-- GOST R 34.10
GOSTParameters ::= SEQUENCE {
+ publicKeyParamSet OBJECT IDENTIFIER,
+ digestParamSet OBJECT IDENTIFIER OPTIONAL
+}
+
+GOSTParametersOld ::= SEQUENCE {
publicKeyParamSet OBJECT IDENTIFIER,
digestParamSet OBJECT IDENTIFIER,
encryptionParamSet OBJECT IDENTIFIER OPTIONAL
{ NULL, 2056, "3"},
{ "GOSTParameters", 1610612741, NULL },
{ "publicKeyParamSet", 1073741836, NULL },
+ { "digestParamSet", 16396, NULL },
+ { "GOSTParametersOld", 1610612741, NULL },
+ { "publicKeyParamSet", 1073741836, NULL },
{ "digestParamSet", 1073741836, NULL },
{ "encryptionParamSet", 16396, NULL },
{ "GOSTPrivateKey", 1073741831, NULL },
gnutls_gost_paramset_t param;
if ((ret = asn1_create_element(_gnutls_get_gnutls_asn(),
+ algo == GNUTLS_PK_GOST_01 ?
+ "GNUTLS.GOSTParametersOld" :
"GNUTLS.GOSTParameters",
&spk)) != ASN1_SUCCESS) {
gnutls_assert();
/* Read the digest */
oid_size = sizeof(oid);
ret = asn1_read_value(spk, "digestParamSet", oid, &oid_size);
- if (ret != ASN1_SUCCESS) {
+ if (ret != ASN1_SUCCESS &&
+ ret != ASN1_ELEMENT_NOT_FOUND) {
gnutls_assert();
ret = _gnutls_asn2err(ret);
goto cleanup;
if ((result = asn1_create_element
- (_gnutls_get_gnutls_asn(), "GNUTLS.GOSTParameters", &spk))
+ (_gnutls_get_gnutls_asn(),
+ params->algo == GNUTLS_PK_GOST_01 ?
+ "GNUTLS.GOSTParametersOld" :
+ "GNUTLS.GOSTParameters", &spk))
!= ASN1_SUCCESS) {
gnutls_assert();
return _gnutls_asn2err(result);
goto cleanup;
}
+ /* For compatibility per R 1323565.1.023—2018 provide digest OID only
+ * for GOST-2001 keys or GOST-2012 keys with CryptoPro curves. Do not
+ * set this optional paramter for TC26 curves */
if (params->algo == GNUTLS_PK_GOST_01)
oid = HASH_OID_GOST_R_3411_94_CRYPTOPRO_PARAMS;
- else if (params->algo == GNUTLS_PK_GOST_12_256)
+ else if (params->algo == GNUTLS_PK_GOST_12_256 &&
+ (params->curve == GNUTLS_ECC_CURVE_GOST256CPA ||
+ params->curve == GNUTLS_ECC_CURVE_GOST256CPB ||
+ params->curve == GNUTLS_ECC_CURVE_GOST256CPC ||
+ params->curve == GNUTLS_ECC_CURVE_GOST256CPXA ||
+ params->curve == GNUTLS_ECC_CURVE_GOST256CPXB))
oid = HASH_OID_STREEBOG_256;
- else if (params->algo == GNUTLS_PK_GOST_12_512)
- oid = HASH_OID_STREEBOG_512;
- else {
- gnutls_assert();
- result = GNUTLS_E_INVALID_REQUEST;
- goto cleanup;
- }
+ else
+ oid = NULL;
- if ((result =
- asn1_write_value(spk, "digestParamSet", oid,
- 1)) != ASN1_SUCCESS) {
+ if ((result = asn1_write_value(spk, "digestParamSet", oid, oid ? 1 : 0)) != ASN1_SUCCESS) {
gnutls_assert();
result = _gnutls_asn2err(result);
goto cleanup;
goto cleanup;
}
- if (params->gost_params == _gnutls_gost_paramset_default(params->algo))
- oid = NULL;
+ if (params->algo == GNUTLS_PK_GOST_01) {
+ if (params->gost_params == _gnutls_gost_paramset_default(params->algo))
+ oid = NULL;
- if ((result =
- asn1_write_value(spk, "encryptionParamSet", oid,
- oid ? 1 : 0)) != ASN1_SUCCESS) {
- gnutls_assert();
- result = _gnutls_asn2err(result);
- goto cleanup;
+ if ((result =
+ asn1_write_value(spk, "encryptionParamSet", oid,
+ oid ? 1 : 0)) != ASN1_SUCCESS) {
+ gnutls_assert();
+ result = _gnutls_asn2err(result);
+ goto cleanup;
+ }
}
result = _gnutls_x509_der_encode(spk, "", der, 0);