diff --git a/CMakeLists.txt b/CMakeLists.txt index 35810e64..c53bef78 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,7 +7,7 @@ project(SymCrypt-OpenSSL HOMEPAGE_URL "https://github.com/microsoft/SymCrypt-OpenSSL") set(SYMCRYPT_MINIMUM_MAJOR "103") -set(SYMCRYPT_MINIMUM_MINOR "6") +set(SYMCRYPT_MINIMUM_MINOR "8") find_package(OpenSSL REQUIRED) @@ -23,7 +23,7 @@ else() if (SYMCRYPT_FOUND) message(STATUS "SymCrypt Includes: ${SYMCRYPT_INCLUDE_DIRS}") include_directories(${SYMCRYPT_INCLUDE_DIRS}) - endif() + endif() endif() # Try to find installed SymCrypt @@ -34,7 +34,7 @@ else() if (NOT SYMCRYPT_HEADER) message(FATAL_ERROR "SymCrypt header file not found. Please set SYMCRYPT_ROOT_DIR or install SymCrypt headers.") endif() - + find_library(SYMCRYPT_LIBRARY symcrypt PATHS ${CMAKE_SOURCE_DIR}) if (SYMCRYPT_LIBRARY) set(SYMCRYPT_FOUND TRUE) diff --git a/KeysInUse/keysinuse.c b/KeysInUse/keysinuse.c index 8fc767be..47072ac6 100644 --- a/KeysInUse/keysinuse.c +++ b/KeysInUse/keysinuse.c @@ -287,7 +287,7 @@ static void keysinuse_init_internal() } if ((pthreadErr = pthread_atfork(keysinuse_atfork_prepare, - keysinuse_atfork_parent, + keysinuse_atfork_parent, keysinuse_atfork_child)) != 0) { keysinuse_log_error("Failed to register logging fork handler,SYS_%d", pthreadErr); @@ -591,7 +591,7 @@ unsigned int keysinuse_derive_key_identifier(_In_reads_bytes_(cbEncodedKey) cons _Out_writes_bytes_opt_(cbEncodedKey)char *pbKeyIdentifier, unsigned long cbKeyIdentifier) { BYTE abHash[SYMCRYPT_SHA256_RESULT_SIZE]; - UINT cbHash = SYMCRYPT_SHA256_RESULT_SIZE; + unsigned int cbHash = SYMCRYPT_SHA256_RESULT_SIZE; if (pbKeyIdentifier == NULL) { diff --git a/ScosslCommon/inc/scossl_rsa.h b/ScosslCommon/inc/scossl_rsa.h index f0d9ad70..c42184b7 100644 --- a/ScosslCommon/inc/scossl_rsa.h +++ b/ScosslCommon/inc/scossl_rsa.h @@ -39,12 +39,12 @@ SCOSSL_STATUS scossl_rsapss_verify(_In_ PSYMCRYPT_RSAKEY key, int mdnid, int cbS _In_reads_bytes_(cbHashValue) PCBYTE pbHashValue, SIZE_T cbHashValue, _In_reads_bytes_(pcbSignature) PCBYTE pbSignature, SIZE_T pcbSignature); -SCOSSL_STATUS scossl_rsa_encrypt(_In_ PSYMCRYPT_RSAKEY key, UINT padding, +SCOSSL_STATUS scossl_rsa_encrypt(_In_ PSYMCRYPT_RSAKEY key, UINT8 padding, int mdnid, _In_reads_bytes_opt_(cbLabel) PCBYTE pbLabel, SIZE_T cbLabel, _In_reads_bytes_(cbSrc) PCBYTE pbSrc, SIZE_T cbSrc, _Out_writes_bytes_(*pcbDst) PBYTE pbDst, _Out_ INT32 *pcbDst, SIZE_T cbDst); -SCOSSL_STATUS scossl_rsa_decrypt(_In_ PSYMCRYPT_RSAKEY key, UINT padding, +SCOSSL_STATUS scossl_rsa_decrypt(_In_ PSYMCRYPT_RSAKEY key, UINT8 padding, int mdnid, _In_reads_bytes_opt_(cbLabel) PCBYTE pbLabel, SIZE_T cbLabel, _In_reads_bytes_(cbSrc) PCBYTE pbSrc, SIZE_T cbSrc, _Out_writes_bytes_(*pcbDst) PBYTE pbDst, _Out_ INT32 *pcbDst, SIZE_T cbDst); diff --git a/ScosslCommon/src/scossl_rsa.c b/ScosslCommon/src/scossl_rsa.c index 8cce9a17..66a9916a 100644 --- a/ScosslCommon/src/scossl_rsa.c +++ b/ScosslCommon/src/scossl_rsa.c @@ -428,7 +428,7 @@ SCOSSL_STATUS scossl_rsapss_verify(PSYMCRYPT_RSAKEY key, int mdnid, int cbSalt, } _Use_decl_annotations_ -SCOSSL_STATUS scossl_rsa_encrypt(PSYMCRYPT_RSAKEY key, UINT padding, +SCOSSL_STATUS scossl_rsa_encrypt(PSYMCRYPT_RSAKEY key, UINT8 padding, int mdnid, PCBYTE pbLabel, SIZE_T cbLabel, // OAEP-only parameters PCBYTE pbSrc, SIZE_T cbSrc, PBYTE pbDst, INT32 *pcbDst, SIZE_T cbDst) @@ -545,7 +545,7 @@ SCOSSL_STATUS scossl_rsa_encrypt(PSYMCRYPT_RSAKEY key, UINT padding, } _Use_decl_annotations_ -SCOSSL_STATUS scossl_rsa_decrypt(PSYMCRYPT_RSAKEY key, UINT padding, +SCOSSL_STATUS scossl_rsa_decrypt(PSYMCRYPT_RSAKEY key, UINT8 padding, int mdnid, PCBYTE pbLabel, SIZE_T cbLabel, // OAEP-only parameters PCBYTE pbSrc, SIZE_T cbSrc, PBYTE pbDst, INT32 *pcbDst, SIZE_T cbDst) diff --git a/SymCryptProvider/src/asymcipher/p_scossl_rsa_cipher.c b/SymCryptProvider/src/asymcipher/p_scossl_rsa_cipher.c index 0790b441..0b1d6f7f 100644 --- a/SymCryptProvider/src/asymcipher/p_scossl_rsa_cipher.c +++ b/SymCryptProvider/src/asymcipher/p_scossl_rsa_cipher.c @@ -20,7 +20,7 @@ typedef struct OSSL_LIB_CTX *libctx; SCOSSL_PROV_RSA_KEY_CTX *keyCtx; - UINT padding; + UINT8 padding; int operation; // OAEP Parameters @@ -145,6 +145,13 @@ static SCOSSL_STATUS p_scossl_rsa_cipher_encrypt(_In_ SCOSSL_RSA_CIPHER_CTX *ctx return SCOSSL_FAILURE; } + if (out != NULL && + outsize < SymCryptRsakeySizeofModulus(ctx->keyCtx->key)) + { + ERR_raise(ERR_LIB_PROV, PROV_R_OUTPUT_BUFFER_TOO_SMALL); + return SCOSSL_FAILURE; + } + if (ctx->operation != EVP_PKEY_OP_ENCRYPT) { ERR_raise(ERR_LIB_PROV, ERR_R_OPERATION_FAIL); @@ -305,7 +312,7 @@ static SCOSSL_STATUS p_scossl_rsa_cipher_set_ctx_params(_Inout_ SCOSSL_RSA_CIPHE // Padding mode may be passed as legacy NID or string, and is // checked against the padding modes the ScOSSL provider supports int i = 0; - UINT padding; + unsigned int padding; switch (p->data_type) { diff --git a/SymCryptProvider/src/ciphers/p_scossl_aes.c b/SymCryptProvider/src/ciphers/p_scossl_aes.c index 984e8bbe..1bc3f156 100644 --- a/SymCryptProvider/src/ciphers/p_scossl_aes.c +++ b/SymCryptProvider/src/ciphers/p_scossl_aes.c @@ -56,7 +56,7 @@ typedef struct SIZE_T cbBuf; OSSL_LIB_CTX *libctx; - UINT tlsVersion; + UINT32 tlsVersion; PBYTE tlsMac; SIZE_T tlsMacSize; @@ -154,7 +154,7 @@ static SCOSSL_STATUS p_scossl_aes_generic_decrypt_init(_Inout_ SCOSSL_AES_CTX *c // the unpadded record, and saves the result to ctx->tlsMac. // // The MAC will later be fetched through p_scossl_aes_generic_get_ctx_params -// This function is adapted from ssl3_cbc_copy_mac in ssl/record/tls_pad.c, and +// This function is adapted from ssl3_cbc_copy_mac in ssl/record/tls_pad.c, and // SymCryptTlsCbcHmacVerifyCore from SymCrypt, and runs in constant time w.r.t // the values in pbData. In case of bad padding, a random MAC is assigned instead static SCOSSL_STATUS p_scossl_aes_tls_remove_padding_and_copy_mac( @@ -230,7 +230,7 @@ static SCOSSL_STATUS p_scossl_aes_tls_remove_padding_and_copy_mac( macStart = macEnd - ctx->tlsMacSize; rotatedMac = rotatedMacBuf + ((0 - (SIZE_T)rotatedMacBuf) & 0x3f); - + // Find and extract MAC, and verify padding memset(rotatedMac, 0, ctx->tlsMacSize); for (i = 0, j = 0; i < cbTail-1; i++) @@ -745,7 +745,7 @@ static SCOSSL_STATUS p_scossl_aes_generic_set_ctx_params(_Inout_ SCOSSL_AES_CTX if ((p = OSSL_PARAM_locate_const(params, OSSL_CIPHER_PARAM_TLS_VERSION)) != NULL) { - UINT tlsVersion; + unsigned int tlsVersion; if (!OSSL_PARAM_get_uint(p, &tlsVersion)) { ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER); @@ -994,16 +994,13 @@ static SCOSSL_STATUS scossl_aes_cfb8_cipher(_Inout_ SCOSSL_AES_CTX *ctx, #define IMPLEMENT_SCOSSL_AES_GENERIC_CIPHER(kbits, ivlen, lcmode, UCMODE, type, blocksize) \ SCOSSL_AES_CTX *p_scossl_aes_##kbits##_##lcmode##_newctx(_In_ SCOSSL_PROVCTX *provctx) \ { \ - SCOSSL_COMMON_ALIGNED_ALLOC(ctx, OPENSSL_malloc, SCOSSL_AES_CTX); \ + SCOSSL_COMMON_ALIGNED_ALLOC(ctx, OPENSSL_zalloc, SCOSSL_AES_CTX); \ if (ctx != NULL) \ { \ ctx->keylen = kbits >> 3; \ ctx->pad = TRUE; \ ctx->cipher = (OSSL_FUNC_cipher_cipher_fn *)&scossl_aes_##lcmode##_cipher; \ ctx->libctx = provctx->libctx; \ - ctx->tlsMac = NULL; \ - ctx->tlsMacSize = 0; \ - ctx->tlsVersion = 0; \ } \ \ return ctx; \ diff --git a/SymCryptProvider/src/kdf/p_scossl_hkdf.c b/SymCryptProvider/src/kdf/p_scossl_hkdf.c index 1c5ec3d0..203b5596 100644 --- a/SymCryptProvider/src/kdf/p_scossl_hkdf.c +++ b/SymCryptProvider/src/kdf/p_scossl_hkdf.c @@ -278,36 +278,26 @@ SCOSSL_STATUS p_scossl_hkdf_set_ctx_params(_Inout_ SCOSSL_PROV_HKDF_CTX *ctx, co if ((p = OSSL_PARAM_locate_const(params, OSSL_KDF_PARAM_SALT)) != NULL) { - PBYTE pbSalt = NULL; - SIZE_T cbSalt = 0; + OPENSSL_clear_free(ctx->hkdfCtx->pbSalt, ctx->hkdfCtx->cbSalt); + ctx->hkdfCtx->pbSalt = NULL; - if (p->data_size > 0 && - !OSSL_PARAM_get_octet_string(p, (void **)&pbSalt, 0, &cbSalt)) + if (!OSSL_PARAM_get_octet_string(p, (void **)&ctx->hkdfCtx->pbSalt, 0, &ctx->hkdfCtx->cbSalt)) { ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER); return SCOSSL_FAILURE; } - - OPENSSL_clear_free(ctx->hkdfCtx->pbSalt, ctx->hkdfCtx->cbSalt); - ctx->hkdfCtx->pbSalt = pbSalt; - ctx->hkdfCtx->cbSalt = cbSalt; } if ((p = OSSL_PARAM_locate_const(params, OSSL_KDF_PARAM_KEY)) != NULL) { - PBYTE pbKey = NULL; - SIZE_T cbKey = 0; + OPENSSL_clear_free(ctx->hkdfCtx->pbKey, ctx->hkdfCtx->cbKey); + ctx->hkdfCtx->pbKey = NULL; - if (p->data_size > 0 && - !OSSL_PARAM_get_octet_string(p, (void **)&pbKey, 0, &cbKey)) + if (!OSSL_PARAM_get_octet_string(p, (void **)&ctx->hkdfCtx->pbKey, 0, &ctx->hkdfCtx->cbKey)) { ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER); return SCOSSL_FAILURE; } - - OPENSSL_clear_free(ctx->hkdfCtx->pbKey, ctx->hkdfCtx->cbKey); - ctx->hkdfCtx->pbKey = pbKey; - ctx->hkdfCtx->cbKey = cbKey; } // Parameters may contain multiple info params that must all be processed @@ -420,7 +410,7 @@ SCOSSL_STATUS p_scossl_hkdf_derive(_In_ SCOSSL_PROV_HKDF_CTX *ctx, * */ static -SCOSSL_STATUS p_scossl_tls13_hkdf_expand(_In_ SCOSSL_HKDF_CTX *ctx, +SCOSSL_STATUS p_scossl_tls13_hkdf_expand(_In_ SCOSSL_HKDF_CTX *ctx, _Out_writes_bytes_(keylen) unsigned char *key, size_t keylen) { SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR; @@ -428,30 +418,30 @@ SCOSSL_STATUS p_scossl_tls13_hkdf_expand(_In_ SCOSSL_HKDF_CTX *ctx, SYMCRYPT_HKDF_EXPANDED_KEY scExpandedKey; SIZE_T labelLen = 0; SIZE_T totalLen = 0; - + BYTE hkdflabel[HKDF_MAXBUF]; SIZE_T hkdflabellen = 0; - - if (ctx->md == NULL) + + if (ctx->md == NULL) { ERR_raise(ERR_LIB_PROV, PROV_R_MISSING_MESSAGE_DIGEST); return SCOSSL_FAILURE; } - if (ctx->pbKey == NULL) + if (ctx->pbKey == NULL) { ERR_raise(ERR_LIB_PROV, PROV_R_MISSING_KEY); return SCOSSL_FAILURE; } symcryptHmacAlg = scossl_get_symcrypt_hmac_algorithm(EVP_MD_type(ctx->md)); - if (symcryptHmacAlg == NULL) + if (symcryptHmacAlg == NULL) { return SCOSSL_FAILURE; } labelLen = ctx->cbPrefix + ctx->cbLabel; - + // Ensure this value does not exceed 0xFF, as only the least-significant byte is copied into hkdflabel. // If the value exceeds 0xFF, it will overflow and corrupt the label encoding. if (labelLen > 0xFF) @@ -459,10 +449,10 @@ SCOSSL_STATUS p_scossl_tls13_hkdf_expand(_In_ SCOSSL_HKDF_CTX *ctx, ERR_raise(ERR_LIB_PROV, PROV_R_LENGTH_TOO_LARGE); return SCOSSL_FAILURE; } - + // 2 bytes for output length, 1 byte for label length, and 1 byte for context length totalLen = 2 + 1 + labelLen + 1 + ctx->cbData; - if (totalLen > HKDF_MAXBUF) + if (totalLen > HKDF_MAXBUF) { ERR_raise(ERR_LIB_PROV, PROV_R_LENGTH_TOO_LARGE); return SCOSSL_FAILURE; @@ -480,7 +470,7 @@ SCOSSL_STATUS p_scossl_tls13_hkdf_expand(_In_ SCOSSL_HKDF_CTX *ctx, hkdflabellen += ctx->cbPrefix; memcpy(hkdflabel + hkdflabellen, ctx->pbLabel, ctx->cbLabel); hkdflabellen += ctx->cbLabel; - + if (ctx->cbData > 0xFF) { ERR_raise(ERR_LIB_PROV, PROV_R_LENGTH_TOO_LARGE); @@ -490,7 +480,7 @@ SCOSSL_STATUS p_scossl_tls13_hkdf_expand(_In_ SCOSSL_HKDF_CTX *ctx, hkdflabel[hkdflabellen++] = (BYTE)ctx->cbData; // Context - if (ctx->cbData > 0) + if (ctx->cbData > 0) { memcpy(hkdflabel + hkdflabellen, ctx->pbData, ctx->cbData); hkdflabellen += ctx->cbData; @@ -519,32 +509,32 @@ SCOSSL_STATUS p_scossl_tls13_hkdf_expand(_In_ SCOSSL_HKDF_CTX *ctx, } static -SCOSSL_STATUS p_scossl_tls13kdf_generate_secret(_In_ SCOSSL_HKDF_CTX *ctx, +SCOSSL_STATUS p_scossl_tls13kdf_generate_secret(_In_ SCOSSL_HKDF_CTX *ctx, _Out_writes_bytes_(keylen) unsigned char *key, size_t keylen) { SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR; SCOSSL_STATUS status = SCOSSL_FAILURE; PCSYMCRYPT_MAC symcryptHmacAlg = NULL; BYTE *default_zeros = NULL; - BYTE empty_hash[EVP_MAX_MD_SIZE]; + BYTE empty_hash[EVP_MAX_MD_SIZE]; BYTE expanded_secret[EVP_MAX_MD_SIZE]; SCOSSL_HKDF_CTX *dupCtx; SIZE_T mdlen = 0; PBYTE pbSavedKey; SIZE_T cbSavedKey = 0; - + if (ctx == NULL || ctx->md == NULL) { ERR_raise(ERR_LIB_PROV, PROV_R_MISSING_MESSAGE_DIGEST); return SCOSSL_FAILURE; } - + symcryptHmacAlg = scossl_get_symcrypt_hmac_algorithm(EVP_MD_type(ctx->md)); - if (symcryptHmacAlg == NULL) + if (symcryptHmacAlg == NULL) { return SCOSSL_FAILURE; } - + mdlen = EVP_MD_get_size(ctx->md); if (mdlen <= 0) { @@ -558,21 +548,21 @@ SCOSSL_STATUS p_scossl_tls13kdf_generate_secret(_In_ SCOSSL_HKDF_CTX *ctx, ERR_raise(ERR_LIB_PROV, ERR_R_MALLOC_FAILURE); return SCOSSL_FAILURE; } - + default_zeros = OPENSSL_zalloc(EVP_MAX_MD_SIZE); if (default_zeros == NULL) { ERR_raise(ERR_LIB_PROV, ERR_R_MALLOC_FAILURE); goto cleanup; } - - if (dupCtx->pbKey == NULL) + + if (dupCtx->pbKey == NULL) { dupCtx->pbKey = default_zeros; dupCtx->cbKey = mdlen; } - if (dupCtx->pbSalt == NULL) + if (dupCtx->pbSalt == NULL) { dupCtx->pbSalt = default_zeros; dupCtx->cbSalt = mdlen; @@ -596,7 +586,7 @@ SCOSSL_STATUS p_scossl_tls13kdf_generate_secret(_In_ SCOSSL_HKDF_CTX *ctx, dupCtx->pbKey = dupCtx->pbSalt; dupCtx->cbKey = dupCtx->cbSalt; - if (SCOSSL_SUCCESS != p_scossl_tls13_hkdf_expand(dupCtx, expanded_secret, keylen)) + if (SCOSSL_SUCCESS != p_scossl_tls13_hkdf_expand(dupCtx, expanded_secret, keylen)) { goto cleanup; } @@ -613,7 +603,7 @@ SCOSSL_STATUS p_scossl_tls13kdf_generate_secret(_In_ SCOSSL_HKDF_CTX *ctx, dupCtx->pbKey, dupCtx->cbKey, dupCtx->pbSalt, dupCtx->cbSalt, key, keylen); - if (scError != SYMCRYPT_NO_ERROR) + if (scError != SYMCRYPT_NO_ERROR) { SCOSSL_PROV_LOG_SYMCRYPT_ERROR("SymCryptHkdfExtractPrk failed", scError); goto cleanup; @@ -636,7 +626,7 @@ SCOSSL_STATUS p_scossl_tls13kdf_derive(_In_ SCOSSL_PROV_HKDF_CTX *ctx, ERR_raise(ERR_LIB_PROV, ERR_R_PASSED_NULL_PARAMETER); return SCOSSL_FAILURE; } - + if (!p_scossl_tls13kdf_set_ctx_params(ctx, params)) { ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER); diff --git a/SymCryptProvider/src/kdf/p_scossl_kbkdf.c b/SymCryptProvider/src/kdf/p_scossl_kbkdf.c index 137af014..9c3eb06f 100644 --- a/SymCryptProvider/src/kdf/p_scossl_kbkdf.c +++ b/SymCryptProvider/src/kdf/p_scossl_kbkdf.c @@ -30,7 +30,7 @@ typedef struct SIZE_T cbLabel; PCSYMCRYPT_MAC pMac; - UINT macType; + UINT8 macType; SIZE_T cbCmacKey; const SCOSSL_KMAC_EXTENSIONS *pMacEx; } SCOSSL_PROV_KBKDF_CTX; diff --git a/SymCryptProvider/src/kdf/p_scossl_pbkdf2.c b/SymCryptProvider/src/kdf/p_scossl_pbkdf2.c index dfc1eb89..b055f4d0 100644 --- a/SymCryptProvider/src/kdf/p_scossl_pbkdf2.c +++ b/SymCryptProvider/src/kdf/p_scossl_pbkdf2.c @@ -153,7 +153,7 @@ SCOSSL_STATUS p_scossl_pbkdf2_derive(_In_ SCOSSL_PROV_PBKDF2_CTX *ctx, ERR_raise(ERR_LIB_PROV, PROV_R_MISSING_MESSAGE_DIGEST); return SCOSSL_FAILURE; } - + if (!ctx->initialized) { scError = SymCryptPbkdf2ExpandKey(&ctx->expandedKey, ctx->pMac, ctx->pbPassword, ctx->cbPassword); @@ -187,15 +187,18 @@ SCOSSL_STATUS p_scossl_pbkdf2_derive(_In_ SCOSSL_PROV_PBKDF2_CTX *ctx, } } - scError = SymCryptPbkdf2Derive( - &ctx->expandedKey, - ctx->pbSalt, ctx->cbSalt, - ctx->iterationCount, - key, keylen); - if (scError != SYMCRYPT_NO_ERROR) + if (keylen > 0) { - SCOSSL_PROV_LOG_SYMCRYPT_ERROR("SymCryptPbkdf2Derive failed", scError); - return SCOSSL_FAILURE; + scError = SymCryptPbkdf2Derive( + &ctx->expandedKey, + ctx->pbSalt, ctx->cbSalt, + ctx->iterationCount, + key, keylen); + if (scError != SYMCRYPT_NO_ERROR) + { + SCOSSL_PROV_LOG_SYMCRYPT_ERROR("SymCryptPbkdf2Derive failed", scError); + return SCOSSL_FAILURE; + } } return SCOSSL_SUCCESS; @@ -231,6 +234,20 @@ SCOSSL_STATUS p_scossl_pbkdf2_set_ctx_params(_Inout_ SCOSSL_PROV_PBKDF2_CTX *ctx SCOSSL_STATUS ret = SCOSSL_FAILURE; const OSSL_PARAM *p; + if ((p = OSSL_PARAM_locate_const(params, OSSL_KDF_PARAM_PKCS5)) != NULL) + { + int pkcs5; + + if (!OSSL_PARAM_get_int(p, &pkcs5)) + { + ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER); + goto cleanup; + } + + ctx->checkMinSizes = pkcs5 == 0; + } + + if ((p = OSSL_PARAM_locate_const(params, OSSL_KDF_PARAM_PASSWORD)) != NULL) { OPENSSL_secure_clear_free(ctx->pbPassword, ctx->cbPassword); @@ -262,6 +279,12 @@ SCOSSL_STATUS p_scossl_pbkdf2_set_ctx_params(_Inout_ SCOSSL_PROV_PBKDF2_CTX *ctx if ((p = OSSL_PARAM_locate_const(params, OSSL_KDF_PARAM_SALT)) != NULL) { + if (ctx->checkMinSizes && p->data_size < SCOSSL_PBKDF2_MIN_SALT_LEN) + { + ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_SALT_LENGTH); + goto cleanup; + } + OPENSSL_free(ctx->pbSalt); ctx->pbSalt = NULL; ctx->cbSalt = 0; @@ -270,7 +293,7 @@ SCOSSL_STATUS p_scossl_pbkdf2_set_ctx_params(_Inout_ SCOSSL_PROV_PBKDF2_CTX *ctx { ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER); goto cleanup; - } + } } if ((p = OSSL_PARAM_locate_const(params, OSSL_KDF_PARAM_DIGEST)) != NULL) @@ -301,24 +324,24 @@ SCOSSL_STATUS p_scossl_pbkdf2_set_ctx_params(_Inout_ SCOSSL_PROV_PBKDF2_CTX *ctx ctx->initialized = FALSE; } - if ((p = OSSL_PARAM_locate_const(params, OSSL_KDF_PARAM_ITER)) != NULL && - !OSSL_PARAM_get_uint64(p, &ctx->iterationCount)) + if ((p = OSSL_PARAM_locate_const(params, OSSL_KDF_PARAM_ITER)) != NULL) { - ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER); - goto cleanup; - } + uint64_t iterationCount; + uint64_t minIterationCount = ctx->checkMinSizes ? SCOSSL_PBKDF2_MIN_ITERATIONS : 1; - if ((p = OSSL_PARAM_locate_const(params, OSSL_KDF_PARAM_PKCS5)) != NULL) - { - int pkcs5; - - if (!OSSL_PARAM_get_int(p, &pkcs5)) + if (!OSSL_PARAM_get_uint64(p, &iterationCount)) { ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER); goto cleanup; } - ctx->checkMinSizes = pkcs5 == 0; + if (iterationCount < minIterationCount) + { + ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_ITERATION_COUNT); + goto cleanup; + } + + ctx->iterationCount = iterationCount; } ret = SCOSSL_SUCCESS; diff --git a/SymCryptProvider/src/kdf/p_scossl_tls1prf.c b/SymCryptProvider/src/kdf/p_scossl_tls1prf.c index b8b0d44d..22191a5a 100644 --- a/SymCryptProvider/src/kdf/p_scossl_tls1prf.c +++ b/SymCryptProvider/src/kdf/p_scossl_tls1prf.c @@ -231,19 +231,14 @@ SCOSSL_STATUS p_scossl_tls1prf_set_ctx_params(_Inout_ SCOSSL_PROV_TLS1_PRF_CTX * if ((p = OSSL_PARAM_locate_const(params, OSSL_KDF_PARAM_SECRET)) != NULL) { - PBYTE pbSecret = NULL; - SIZE_T cbSecret = 0; + OPENSSL_clear_free(ctx->tls1prfCtx->pbSecret, ctx->tls1prfCtx->cbSecret); + ctx->tls1prfCtx->pbSecret = NULL; - if (p->data_size > 0 && - !OSSL_PARAM_get_octet_string(p, (void **)&pbSecret, 0, &cbSecret)) + if (!OSSL_PARAM_get_octet_string(p, (void **)&ctx->tls1prfCtx->pbSecret, 0, &ctx->tls1prfCtx->cbSecret)) { ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER); goto cleanup; } - - OPENSSL_clear_free(ctx->tls1prfCtx->pbSecret, ctx->tls1prfCtx->cbSecret); - ctx->tls1prfCtx->pbSecret = pbSecret; - ctx->tls1prfCtx->cbSecret = cbSecret; } // Parameters may contain multiple seed params that must all be processed diff --git a/SymCryptProvider/src/keyexch/p_scossl_dh.c b/SymCryptProvider/src/keyexch/p_scossl_dh.c index 402be1a6..670df5ed 100644 --- a/SymCryptProvider/src/keyexch/p_scossl_dh.c +++ b/SymCryptProvider/src/keyexch/p_scossl_dh.c @@ -28,7 +28,7 @@ typedef struct SCOSSL_PROV_DH_KEY_CTX *provKey; SCOSSL_PROV_DH_KEY_CTX *peerProvKey; - UINT pad; + BOOL pad; // X9.42 parameters enum scossl_kdf_type kdfType; @@ -323,6 +323,10 @@ static SCOSSL_STATUS p_scossl_dh_derive(_In_ SCOSSL_DH_CTX *ctx, static SCOSSL_STATUS p_scossl_dh_set_ctx_params(_Inout_ SCOSSL_DH_CTX *ctx, _In_ const OSSL_PARAM params[]) { + const char *mdName = NULL; + const char *mdProps = NULL; + EVP_MD *md = NULL; + SCOSSL_STATUS ret = SCOSSL_FAILURE; const OSSL_PARAM *p = NULL; if ((p = OSSL_PARAM_locate_const(params, OSSL_EXCHANGE_PARAM_PAD)) != NULL) @@ -331,10 +335,10 @@ static SCOSSL_STATUS p_scossl_dh_set_ctx_params(_Inout_ SCOSSL_DH_CTX *ctx, _In_ if (!OSSL_PARAM_get_uint(p, &pad)) { ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER); - return SCOSSL_FAILURE; + goto cleanup; } - ctx->pad = pad ? 1 : 0; + ctx->pad = pad ? TRUE : FALSE; } if ((p = OSSL_PARAM_locate_const(params, OSSL_EXCHANGE_PARAM_KDF_TYPE)) != NULL) @@ -344,7 +348,7 @@ static SCOSSL_STATUS p_scossl_dh_set_ctx_params(_Inout_ SCOSSL_DH_CTX *ctx, _In_ kdfType == NULL) { ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER); - return SCOSSL_FAILURE; + goto cleanup; } if (kdfType[0] =='\0') @@ -358,32 +362,48 @@ static SCOSSL_STATUS p_scossl_dh_set_ctx_params(_Inout_ SCOSSL_DH_CTX *ctx, _In_ else { ERR_raise(ERR_LIB_PROV, PROV_R_NOT_SUPPORTED); - return SCOSSL_FAILURE; + goto cleanup; } } if ((p = OSSL_PARAM_locate_const(params, OSSL_EXCHANGE_PARAM_KDF_DIGEST)) != NULL) { - OPENSSL_free(ctx->kdfMdName); - ctx->kdfMdName = NULL; - - if (!OSSL_PARAM_get_utf8_string(p, &ctx->kdfMdName, 0)) + if (!OSSL_PARAM_get_utf8_string(p, &mdName, 0)) { ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER); - return SCOSSL_FAILURE; + goto cleanup; } - } - if ((p = OSSL_PARAM_locate_const(params, OSSL_EXCHANGE_PARAM_KDF_DIGEST_PROPS)) != NULL) - { + if ((p = OSSL_PARAM_locate_const(params, OSSL_EXCHANGE_PARAM_KDF_DIGEST_PROPS)) != NULL) + { + if (!OSSL_PARAM_get_utf8_string(p, &mdProps, 0)) + { + ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER); + goto cleanup; + } + } + + OPENSSL_free(ctx->kdfMdName); OPENSSL_free(ctx->kdfMdProps); + ctx->kdfMdName = NULL; ctx->kdfMdProps = NULL; - if (!OSSL_PARAM_get_utf8_string(p, &ctx->kdfMdProps, 0)) + if ((md = EVP_MD_fetch(ctx->libCtx, mdName, mdProps)) == NULL) { - ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER); - return SCOSSL_FAILURE; + ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_DIGEST); + goto cleanup; + } + + if (EVP_MD_xof(md)) + { + ERR_raise(ERR_LIB_PROV, PROV_R_XOF_DIGESTS_NOT_ALLOWED); + goto cleanup; } + + ctx->kdfMdName = mdName; + ctx->kdfMdProps = mdProps; + mdName = NULL; + mdProps = NULL; } if ((p = OSSL_PARAM_locate_const(params, OSSL_KDF_PARAM_CEK_ALG)) != NULL) @@ -394,7 +414,7 @@ static SCOSSL_STATUS p_scossl_dh_set_ctx_params(_Inout_ SCOSSL_DH_CTX *ctx, _In_ if (!OSSL_PARAM_get_utf8_string(p, &ctx->kdfCekAlg, 0)) { ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER); - return SCOSSL_FAILURE; + goto cleanup; } } @@ -409,7 +429,7 @@ static SCOSSL_STATUS p_scossl_dh_set_ctx_params(_Inout_ SCOSSL_DH_CTX *ctx, _In_ !OSSL_PARAM_get_octet_string(p, (void **)(&ctx->kdfUkm), 0, &ctx->kdfUkmlen)) { ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER); - return SCOSSL_FAILURE; + goto cleanup; } } @@ -417,10 +437,17 @@ static SCOSSL_STATUS p_scossl_dh_set_ctx_params(_Inout_ SCOSSL_DH_CTX *ctx, _In_ !OSSL_PARAM_get_size_t(p, &ctx->kdfOutlen)) { ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER); - return SCOSSL_FAILURE; + goto cleanup; } - return SCOSSL_SUCCESS; + ret = SCOSSL_SUCCESS; + +cleanup: + OPENSSL_free(mdName); + OPENSSL_free(mdProps); + EVP_MD_free(md); + + return ret; } static const OSSL_PARAM *p_scossl_dh_ctx_settable_params(ossl_unused void *ctx, ossl_unused void *provctx) diff --git a/SymCryptProvider/src/keymgmt/p_scossl_rsa_keymgmt.c b/SymCryptProvider/src/keymgmt/p_scossl_rsa_keymgmt.c index 0cdace31..c70fb6b3 100644 --- a/SymCryptProvider/src/keymgmt/p_scossl_rsa_keymgmt.c +++ b/SymCryptProvider/src/keymgmt/p_scossl_rsa_keymgmt.c @@ -17,7 +17,7 @@ typedef struct { OSSL_LIB_CTX *libctx; // May be set for PSS - UINT keyType; + UINT32 keyType; SCOSSL_RSA_PSS_RESTRICTIONS *pssRestrictions; UINT32 nBitsOfModulus; @@ -226,19 +226,26 @@ static SCOSSL_STATUS p_scossl_rsa_keymgmt_dup_keydata(_In_ PCSYMCRYPT_RSAKEY fro static SCOSSL_PROV_RSA_KEY_CTX *p_scossl_rsa_keymgmt_dup_ctx(_In_ const SCOSSL_PROV_RSA_KEY_CTX *keyCtx, int selection) { - SCOSSL_PROV_RSA_KEY_CTX *copyCtx = OPENSSL_zalloc(sizeof(SCOSSL_PROV_RSA_KEY_CTX)); - if (copyCtx == NULL) + SCOSSL_PROV_RSA_KEY_CTX *copyCtx; + BOOL includePrivate = (selection & OSSL_KEYMGMT_SELECT_PRIVATE_KEY) != 0; + + if ((selection & OSSL_KEYMGMT_SELECT_KEYPAIR) == 0) { return NULL; } + if ((copyCtx = OPENSSL_zalloc(sizeof(SCOSSL_PROV_RSA_KEY_CTX))) == NULL) + { + ERR_raise(ERR_LIB_PROV, ERR_R_MALLOC_FAILURE); + return NULL; + } + copyCtx->initialized = keyCtx->initialized; copyCtx->keyType = keyCtx->keyType; - if (keyCtx->initialized && (selection & OSSL_KEYMGMT_SELECT_KEYPAIR) != 0) + if (keyCtx->initialized) { - if (!p_scossl_rsa_keymgmt_dup_keydata((PCSYMCRYPT_RSAKEY) keyCtx->key, ©Ctx->key, - (selection & OSSL_KEYMGMT_SELECT_PRIVATE_KEY) != 0)) + if (p_scossl_rsa_keymgmt_dup_keydata((PCSYMCRYPT_RSAKEY) keyCtx->key, ©Ctx->key, includePrivate) != SCOSSL_SUCCESS) { p_scossl_rsa_keymgmt_free_ctx(copyCtx); return NULL; @@ -250,7 +257,8 @@ static SCOSSL_PROV_RSA_KEY_CTX *p_scossl_rsa_keymgmt_dup_ctx(_In_ const SCOSSL_P #endif } - if (keyCtx->keyType == RSA_FLAG_TYPE_RSASSAPSS && keyCtx->pssRestrictions != NULL) + if (keyCtx->keyType == RSA_FLAG_TYPE_RSASSAPSS && + keyCtx->pssRestrictions != NULL) { if ((copyCtx->pssRestrictions = OPENSSL_memdup(keyCtx->pssRestrictions, sizeof(SCOSSL_RSA_PSS_RESTRICTIONS))) == NULL) { @@ -351,7 +359,7 @@ static void p_scossl_rsa_keygen_cleanup(_Inout_ SCOSSL_RSA_KEYGEN_CTX *genCtx) } static SCOSSL_RSA_KEYGEN_CTX *p_scossl_rsa_keygen_init_common(_In_ SCOSSL_PROVCTX *provctx, int selection, - _In_ const OSSL_PARAM params[], UINT keyType) + _In_ const OSSL_PARAM params[], UINT32 keyType) { // Sanity check if ((selection & OSSL_KEYMGMT_SELECT_KEYPAIR) == 0) @@ -418,11 +426,11 @@ static SCOSSL_PROV_RSA_KEY_CTX *p_scossl_rsa_keygen(_In_ SCOSSL_RSA_KEYGEN_CTX * SCOSSL_PROV_LOG_ERROR(ERR_R_INTERNAL_ERROR, "SymCryptRsakeyAllocate failed"); goto cleanup; } - + if (genCtx->nBitsOfModulus < SYMCRYPT_RSAKEY_FIPS_MIN_BITSIZE_MODULUS) { genFlags |= SYMCRYPT_FLAG_KEY_NO_FIPS; - SCOSSL_PROV_LOG_SYMCRYPT_INFO("Generating RSA key with size < %u bits. This operation is not FIPS compliant.", + SCOSSL_PROV_LOG_SYMCRYPT_INFO("Generating RSA key with size < %u bits. This operation is not FIPS compliant.", SYMCRYPT_RSAKEY_FIPS_MIN_BITSIZE_MODULUS); } diff --git a/SymCryptProvider/src/p_scossl_names.h b/SymCryptProvider/src/p_scossl_names.h index 05b8f940..fbb57d82 100644 --- a/SymCryptProvider/src/p_scossl_names.h +++ b/SymCryptProvider/src/p_scossl_names.h @@ -15,18 +15,18 @@ extern "C" { // Digests #define SCOSSL_ALG_NAME_MD5 SN_md5":SSL3-MD5:1.2.840.113549.2.5" #define SCOSSL_ALG_NAME_SHA1 SN_sha1":SHA-1:SSL3-SHA1:1.3.14.3.2.26" -#define SCOSSL_ALG_NAME_SHA224 SN_sha224":SHA2-224:SHA-224:2.16.840.1.101.3.4.2.4" -#define SCOSSL_ALG_NAME_SHA256 SN_sha256":SHA2-256:SHA-256:2.16.840.1.101.3.4.2.1" -#define SCOSSL_ALG_NAME_SHA384 SN_sha384":SHA2-384:SHA-384:2.16.840.1.101.3.4.2.2" -#define SCOSSL_ALG_NAME_SHA512 SN_sha512":SHA2-512:SHA-512:2.16.840.1.101.3.4.2.3" -#define SCOSSL_ALG_NAME_SHA512_224 SN_sha512_224":SHA2-512/224:SHA-512/224:2.16.840.1.101.3.4.2.5" -#define SCOSSL_ALG_NAME_SHA512_256 SN_sha512_256":SHA2-512/256:SHA-512/256:2.16.840.1.101.3.4.2.6" +#define SCOSSL_ALG_NAME_SHA224 "SHA2-224:SHA-224:"SN_sha224":2.16.840.1.101.3.4.2.4" +#define SCOSSL_ALG_NAME_SHA256 "SHA2-256:SHA-256:"SN_sha256":2.16.840.1.101.3.4.2.1" +#define SCOSSL_ALG_NAME_SHA384 "SHA2-384:SHA-384:"SN_sha384":2.16.840.1.101.3.4.2.2" +#define SCOSSL_ALG_NAME_SHA512 "SHA2-512:SHA-512:"SN_sha512":2.16.840.1.101.3.4.2.3" +#define SCOSSL_ALG_NAME_SHA512_224 "SHA2-512/224:SHA-512/224:"SN_sha512_224":2.16.840.1.101.3.4.2.5" +#define SCOSSL_ALG_NAME_SHA512_256 "SHA2-512/256:SHA-512/256:"SN_sha512_256":2.16.840.1.101.3.4.2.6" #define SCOSSL_ALG_NAME_SHA3_224 SN_sha3_224":2.16.840.1.101.3.4.2.7" #define SCOSSL_ALG_NAME_SHA3_256 SN_sha3_256":2.16.840.1.101.3.4.2.8" #define SCOSSL_ALG_NAME_SHA3_384 SN_sha3_384":2.16.840.1.101.3.4.2.9" #define SCOSSL_ALG_NAME_SHA3_512 SN_sha3_512":2.16.840.1.101.3.4.2.10" -#define SCOSSL_ALG_NAME_SHAKE128 SN_shake128":SHAKE-128:2.16.840.1.101.3.4.2.11" -#define SCOSSL_ALG_NAME_SHAKE256 SN_shake256":SHAKE-256:2.16.840.1.101.3.4.2.12" +#define SCOSSL_ALG_NAME_SHAKE128 "SHAKE-128:"SN_shake128":2.16.840.1.101.3.4.2.11" +#define SCOSSL_ALG_NAME_SHAKE256 "SHAKE-256:"SN_shake256":2.16.840.1.101.3.4.2.12" #define SCOSSL_ALG_NAME_CSHAKE128 "CSHAKE-128:CSHAKE128" #define SCOSSL_ALG_NAME_CSHAKE256 "CSHAKE-256:CSHAKE256" @@ -43,20 +43,20 @@ extern "C" { #define SCOSSL_ALG_NAME_AES_128_CFB8 SN_aes_128_cfb8 #define SCOSSL_ALG_NAME_AES_192_CFB8 SN_aes_192_cfb8 #define SCOSSL_ALG_NAME_AES_256_CFB8 SN_aes_256_cfb8 -#define SCOSSL_ALG_NAME_AES_128_GCM SN_aes_128_gcm":AES-128-GCM:2.16.840.1.101.3.4.1.6" -#define SCOSSL_ALG_NAME_AES_192_GCM SN_aes_192_gcm":AES-192-GCM:2.16.840.1.101.3.4.1.26" -#define SCOSSL_ALG_NAME_AES_256_GCM SN_aes_256_gcm":AES-256-GCM:2.16.840.1.101.3.4.1.46" -#define SCOSSL_ALG_NAME_AES_128_CCM SN_aes_128_ccm":AES-128-CCM:2.16.840.1.101.3.4.1.7" -#define SCOSSL_ALG_NAME_AES_192_CCM SN_aes_192_ccm":AES-192-CCM:2.16.840.1.101.3.4.1.27" -#define SCOSSL_ALG_NAME_AES_256_CCM SN_aes_256_ccm":AES-256-CCM:2.16.840.1.101.3.4.1.47" +#define SCOSSL_ALG_NAME_AES_128_GCM "AES-128-GCM:"SN_aes_128_gcm":2.16.840.1.101.3.4.1.6" +#define SCOSSL_ALG_NAME_AES_192_GCM "AES-192-GCM:"SN_aes_192_gcm":2.16.840.1.101.3.4.1.26" +#define SCOSSL_ALG_NAME_AES_256_GCM "AES-256-GCM:"SN_aes_256_gcm":2.16.840.1.101.3.4.1.46" +#define SCOSSL_ALG_NAME_AES_128_CCM "AES-128-CCM:"SN_aes_128_ccm":2.16.840.1.101.3.4.1.7" +#define SCOSSL_ALG_NAME_AES_192_CCM "AES-192-CCM:"SN_aes_192_ccm":2.16.840.1.101.3.4.1.27" +#define SCOSSL_ALG_NAME_AES_256_CCM "AES-256-CCM:"SN_aes_256_ccm":2.16.840.1.101.3.4.1.47" #define SCOSSL_ALG_NAME_AES_128_XTS SN_aes_128_xts":1.3.111.2.1619.0.1.1" #define SCOSSL_ALG_NAME_AES_256_XTS SN_aes_256_xts":1.3.111.2.1619.0.1.2" // MAC #define SCOSSL_ALG_NAME_CMAC SN_cmac #define SCOSSL_ALG_NAME_HMAC SN_hmac -#define SCOSSL_ALG_NAME_KMAC128 SN_kmac128":KMAC-128:KMAC128:2.16.840.1.101.3.4.2.19" -#define SCOSSL_ALG_NAME_KMAC256 SN_kmac256":KMAC-256:KMAC256:2.16.840.1.101.3.4.2.20" +#define SCOSSL_ALG_NAME_KMAC128 "KMAC-128:"SN_kmac128":2.16.840.1.101.3.4.2.19" +#define SCOSSL_ALG_NAME_KMAC256 "KMAC-256:"SN_kmac256":2.16.840.1.101.3.4.2.20" // KDF #define SCOSSL_ALG_NAME_HKDF OSSL_KDF_NAME_HKDF @@ -73,11 +73,11 @@ extern "C" { #define SCOSSL_ALG_NAME_CTR_DBG "CTR-DRBG" // Key management -#define SCOSSL_ALG_NAME_EC SN_X9_62_id_ecPublicKey":EC:1.2.840.10045.2.1" -#define SCOSSL_ALG_NAME_RSA_PSS SN_rsassaPss":RSA-PSS:1.2.840.113549.1.1.10" +#define SCOSSL_ALG_NAME_EC "EC:"SN_X9_62_id_ecPublicKey":1.2.840.10045.2.1" +#define SCOSSL_ALG_NAME_RSA_PSS "RSA-PSS:"SN_rsassaPss":1.2.840.113549.1.1.10" // Key exchange -#define SCOSSL_ALG_NAME_DH LN_dhKeyAgreement":DH:1.2.840.113549.1.3.1" +#define SCOSSL_ALG_NAME_DH "DH:"LN_dhKeyAgreement":1.2.840.113549.1.3.1" #define SCOSSL_ALG_NAME_ECDH "ECDH" #define SCOSSL_ALG_NAME_X25519 SN_X25519":1.3.101.110" diff --git a/SymCryptProvider/src/p_scossl_rsa.c b/SymCryptProvider/src/p_scossl_rsa.c index fea6dce9..1f21c63c 100644 --- a/SymCryptProvider/src/p_scossl_rsa.c +++ b/SymCryptProvider/src/p_scossl_rsa.c @@ -35,7 +35,7 @@ static const OSSL_ITEM p_scossl_rsa_supported_mds[] = { {NID_sha3_512, OSSL_DIGEST_NAME_SHA3_512}}; _Use_decl_annotations_ -const OSSL_ITEM *p_scossl_rsa_get_supported_md(OSSL_LIB_CTX *libctx, UINT padding, +const OSSL_ITEM *p_scossl_rsa_get_supported_md(OSSL_LIB_CTX *libctx, UINT8 padding, const char *mdname, const char *propq, EVP_MD **md) { diff --git a/SymCryptProvider/src/p_scossl_rsa.h b/SymCryptProvider/src/p_scossl_rsa.h index 6d82042a..b0ca9de4 100644 --- a/SymCryptProvider/src/p_scossl_rsa.h +++ b/SymCryptProvider/src/p_scossl_rsa.h @@ -23,7 +23,7 @@ typedef struct OSSL_LIB_CTX *libctx; BOOL initialized; PSYMCRYPT_RSAKEY key; - UINT keyType; + UINT32 keyType; SCOSSL_RSA_PSS_RESTRICTIONS *pssRestrictions; #ifdef KEYSINUSE_ENABLED @@ -32,7 +32,7 @@ typedef struct #endif } SCOSSL_PROV_RSA_KEY_CTX; -const OSSL_ITEM *p_scossl_rsa_get_supported_md(_In_ OSSL_LIB_CTX *libctx, UINT padding, +const OSSL_ITEM *p_scossl_rsa_get_supported_md(_In_ OSSL_LIB_CTX *libctx, UINT8 padding, _In_ const char *mdname, _In_ const char *propq, _Out_opt_ EVP_MD **md); diff --git a/SymCryptProvider/src/signature/p_scossl_ecdsa_signature.c b/SymCryptProvider/src/signature/p_scossl_ecdsa_signature.c index e8e22af0..4ed3a9fd 100644 --- a/SymCryptProvider/src/signature/p_scossl_ecdsa_signature.c +++ b/SymCryptProvider/src/signature/p_scossl_ecdsa_signature.c @@ -200,20 +200,24 @@ static SCOSSL_STATUS p_scossl_ecdsa_sign(_In_ SCOSSL_ECDSA_CTX *ctx, return SCOSSL_SUCCESS; } -static SCOSSL_STATUS p_scossl_ecdsa_verify(_In_ SCOSSL_ECDSA_CTX *ctx, - _In_reads_bytes_(siglen) const unsigned char *sig, size_t siglen, - _In_reads_bytes_(tbslen) const unsigned char *tbs, size_t tbslen) +// Return +// 1 (SCOSSL_SUCCESS) for valid signature +// 0 (SCOSSL_FAILURE) for invalid signature +// -1 for error +static int p_scossl_ecdsa_verify(_In_ SCOSSL_ECDSA_CTX *ctx, + _In_reads_bytes_(siglen) const unsigned char *sig, size_t siglen, + _In_reads_bytes_(tbslen) const unsigned char *tbs, size_t tbslen) { if (ctx == NULL || ctx->keyCtx == NULL) { ERR_raise(ERR_LIB_PROV, PROV_R_NO_KEY_SET); - return SCOSSL_FAILURE; + return -1; } if (ctx->operation != EVP_PKEY_OP_VERIFY) { ERR_raise(ERR_LIB_PROV, ERR_R_OPERATION_FAIL); - return SCOSSL_FAILURE; + return -1; } return scossl_ecdsa_verify(ctx->keyCtx->key, ctx->keyCtx->curve, tbs, tbslen, sig, siglen); @@ -281,7 +285,7 @@ static SCOSSL_STATUS p_scossl_ecdsa_digest_sign_final(_In_ SCOSSL_ECDSA_CTX *ctx _Out_writes_bytes_(*siglen) unsigned char *sig, _Out_ size_t *siglen, size_t sigsize) { BYTE digest[EVP_MAX_MD_SIZE]; - UINT cbDigest = 0; + SIZE_T cbDigest = 0; if (ctx->mdctx == NULL) { @@ -302,11 +306,11 @@ static SCOSSL_STATUS p_scossl_ecdsa_digest_sign_final(_In_ SCOSSL_ECDSA_CTX *ctx return p_scossl_ecdsa_sign(ctx, sig, siglen, sigsize, digest, cbDigest); } -static SCOSSL_STATUS p_scossl_ecdsa_digest_verify_final(_In_ SCOSSL_ECDSA_CTX *ctx, - _In_reads_bytes_(siglen) unsigned char *sig, size_t siglen) +static int p_scossl_ecdsa_digest_verify_final(_In_ SCOSSL_ECDSA_CTX *ctx, + _In_reads_bytes_(siglen) unsigned char *sig, size_t siglen) { BYTE digest[EVP_MAX_MD_SIZE]; - UINT cbDigest = 0; + SIZE_T cbDigest = 0; if (ctx->mdctx == NULL) { @@ -358,7 +362,7 @@ static SCOSSL_STATUS p_scossl_ecdsa_set_ctx_params(_Inout_ SCOSSL_ECDSA_CTX *ctx } if ((p = OSSL_PARAM_locate_const(params, OSSL_SIGNATURE_PARAM_DIGEST_SIZE)) != NULL && - !OSSL_PARAM_get_size_t(p, &ctx->mdSize)) + !OSSL_PARAM_get_SIZE_T(p, &ctx->mdSize)) { ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER); return SCOSSL_FAILURE; @@ -392,7 +396,7 @@ static SCOSSL_STATUS p_scossl_ecdsa_get_ctx_params(_In_ SCOSSL_ECDSA_CTX *ctx, _ } if ((p = OSSL_PARAM_locate(params, OSSL_SIGNATURE_PARAM_DIGEST_SIZE)) != NULL && - !OSSL_PARAM_set_size_t(p, ctx->mdSize)) + !OSSL_PARAM_set_SIZE_T(p, ctx->mdSize)) { ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER); goto cleanup; diff --git a/SymCryptProvider/src/signature/p_scossl_rsa_signature.c b/SymCryptProvider/src/signature/p_scossl_rsa_signature.c index 720be750..81f86b82 100644 --- a/SymCryptProvider/src/signature/p_scossl_rsa_signature.c +++ b/SymCryptProvider/src/signature/p_scossl_rsa_signature.c @@ -18,7 +18,7 @@ extern "C" { typedef struct { SCOSSL_PROV_RSA_KEY_CTX *keyCtx; - UINT padding; + UINT8 padding; int operation; // Needed for fetching md @@ -394,7 +394,7 @@ static SCOSSL_STATUS p_scossl_rsa_digest_sign_final(_In_ SCOSSL_RSA_SIGN_CTX *ct { SCOSSL_STATUS ret = SCOSSL_FAILURE; BYTE digest[EVP_MAX_MD_SIZE]; - UINT cbDigest = 0; + SIZE_T cbDigest = 0; if (ctx->mdctx == NULL) { @@ -415,7 +415,7 @@ static SCOSSL_STATUS p_scossl_rsa_digest_verify_final(_In_ SCOSSL_RSA_SIGN_CTX * _In_reads_bytes_(siglen) unsigned char *sig, size_t siglen) { BYTE digest[EVP_MAX_MD_SIZE]; - UINT cbDigest = 0; + SIZE_T cbDigest = 0; if (ctx->mdctx == NULL) { @@ -491,7 +491,7 @@ static SCOSSL_STATUS p_scossl_rsa_set_ctx_params(_Inout_ SCOSSL_RSA_SIGN_CTX *ct // Padding mode may be passed as legacy NID or string, and is // checked against the padding modes the ScOSSL provider supports int i = 0; - UINT padding; + unsigned int padding; switch (p->data_type) {