Remove references to o_time.h
[openssl.git] / crypto / asn1 / ameth_lib.c
index cfaef87555892cb11fd6d569227b90428c9d8d52..5fff22612010cb7bd069d35f24e1e28f980c414b 100644 (file)
@@ -1,4 +1,4 @@
-/* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL
+/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
  * project 2006.
  */
 /* ====================================================================
 extern const EVP_PKEY_ASN1_METHOD rsa_asn1_meths[];
 extern const EVP_PKEY_ASN1_METHOD dsa_asn1_meths[];
 extern const EVP_PKEY_ASN1_METHOD dh_asn1_meth;
+extern const EVP_PKEY_ASN1_METHOD dhx_asn1_meth;
 extern const EVP_PKEY_ASN1_METHOD eckey_asn1_meth;
 extern const EVP_PKEY_ASN1_METHOD hmac_asn1_meth;
+extern const EVP_PKEY_ASN1_METHOD cmac_asn1_meth;
 
 /* Keep this sorted in type order !! */
 static const EVP_PKEY_ASN1_METHOD *standard_methods[] = 
@@ -90,11 +92,16 @@ static const EVP_PKEY_ASN1_METHOD *standard_methods[] =
 #ifndef OPENSSL_NO_EC
        &eckey_asn1_meth,
 #endif
-       &hmac_asn1_meth
+       &hmac_asn1_meth,
+       &cmac_asn1_meth,
+#ifndef OPENSSL_NO_DH
+       &dhx_asn1_meth
+#endif
        };
 
 typedef int sk_cmp_fn_type(const char * const *a, const char * const *b);
-static STACK *app_methods = NULL;
+DECLARE_STACK_OF(EVP_PKEY_ASN1_METHOD)
+static STACK_OF(EVP_PKEY_ASN1_METHOD) *app_methods = NULL;
 
 
 
@@ -111,17 +118,23 @@ void main()
        }
 #endif
 
+DECLARE_OBJ_BSEARCH_CMP_FN(const EVP_PKEY_ASN1_METHOD *,
+                          const EVP_PKEY_ASN1_METHOD *, ameth);
+
 static int ameth_cmp(const EVP_PKEY_ASN1_METHOD * const *a,
-                const EVP_PKEY_ASN1_METHOD * const *b)
+                    const EVP_PKEY_ASN1_METHOD * const *b)
        {
         return ((*a)->pkey_id - (*b)->pkey_id);
        }
 
+IMPLEMENT_OBJ_BSEARCH_CMP_FN(const EVP_PKEY_ASN1_METHOD *,
+                            const EVP_PKEY_ASN1_METHOD *, ameth);
+
 int EVP_PKEY_asn1_get_count(void)
        {
        int num = sizeof(standard_methods)/sizeof(EVP_PKEY_ASN1_METHOD *);
        if (app_methods)
-               num += sk_num(app_methods);
+               num += sk_EVP_PKEY_ASN1_METHOD_num(app_methods);
        return num;
        }
 
@@ -133,26 +146,24 @@ const EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_get0(int idx)
        if (idx < num)
                return standard_methods[idx];
        idx -= num;
