Fix parsing PBKDF2 params.
Signed-off-by: Pol Henarejos <pol.henarejos@cttc.es>
This commit is contained in:
@@ -45,7 +45,7 @@ static int pkcs5_parse_pbkdf2_params( const mbedtls_asn1_buf *params,
|
|||||||
unsigned char *p = params->p;
|
unsigned char *p = params->p;
|
||||||
const unsigned char *end = params->p + params->len;
|
const unsigned char *end = params->p + params->len;
|
||||||
|
|
||||||
if( params->tag != ( MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) )
|
if (params->tag != (MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE))
|
||||||
return( MBEDTLS_ERROR_ADD( MBEDTLS_ERR_PKCS5_INVALID_FORMAT,
|
return( MBEDTLS_ERROR_ADD( MBEDTLS_ERR_PKCS5_INVALID_FORMAT,
|
||||||
MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) );
|
MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) );
|
||||||
/*
|
/*
|
||||||
@@ -70,8 +70,7 @@ static int pkcs5_parse_pbkdf2_params( const mbedtls_asn1_buf *params,
|
|||||||
if( p == end )
|
if( p == end )
|
||||||
return( 0 );
|
return( 0 );
|
||||||
|
|
||||||
if( ( ret = mbedtls_asn1_get_int( &p, end, keylen ) ) != 0 )
|
if( ( ret = mbedtls_asn1_get_int( &p, end, keylen ) ) != 0 ) {
|
||||||
{
|
|
||||||
if( ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG )
|
if( ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG )
|
||||||
return( MBEDTLS_ERROR_ADD( MBEDTLS_ERR_PKCS5_INVALID_FORMAT, ret ) );
|
return( MBEDTLS_ERROR_ADD( MBEDTLS_ERR_PKCS5_INVALID_FORMAT, ret ) );
|
||||||
}
|
}
|
||||||
@@ -298,7 +297,7 @@ int cmd_cipher_sym() {
|
|||||||
}
|
}
|
||||||
else if (memcmp(oid, OID_PKCS5_PBKDF2, oid_len) == 0) {
|
else if (memcmp(oid, OID_PKCS5_PBKDF2, oid_len) == 0) {
|
||||||
int iterations = 0, keylen = 0;
|
int iterations = 0, keylen = 0;
|
||||||
mbedtls_asn1_buf salt, params = { .p = enc, .len = enc_len };
|
mbedtls_asn1_buf salt, params = { .p = enc, .len = enc_len, .tag = (MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE) };
|
||||||
mbedtls_md_type_t md_type = MBEDTLS_MD_SHA1;
|
mbedtls_md_type_t md_type = MBEDTLS_MD_SHA1;
|
||||||
mbedtls_md_context_t md_ctx;
|
mbedtls_md_context_t md_ctx;
|
||||||
|
|
||||||
@@ -322,7 +321,7 @@ int cmd_cipher_sym() {
|
|||||||
res_APDU_size = keylen ? keylen : (apdu.ne > 0 && apdu.ne < 65536 ? apdu.ne : 32);
|
res_APDU_size = keylen ? keylen : (apdu.ne > 0 && apdu.ne < 65536 ? apdu.ne : 32);
|
||||||
}
|
}
|
||||||
else if (memcmp(oid, OID_PKCS5_PBES2, oid_len) == 0) {
|
else if (memcmp(oid, OID_PKCS5_PBES2, oid_len) == 0) {
|
||||||
mbedtls_asn1_buf params = { .p = aad, .len = aad_len };
|
mbedtls_asn1_buf params = { .p = aad, .len = aad_len, .tag = (MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE) };
|
||||||
int r = mbedtls_pkcs5_pbes2(¶ms, algo == ALGO_EXT_CIPHER_ENCRYPT ? MBEDTLS_PKCS5_ENCRYPT : MBEDTLS_PKCS5_DECRYPT, kdata, key_size, enc, enc_len, res_APDU);
|
int r = mbedtls_pkcs5_pbes2(¶ms, algo == ALGO_EXT_CIPHER_ENCRYPT ? MBEDTLS_PKCS5_ENCRYPT : MBEDTLS_PKCS5_DECRYPT, kdata, key_size, enc, enc_len, res_APDU);
|
||||||
mbedtls_platform_zeroize(kdata, sizeof(kdata));
|
mbedtls_platform_zeroize(kdata, sizeof(kdata));
|
||||||
if (r != 0) {
|
if (r != 0) {
|
||||||
@@ -332,15 +331,15 @@ int cmd_cipher_sym() {
|
|||||||
}
|
}
|
||||||
else if (memcmp(oid, OID_KDF_X963, oid_len) == 0) {
|
else if (memcmp(oid, OID_KDF_X963, oid_len) == 0) {
|
||||||
mbedtls_md_type_t md_type = MBEDTLS_MD_SHA1;
|
mbedtls_md_type_t md_type = MBEDTLS_MD_SHA1;
|
||||||
if (memcmp(enc, OID_ECKA_DH_X963KDF_SHA1, enc_len) == 0)
|
if (memcmp(enc, OID_HMAC_SHA1, enc_len) == 0)
|
||||||
md_type = MBEDTLS_MD_SHA1;
|
md_type = MBEDTLS_MD_SHA1;
|
||||||
else if (memcmp(enc, OID_ECKA_DH_X963KDF_SHA224, enc_len) == 0)
|
else if (memcmp(enc, OID_HMAC_SHA224, enc_len) == 0)
|
||||||
md_type = MBEDTLS_MD_SHA224;
|
md_type = MBEDTLS_MD_SHA224;
|
||||||
else if (memcmp(enc, OID_ECKA_DH_X963KDF_SHA256, enc_len) == 0)
|
else if (memcmp(enc, OID_HMAC_SHA256, enc_len) == 0)
|
||||||
md_type = MBEDTLS_MD_SHA256;
|
md_type = MBEDTLS_MD_SHA256;
|
||||||
else if (memcmp(enc, OID_ECKA_DH_X963KDF_SHA384, enc_len) == 0)
|
else if (memcmp(enc, OID_HMAC_SHA384, enc_len) == 0)
|
||||||
md_type = MBEDTLS_MD_SHA384;
|
md_type = MBEDTLS_MD_SHA384;
|
||||||
else if (memcmp(enc, OID_ECKA_DH_X963KDF_SHA512, enc_len) == 0)
|
else if (memcmp(enc, OID_HMAC_SHA512, enc_len) == 0)
|
||||||
md_type = MBEDTLS_MD_SHA512;
|
md_type = MBEDTLS_MD_SHA512;
|
||||||
int r = mbedtls_ansi_x936_kdf(md_type, key_size, kdata, aad_len, aad, apdu.ne > 0 && apdu.ne < 65536 ? apdu.ne : 32, res_APDU);
|
int r = mbedtls_ansi_x936_kdf(md_type, key_size, kdata, aad_len, aad, apdu.ne > 0 && apdu.ne < 65536 ? apdu.ne : 32, res_APDU);
|
||||||
mbedtls_platform_zeroize(kdata, sizeof(kdata));
|
mbedtls_platform_zeroize(kdata, sizeof(kdata));
|
||||||
|
|||||||
Reference in New Issue
Block a user