From 72f474f09fdbd420999e204de243ca4aeddf7476 Mon Sep 17 00:00:00 2001 From: Frank Morgner Date: Thu, 13 Jun 2019 07:54:54 +0200 Subject: [PATCH] use consistent parameters - in sc_pkcs15_wrap() - and sc_pkcs15_derive() --- src/libopensc/pkcs15-sec.c | 25 +++++++++---------------- src/libopensc/pkcs15.h | 4 ++-- src/minidriver/minidriver.c | 14 +++++++------- src/pkcs11/framework-pkcs15.c | 13 ++++++++++--- 4 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/libopensc/pkcs15-sec.c b/src/libopensc/pkcs15-sec.c index ce054f74..42a3a6af 100644 --- a/src/libopensc/pkcs15-sec.c +++ b/src/libopensc/pkcs15-sec.c @@ -304,7 +304,7 @@ int sc_pkcs15_derive(struct sc_pkcs15_card *p15card, const struct sc_pkcs15_object *obj, unsigned long flags, const u8 * in, size_t inlen, u8 *out, - unsigned long *poutlen) + size_t *poutlen) { sc_context_t *ctx = p15card->card->ctx; int r; @@ -444,8 +444,8 @@ int sc_pkcs15_wrap(struct sc_pkcs15_card *p15card, const struct sc_pkcs15_object *key, struct sc_pkcs15_object *target_key, unsigned long flags, - u8 * cryptogram, unsigned long* crgram_len, - const u8 * param, size_t paramlen) { + u8 *cryptogram, size_t *crgram_len, + const u8 *param, size_t paramlen) { sc_context_t *ctx = p15card->card->ctx; int r; sc_algorithm_info_t *alg_info = NULL; @@ -456,10 +456,6 @@ int sc_pkcs15_wrap(struct sc_pkcs15_card *p15card, const struct sc_pkcs15_skey_info *target_skey = (const struct sc_pkcs15_skey_info *) target_key->data; unsigned long pad_flags = 0, sec_flags = 0; sc_path_t tkey_path; - u8 *in = 0; - u8 *out = 0; - unsigned long *poutlen = 0; - size_t inlen = 0; sc_path_t path, target_file_id; sc_sec_env_param_t senv_param; @@ -531,18 +527,15 @@ int sc_pkcs15_wrap(struct sc_pkcs15_card *p15card, LOG_TEST_RET(ctx, sec_env_add_param(&senv, &senv_param), "failed to add IV to security environment"); } - out = cryptogram; - poutlen = crgram_len; - r = use_key(p15card, key, &senv, sc_wrap, in, inlen, out, - *poutlen); + r = use_key(p15card, key, &senv, sc_wrap, NULL, 0, cryptogram, crgram_len ? *crgram_len : 0); - if (r > -1) { - if (*crgram_len < (unsigned) r) { - *poutlen = r; - if (out != NULL) /* if NULL, return success and required buffer length by PKCS#11 convention */ + if (r > -1 && crgram_len) { + if (*crgram_len < (size_t) r) { + *crgram_len = r; + if (cryptogram != NULL) /* if NULL, return success and required buffer length by PKCS#11 convention */ LOG_TEST_RET(ctx, SC_ERROR_BUFFER_TOO_SMALL, "Buffer too small to hold the wrapped key."); } - *poutlen = r; + *crgram_len = r; } LOG_FUNC_RETURN(ctx, r); diff --git a/src/libopensc/pkcs15.h b/src/libopensc/pkcs15.h index d8bb1b27..f2ccc42a 100644 --- a/src/libopensc/pkcs15.h +++ b/src/libopensc/pkcs15.h @@ -666,7 +666,7 @@ int sc_pkcs15_decipher(struct sc_pkcs15_card *p15card, int sc_pkcs15_derive(struct sc_pkcs15_card *p15card, const struct sc_pkcs15_object *prkey_obj, unsigned long flags, - const u8 *in, size_t inlen, u8 *out, unsigned long *poutlen); + const u8 *in, size_t inlen, u8 *out, size_t *poutlen); int sc_pkcs15_unwrap(struct sc_pkcs15_card *p15card, const struct sc_pkcs15_object *key, @@ -679,7 +679,7 @@ int sc_pkcs15_wrap(struct sc_pkcs15_card *p15card, const struct sc_pkcs15_object *key, struct sc_pkcs15_object *target_key, unsigned long flags, - u8 * cryptogram, unsigned long* crgram_len, + u8 * cryptogram, size_t* crgram_len, const u8 * param, size_t paramlen); int sc_pkcs15_compute_signature(struct sc_pkcs15_card *p15card, diff --git a/src/minidriver/minidriver.c b/src/minidriver/minidriver.c index 54e23c5d..8a0940d0 100644 --- a/src/minidriver/minidriver.c +++ b/src/minidriver/minidriver.c @@ -4879,9 +4879,9 @@ DWORD WINAPI CardConstructDHAgreement(__in PCARD_DATA pCardData, struct sc_pkcs15_object *pkey = NULL; int r, opt_derive_flags = SC_ALGORITHM_ECDH_CDH_RAW; u8* out = 0; - unsigned long outlen = 0; + size_t outlen = 0; PBYTE pbPublicKey = NULL; - DWORD dwPublicKeySize = 0; + size_t publicKeySize = 0; struct md_dh_agreement* dh_agreement = NULL; struct md_dh_agreement* temp = NULL; BYTE i; @@ -4936,18 +4936,18 @@ DWORD WINAPI CardConstructDHAgreement(__in PCARD_DATA pCardData, } /* convert the Windows public key into an OpenSC public key */ - dwPublicKeySize = pAgreementInfo->dwPublicKey - sizeof(BCRYPT_ECCKEY_BLOB) + 1; - pbPublicKey = (PBYTE) pCardData->pfnCspAlloc(dwPublicKeySize); + publicKeySize = pAgreementInfo->dwPublicKey - sizeof(BCRYPT_ECCKEY_BLOB) + 1; + pbPublicKey = (PBYTE) pCardData->pfnCspAlloc(publicKeySize); if (!pbPublicKey) { dwret = ERROR_OUTOFMEMORY; goto err; } pbPublicKey[0] = 4; - memcpy(pbPublicKey+1, pAgreementInfo->pbPublicKey + sizeof(BCRYPT_ECCKEY_BLOB), dwPublicKeySize-1); + memcpy(pbPublicKey+1, pAgreementInfo->pbPublicKey + sizeof(BCRYPT_ECCKEY_BLOB), publicKeySize-1); /* derive the key using the OpenSC functions */ - r = sc_pkcs15_derive(vs->p15card, pkey, opt_derive_flags, pbPublicKey, dwPublicKeySize, out, &outlen ); + r = sc_pkcs15_derive(vs->p15card, pkey, opt_derive_flags, pbPublicKey, publicKeySize, out, &outlen ); logprintf(pCardData, 2, "sc_pkcs15_derive returned %d\n", r); if ( r < 0) { @@ -4964,7 +4964,7 @@ DWORD WINAPI CardConstructDHAgreement(__in PCARD_DATA pCardData, goto err; } - r = sc_pkcs15_derive(vs->p15card, pkey, opt_derive_flags, pbPublicKey, dwPublicKeySize, out, &outlen ); + r = sc_pkcs15_derive(vs->p15card, pkey, opt_derive_flags, pbPublicKey, publicKeySize, out, &outlen ); logprintf(pCardData, 2, "sc_pkcs15_derive returned %d\n", r); pCardData->pfnCspFree(pbPublicKey); diff --git a/src/pkcs11/framework-pkcs15.c b/src/pkcs11/framework-pkcs15.c index ed0f677d..3c845a71 100644 --- a/src/pkcs11/framework-pkcs15.c +++ b/src/pkcs11/framework-pkcs15.c @@ -4268,12 +4268,14 @@ pkcs15_prkey_derive(struct sc_pkcs11_session *session, void *obj, break; } + size_t len = *pulDataLen; rv = sc_pkcs15_derive(fw_data->p15_card, prkey->prv_p15obj, flags, - pSeedData, ulSeedDataLen, pData, pulDataLen); + pSeedData, ulSeedDataLen, pData, &len); if (rv < 0 && !sc_pkcs11_conf.lock_login && !prkey_has_path && need_unlock) if (reselect_app_df(fw_data->p15_card) == SC_SUCCESS) rv = sc_pkcs15_derive(fw_data->p15_card, prkey->prv_p15obj, flags, - pSeedData, ulSeedDataLen, pData, pulDataLen); + pSeedData, ulSeedDataLen, pData, &len); + *pulDataLen = len; /* this may have been a request for size */ @@ -5049,6 +5051,7 @@ pkcs15_skey_wrap(struct sc_pkcs11_session *session, void *obj, struct pkcs15_fw_data *fw_data = NULL; struct pkcs15_skey_object *skey = (struct pkcs15_skey_object *) obj; struct pkcs15_skey_object *targetKeyObj = (struct pkcs15_skey_object *) targetKey; + size_t len = pulDataLen ? *pulDataLen : 0; int rv, flags = 0; sc_log(context, "Initializing wrapping with a secret key."); @@ -5098,7 +5101,11 @@ pkcs15_skey_wrap(struct sc_pkcs11_session *session, void *obj, /* Call the card to do the wrapping operation */ rv = sc_pkcs15_wrap(fw_data->p15_card, skey->prv_p15obj, targetKeyObj->prv_p15obj, flags, - pData, pulDataLen, pMechanism->pParameter, pMechanism->ulParameterLen); + pData, &len, pMechanism->pParameter, pMechanism->ulParameterLen); + + if (pulDataLen) { + *pulDataLen = len; + } sc_unlock(p11card->card);