diff options
author | Werner Koch <[email protected]> | 2009-05-08 15:07:45 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 2009-05-08 15:07:45 +0000 |
commit | eeca39ae50bcb7dfb1089b37658de4f02a0c1f9a (patch) | |
tree | 266e3cd4fa755d134bfdab7c8727b7f226313af0 /scd/iso7816.c | |
parent | New helper function factored out of ../scd and equipped with test code. (diff) | |
download | gnupg-eeca39ae50bcb7dfb1089b37658de4f02a0c1f9a.tar.gz gnupg-eeca39ae50bcb7dfb1089b37658de4f02a0c1f9a.zip |
More support for Netkey cards.
Small changes to teh CCID driver.
Support 2048 bit OpenPGP cards.
Diffstat (limited to 'scd/iso7816.c')
-rw-r--r-- | scd/iso7816.c | 35 |
1 files changed, 23 insertions, 12 deletions
diff --git a/scd/iso7816.c b/scd/iso7816.c index d12f918a8..492e125de 100644 --- a/scd/iso7816.c +++ b/scd/iso7816.c @@ -605,10 +605,15 @@ iso7816_internal_authenticate (int slot, } +/* LE is the expected return length. This is usually 0 except if + extended length mode is used and more than 256 byte will be + returned. In that case a value of -1 uses a large default + (e.g. 4096 bytes), a value larger 256 used that value. */ static gpg_error_t -do_generate_keypair (int slot, int readonly, - const unsigned char *data, size_t datalen, - unsigned char **result, size_t *resultlen) +do_generate_keypair (int slot, int extended_mode, int readonly, + const unsigned char *data, size_t datalen, + int le, + unsigned char **result, size_t *resultlen) { int sw; @@ -617,9 +622,11 @@ do_generate_keypair (int slot, int readonly, *result = NULL; *resultlen = 0; - sw = apdu_send (slot, 0, - 0x00, CMD_GENERATE_KEYPAIR, readonly? 0x81:0x80, 0, - datalen, (const char*)data, result, resultlen); + sw = apdu_send_le (slot, extended_mode, + 0x00, CMD_GENERATE_KEYPAIR, readonly? 0x81:0x80, 0, + datalen, (const char*)data, + le >= 0 && le < 256? 256:le, + result, resultlen); if (sw != SW_SUCCESS) { /* Make sure that pending buffers are released. */ @@ -634,20 +641,24 @@ do_generate_keypair (int slot, int readonly, gpg_error_t -iso7816_generate_keypair (int slot, +iso7816_generate_keypair (int slot, int extended_mode, const unsigned char *data, size_t datalen, + int le, unsigned char **result, size_t *resultlen) { - return do_generate_keypair (slot, 0, data, datalen, result, resultlen); + return do_generate_keypair (slot, extended_mode, 0, + data, datalen, le, result, resultlen); } gpg_error_t -iso7816_read_public_key (int slot, - const unsigned char *data, size_t datalen, - unsigned char **result, size_t *resultlen) +iso7816_read_public_key (int slot, int extended_mode, + const unsigned char *data, size_t datalen, + int le, + unsigned char **result, size_t *resultlen) { - return do_generate_keypair (slot, 1, data, datalen, result, resultlen); + return do_generate_keypair (slot, extended_mode, 1, + data, datalen, le, result, resultlen); } |