Submitted by: "Victor B. Wagner" <vitus@cryptocom.ru>
authorDr. Stephen Henson <steve@openssl.org>
Wed, 21 Nov 2007 12:39:12 +0000 (12:39 +0000)
committerDr. Stephen Henson <steve@openssl.org>
Wed, 21 Nov 2007 12:39:12 +0000 (12:39 +0000)
Update gost algorithm print routines.

engines/ccgost/e_gost_err.c
engines/ccgost/e_gost_err.h
engines/ccgost/gost_ameth.c

index d483411..e7a4dab 100644 (file)
@@ -109,6 +109,7 @@ static ERR_STRING_DATA GOST_str_functs[]=
 {ERR_FUNC(GOST_F_PKEY_GOST_MAC_CTRL),  "PKEY_GOST_MAC_CTRL"},
 {ERR_FUNC(GOST_F_PKEY_GOST_MAC_CTRL_STR),      "PKEY_GOST_MAC_CTRL_STR"},
 {ERR_FUNC(GOST_F_PKEY_GOST_MAC_KEYGEN),        "PKEY_GOST_MAC_KEYGEN"},
+{ERR_FUNC(GOST_F_PRINT_GOST_01),       "PRINT_GOST_01"},
 {ERR_FUNC(GOST_F_PRIV_DECODE_GOST_94), "PRIV_DECODE_GOST_94"},
 {ERR_FUNC(GOST_F_PRIV_DECODE_MAC),     "PRIV_DECODE_MAC"},
 {ERR_FUNC(GOST_F_PUB_DECODE_GOST01),   "PUB_DECODE_GOST01"},
index a672ed9..2679dda 100644 (file)
@@ -106,6 +106,7 @@ void ERR_GOST_error(int function, int reason, char *file, int line);
 #define GOST_F_PKEY_GOST_MAC_CTRL                       140
 #define GOST_F_PKEY_GOST_MAC_CTRL_STR                   141
 #define GOST_F_PKEY_GOST_MAC_KEYGEN                     142
+#define GOST_F_PRINT_GOST_01                            146
 #define GOST_F_PRIV_DECODE_GOST_94                      117
 #define GOST_F_PRIV_DECODE_MAC                          143
 #define GOST_F_PUB_DECODE_GOST01                        136
index 617b03e..cfc6b4c 100644 (file)
@@ -343,18 +343,132 @@ static int priv_encode_gost(PKCS8_PRIV_KEY_INFO *p8, const EVP_PKEY *pk)
        return PKCS8_pkey_set0(p8,algobj,0,V_ASN1_SEQUENCE,params,
                priv_buf,priv_len);
        }
+/* --------- printing keys --------------------------------*/
+static int print_gost_94(BIO *out, const EVP_PKEY *pkey, int indent,
+       ASN1_PCTX *pctx, int type) 
+       {
+       int param_nid = NID_undef;
+
+       if (type == 2) 
+               {
+               BIGNUM *key;
+
+               if (!BIO_indent(out,indent,128)) return 0;
+               BIO_printf(out,"Private key: ");
+               key = gost_get0_priv_key(pkey);
+               if (!key) 
+                       BIO_printf(out,"<undefined>");
+               else 
+                       BN_print(out,key);
+               BIO_printf(out,"\n");
+               }
+       if (type >= 1)
+               {
+               BIGNUM *pubkey;
+               
+               pubkey = ((DSA *)EVP_PKEY_get0((EVP_PKEY *)pkey))->pub_key;
+               BIO_indent(out,indent,128);
+               BIO_printf(out,"Public key: ");
+               BN_print(out,pubkey);
+               BIO_printf(out,"\n");
+       }       
+
+       param_nid = gost94_nid_by_params(EVP_PKEY_get0((EVP_PKEY *)pkey));
+       BIO_indent(out,indent,128);
+       BIO_printf(out, "Parameter set: %s\n",OBJ_nid2ln(param_nid));
+       return 1;
+}
+
+static int param_print_gost94(BIO *out, const EVP_PKEY *pkey, int indent,
+       ASN1_PCTX *pctx) 
+       {
+       return print_gost_94(out, pkey, indent, pctx,0);
+       }
 
-static int priv_print_gost (BIO *out,const EVP_PKEY *pkey, int indent,
+static int pub_print_gost94(BIO *out, const EVP_PKEY *pkey, int indent,
+       ASN1_PCTX *pctx)
+       {
+       return print_gost_94(out,pkey, indent, pctx,1);
+       }
+static int priv_print_gost94(BIO *out,const EVP_PKEY *pkey, int indent,
        ASN1_PCTX *pctx) 
        {
-       BIGNUM *key;
+       return print_gost_94(out,pkey,indent,pctx,2);
+       }
+
+static int print_gost_01(BIO *out, const EVP_PKEY *pkey, int indent,
+       ASN1_PCTX *pctx, int type)
+       {
+       int param_nid = NID_undef;
+       if (type == 2) 
+               {
+               BIGNUM *key;
+
+               if (!BIO_indent(out,indent,128)) return 0;
+               BIO_printf(out,"Private key: ");
+               key = gost_get0_priv_key(pkey);
+               if (!key) 
+                       BIO_printf(out,"<undefined)");
+               else 
+                       BN_print(out,key);
+               BIO_printf(out,"\n");
+               }
+       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;
+                       }
+               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)) 
+                       {
+                       GOSTerr(GOST_F_PRINT_GOST_01,ERR_R_EC_LIB);
+                       BN_CTX_free(ctx);
+                       return 0;
+                       }
+               if (!BIO_indent(out,indent,128)) return 0;
+               BIO_printf(out,"Public key:\n");
+               if (!BIO_indent(out,indent+3,128)) return 0;
+               BIO_printf(out,"X:");
+               BN_print(out,X);
+               BIO_printf(out,"\n");
+               BIO_indent(out,indent+3,128);
+               BIO_printf(out,"Y:");
+               BN_print(out,Y);
+               BIO_printf(out,"\n");
+               BN_CTX_end(ctx);
+               BN_CTX_free(ctx);
+               }
+
+       param_nid = EC_GROUP_get_curve_name(EC_KEY_get0_group(EVP_PKEY_get0((EVP_PKEY *)pkey)));
        if (!BIO_indent(out,indent,128)) return 0;
-       key = gost_get0_priv_key(pkey);
-       if (!key) return 0;
-       BN_print(out,key);
+       BIO_printf(out,"Parameter set: %s\n",OBJ_nid2ln(param_nid));
        return 1;
+}
+static int param_print_gost01(BIO *out, const EVP_PKEY *pkey, int indent,
+       ASN1_PCTX *pctx) 
+       {       
+       return print_gost_01(out,pkey,indent,pctx,0);
+       }
+static int pub_print_gost01(BIO *out, const EVP_PKEY *pkey, int indent,
+       ASN1_PCTX *pctx)
+       {
+       return print_gost_01(out,pkey, indent, pctx,1);
+       }
+static int priv_print_gost01(BIO *out,const EVP_PKEY *pkey, int indent,
+       ASN1_PCTX *pctx) 
+       {
+       return print_gost_01(out,pkey,indent,pctx,2);
        }
-
 /* ---------------------------------------------------------------------*/
 static int param_missing_gost94(const EVP_PKEY *pk) 
        {
@@ -660,22 +774,8 @@ static int pub_cmp_gost01(const EVP_PKEY *a,const EVP_PKEY *b)
        return ret;
        }
 
-static int pub_print_gost94(BIO *out, const EVP_PKEY *pkey, int indent,
-       ASN1_PCTX *pctx)
-       {
-       const BIGNUM *key;
-       if (!BIO_indent(out,indent,128)) return 0;
-       key = ((DSA *)EVP_PKEY_get0((EVP_PKEY *)pkey))->pub_key;
-       if (!key) return 0;
-       BN_print(out,key);
-       return 1;
-       }
 
-static int pub_print_gost01(BIO *out, const EVP_PKEY *pkey, int indent,
-       ASN1_PCTX *pctx)
-       {
-       return 0;
-       }
+
 
 static int pkey_size_gost(const EVP_PKEY *pk)
        {
@@ -715,11 +815,11 @@ int register_ameth_gost (int nid, EVP_PKEY_ASN1_METHOD **ameth, const char* pems
                        EVP_PKEY_asn1_set_free (*ameth, pkey_free_gost94);
                        EVP_PKEY_asn1_set_private (*ameth, 
                                priv_decode_gost, priv_encode_gost, 
-                               priv_print_gost);
+                               priv_print_gost94);
 
                        EVP_PKEY_asn1_set_param (*ameth, 0, 0,
                                param_missing_gost94, param_copy_gost94, 
-                               param_cmp_gost94,0 );
+                               param_cmp_gost94,param_print_gost94 );
                        EVP_PKEY_asn1_set_public (*ameth,
                                pub_decode_gost94, pub_encode_gost94,
                                pub_cmp_gost94, pub_print_gost94,
@@ -731,11 +831,11 @@ int register_ameth_gost (int nid, EVP_PKEY_ASN1_METHOD **ameth, const char* pems
                        EVP_PKEY_asn1_set_free (*ameth, pkey_free_gost01);
                        EVP_PKEY_asn1_set_private (*ameth, 
                                priv_decode_gost, priv_encode_gost, 
-                               priv_print_gost);
+                               priv_print_gost01);
 
                        EVP_PKEY_asn1_set_param (*ameth, 0, 0,
                                param_missing_gost01, param_copy_gost01, 
-                               param_cmp_gost01, 0);
+                               param_cmp_gost01, param_print_gost01);
                        EVP_PKEY_asn1_set_public (*ameth,
                                pub_decode_gost01, pub_encode_gost01,
                                pub_cmp_gost01, pub_print_gost01,