From 6c3b43f636334f10358e15ee52b4faba8347a6cd Mon Sep 17 00:00:00 2001 From: vtarasov Date: Wed, 27 Apr 2011 13:56:31 +0000 Subject: [PATCH] iasecc: when signing short data sequence with PSO_DST ... ... 'last-hash-step' APDU do not includes the 'pre-hash' and 'counter' data -- only the 'last-data-block'. git-svn-id: https://www.opensc-project.org/svnp/opensc/trunk@5401 c6295689-39f2-0310-b995-f0e70906c6a9 --- src/libopensc/card-iasecc.c | 21 +++++++++++++++------ src/libopensc/iasecc.h | 1 + 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/libopensc/card-iasecc.c b/src/libopensc/card-iasecc.c index c12f3de4..0f591ccd 100644 --- a/src/libopensc/card-iasecc.c +++ b/src/libopensc/card-iasecc.c @@ -2741,12 +2741,16 @@ iasecc_get_qsign_data (struct sc_context *ctx, const unsigned char *in, size_t i out->counter[hh_size+ii] = (sha.Nl >> 8*(hh_size-1-ii)) &0xFF; } + for (ii=0, out->counter_long=0; iicounter); ii++) + out->counter_long = out->counter_long*0x100 + out->counter[ii]; + sc_log(ctx, "Pre SHA1:%s", sc_dump_hex(out->pre_hash, out->pre_hash_size)); - sc_log(ctx, "Pre counter:%s", sc_dump_hex(out->counter, sizeof(out->counter))); + sc_log(ctx, "Pre counter(%li):%s", out->counter_long, sc_dump_hex(out->counter, sizeof(out->counter))); for (ii=0;iilast_block[ii] = (sha.data[ii/hh_size] >> 8*(hh_size-1-(ii%hh_size))) &0xFF; out->last_block_size = sha.num; + sc_log(ctx, "Last block(%i):%s", out->last_block_size, sc_dump_hex(out->last_block, out->last_block_size)); SHA1_Final(out->hash, &sha); out->hash_size = SHA_DIGEST_LENGTH; @@ -2792,11 +2796,16 @@ iasecc_compute_signature_dst(struct sc_card *card, memset(sbuf, 0, sizeof(sbuf)); sbuf[offs++] = 0x90; - sbuf[offs++] = qsign_data.hash_size + 8; - memcpy(sbuf + offs, qsign_data.pre_hash, qsign_data.pre_hash_size); - offs += qsign_data.pre_hash_size; - memcpy(sbuf + offs, qsign_data.counter, sizeof(qsign_data.counter)); - offs += sizeof(qsign_data.counter); + if (qsign_data.counter_long) { + sbuf[offs++] = qsign_data.hash_size + 8; + memcpy(sbuf + offs, qsign_data.pre_hash, qsign_data.pre_hash_size); + offs += qsign_data.pre_hash_size; + memcpy(sbuf + offs, qsign_data.counter, sizeof(qsign_data.counter)); + offs += sizeof(qsign_data.counter); + } + else { + sbuf[offs++] = 0; + } sbuf[offs++] = 0x80; sbuf[offs++] = qsign_data.last_block_size; diff --git a/src/libopensc/iasecc.h b/src/libopensc/iasecc.h index b5155368..62a2d3a8 100644 --- a/src/libopensc/iasecc.h +++ b/src/libopensc/iasecc.h @@ -102,6 +102,7 @@ typedef struct iasecc_qsign_data { size_t pre_hash_size; unsigned char counter[8]; + unsigned long counter_long; unsigned char last_block[64]; size_t last_block_size;