-       return (const EVP_PKEY_ASN1_METHOD *)sk_value(app_methods, idx);
+       return sk_EVP_PKEY_ASN1_METHOD_value(app_methods, idx);
        }
 
 static const EVP_PKEY_ASN1_METHOD *pkey_asn1_find(int type)
        {
-       EVP_PKEY_ASN1_METHOD tmp, *t = &tmp, **ret;
+       EVP_PKEY_ASN1_METHOD tmp;
+       const EVP_PKEY_ASN1_METHOD *t = &tmp, **ret;
        tmp.pkey_id = type;
        if (app_methods)
                {
                int idx;
-               idx = sk_find(app_methods, (char *)&tmp);
+               idx = sk_EVP_PKEY_ASN1_METHOD_find(app_methods, &tmp);
                if (idx >= 0)
-                       return (EVP_PKEY_ASN1_METHOD *)
-                               sk_value(app_methods, idx);
+                       return sk_EVP_PKEY_ASN1_METHOD_value(app_methods, idx);
                }
-       ret = (EVP_PKEY_ASN1_METHOD **) OBJ_bsearch((char *)&t,
-                       (char *)standard_methods,
-                       sizeof(standard_methods)/sizeof(EVP_PKEY_ASN1_METHOD *),
-                       sizeof(EVP_PKEY_ASN1_METHOD *),
-                       (int (*)(const void *, const void *))ameth_cmp);
+       ret = OBJ_bsearch_ameth(&t, standard_methods,
+                         sizeof(standard_methods)
+                         /sizeof(EVP_PKEY_ASN1_METHOD *));
        if (!ret || !*ret)
                return NULL;
        return *ret;
@@ -167,7 +178,6 @@ static const EVP_PKEY_ASN1_METHOD *pkey_asn1_find(int type)
 const EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_find(ENGINE **pe, int type)
        {
        const EVP_PKEY_ASN1_METHOD *t;
-       ENGINE *e;
 
        for (;;)
                {
@@ -179,6 +189,7 @@ const EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_find(ENGINE **pe, int type)
        if (pe)
                {
 #ifndef OPENSSL_NO_ENGINE
+               ENGINE *e;
                /* type will contain the final unaliased type */
                e = ENGINE_get_pkey_asn1_meth_engine(type);
                if (e)
@@ -234,13 +245,13 @@ int EVP_PKEY_asn1_add0(const EVP_PKEY_ASN1_METHOD *ameth)
        {
        if (app_methods == NULL)
                {
-               app_methods = sk_new((sk_cmp_fn_type *)ameth_cmp);
+               app_methods = sk_EVP_PKEY_ASN1_METHOD_new(ameth_cmp);
                if (!app_methods)
                        return 0;
                }
-       if (!sk_push(app_methods, (char *)ameth))
+       if (!sk_EVP_PKEY_ASN1_METHOD_push(app_methods, ameth))
                return 0;
-       sk_sort(app_methods);
+       sk_EVP_PKEY_ASN1_METHOD_sort(app_methods);
        return 1;
        }
 
@@ -286,6 +297,8 @@ EVP_PKEY_ASN1_METHOD* EVP_PKEY_asn1_new(int id, int flags,
        if (!ameth)
                return NULL;
 
+       memset(ameth, 0, sizeof(EVP_PKEY_ASN1_METHOD));
+
        ameth->pkey_id = id;
        ameth->pkey_base_id = id;
        ameth->pkey_flags = flags | ASN1_PKEY_DYNAMIC;
@@ -296,6 +309,8 @@ EVP_PKEY_ASN1_METHOD* EVP_PKEY_asn1_new(int id, int flags,
                if (!ameth->info)
                        goto err;
                }
+       else
+               ameth->info = NULL;
 
        if (pem_str)
                {
@@ -303,6 +318,8 @@ EVP_PKEY_ASN1_METHOD* EVP_PKEY_asn1_new(int id, int flags,
                if (!ameth->pem_str)
                        goto err;
                }
+       else
+               ameth->pem_str = NULL;
 
        ameth->pub_decode = 0;
        ameth->pub_encode = 0;
@@ -316,6 +333,9 @@ EVP_PKEY_ASN1_METHOD* EVP_PKEY_asn1_new(int id, int flags,
        ameth->old_priv_encode = 0;
        ameth->old_priv_decode = 0;
 
+       ameth->item_verify = 0;
+       ameth->item_sign = 0;
+
        ameth->pkey_size = 0;
        ameth->pkey_bits = 0;
 
@@ -367,6 +387,9 @@ void EVP_PKEY_asn1_copy(EVP_PKEY_ASN1_METHOD *dst,
        dst->pkey_free = src->pkey_free;
        dst->pkey_ctrl = src->pkey_ctrl;
 
+       dst->item_sign = src->item_sign;
+       dst->item_verify = src->item_verify;
+
        }
 
 void EVP_PKEY_asn1_free(EVP_PKEY_ASN1_METHOD *ameth)