aboutsummaryrefslogtreecommitdiff
path: root/gost_gost2015.c
diff options
context:
space:
mode:
authorDmitry Belyavskiy <beldmit@gmail.com>2020-05-09 13:18:32 +0300
committerDmitry Belyavskiy <beldmit@gmail.com>2020-05-09 13:18:32 +0300
commit15066ba010e653efb062087f81d86e1ede1692cf (patch)
tree86e6d3cb41a53bec1d05707913a3239a0ef6f4bc /gost_gost2015.c
parent3c0db93862faa4b5f302bf6f310c5f86f4dded24 (diff)
downloadgost-engine-15066ba010e653efb062087f81d86e1ede1692cf.zip
gost-engine-15066ba010e653efb062087f81d86e1ede1692cf.tar.gz
gost-engine-15066ba010e653efb062087f81d86e1ede1692cf.tar.bz2
Refactoring unprotected attributes processing
Diffstat (limited to 'gost_gost2015.c')
-rw-r--r--gost_gost2015.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/gost_gost2015.c b/gost_gost2015.c
index c0a914d..a9e3d35 100644
--- a/gost_gost2015.c
+++ b/gost_gost2015.c
@@ -120,3 +120,23 @@ end:
GOST2015_CIPHER_PARAMS_free(gcp);
return ret;
}
+
+int gost2015_process_unprotected_attributes(STACK_OF(X509_ATTRIBUTE) *attrs,
+ int encryption, size_t mac_len, unsigned char *final_tag)
+{
+ if (encryption == 0) /*Decrypting*/ {
+ ASN1_OCTET_STRING *osExpectedMac = X509at_get0_data_by_OBJ(attrs,
+ OBJ_txt2obj(OID_GOST_CMS_MAC, 1), -3, V_ASN1_OCTET_STRING);
+
+ if (!osExpectedMac || osExpectedMac->length != (int)mac_len)
+ return -1;
+
+ memcpy(final_tag, osExpectedMac->data, osExpectedMac->length);
+ } else {
+ if (attrs == NULL)
+ return -1;
+ return (X509at_add1_attr_by_OBJ(&attrs, OBJ_txt2obj(OID_GOST_CMS_MAC, 1),
+ V_ASN1_OCTET_STRING, final_tag, mac_len) == NULL) ? -1 : 1;
+ }
+ return 1;
+}