X-Git-Url: http://wagner.pp.ru/gitweb/?a=blobdiff_plain;f=gost_ameth.c;h=5089e2a21adf1184f6edebed1b3889471ba6610f;hb=25729ddc501fecd873943450dec45e15d885c20f;hp=b2333a4ea6cc32c348122f59489b0dd9894eaaec;hpb=dd84ee9c14ddb4e49569410c6442296f84c1a7ca;p=openssl-gost%2Fengine.git diff --git a/gost_ameth.c b/gost_ameth.c index b2333a4..5089e2a 100644 --- a/gost_ameth.c +++ b/gost_ameth.c @@ -19,6 +19,8 @@ #include "gost_lcl.h" #include "e_gost_err.h" +#define PK_WRAP_PARAM "LEGACY_PK_WRAP" + /* * Pack bignum into byte buffer of given size, filling all leading bytes by * zeros @@ -415,10 +417,11 @@ static int priv_encode_gost(PKCS8_PRIV_KEY_INFO *p8, const EVP_PKEY *pk) { ASN1_OBJECT *algobj = OBJ_nid2obj(EVP_PKEY_base_id(pk)); ASN1_STRING *params = encode_gost_algor_params(pk); - unsigned char /**priv_buf = NULL,*/ *buf = NULL; - int key_len = pkey_bits_gost(pk), /*priv_len = 0,*/ i = 0; + unsigned char *buf = NULL; + int key_len = pkey_bits_gost(pk), i = 0; + /* unmasked private key */ + const char *pk_format = get_gost_engine_param(GOST_PARAM_PK_FORMAT); - /*ASN1_STRING *octet = NULL;*/ if (!params) { return 0; } @@ -440,18 +443,23 @@ static int priv_encode_gost(PKCS8_PRIV_KEY_INFO *p8, const EVP_PKEY *pk) buf[key_len - 1 - i] = tmp; } -/* - octet = ASN1_STRING_new(); - ASN1_OCTET_STRING_set(octet, buf, key_len); + if(pk_format != NULL && strcmp(pk_format, PK_WRAP_PARAM) == 0) { + ASN1_STRING *octet = NULL; + int priv_len = 0; + unsigned char *priv_buf = NULL; - priv_len = i2d_ASN1_OCTET_STRING(octet, &priv_buf); - ASN1_STRING_free(octet); - OPENSSL_free(buf); + octet = ASN1_STRING_new(); + ASN1_OCTET_STRING_set(octet, buf, key_len); + priv_len = i2d_ASN1_OCTET_STRING(octet, &priv_buf); + ASN1_STRING_free(octet); + OPENSSL_free(buf); + + return PKCS8_pkey_set0(p8, algobj, 0, V_ASN1_SEQUENCE, params, + priv_buf, priv_len); + } return PKCS8_pkey_set0(p8, algobj, 0, V_ASN1_SEQUENCE, params, - priv_buf, priv_len); */ - return PKCS8_pkey_set0(p8, algobj, 0, V_ASN1_SEQUENCE, params, - buf, key_len); + buf, key_len); } /* --------- printing keys --------------------------------*/ @@ -641,11 +649,11 @@ static int pub_decode_gost_ec(EVP_PKEY *pk, X509_PUBKEY *pub) const unsigned char *pubkey_buf = NULL; unsigned char *databuf; ASN1_OBJECT *palgobj = NULL; - int pub_len, i, j; + int pub_len; EC_POINT *pub_key; BIGNUM *X, *Y; ASN1_OCTET_STRING *octet = NULL; - int len; + size_t len; const EC_GROUP *group; if (!X509_PUBKEY_get0_param(&palgobj, &pubkey_buf, &pub_len, &palg, pub)) @@ -698,8 +706,8 @@ static int pub_encode_gost_ec(X509_PUBKEY *pub, const EVP_PKEY *pk) ASN1_OBJECT *algobj = NULL; ASN1_OCTET_STRING *octet = NULL; void *pval = NULL; - unsigned char *buf = NULL, *databuf = NULL, *sptr; - int i, j, data_len, ret = -1; + unsigned char *buf = NULL, *databuf = NULL; + int data_len, ret = -1; const EC_POINT *pub_key; BIGNUM *X = NULL, *Y = NULL, *order = NULL; const EC_KEY *ec = EVP_PKEY_get0((EVP_PKEY *)pk); @@ -834,6 +842,30 @@ static int mac_ctrl_gost_12(EVP_PKEY *pkey, int op, long arg1, void *arg2) return -2; } +static int mac_ctrl_magma(EVP_PKEY *pkey, int op, long arg1, void *arg2) +{ + switch (op) { + case ASN1_PKEY_CTRL_DEFAULT_MD_NID: + if (arg2) { + *(int *)arg2 = NID_magma_mac; + return 2; + } + } + return -2; +} + +static int mac_ctrl_grasshopper(EVP_PKEY *pkey, int op, long arg1, void *arg2) +{ + switch (op) { + case ASN1_PKEY_CTRL_DEFAULT_MD_NID: + if (arg2) { + *(int *)arg2 = NID_grasshopper_mac; + return 2; + } + } + return -2; +} + static int gost2001_param_encode(const EVP_PKEY *pkey, unsigned char **pder) { int nid = @@ -914,6 +946,14 @@ int register_ameth_gost(int nid, EVP_PKEY_ASN1_METHOD **ameth, EVP_PKEY_asn1_set_free(*ameth, mackey_free_gost); EVP_PKEY_asn1_set_ctrl(*ameth, mac_ctrl_gost_12); break; + case NID_magma_mac: + EVP_PKEY_asn1_set_free(*ameth, mackey_free_gost); + EVP_PKEY_asn1_set_ctrl(*ameth, mac_ctrl_magma); + break; + case NID_grasshopper_mac: + EVP_PKEY_asn1_set_free(*ameth, mackey_free_gost); + EVP_PKEY_asn1_set_ctrl(*ameth, mac_ctrl_grasshopper); + break; } return 1; }