Use properly local variables for thread-safety.
[openssl.git] / engines / ccgost / gost_ameth.c
index cfc6b4ca608b17ae1a89bc134739f3a9c5007f23..16a99ac2b2cf6ae16510dd8e80b1b672e8988f06 100644 (file)
@@ -7,10 +7,12 @@
  *       for OpenSSL                                                  *
  *          Requires OpenSSL 0.9.9 for compilation                    *
  **********************************************************************/
+#include <string.h>
+#include <openssl/crypto.h>
+#include <openssl/err.h>
 #include <openssl/engine.h>
 #include <openssl/evp.h>
 #include <openssl/asn1.h>
-#include <string.h>
 #include "gost_params.h"
 #include "gost_lcl.h"
 #include "e_gost_err.h"
@@ -294,7 +296,7 @@ static int priv_decode_gost( EVP_PKEY *pk, PKCS8_PRIV_KEY_INFO *p8inf)
                ASN1_OCTET_STRING *s = d2i_ASN1_OCTET_STRING(NULL,&p,priv_len);
                if (!s||s->length !=32) 
                        {
-                       GOSTerr(GOST_F_PRIV_DECODE_GOST_94,
+                       GOSTerr(GOST_F_PRIV_DECODE_GOST,
                                EVP_R_DECODE_ERROR);
                        return 0;       
                        }
@@ -313,7 +315,7 @@ static int priv_decode_gost( EVP_PKEY *pk, PKCS8_PRIV_KEY_INFO *p8inf)
                ASN1_INTEGER_free(priv_key);
                if (!ret)
                        {
-                       GOSTerr(GOST_F_PRIV_DECODE_GOST_94,
+                       GOSTerr(GOST_F_PRIV_DECODE_GOST,
                                EVP_R_DECODE_ERROR);
                        return 0;       
                        }
@@ -413,20 +415,21 @@ static int print_gost_01(BIO *out, const EVP_PKEY *pkey, int indent,
                        BN_print(out,key);
                BIO_printf(out,"\n");
                }
-       if (type >=1) 
+       if (type >= 1) 
                {
                BN_CTX *ctx = BN_CTX_new();
                BIGNUM *X,*Y;
                const EC_POINT *pubkey;
                const EC_GROUP *group;
-               BN_CTX_start(ctx);
-               X= BN_CTX_get(ctx);
-               Y=BN_CTX_get(ctx);
+
                if (!ctx) 
                        {
                        GOSTerr(GOST_F_PRINT_GOST_01,ERR_R_MALLOC_FAILURE);
                        return 0;
                        }
+               BN_CTX_start(ctx);
+               X = BN_CTX_get(ctx);
+               Y = BN_CTX_get(ctx);
                pubkey = EC_KEY_get0_public_key((EC_KEY *)EVP_PKEY_get0((EVP_PKEY *)pkey));
                group = EC_KEY_get0_group((EC_KEY *)EVP_PKEY_get0((EVP_PKEY *)pkey));
                if (!EC_POINT_get_affine_coordinates_GFp(group,pubkey,X,Y,ctx)) 
@@ -528,7 +531,7 @@ static int param_copy_gost01(EVP_PKEY *to, const EVP_PKEY *from)
                }       
        if (!efrom) 
                {
-               GOSTerr(GOST_F_PARAM_COPY_GOST94,
+               GOSTerr(GOST_F_PARAM_COPY_GOST01,
                        GOST_R_KEY_PARAMETERS_MISSING);
                return 0;
                }       
@@ -653,7 +656,7 @@ static int pub_decode_gost01(EVP_PKEY *pk,X509_PUBKEY *pub)
        octet = d2i_ASN1_OCTET_STRING(NULL,&pubkey_buf,pub_len);
        if (!octet) 
                {
-               GOSTerr(GOST_F_PUB_DECODE_GOST94,ERR_R_MALLOC_FAILURE);
+               GOSTerr(GOST_F_PUB_DECODE_GOST01,ERR_R_MALLOC_FAILURE);
                return 0;
                }       
        databuf = OPENSSL_malloc(octet->length);
@@ -803,6 +806,59 @@ static int mac_ctrl_gost(EVP_PKEY *pkey, int op, long arg1, void *arg2)
                }
        return -2;
 }      
+
+static int gost94_param_encode(const EVP_PKEY *pkey, unsigned char **pder) 
+{
+   int nid=gost94_nid_by_params(EVP_PKEY_get0((EVP_PKEY *)pkey));
+   return i2d_ASN1_OBJECT(OBJ_nid2obj(nid),pder);
+}
+static int gost2001_param_encode(const EVP_PKEY *pkey, unsigned char **pder) 
+{
+   int nid = EC_GROUP_get_curve_name(EC_KEY_get0_group(EVP_PKEY_get0((EVP_PKEY *)pkey)));
+   return i2d_ASN1_OBJECT(OBJ_nid2obj(nid),pder);
+}
+
+static int gost94_param_decode(EVP_PKEY *pkey, const unsigned char **pder, int derlen)
+{
+       ASN1_OBJECT *obj=NULL;
+       DSA *dsa = EVP_PKEY_get0(pkey);
+       int nid;
+       if (d2i_ASN1_OBJECT(&obj,pder,derlen)==NULL) {
+               return 0;
+       }
+       nid = OBJ_obj2nid(obj);
+       ASN1_OBJECT_free(obj);
+       if (!dsa) 
+               {
+               dsa=DSA_new();
+               if (!EVP_PKEY_assign(pkey,NID_id_GostR3410_94,dsa)) return 0;
+               }
+       if (!fill_GOST94_params(dsa,nid)) return 0;
+       return 1;
+}      
+
+static int gost2001_param_decode(EVP_PKEY *pkey, const unsigned char **pder, int derlen) {
+       ASN1_OBJECT *obj=NULL;
+       int nid;
+       EC_KEY *ec = EVP_PKEY_get0(pkey);
+       if (d2i_ASN1_OBJECT(&obj,pder,derlen)==NULL) {
+               return 0;
+       }
+       nid = OBJ_obj2nid(obj);
+       ASN1_OBJECT_free(obj);
+       if (!ec) 
+               {
+               ec = EC_KEY_new();
+               if (!EVP_PKEY_assign(pkey,NID_id_GostR3410_2001,ec)) return 0;
+               }       
+       if (!fill_GOST2001_params(ec, nid)) return 0;
+       return 1;
+}      
+
+
+
+
+
 /* ----------------------------------------------------------------------*/
 int register_ameth_gost (int nid, EVP_PKEY_ASN1_METHOD **ameth, const char* pemstr, const char* info) 
        {
@@ -817,7 +873,8 @@ int register_ameth_gost (int nid, EVP_PKEY_ASN1_METHOD **ameth, const char* pems
                                priv_decode_gost, priv_encode_gost, 
                                priv_print_gost94);
 
-                       EVP_PKEY_asn1_set_param (*ameth, 0, 0,
+                       EVP_PKEY_asn1_set_param (*ameth, 
+                               gost94_param_decode, gost94_param_encode,
                                param_missing_gost94, param_copy_gost94, 
                                param_cmp_gost94,param_print_gost94 );
                        EVP_PKEY_asn1_set_public (*ameth,
@@ -833,7 +890,8 @@ int register_ameth_gost (int nid, EVP_PKEY_ASN1_METHOD **ameth, const char* pems
                                priv_decode_gost, priv_encode_gost, 
                                priv_print_gost01);
 
-                       EVP_PKEY_asn1_set_param (*ameth, 0, 0,
+                       EVP_PKEY_asn1_set_param (*ameth, 
+                               gost2001_param_decode, gost2001_param_encode,
                                param_missing_gost01, param_copy_gost01, 
                                param_cmp_gost01, param_print_gost01);
                        EVP_PKEY_asn1_set_public (*ameth,