Stack.
authorBen Laurie <ben@openssl.org>
Mon, 31 May 1999 20:35:31 +0000 (20:35 +0000)
committerBen Laurie <ben@openssl.org>
Mon, 31 May 1999 20:35:31 +0000 (20:35 +0000)
crypto/asn1/asn1_mac.h
crypto/asn1/p7_s_e.c
crypto/asn1/p7_signd.c
crypto/pkcs7/pk7_doit.c
crypto/pkcs7/pk7_lib.c
crypto/pkcs7/pkcs7.h
crypto/x509/x509.h
demos/b64.c

index 6edbf06a7d63937095e4486802c724b46ba573ac..a1bbfddc7ffdc55434794862795ca813db390f81 100644 (file)
@@ -352,6 +352,10 @@ err:\
 #define M_ASN1_I2D_len_SET(a,f) \
                ret+=i2d_ASN1_SET(a,NULL,f,V_ASN1_SET,V_ASN1_UNIVERSAL,IS_SET);
 
 #define M_ASN1_I2D_len_SET(a,f) \
                ret+=i2d_ASN1_SET(a,NULL,f,V_ASN1_SET,V_ASN1_UNIVERSAL,IS_SET);
 
+#define M_ASN1_I2D_len_SET_type(type,a,f) \
+               ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,V_ASN1_SET, \
+                                           V_ASN1_UNIVERSAL,IS_SET);
+
 #define M_ASN1_I2D_len_SEQUENCE(a,f) \
                ret+=i2d_ASN1_SET(a,NULL,f,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL, \
                                  IS_SEQUENCE);
 #define M_ASN1_I2D_len_SEQUENCE(a,f) \
                ret+=i2d_ASN1_SET(a,NULL,f,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL, \
                                  IS_SEQUENCE);
@@ -444,6 +448,8 @@ err:\
 
 #define M_ASN1_I2D_put_SET(a,f) i2d_ASN1_SET(a,&p,f,V_ASN1_SET,\
                        V_ASN1_UNIVERSAL,IS_SET)
 
 #define M_ASN1_I2D_put_SET(a,f) i2d_ASN1_SET(a,&p,f,V_ASN1_SET,\
                        V_ASN1_UNIVERSAL,IS_SET)
+#define M_ASN1_I2D_put_SET_type(type,a,f) \
+     i2d_ASN1_SET_OF_##type(a,&p,f,V_ASN1_SET,V_ASN1_UNIVERSAL,IS_SET)
 #define M_ASN1_I2D_put_IMP_SET(a,f,x) i2d_ASN1_SET(a,&p,f,x,\
                        V_ASN1_CONTEXT_SPECIFIC,IS_SET)
 #define M_ASN1_I2D_put_IMP_SET_type(type,a,f,x) \
 #define M_ASN1_I2D_put_IMP_SET(a,f,x) i2d_ASN1_SET(a,&p,f,x,\
                        V_ASN1_CONTEXT_SPECIFIC,IS_SET)
 #define M_ASN1_I2D_put_IMP_SET_type(type,a,f,x) \
index 0a3eeeb65b185bc8c0f068687ed9d86499f40bbc..bf20fd0b6340a310b2cb108d4b4ae087822869d0 100644 (file)
@@ -67,7 +67,7 @@ int i2d_PKCS7_SIGN_ENVELOPE(PKCS7_SIGN_ENVELOPE *a, unsigned char **pp)
 
        M_ASN1_I2D_len(a->version,i2d_ASN1_INTEGER);
        M_ASN1_I2D_len_SET(a->recipientinfo,i2d_PKCS7_RECIP_INFO);
 
        M_ASN1_I2D_len(a->version,i2d_ASN1_INTEGER);
        M_ASN1_I2D_len_SET(a->recipientinfo,i2d_PKCS7_RECIP_INFO);
-       M_ASN1_I2D_len_SET(a->md_algs,i2d_X509_ALGOR);
+       M_ASN1_I2D_len_SET_type(X509_ALGOR,a->md_algs,i2d_X509_ALGOR);
        M_ASN1_I2D_len(a->enc_data,i2d_PKCS7_ENC_CONTENT);
        M_ASN1_I2D_len_IMP_SEQUENCE_opt_type(X509,a->cert,i2d_X509,0);
        M_ASN1_I2D_len_IMP_SET_opt(a->crl,i2d_X509_CRL,1);
        M_ASN1_I2D_len(a->enc_data,i2d_PKCS7_ENC_CONTENT);
        M_ASN1_I2D_len_IMP_SEQUENCE_opt_type(X509,a->cert,i2d_X509,0);
        M_ASN1_I2D_len_IMP_SET_opt(a->crl,i2d_X509_CRL,1);
@@ -77,7 +77,7 @@ int i2d_PKCS7_SIGN_ENVELOPE(PKCS7_SIGN_ENVELOPE *a, unsigned char **pp)
 
        M_ASN1_I2D_put(a->version,i2d_ASN1_INTEGER);
        M_ASN1_I2D_put_SET(a->recipientinfo,i2d_PKCS7_RECIP_INFO);
 
        M_ASN1_I2D_put(a->version,i2d_ASN1_INTEGER);
        M_ASN1_I2D_put_SET(a->recipientinfo,i2d_PKCS7_RECIP_INFO);
-       M_ASN1_I2D_put_SET(a->md_algs,i2d_X509_ALGOR);
+       M_ASN1_I2D_put_SET_type(X509_ALGOR,a->md_algs,i2d_X509_ALGOR);
        M_ASN1_I2D_put(a->enc_data,i2d_PKCS7_ENC_CONTENT);
        M_ASN1_I2D_put_IMP_SEQUENCE_opt_type(X509,a->cert,i2d_X509,0);
        M_ASN1_I2D_put_IMP_SET_opt(a->crl,i2d_X509_CRL,1);
        M_ASN1_I2D_put(a->enc_data,i2d_PKCS7_ENC_CONTENT);
        M_ASN1_I2D_put_IMP_SEQUENCE_opt_type(X509,a->cert,i2d_X509,0);
        M_ASN1_I2D_put_IMP_SET_opt(a->crl,i2d_X509_CRL,1);
@@ -96,7 +96,8 @@ PKCS7_SIGN_ENVELOPE *d2i_PKCS7_SIGN_ENVELOPE(PKCS7_SIGN_ENVELOPE **a,
        M_ASN1_D2I_get(ret->version,d2i_ASN1_INTEGER);
        M_ASN1_D2I_get_set(ret->recipientinfo,d2i_PKCS7_RECIP_INFO,
                PKCS7_RECIP_INFO_free);
        M_ASN1_D2I_get(ret->version,d2i_ASN1_INTEGER);
        M_ASN1_D2I_get_set(ret->recipientinfo,d2i_PKCS7_RECIP_INFO,
                PKCS7_RECIP_INFO_free);
-       M_ASN1_D2I_get_set(ret->md_algs,d2i_X509_ALGOR,X509_ALGOR_free);
+       M_ASN1_D2I_get_set_type(X509_ALGOR,ret->md_algs,d2i_X509_ALGOR,
+                               X509_ALGOR_free);
        M_ASN1_D2I_get(ret->enc_data,d2i_PKCS7_ENC_CONTENT);
        M_ASN1_D2I_get_IMP_set_opt_type(X509,ret->cert,d2i_X509,X509_free,0);
        M_ASN1_D2I_get_IMP_set_opt(ret->crl,d2i_X509_CRL,X509_CRL_free,1);
        M_ASN1_D2I_get(ret->enc_data,d2i_PKCS7_ENC_CONTENT);
        M_ASN1_D2I_get_IMP_set_opt_type(X509,ret->cert,d2i_X509,X509_free,0);
        M_ASN1_D2I_get_IMP_set_opt(ret->crl,d2i_X509_CRL,X509_CRL_free,1);
@@ -115,7 +116,7 @@ PKCS7_SIGN_ENVELOPE *PKCS7_SIGN_ENVELOPE_new(void)
        M_ASN1_New_Malloc(ret,PKCS7_SIGN_ENVELOPE);
        M_ASN1_New(ret->version,ASN1_INTEGER_new);
        M_ASN1_New(ret->recipientinfo,sk_new_null);
        M_ASN1_New_Malloc(ret,PKCS7_SIGN_ENVELOPE);
        M_ASN1_New(ret->version,ASN1_INTEGER_new);
        M_ASN1_New(ret->recipientinfo,sk_new_null);
-       M_ASN1_New(ret->md_algs,sk_new_null);
+       M_ASN1_New(ret->md_algs,sk_X509_ALGOR_new_null);
        M_ASN1_New(ret->enc_data,PKCS7_ENC_CONTENT_new);
        ret->cert=NULL;
        ret->crl=NULL;
        M_ASN1_New(ret->enc_data,PKCS7_ENC_CONTENT_new);
        ret->cert=NULL;
        ret->crl=NULL;
@@ -129,7 +130,7 @@ void PKCS7_SIGN_ENVELOPE_free(PKCS7_SIGN_ENVELOPE *a)
        if (a == NULL) return;
        ASN1_INTEGER_free(a->version);
        sk_pop_free(a->recipientinfo,PKCS7_RECIP_INFO_free);
        if (a == NULL) return;
        ASN1_INTEGER_free(a->version);
        sk_pop_free(a->recipientinfo,PKCS7_RECIP_INFO_free);
-       sk_pop_free(a->md_algs,X509_ALGOR_free);
+       sk_X509_ALGOR_pop_free(a->md_algs,X509_ALGOR_free);
        PKCS7_ENC_CONTENT_free(a->enc_data);
        sk_X509_pop_free(a->cert,X509_free);
        sk_pop_free(a->crl,X509_CRL_free);
        PKCS7_ENC_CONTENT_free(a->enc_data);
        sk_X509_pop_free(a->cert,X509_free);
        sk_pop_free(a->crl,X509_CRL_free);
index 186e6ed0e1ea1ea2b36c856fa6fc917a457fd6ca..1dbde84d4c68ccb8ac656e5c9baf46c1f03cc17e 100644 (file)
@@ -66,7 +66,7 @@ int i2d_PKCS7_SIGNED(PKCS7_SIGNED *a, unsigned char **pp)
        M_ASN1_I2D_vars(a);
 
        M_ASN1_I2D_len(a->version,i2d_ASN1_INTEGER);
        M_ASN1_I2D_vars(a);
 
        M_ASN1_I2D_len(a->version,i2d_ASN1_INTEGER);
-       M_ASN1_I2D_len_SET(a->md_algs,i2d_X509_ALGOR);
+       M_ASN1_I2D_len_SET_type(X509_ALGOR,a->md_algs,i2d_X509_ALGOR);
        M_ASN1_I2D_len(a->contents,i2d_PKCS7);
        M_ASN1_I2D_len_IMP_SEQUENCE_opt_type(X509,a->cert,i2d_X509,0);
        M_ASN1_I2D_len_IMP_SET_opt(a->crl,i2d_X509_CRL,1);
        M_ASN1_I2D_len(a->contents,i2d_PKCS7);
        M_ASN1_I2D_len_IMP_SEQUENCE_opt_type(X509,a->cert,i2d_X509,0);
        M_ASN1_I2D_len_IMP_SET_opt(a->crl,i2d_X509_CRL,1);
@@ -75,7 +75,7 @@ int i2d_PKCS7_SIGNED(PKCS7_SIGNED *a, unsigned char **pp)
        M_ASN1_I2D_seq_total();
 
        M_ASN1_I2D_put(a->version,i2d_ASN1_INTEGER);
        M_ASN1_I2D_seq_total();
 
        M_ASN1_I2D_put(a->version,i2d_ASN1_INTEGER);
-       M_ASN1_I2D_put_SET(a->md_algs,i2d_X509_ALGOR);
+       M_ASN1_I2D_put_SET_type(X509_ALGOR,a->md_algs,i2d_X509_ALGOR);
        M_ASN1_I2D_put(a->contents,i2d_PKCS7);
        M_ASN1_I2D_put_IMP_SEQUENCE_opt_type(X509,a->cert,i2d_X509,0);
        M_ASN1_I2D_put_IMP_SET_opt(a->crl,i2d_X509_CRL,1);
        M_ASN1_I2D_put(a->contents,i2d_PKCS7);
        M_ASN1_I2D_put_IMP_SEQUENCE_opt_type(X509,a->cert,i2d_X509,0);
        M_ASN1_I2D_put_IMP_SET_opt(a->crl,i2d_X509_CRL,1);
@@ -92,7 +92,8 @@ PKCS7_SIGNED *d2i_PKCS7_SIGNED(PKCS7_SIGNED **a, unsigned char **pp,
        M_ASN1_D2I_Init();
        M_ASN1_D2I_start_sequence();
        M_ASN1_D2I_get(ret->version,d2i_ASN1_INTEGER);
        M_ASN1_D2I_Init();
        M_ASN1_D2I_start_sequence();
        M_ASN1_D2I_get(ret->version,d2i_ASN1_INTEGER);
-       M_ASN1_D2I_get_set(ret->md_algs,d2i_X509_ALGOR,X509_ALGOR_free);
+       M_ASN1_D2I_get_set_type(X509_ALGOR,ret->md_algs,d2i_X509_ALGOR,
+                               X509_ALGOR_free);
        M_ASN1_D2I_get(ret->contents,d2i_PKCS7);
        M_ASN1_D2I_get_IMP_set_opt_type(X509,ret->cert,d2i_X509,X509_free,0);
        M_ASN1_D2I_get_IMP_set_opt(ret->crl,d2i_X509_CRL,X509_CRL_free,1);
        M_ASN1_D2I_get(ret->contents,d2i_PKCS7);
        M_ASN1_D2I_get_IMP_set_opt_type(X509,ret->cert,d2i_X509,X509_free,0);
        M_ASN1_D2I_get_IMP_set_opt(ret->crl,d2i_X509_CRL,X509_CRL_free,1);
@@ -109,7 +110,7 @@ PKCS7_SIGNED *PKCS7_SIGNED_new(void)
 
        M_ASN1_New_Malloc(ret,PKCS7_SIGNED);
        M_ASN1_New(ret->version,ASN1_INTEGER_new);
 
        M_ASN1_New_Malloc(ret,PKCS7_SIGNED);
        M_ASN1_New(ret->version,ASN1_INTEGER_new);
-       M_ASN1_New(ret->md_algs,sk_new_null);
+       M_ASN1_New(ret->md_algs,sk_X509_ALGOR_new_null);
        M_ASN1_New(ret->contents,PKCS7_new);
        ret->cert=NULL;
        ret->crl=NULL;
        M_ASN1_New(ret->contents,PKCS7_new);
        ret->cert=NULL;
        ret->crl=NULL;
@@ -122,7 +123,7 @@ void PKCS7_SIGNED_free(PKCS7_SIGNED *a)
        {
        if (a == NULL) return;
        ASN1_INTEGER_free(a->version);
        {
        if (a == NULL) return;
        ASN1_INTEGER_free(a->version);
-       sk_pop_free(a->md_algs,X509_ALGOR_free);
+       sk_X509_ALGOR_pop_free(a->md_algs,X509_ALGOR_free);
        PKCS7_free(a->contents);
        sk_X509_pop_free(a->cert,X509_free);
        sk_pop_free(a->crl,X509_CRL_free);
        PKCS7_free(a->contents);
        sk_X509_pop_free(a->cert,X509_free);
        sk_pop_free(a->crl,X509_CRL_free);
@@ -130,3 +131,5 @@ void PKCS7_SIGNED_free(PKCS7_SIGNED *a)
        Free((char *)a);
        }
 
        Free((char *)a);
        }
 
+IMPLEMENT_STACK_OF(X509_ALGOR)
+IMPLEMENT_ASN1_SET_OF(X509_ALGOR)
index 4222173e36b9360bbc4092c4c55896faad60b963..5a51d64af188588417623a58cc4e290fc9c7ca73 100644 (file)
@@ -73,7 +73,8 @@ BIO *PKCS7_dataInit(PKCS7 *p7, BIO *bio)
        X509_ALGOR *xa;
        const EVP_MD *evp_md;
        const EVP_CIPHER *evp_cipher=NULL;
        X509_ALGOR *xa;
        const EVP_MD *evp_md;
        const EVP_CIPHER *evp_cipher=NULL;
-       STACK *md_sk=NULL,*rsk=NULL;
+       STACK_OF(X509_ALGOR) *md_sk=NULL;
+       STACK *rsk=NULL;
        X509_ALGOR *xalg=NULL;
        PKCS7_RECIP_INFO *ri=NULL;
        EVP_PKEY *pkey;
        X509_ALGOR *xalg=NULL;
        PKCS7_RECIP_INFO *ri=NULL;
        EVP_PKEY *pkey;
@@ -116,9 +117,9 @@ BIO *PKCS7_dataInit(PKCS7 *p7, BIO *bio)
 
        if (md_sk != NULL)
                {
 
        if (md_sk != NULL)
                {
-               for (i=0; i<sk_num(md_sk); i++)
+               for (i=0; i<sk_X509_ALGOR_num(md_sk); i++)
                        {
                        {
-                       xa=(X509_ALGOR *)sk_value(md_sk,i);
+                       xa=sk_X509_ALGOR_value(md_sk,i);
                        if ((btmp=BIO_new(BIO_f_md())) == NULL)
                                {
                                PKCS7err(PKCS7_F_PKCS7_DATAINIT,ERR_R_BIO_LIB);
                        if ((btmp=BIO_new(BIO_f_md())) == NULL)
                                {
                                PKCS7err(PKCS7_F_PKCS7_DATAINIT,ERR_R_BIO_LIB);
@@ -265,7 +266,8 @@ BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert)
        const EVP_CIPHER *evp_cipher=NULL;
        EVP_CIPHER_CTX *evp_ctx=NULL;
        X509_ALGOR *enc_alg=NULL;
        const EVP_CIPHER *evp_cipher=NULL;
        EVP_CIPHER_CTX *evp_ctx=NULL;
        X509_ALGOR *enc_alg=NULL;
-       STACK *md_sk=NULL,*rsk=NULL;
+       STACK_OF(X509_ALGOR) *md_sk=NULL;
+       STACK *rsk=NULL;
        X509_ALGOR *xalg=NULL;
        PKCS7_RECIP_INFO *ri=NULL;
 /*     EVP_PKEY *pkey; */
        X509_ALGOR *xalg=NULL;
        PKCS7_RECIP_INFO *ri=NULL;
 /*     EVP_PKEY *pkey; */
@@ -315,9 +317,9 @@ BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert)
        /* We will be checking the signature */
        if (md_sk != NULL)
                {
        /* We will be checking the signature */
        if (md_sk != NULL)
                {
-               for (i=0; i<sk_num(md_sk); i++)
+               for (i=0; i<sk_X509_ALGOR_num(md_sk); i++)
                        {
                        {
-                       xa=(X509_ALGOR *)sk_value(md_sk,i);
+                       xa=sk_X509_ALGOR_value(md_sk,i);
                        if ((btmp=BIO_new(BIO_f_md())) == NULL)
                                {
                                PKCS7err(PKCS7_F_PKCS7_DATADECODE,ERR_R_BIO_LIB);
                        if ((btmp=BIO_new(BIO_f_md())) == NULL)
                                {
                                PKCS7err(PKCS7_F_PKCS7_DATADECODE,ERR_R_BIO_LIB);
index b931ac7e088d57e0aaed2217a9928c83ae993296..e121ebf003f77471b13303608aec15ead5fb90dc 100644 (file)
@@ -191,7 +191,7 @@ int PKCS7_add_signer(PKCS7 *p7, PKCS7_SIGNER_INFO *psi)
        int i,j,nid;
        X509_ALGOR *alg;
        STACK *signer_sk;
        int i,j,nid;
        X509_ALGOR *alg;
        STACK *signer_sk;
-       STACK *md_sk;
+       STACK_OF(X509_ALGOR) *md_sk;
 
        i=OBJ_obj2nid(p7->type);
        switch (i)
 
        i=OBJ_obj2nid(p7->type);
        switch (i)
@@ -213,9 +213,9 @@ int PKCS7_add_signer(PKCS7 *p7, PKCS7_SIGNER_INFO *psi)
 
        /* If the digest is not currently listed, add it */
        j=0;
 
        /* If the digest is not currently listed, add it */
        j=0;
-       for (i=0; i<sk_num(md_sk); i++)
+       for (i=0; i<sk_X509_ALGOR_num(md_sk); i++)
                {
                {
-               alg=(X509_ALGOR *)sk_value(md_sk,i);
+               alg=sk_X509_ALGOR_value(md_sk,i);
                if (OBJ_obj2nid(alg->algorithm) == nid)
                        {
                        j=1;
                if (OBJ_obj2nid(alg->algorithm) == nid)
                        {
                        j=1;
@@ -226,7 +226,7 @@ int PKCS7_add_signer(PKCS7 *p7, PKCS7_SIGNER_INFO *psi)
                {
                alg=X509_ALGOR_new();
                alg->algorithm=OBJ_nid2obj(nid);
                {
                alg=X509_ALGOR_new();
                alg->algorithm=OBJ_nid2obj(nid);
-               sk_push(md_sk,(char *)alg);
+               sk_X509_ALGOR_push(md_sk,alg);
                }
 
        sk_push(signer_sk,(char *)psi);
                }
 
        sk_push(signer_sk,(char *)psi);
index 733d4e87d3f026dc9d877aa9ba122a33ad2a3b5c..9d6ae038a4945ed8753f35bd22aba5ec7c7514cf 100644 (file)
@@ -110,7 +110,7 @@ typedef struct pkcs7_recip_info_st
 typedef struct pkcs7_signed_st
        {
        ASN1_INTEGER                    *version;       /* version 1 */
 typedef struct pkcs7_signed_st
        {
        ASN1_INTEGER                    *version;       /* version 1 */
-       STACK /* X509_ALGOR's */        *md_algs;       /* md used */
+       STACK_OF(X509_ALGOR)            *md_algs;       /* md used */
        STACK_OF(X509)                  *cert;          /* [ 0 ] */
        STACK /* X509_CRL */            *crl;           /* [ 1 ] */
        STACK /* PKCS7_SIGNER_INFO */   *signer_info;
        STACK_OF(X509)                  *cert;          /* [ 0 ] */
        STACK /* X509_CRL */            *crl;           /* [ 1 ] */
        STACK /* PKCS7_SIGNER_INFO */   *signer_info;
@@ -138,7 +138,7 @@ typedef struct pkcs7_enveloped_st
 typedef struct pkcs7_signedandenveloped_st
        {
        ASN1_INTEGER                    *version;       /* version 1 */
 typedef struct pkcs7_signedandenveloped_st
        {
        ASN1_INTEGER                    *version;       /* version 1 */
-       STACK /* X509_ALGOR's */        *md_algs;       /* md used */
+       STACK_OF(X509_ALGOR)            *md_algs;       /* md used */
        STACK_OF(X509)                  *cert;          /* [ 0 ] */
        STACK /* X509_CRL */            *crl;           /* [ 1 ] */
        STACK /* PKCS7_SIGNER_INFO */   *signer_info;
        STACK_OF(X509)                  *cert;          /* [ 0 ] */
        STACK /* X509_CRL */            *crl;           /* [ 1 ] */
        STACK /* PKCS7_SIGNER_INFO */   *signer_info;
index 6d8f0a1941df921663dca978036fa6034f7004d4..125dbcfe2e0d47ebd490e5186f9853ec8c764d06 100644 (file)
@@ -120,6 +120,9 @@ typedef struct X509_algor_st
        ASN1_TYPE *parameter;
        } X509_ALGOR;
 
        ASN1_TYPE *parameter;
        } X509_ALGOR;
 
+DECLARE_STACK_OF(X509_ALGOR)
+DECLARE_ASN1_SET_OF(X509_ALGOR)
+
 typedef struct X509_val_st
        {
        ASN1_UTCTIME *notBefore;
 typedef struct X509_val_st
        {
        ASN1_UTCTIME *notBefore;
index 725c78db21c83f035e4f39231002971bd3dc89be..ad86bc9b49ad7aca3d7aacb2b68bf01388722176 100644 (file)
@@ -59,7 +59,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include "apps.h"
+#include "../apps/apps.h"
 #include <openssl/buffer.h>
 #include <openssl/err.h>
 #include <openssl/evp.h>
 #include <openssl/buffer.h>
 #include <openssl/err.h>
 #include <openssl/evp.h>