1 2#include <sys/types.h> 3#include <string.h> 4 5#include <openssl/ui.h> 6 7#include "trousers/tss.h" 8#include "spi_utils.h" 9 10static TSS_RESULT do_ui(BYTE *string, UINT32 *string_len, BYTE *popup, int verify) 11{ 12 char pin_buf[UI_MAX_SECRET_STRING_LENGTH + 1]; 13 char verify_buf[UI_MAX_SECRET_STRING_LENGTH + 1]; 14 char *popup_nl; 15 UI *ui; 16 BYTE *unicode; 17 TSS_RESULT ret = TSS_E_FAIL; 18 19 popup_nl = malloc(strlen((char *)popup) + 2); 20 if (!popup_nl) 21 return TSS_E_OUTOFMEMORY; 22 23 ui = UI_new(); 24 if (!ui) 25 goto no_ui; 26 27 sprintf(popup_nl, "%s\n", (char *)popup); 28 if (!UI_add_info_string(ui, popup_nl)) { 29 printf("add info fail\n"); 30 goto out; 31 } 32 33 /* UI_add_input_string() doesn't count for the null terminator in its last */ 34 /* parameter, that's why we statically allocated 1 more byte to pin_buf */ 35 if (!UI_add_input_string(ui, "Enter PIN:", 0, pin_buf, 1, UI_MAX_SECRET_STRING_LENGTH)) { 36 printf("add input fail\n"); 37 goto out; 38 } 39 40 if (verify && 41 !UI_add_verify_string(ui, "Verify PIN:", 0, verify_buf, 1, UI_MAX_SECRET_STRING_LENGTH, pin_buf)) { 42 printf("Add verify fail\n"); 43 goto out; 44 } 45 46 if (UI_process(ui)) 47 goto out; 48 49 ret = TSS_SUCCESS; 50 51 unicode = Trspi_Native_To_UNICODE((BYTE *)pin_buf, string_len); 52 __tspi_memset(string, 0, UI_MAX_SECRET_STRING_LENGTH); 53 memcpy(string, unicode, *string_len); 54 free(unicode); 55 out: 56 UI_free(ui); 57 no_ui: 58 free(popup_nl); 59 return ret; 60} 61 62/* 63 * DisplayPINWindow() 64 * 65 * Popup the dialog to collect an existing password. 66 * 67 * string - buffer that the password will be passed back to caller in 68 * popup - UTF-8 string to be displayed in the title bar of the dialog box 69 * 70 */ 71TSS_RESULT DisplayPINWindow(BYTE *string, UINT32 *string_len, BYTE *popup) 72{ 73 return do_ui(string, string_len, popup, 0); 74} 75/* 76 * DisplayNewPINWindow() 77 * 78 * Popup the dialog to collect a new password. 79 * 80 * string - buffer that the password will be passed back to caller in 81 * popup - UTF-8 string to be displayed in the title bar of the dialog box 82 * 83 */ 84TSS_RESULT DisplayNewPINWindow(BYTE *string, UINT32 *string_len, BYTE *popup) 85{ 86 return do_ui(string, string_len, popup, 1); 87} 88