diff options
author | Dmitry Eremin-Solenikov <dbaryshkov@gmail.com> | 2016-11-21 20:58:00 +0300 |
---|---|---|
committer | Dmitry Eremin-Solenikov <dbaryshkov@gmail.com> | 2018-06-23 12:20:16 +0300 |
commit | 6620dec7c1d91f9bcbd2b95586918b0244ba872d (patch) | |
tree | 2f68a4954208c80be753043d7bfdbe254609418b | |
parent | 498c66ffe5a3f2b0716372fb5dc2448ec626b9ae (diff) | |
download | gnutls-6620dec7c1d91f9bcbd2b95586918b0244ba872d.tar.gz |
Use GOST R 34.11-94 when generating key for PKCS data to be encrypted with GOST 28147-89
Signed-off-by: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
-rw-r--r-- | lib/x509/pkcs7-crypt.c | 41 |
1 files changed, 34 insertions, 7 deletions
diff --git a/lib/x509/pkcs7-crypt.c b/lib/x509/pkcs7-crypt.c index b04922685e..c2b00e61c1 100644 --- a/lib/x509/pkcs7-crypt.c +++ b/lib/x509/pkcs7-crypt.c @@ -1336,6 +1336,7 @@ write_pbkdf2_params(ASN1_TYPE pasn, const struct pbkdf2_params *kdf_params) int result; ASN1_TYPE pbkdf2_asn = ASN1_TYPE_EMPTY; uint8_t tmp[MAX_OID_SIZE]; + const mac_entry_st *me; /* Write the key derivation algorithm */ @@ -1398,9 +1399,22 @@ write_pbkdf2_params(ASN1_TYPE pasn, const struct pbkdf2_params *kdf_params) goto error; } - /* We write an emptry prf. - */ - result = asn1_write_value(pbkdf2_asn, "prf", NULL, 0); + me = _gnutls_mac_to_entry(kdf_params->mac); + if (!me || !me->mac_oid) { + gnutls_assert(); + result = GNUTLS_E_INTERNAL_ERROR; + goto error; + } + + result = asn1_write_value(pbkdf2_asn, "prf.algorithm", + me->mac_oid, strlen(me->mac_oid)); + if (result != ASN1_SUCCESS) { + gnutls_assert(); + result = _gnutls_asn2err(result); + goto error; + } + + result = asn1_write_value(pbkdf2_asn, "prf.parameters", NULL, 0); if (result != ASN1_SUCCESS) { gnutls_assert(); result = _gnutls_asn2err(result); @@ -1583,10 +1597,23 @@ _gnutls_pkcs_generate_key(schema_id schema, */ if (p->pbes2 != 0) { - pbkdf2_hmac_sha1(pass_len, (uint8_t *) password, - kdf_params->iter_count, - kdf_params->salt_size, kdf_params->salt, - kdf_params->key_size, key->data); + if (p->schema == PBES2_GOST28147_89_TC26Z) + kdf_params->mac = GNUTLS_MAC_STREEBOG_256; + else if (p->schema == PBES2_GOST28147_89_CPA || + p->schema == PBES2_GOST28147_89_CPB || + p->schema == PBES2_GOST28147_89_CPC || + p->schema == PBES2_GOST28147_89_CPD) + kdf_params->mac = GNUTLS_MAC_GOSTR_94; + else + kdf_params->mac = GNUTLS_MAC_SHA1; + ret = _gnutls_pbes2_string_to_key(pass_len, password, + kdf_params, + kdf_params->key_size, + key->data); + if (ret < 0) { + gnutls_assert(); + return ret; + } if (enc_params->iv_size) { ret = gnutls_rnd(GNUTLS_RND_NONCE, |