Initial support for generalized public key parameters.
authorDr. Stephen Henson <steve@openssl.org>
Fri, 24 Mar 2006 13:46:58 +0000 (13:46 +0000)
committerDr. Stephen Henson <steve@openssl.org>
Fri, 24 Mar 2006 13:46:58 +0000 (13:46 +0000)
crypto/asn1/ameth_lib.c
crypto/asn1/asn1_locl.h
crypto/evp/evp.h
crypto/evp/p_lib.c
crypto/pem/pem.h
crypto/pem/pem_err.c
crypto/pem/pem_pkey.c

index c95ccf0831ce826eab8ae152e464f62b5c118c5d..3616816c1cc353fbcc186b06f4fb76b5a5c745ad 100644 (file)
@@ -70,15 +70,23 @@ extern const EVP_PKEY_ASN1_METHOD eckey_asn1_meth;
 /* Keep this sorted in type order !! */
 const EVP_PKEY_ASN1_METHOD *standard_methods[] = 
        {
+#ifndef OPENSSL_NO_RSA
        &rsa_asn1_meths[0],
        &rsa_asn1_meths[1],
+#endif
+#ifndef OPENSSL_NO_DH
        &dh_asn1_meth,
+#endif
+#ifndef OPENSSL_NO_DSA
        &dsa_asn1_meths[0],
        &dsa_asn1_meths[1],
        &dsa_asn1_meths[2],
        &dsa_asn1_meths[3],
        &dsa_asn1_meths[4],
+#endif
+#ifndef OPENSSL_NO_EC
        &eckey_asn1_meth
+#endif
        };
 
 typedef int sk_cmp_fn_type(const char * const *a, const char * const *b);
