sc-hsm-tool: Fixed a crash on Windows when --wrap-key frees memory allocated in opensc.dll
This commit is contained in:
parent
e1da77e253
commit
ae1b96e5b2
|
@ -557,7 +557,7 @@ static int sc_hsm_decipher(sc_card_t *card, const u8 * crgram, size_t crgram_len
|
||||||
apdu.resplen = sizeof(rbuf);
|
apdu.resplen = sizeof(rbuf);
|
||||||
apdu.le = 256;
|
apdu.le = 256;
|
||||||
|
|
||||||
apdu.data = crgram;
|
apdu.data = (u8 *)crgram;
|
||||||
apdu.lc = crgram_len;
|
apdu.lc = crgram_len;
|
||||||
apdu.datalen = crgram_len;
|
apdu.datalen = crgram_len;
|
||||||
|
|
||||||
|
@ -718,7 +718,7 @@ static int sc_hsm_wrap_key(sc_card_t *card, sc_cardctl_sc_hsm_wrapped_key_t *par
|
||||||
{
|
{
|
||||||
sc_context_t *ctx = card->ctx;
|
sc_context_t *ctx = card->ctx;
|
||||||
sc_apdu_t apdu;
|
sc_apdu_t apdu;
|
||||||
u8 data[SC_MAX_EXT_APDU_BUFFER_SIZE];
|
u8 data[MAX_EXT_APDU_LENGTH];
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
LOG_FUNC_CALLED(card->ctx);
|
LOG_FUNC_CALLED(card->ctx);
|
||||||
|
@ -736,10 +736,17 @@ static int sc_hsm_wrap_key(sc_card_t *card, sc_cardctl_sc_hsm_wrapped_key_t *par
|
||||||
|
|
||||||
LOG_TEST_RET(ctx, r, "Check SW error");
|
LOG_TEST_RET(ctx, r, "Check SW error");
|
||||||
|
|
||||||
params->wrapped_key_length = apdu.resplen;
|
|
||||||
params->wrapped_key = malloc(apdu.resplen);
|
|
||||||
if (params->wrapped_key == NULL) {
|
if (params->wrapped_key == NULL) {
|
||||||
LOG_FUNC_RETURN(card->ctx, SC_ERROR_OUT_OF_MEMORY);
|
params->wrapped_key_length = apdu.resplen;
|
||||||
|
params->wrapped_key = malloc(apdu.resplen);
|
||||||
|
if (params->wrapped_key == NULL) {
|
||||||
|
LOG_FUNC_RETURN(card->ctx, SC_ERROR_OUT_OF_MEMORY);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (apdu.resplen > params->wrapped_key_length) {
|
||||||
|
LOG_FUNC_RETURN(card->ctx, SC_ERROR_BUFFER_TOO_SMALL);
|
||||||
|
}
|
||||||
|
params->wrapped_key_length = apdu.resplen;
|
||||||
}
|
}
|
||||||
memcpy(params->wrapped_key, data, apdu.resplen);
|
memcpy(params->wrapped_key, data, apdu.resplen);
|
||||||
LOG_FUNC_RETURN(card->ctx, SC_SUCCESS);
|
LOG_FUNC_RETURN(card->ctx, SC_SUCCESS);
|
||||||
|
|
|
@ -57,7 +57,7 @@ static int verbose = 0;
|
||||||
// Some reasonable maximums
|
// Some reasonable maximums
|
||||||
#define MAX_CERT 4096
|
#define MAX_CERT 4096
|
||||||
#define MAX_PRKD 256
|
#define MAX_PRKD 256
|
||||||
#define MAX_KEY 512
|
#define MAX_KEY 1024
|
||||||
#define MAX_WRAPPED_KEY (MAX_CERT + MAX_PRKD + MAX_KEY)
|
#define MAX_WRAPPED_KEY (MAX_CERT + MAX_PRKD + MAX_KEY)
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
@ -572,7 +572,7 @@ static int recreate_password_from_shares(char **pwd, int *pwdlen, int num_of_pas
|
||||||
BIGNUM *p;
|
BIGNUM *p;
|
||||||
char inbuf[64];
|
char inbuf[64];
|
||||||
char bin[64];
|
char bin[64];
|
||||||
int binlen = 0;
|
size_t binlen = 0;
|
||||||
char *ip;
|
char *ip;
|
||||||
secret_share_t *shares = NULL;
|
secret_share_t *shares = NULL;
|
||||||
secret_share_t *sp;
|
secret_share_t *sp;
|
||||||
|
@ -985,6 +985,50 @@ static size_t determineLength(const u8 *tlv, size_t buflen)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encapsulate data object as TLV object
|
||||||
|
*
|
||||||
|
* @param tag the one byte tag
|
||||||
|
* @param indata the value field
|
||||||
|
* @param inlen the length of the value field
|
||||||
|
* @param outdata pointer to the allocated memory buffer
|
||||||
|
* @param outlen the size of the TLV object
|
||||||
|
*/
|
||||||
|
int wrap_with_tag(u8 tag, u8 *indata, size_t inlen, u8 **outdata, size_t *outlen)
|
||||||
|
{
|
||||||
|
int nlc = 0;
|
||||||
|
u8 *ptr;
|
||||||
|
|
||||||
|
if (inlen > 127) {
|
||||||
|
do {
|
||||||
|
nlc++;
|
||||||
|
} while (inlen >= (1 << (nlc << 3)));
|
||||||
|
}
|
||||||
|
|
||||||
|
*outlen = 2 + nlc + inlen;
|
||||||
|
ptr = malloc(*outlen);
|
||||||
|
if (ptr == NULL) {
|
||||||
|
return SC_ERROR_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
*outdata = ptr;
|
||||||
|
*ptr++ = tag;
|
||||||
|
|
||||||
|
if (nlc) {
|
||||||
|
*ptr++ = 0x80 | nlc;
|
||||||
|
while (nlc--) {
|
||||||
|
*ptr++ = (inlen >> (nlc << 3)) & 0xFF;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
*ptr++ = inlen & 0x7F;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(ptr, indata, inlen);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void wrap_key(sc_card_t *card, u8 keyid, const char *outf, const char *pin)
|
static void wrap_key(sc_card_t *card, u8 keyid, const char *outf, const char *pin)
|
||||||
{
|
{
|
||||||
sc_cardctl_sc_hsm_wrapped_key_t wrapped_key;
|
sc_cardctl_sc_hsm_wrapped_key_t wrapped_key;
|
||||||
|
@ -995,6 +1039,7 @@ static void wrap_key(sc_card_t *card, u8 keyid, const char *outf, const char *pi
|
||||||
u8 fid[2];
|
u8 fid[2];
|
||||||
u8 ef_prkd[MAX_PRKD];
|
u8 ef_prkd[MAX_PRKD];
|
||||||
u8 ef_cert[MAX_CERT];
|
u8 ef_cert[MAX_CERT];
|
||||||
|
u8 wrapped_key_buff[MAX_KEY];
|
||||||
u8 keyblob[MAX_WRAPPED_KEY];
|
u8 keyblob[MAX_WRAPPED_KEY];
|
||||||
u8 *key;
|
u8 *key;
|
||||||
u8 *ptr;
|
u8 *ptr;
|
||||||
|
@ -1029,6 +1074,8 @@ static void wrap_key(sc_card_t *card, u8 keyid, const char *outf, const char *pi
|
||||||
}
|
}
|
||||||
|
|
||||||
wrapped_key.key_id = keyid;
|
wrapped_key.key_id = keyid;
|
||||||
|
wrapped_key.wrapped_key = wrapped_key_buff;
|
||||||
|
wrapped_key.wrapped_key_length = sizeof(wrapped_key_buff);
|
||||||
|
|
||||||
r = sc_card_ctl(card, SC_CARDCTL_SC_HSM_WRAP_KEY, (void *)&wrapped_key);
|
r = sc_card_ctl(card, SC_CARDCTL_SC_HSM_WRAP_KEY, (void *)&wrapped_key);
|
||||||
|
|
||||||
|
@ -1080,13 +1127,12 @@ static void wrap_key(sc_card_t *card, u8 keyid, const char *outf, const char *pi
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ptr = keyblob;
|
ptr = keyblob;
|
||||||
|
|
||||||
// Encode key in octet string object
|
// Encode key in octet string object
|
||||||
sc_asn1_write_element(card->ctx, SC_ASN1_OCTET_STRING,
|
key_len = 0;
|
||||||
wrapped_key.wrapped_key, wrapped_key.wrapped_key_length,
|
wrap_with_tag(0x04, wrapped_key.wrapped_key, wrapped_key.wrapped_key_length,
|
||||||
&key, &key_len);
|
&key, &key_len);
|
||||||
|
|
||||||
memcpy(ptr, key, key_len);
|
memcpy(ptr, key, key_len);
|
||||||
ptr += key_len;
|
ptr += key_len;
|
||||||
|
@ -1104,10 +1150,9 @@ static void wrap_key(sc_card_t *card, u8 keyid, const char *outf, const char *pi
|
||||||
ptr += ef_cert_len;
|
ptr += ef_cert_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Encode key in octet string object
|
// Encode key, key decription and certificate object in sequence
|
||||||
sc_asn1_write_element(card->ctx, SC_ASN1_SEQUENCE|SC_ASN1_CONS,
|
key_len = 0;
|
||||||
keyblob, ptr - keyblob,
|
wrap_with_tag(0x30, keyblob, ptr - keyblob, &key, &key_len);
|
||||||
&key, &key_len);
|
|
||||||
|
|
||||||
out = fopen(outf, "wb");
|
out = fopen(outf, "wb");
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue