Allow public key ASN1 methods to set PKCS#7 SignerInfo structures.
[openssl.git] / crypto / asn1 / ameth_lib.c
index 6b4690e5b7680240db24e3868081bd3b8ac54e04..8c33ca562587d691245a0270f0a868ffa0352355 100644 (file)
@@ -68,7 +68,7 @@ extern const EVP_PKEY_ASN1_METHOD dh_asn1_meth;
 extern const EVP_PKEY_ASN1_METHOD eckey_asn1_meth;
 
 /* Keep this sorted in type order !! */
-const EVP_PKEY_ASN1_METHOD *standard_methods[] = 
+static const EVP_PKEY_ASN1_METHOD *standard_methods[] = 
        {
 #ifndef OPENSSL_NO_RSA
        &rsa_asn1_meths[0],
@@ -160,19 +160,21 @@ const EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_find_str(const char *str, int len)
        {
        int i;
        const EVP_PKEY_ASN1_METHOD *ameth;
+       if (len == -1)
+               len = strlen(str);
        for (i = 0; i < EVP_PKEY_asn1_get_count(); i++)
                {
                ameth = EVP_PKEY_asn1_get0(i);
                if (ameth->pkey_flags & ASN1_PKEY_ALIAS)
                        continue;
-               if ((strlen(ameth->pem_str) == len) && 
+               if (((int)strlen(ameth->pem_str) == len) && 
                        !strncasecmp(ameth->pem_str, str, len))
                        return ameth;
                }
        return NULL;
        }
 
-int EVP_PKEY_asn1_add(const EVP_PKEY_ASN1_METHOD *ameth)
+int EVP_PKEY_asn1_add0(const EVP_PKEY_ASN1_METHOD *ameth)
        {
        if (app_methods == NULL)
                {
@@ -186,6 +188,17 @@ int EVP_PKEY_asn1_add(const EVP_PKEY_ASN1_METHOD *ameth)
        return 1;
        }
 
+int EVP_PKEY_asn1_add_alias(int to, int from)
+       {
+       EVP_PKEY_ASN1_METHOD *ameth;
+       ameth = EVP_PKEY_asn1_new(from, NULL, NULL);
+       if (!ameth)
+               return 0;
+       ameth->pkey_base_id = to;
+       ameth->pkey_flags |= ASN1_PKEY_ALIAS;
+       return EVP_PKEY_asn1_add0(ameth);
+       }
+
 int EVP_PKEY_asn1_get0_info(int *ppkey_id, int *ppkey_base_id, int *ppkey_flags,
                                const char **pinfo, const char **ppem_str,
                                        const EVP_PKEY_ASN1_METHOD *ameth)
@@ -327,7 +340,7 @@ void EVP_PKEY_asn1_set_free(EVP_PKEY_ASN1_METHOD *ameth,
        }
 
 void EVP_PKEY_asn1_set_ctrl(EVP_PKEY_ASN1_METHOD *ameth,
-               void (*pkey_ctrl)(EVP_PKEY *pkey, int op,
+               int (*pkey_ctrl)(EVP_PKEY *pkey, int op,
                                                        long arg1, void *arg2))
        {
        ameth->pkey_ctrl = pkey_ctrl;