@@ -209,11 +217,9 @@ EVP_PKEY_ASN1_METHOD* EVP_PKEY_asn1_new(int id,
        ameth->pub_cmp = 0;
        ameth->pub_print = 0;
 
-
        ameth->priv_decode = 0;
        ameth->priv_encode = 0;
        ameth->priv_print = 0;
-       
 
        ameth->pkey_size = 0;
        ameth->pkey_bits = 0;
@@ -225,7 +231,6 @@ EVP_PKEY_ASN1_METHOD* EVP_PKEY_asn1_new(int id,
        ameth->param_cmp = 0;
        ameth->param_print = 0;
 
-
        ameth->pkey_free = 0;
        ameth->pkey_ctrl = 0;
 
@@ -279,8 +284,9 @@ void EVP_PKEY_asn1_set_private(EVP_PKEY_ASN1_METHOD *ameth,
        }
 
 void EVP_PKEY_asn1_set_param(EVP_PKEY_ASN1_METHOD *ameth,
-               int (*param_decode)(const EVP_PKEY *pk, X509_PUBKEY *pub),
-               int (*param_encode)(X509_PUBKEY *pub, const EVP_PKEY *pk),
+               int (*param_decode)(EVP_PKEY *pkey,
+                               const unsigned char **pder, int derlen),
+               int (*param_encode)(const EVP_PKEY *pkey, unsigned char **pder),
                int (*param_missing)(const EVP_PKEY *pk),
                int (*param_copy)(EVP_PKEY *to, const EVP_PKEY *from),
                int (*param_cmp)(const EVP_PKEY *a, const EVP_PKEY *b),
index 3acb4392d57024971933db663c44f48387e60ba4..d21108d9bbb7a9ba4b801138e314de4783768858 100644 (file)
@@ -1,9 +1,9 @@
 /* asn1t.h */
 /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL
- * project 2005.
+ * project 2006.
  */
 /* ====================================================================
- * Copyright (c) 2005 The OpenSSL Project.  All rights reserved.
+ * Copyright (c) 2006 The OpenSSL Project.  All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -97,8 +97,9 @@ struct evp_pkey_asn1_method_st
        int (*pkey_size)(const EVP_PKEY *pk);
        int (*pkey_bits)(const EVP_PKEY *pk);
 
-       int (*param_decode)(const EVP_PKEY *pk, X509_PUBKEY *pub);
-       int (*param_encode)(X509_PUBKEY *pub, const EVP_PKEY *pk);
+       int (*param_decode)(EVP_PKEY *pkey,
+                               const unsigned char **pder, int derlen);
+       int (*param_encode)(const EVP_PKEY *pkey, unsigned char **pder);
        int (*param_missing)(const EVP_PKEY *pk);
        int (*param_copy)(EVP_PKEY *to, const EVP_PKEY *from);
        int (*param_cmp)(const EVP_PKEY *a, const EVP_PKEY *b);
index 76ed8764c9b0be889ee84fdc2ab8ba1e817c7c40..a367ff97177d119f88ab4d5d0f39ba512e3f77b3 100644 (file)
@@ -777,6 +777,7 @@ int         EVP_PKEY_type(int type);
 int            EVP_PKEY_bits(EVP_PKEY *pkey);
 int            EVP_PKEY_size(EVP_PKEY *pkey);
 int            EVP_PKEY_assign(EVP_PKEY *pkey,int type,char *key);
+void *         EVP_PKEY_get0(EVP_PKEY *pkey);
 
 #ifndef OPENSSL_NO_RSA
 struct rsa_st;
@@ -868,14 +869,17 @@ void EVP_PKEY_asn1_set_private(EVP_PKEY_ASN1_METHOD *ameth,
                int (*priv_encode)(PKCS8_PRIV_KEY_INFO *p8, const EVP_PKEY *pk),
                int (*priv_print)(BIO *out, const EVP_PKEY *pkey, int indent,
                                                        ASN1_PCTX *pctx));
+
 void EVP_PKEY_asn1_set_param(EVP_PKEY_ASN1_METHOD *ameth,
-               int (*param_decode)(const EVP_PKEY *pk, X509_PUBKEY *pub),
-               int (*param_encode)(X509_PUBKEY *pub, const EVP_PKEY *pk),
+               int (*param_decode)(EVP_PKEY *pkey,
+                               const unsigned char **pder, int derlen),
+               int (*param_encode)(const EVP_PKEY *pkey, unsigned char **pder),
                int (*param_missing)(const EVP_PKEY *pk),
                int (*param_copy)(EVP_PKEY *to, const EVP_PKEY *from),
                int (*param_cmp)(const EVP_PKEY *a, const EVP_PKEY *b),
                int (*param_print)(BIO *out, const EVP_PKEY *pkey, int indent,
                                                        ASN1_PCTX *pctx));
+
 void EVP_PKEY_asn1_set_free(EVP_PKEY_ASN1_METHOD *ameth,
                void (*pkey_free)(EVP_PKEY *pkey));
 void EVP_PKEY_asn1_set_ctrl(EVP_PKEY_ASN1_METHOD *ameth,
index f18ac62a0fe98832bde6cfba94cfe2e2d0081f94..0d3a69b48a42862e12fef4266826a488f6de0cb9 100644 (file)
@@ -199,6 +199,11 @@ int EVP_PKEY_assign(EVP_PKEY *pkey, int type, char *key)
        return(key != NULL);
        }
 
+void *EVP_PKEY_get0(EVP_PKEY *pkey)
+       {
+       return pkey->pkey.ptr;
+       }
+
 #ifndef OPENSSL_NO_RSA
 int EVP_PKEY_set1_RSA(EVP_PKEY *pkey, RSA *key)
 {
index f2c5f329adb17eab5166b7b1951465f4ad0b8f0e..b273007c0e984a5aa6e5f93b034dfd174ff256aa 100644 (file)
@@ -133,6 +133,7 @@ extern "C" {
 #define PEM_STRING_ECDSA_PUBLIC "ECDSA PUBLIC KEY"
 #define PEM_STRING_ECPARAMETERS "EC PARAMETERS"
 #define PEM_STRING_ECPRIVATEKEY        "EC PRIVATE KEY"
+#define PEM_STRING_PARAMETERS  "PARAMETERS"
 
   /* Note that this structure is initialised by PEM_SealInit and cleaned up
      by PEM_SealFinal (at least for now) */
@@ -724,6 +725,7 @@ void ERR_load_PEM_strings(void);
 #define PEM_F_PEM_PK8PKEY                               119
 #define PEM_F_PEM_READ                                  108
 #define PEM_F_PEM_READ_BIO                              109
+#define PEM_F_PEM_READ_BIO_PARAMETERS                   140
 #define PEM_F_PEM_READ_BIO_PRIVATEKEY                   123
 #define PEM_F_PEM_READ_PRIVATEKEY                       124
 #define PEM_F_PEM_SEALFINAL                             110
index c43585564b2fcba2124586de8a141310a714e27b..d3352080e16ff6356e6b0cd4002a3de8e98f1af0 100644 (file)
@@ -98,6 +98,7 @@ static ERR_STRING_DATA PEM_str_functs[]=
 {ERR_FUNC(PEM_F_PEM_PK8PKEY),  "PEM_PK8PKEY"},
 {ERR_FUNC(PEM_F_PEM_READ),     "PEM_read"},
 {ERR_FUNC(PEM_F_PEM_READ_BIO), "PEM_read_bio"},
+{ERR_FUNC(PEM_F_PEM_READ_BIO_PARAMETERS),      "PEM_READ_BIO_PARAMETERS"},
 {ERR_FUNC(PEM_F_PEM_READ_BIO_PRIVATEKEY),      "PEM_READ_BIO_PRIVATEKEY"},
 {ERR_FUNC(PEM_F_PEM_READ_PRIVATEKEY),  "PEM_READ_PRIVATEKEY"},
 {ERR_FUNC(PEM_F_PEM_SEALFINAL),        "PEM_SealFinal"},
index aea826e04eae3c41d385a59ee06554b07233aecb..b9067e074545e0aaf2c3d17bfc27428bad63dd4c 100644 (file)
@@ -149,6 +149,60 @@ int PEM_write_bio_PrivateKey(BIO *bp, EVP_PKEY *x, const EVP_CIPHER *enc,
                                pem_str,bp,(char *)x,enc,kstr,klen,cb,u);
        }
 
+EVP_PKEY *PEM_read_bio_Parameters(BIO *bp, EVP_PKEY **x, pem_password_cb *cb, void *u)
+       {
+       char *nm=NULL;
+       const unsigned char *p=NULL;
+       unsigned char *data=NULL;
+       long len;
+       int slen;
+       EVP_PKEY *ret=NULL;
+
+       if (!PEM_bytes_read_bio(&data, &len, &nm, PEM_STRING_PARAMETERS,
+                                                               bp, cb, u))
+               return NULL;
+       p = data;
+
+       if ((slen = pem_check_suffix(nm, "PARAMETERS")) > 0)
+               {
+               const EVP_PKEY_ASN1_METHOD *ameth;
+               ameth = EVP_PKEY_asn1_find_str(nm, slen);
+               if (!ameth || !ameth->param_decode)
+                       goto err;
+               ret = EVP_PKEY_new();
+               if (!ret)
+                       goto err;
+               if (!ameth->param_decode(ret, &p, len))
+                       {
+                       EVP_PKEY_free(ret);
+                       ret = NULL;
+                       goto err;
+                       }
+               if(x)
+                       {
+                       if(*x) EVP_PKEY_free((EVP_PKEY *)*x);
+                       *x = ret;
+                       }
+               }
+err:
+       if (ret == NULL)
+               PEMerr(PEM_F_PEM_READ_BIO_PARAMETERS,ERR_R_ASN1_LIB);
+       OPENSSL_free(nm);
+       OPENSSL_free(data);
+       return(ret);
+       }
+
+int PEM_write_bio_Paramters(BIO *bp, EVP_PKEY *x)
+       {
+       char pem_str[80];
+       if (!x->ameth || !x->ameth->param_encode)
+               return 0;
+
+       BIO_snprintf(pem_str, 80, "%s PARAMETERS", x->ameth->pem_str);
+       return PEM_ASN1_write_bio(
+               (i2d_of_void *)openssl_fcast(x->ameth->param_encode),
+                               pem_str,bp,(char *)x,NULL,NULL,0,0,NULL);
+       }
 
 #ifndef OPENSSL_NO_FP_API
 EVP_PKEY *PEM_read_PrivateKey(FILE *fp, EVP_PKEY **x, pem_password_cb *cb, void *u)