Ticket #217: opensc-libassuan-2.patch
| File opensc-libassuan-2.patch, 3.7 KB (added by puzel, 2 years ago) |
|---|
-
m4/libassuan.m4
--- m4/gpg-error.m4 | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++ m4/libassuan.m4 | 2 - src/signer/dialog.c | 35 +++++++++++++++++----------- 3 files changed, 88 insertions(+), 14 deletions(-)
old new AC_DEFUN([_AM_PATH_LIBASSUAN_COMMON], 26 26 fi 27 27 AC_PATH_PROG(LIBASSUAN_CONFIG, libassuan-config, no) 28 28 29 tmp=ifelse([$1], , 1:0.9.2,$1)29 tmp=ifelse([$1], ,2:2.0.0,$1) 30 30 if echo "$tmp" | grep ':' >/dev/null 2>/dev/null ; then 31 31 req_libassuan_api=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\1/'` 32 32 min_libassuan_version=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\2/'` -
src/signer/dialog.c
old new struct entry_parm_s { 15 15 char *buffer; 16 16 }; 17 17 18 static AssuanError18 static gpg_error_t 19 19 getpin_cb (void *opaque, const void *buffer, size_t length) 20 20 { 21 21 struct entry_parm_s *parm = (struct entry_parm_s *) opaque; 22 22 23 23 /* we expect the pin to fit on one line */ 24 24 if (parm->lines || length >= parm->size) 25 return ASSUAN_Too_Much_Data;25 return gpg_error(GPG_ERR_ASS_TOO_MUCH_DATA); 26 26 27 27 /* fixme: we should make sure that the assuan buffer is allocated in 28 28 secure memory or read the response byte by byte */ 29 29 memcpy(parm->buffer, buffer, length); 30 30 parm->buffer[length] = 0; 31 31 parm->lines++; 32 return (AssuanError) 0;32 return gpg_error(GPG_ERR_NO_ERROR); 33 33 } 34 34 35 35 int ask_and_verify_pin_code(struct sc_pkcs15_card *p15card, 36 36 struct sc_pkcs15_object *pin) 37 37 { 38 int r;38 gpg_error_t r; 39 39 size_t len; 40 40 const char *argv[3]; 41 41 const char *pgmname = PIN_ENTRY; 42 ASSUAN_CONTEXT ctx;42 assuan_context_t ctx = NULL; 43 43 char buf[500]; 44 44 char errtext[100]; 45 45 struct entry_parm_s parm; … … int ask_and_verify_pin_code(struct sc_pk 48 48 argv[0] = pgmname; 49 49 argv[1] = NULL; 50 50 51 r = assuan_pipe_connect(&ctx, pgmname, (char **) argv, NULL); 51 assuan_set_gpg_err_source (GPG_ERR_SOURCE_DEFAULT); 52 53 r = assuan_new(&ctx); 54 if (r) { 55 printf("Can't initialize assuan context: %s\n)", 56 gpg_strerror(r)); 57 goto err; 58 } 59 60 r = assuan_pipe_connect(ctx, pgmname, (const char **) argv, \ 61 NULL, NULL, NULL, 0); 52 62 if (r) { 53 63 printf("Can't connect to the PIN entry module: %s\n", 54 assuan_strerror((AssuanError)r));64 gpg_strerror(r)); 55 65 goto err; 56 66 } 57 67 sprintf(buf, "SETDESC Enter PIN [%s] for digital signing ", pin->label); 58 68 r = assuan_transact(ctx, buf, NULL, NULL, NULL, NULL, NULL, NULL); 59 69 if (r) { 60 printf("SETDESC: %s\n", assuan_strerror((AssuanError)r));70 printf("SETDESC: %s\n", gpg_strerror(r)); 61 71 goto err; 62 72 } 63 73 errtext[0] = 0; … … int ask_and_verify_pin_code(struct sc_pk 71 81 parm.size = sizeof(buf); 72 82 parm.buffer = buf; 73 83 r = assuan_transact(ctx, "GETPIN", getpin_cb, &parm, NULL, NULL, NULL, NULL); 74 if ( r == ASSUAN_Canceled) {75 assuan_ disconnect(ctx);84 if (gpg_err_code(r) == GPG_ERR_ASS_CANCELED) { 85 assuan_release(ctx); 76 86 return -2; 77 87 } 78 88 if (r) { 79 printf("GETPIN: %s\n", assuan_strerror((AssuanError)r));89 printf("GETPIN: %s\n", gpg_strerror(r)); 80 90 goto err; 81 91 } 82 92 len = strlen(buf); … … int ask_and_verify_pin_code(struct sc_pk 104 114 break; 105 115 } 106 116 107 assuan_ disconnect(ctx);117 assuan_release(ctx); 108 118 return 0; 109 119 err: 110 assuan_ disconnect(ctx);120 assuan_release(ctx); 111 121 return -1; 112 122 }
