提交 8f0edcd1 编写于 作者: B Ben Laurie

stack.

上级 a1195a19
...@@ -66,13 +66,15 @@ int i2d_PKCS7_ENVELOPE(PKCS7_ENVELOPE *a, unsigned char **pp) ...@@ -66,13 +66,15 @@ int i2d_PKCS7_ENVELOPE(PKCS7_ENVELOPE *a, unsigned char **pp)
M_ASN1_I2D_vars(a); M_ASN1_I2D_vars(a);
M_ASN1_I2D_len(a->version,i2d_ASN1_INTEGER); 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_type(PKCS7_RECIP_INFO,a->recipientinfo,
i2d_PKCS7_RECIP_INFO);
M_ASN1_I2D_len(a->enc_data,i2d_PKCS7_ENC_CONTENT); M_ASN1_I2D_len(a->enc_data,i2d_PKCS7_ENC_CONTENT);
M_ASN1_I2D_seq_total(); M_ASN1_I2D_seq_total();
M_ASN1_I2D_put(a->version,i2d_ASN1_INTEGER); 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_type(PKCS7_RECIP_INFO,a->recipientinfo,
i2d_PKCS7_RECIP_INFO);
M_ASN1_I2D_put(a->enc_data,i2d_PKCS7_ENC_CONTENT); M_ASN1_I2D_put(a->enc_data,i2d_PKCS7_ENC_CONTENT);
M_ASN1_I2D_finish(); M_ASN1_I2D_finish();
...@@ -86,8 +88,8 @@ PKCS7_ENVELOPE *d2i_PKCS7_ENVELOPE(PKCS7_ENVELOPE **a, unsigned char **pp, ...@@ -86,8 +88,8 @@ PKCS7_ENVELOPE *d2i_PKCS7_ENVELOPE(PKCS7_ENVELOPE **a, unsigned char **pp,
M_ASN1_D2I_Init(); M_ASN1_D2I_Init();
M_ASN1_D2I_start_sequence(); M_ASN1_D2I_start_sequence();
M_ASN1_D2I_get(ret->version,d2i_ASN1_INTEGER); M_ASN1_D2I_get(ret->version,d2i_ASN1_INTEGER);
M_ASN1_D2I_get_set(ret->recipientinfo,d2i_PKCS7_RECIP_INFO, M_ASN1_D2I_get_set_type(PKCS7_RECIP_INFO,ret->recipientinfo,
PKCS7_RECIP_INFO_free); d2i_PKCS7_RECIP_INFO,PKCS7_RECIP_INFO_free);
M_ASN1_D2I_get(ret->enc_data,d2i_PKCS7_ENC_CONTENT); M_ASN1_D2I_get(ret->enc_data,d2i_PKCS7_ENC_CONTENT);
M_ASN1_D2I_Finish(a,PKCS7_ENVELOPE_free,ASN1_F_D2I_PKCS7_ENVELOPE); M_ASN1_D2I_Finish(a,PKCS7_ENVELOPE_free,ASN1_F_D2I_PKCS7_ENVELOPE);
...@@ -100,7 +102,7 @@ PKCS7_ENVELOPE *PKCS7_ENVELOPE_new(void) ...@@ -100,7 +102,7 @@ PKCS7_ENVELOPE *PKCS7_ENVELOPE_new(void)
M_ASN1_New_Malloc(ret,PKCS7_ENVELOPE); M_ASN1_New_Malloc(ret,PKCS7_ENVELOPE);
M_ASN1_New(ret->version,ASN1_INTEGER_new); M_ASN1_New(ret->version,ASN1_INTEGER_new);
M_ASN1_New(ret->recipientinfo,sk_new_null); M_ASN1_New(ret->recipientinfo,sk_PKCS7_RECIP_INFO_new_null);
M_ASN1_New(ret->enc_data,PKCS7_ENC_CONTENT_new); M_ASN1_New(ret->enc_data,PKCS7_ENC_CONTENT_new);
return(ret); return(ret);
M_ASN1_New_Error(ASN1_F_PKCS7_ENVELOPE_NEW); M_ASN1_New_Error(ASN1_F_PKCS7_ENVELOPE_NEW);
...@@ -110,7 +112,7 @@ void PKCS7_ENVELOPE_free(PKCS7_ENVELOPE *a) ...@@ -110,7 +112,7 @@ void PKCS7_ENVELOPE_free(PKCS7_ENVELOPE *a)
{ {
if (a == NULL) return; if (a == NULL) return;
ASN1_INTEGER_free(a->version); ASN1_INTEGER_free(a->version);
sk_pop_free(a->recipientinfo,PKCS7_RECIP_INFO_free); sk_PKCS7_RECIP_INFO_pop_free(a->recipientinfo,PKCS7_RECIP_INFO_free);
PKCS7_ENC_CONTENT_free(a->enc_data); PKCS7_ENC_CONTENT_free(a->enc_data);
Free((char *)a); Free((char *)a);
} }
......
...@@ -121,3 +121,5 @@ void PKCS7_RECIP_INFO_free(PKCS7_RECIP_INFO *a) ...@@ -121,3 +121,5 @@ void PKCS7_RECIP_INFO_free(PKCS7_RECIP_INFO *a)
Free((char *)a); Free((char *)a);
} }
IMPLEMENT_STACK_OF(PKCS7_RECIP_INFO)
IMPLEMENT_ASN1_SET_OF(PKCS7_RECIP_INFO)
...@@ -66,7 +66,8 @@ int i2d_PKCS7_SIGN_ENVELOPE(PKCS7_SIGN_ENVELOPE *a, unsigned char **pp) ...@@ -66,7 +66,8 @@ int i2d_PKCS7_SIGN_ENVELOPE(PKCS7_SIGN_ENVELOPE *a, unsigned char **pp)
M_ASN1_I2D_vars(a); M_ASN1_I2D_vars(a);
M_ASN1_I2D_len(a->version,i2d_ASN1_INTEGER); 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_type(PKCS7_RECIP_INFO,a->recipientinfo,
i2d_PKCS7_RECIP_INFO);
M_ASN1_I2D_len_SET_type(X509_ALGOR,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(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_SEQUENCE_opt_type(X509,a->cert,i2d_X509,0);
...@@ -77,7 +78,8 @@ int i2d_PKCS7_SIGN_ENVELOPE(PKCS7_SIGN_ENVELOPE *a, unsigned char **pp) ...@@ -77,7 +78,8 @@ int i2d_PKCS7_SIGN_ENVELOPE(PKCS7_SIGN_ENVELOPE *a, unsigned char **pp)
M_ASN1_I2D_seq_total(); M_ASN1_I2D_seq_total();
M_ASN1_I2D_put(a->version,i2d_ASN1_INTEGER); 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_type(PKCS7_RECIP_INFO,a->recipientinfo,
i2d_PKCS7_RECIP_INFO);
M_ASN1_I2D_put_SET_type(X509_ALGOR,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(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_SEQUENCE_opt_type(X509,a->cert,i2d_X509,0);
...@@ -96,8 +98,8 @@ PKCS7_SIGN_ENVELOPE *d2i_PKCS7_SIGN_ENVELOPE(PKCS7_SIGN_ENVELOPE **a, ...@@ -96,8 +98,8 @@ PKCS7_SIGN_ENVELOPE *d2i_PKCS7_SIGN_ENVELOPE(PKCS7_SIGN_ENVELOPE **a,
M_ASN1_D2I_Init(); M_ASN1_D2I_Init();
M_ASN1_D2I_start_sequence(); M_ASN1_D2I_start_sequence();
M_ASN1_D2I_get(ret->version,d2i_ASN1_INTEGER); M_ASN1_D2I_get(ret->version,d2i_ASN1_INTEGER);
M_ASN1_D2I_get_set(ret->recipientinfo,d2i_PKCS7_RECIP_INFO, M_ASN1_D2I_get_set_type(PKCS7_RECIP_INFO,ret->recipientinfo,
PKCS7_RECIP_INFO_free); d2i_PKCS7_RECIP_INFO,PKCS7_RECIP_INFO_free);
M_ASN1_D2I_get_set_type(X509_ALGOR,ret->md_algs,d2i_X509_ALGOR, M_ASN1_D2I_get_set_type(X509_ALGOR,ret->md_algs,d2i_X509_ALGOR,
X509_ALGOR_free); X509_ALGOR_free);
M_ASN1_D2I_get(ret->enc_data,d2i_PKCS7_ENC_CONTENT); M_ASN1_D2I_get(ret->enc_data,d2i_PKCS7_ENC_CONTENT);
...@@ -118,7 +120,7 @@ PKCS7_SIGN_ENVELOPE *PKCS7_SIGN_ENVELOPE_new(void) ...@@ -118,7 +120,7 @@ PKCS7_SIGN_ENVELOPE *PKCS7_SIGN_ENVELOPE_new(void)
M_ASN1_New_Malloc(ret,PKCS7_SIGN_ENVELOPE); M_ASN1_New_Malloc(ret,PKCS7_SIGN_ENVELOPE);
M_ASN1_New(ret->version,ASN1_INTEGER_new); M_ASN1_New(ret->version,ASN1_INTEGER_new);
M_ASN1_New(ret->recipientinfo,sk_new_null); M_ASN1_New(ret->recipientinfo,sk_PKCS7_RECIP_INFO_new_null);
M_ASN1_New(ret->md_algs,sk_X509_ALGOR_new_null); M_ASN1_New(ret->md_algs,sk_X509_ALGOR_new_null);
M_ASN1_New(ret->enc_data,PKCS7_ENC_CONTENT_new); M_ASN1_New(ret->enc_data,PKCS7_ENC_CONTENT_new);
ret->cert=NULL; ret->cert=NULL;
...@@ -132,12 +134,12 @@ void PKCS7_SIGN_ENVELOPE_free(PKCS7_SIGN_ENVELOPE *a) ...@@ -132,12 +134,12 @@ void PKCS7_SIGN_ENVELOPE_free(PKCS7_SIGN_ENVELOPE *a)
{ {
if (a == NULL) return; if (a == NULL) return;
ASN1_INTEGER_free(a->version); ASN1_INTEGER_free(a->version);
sk_pop_free(a->recipientinfo,PKCS7_RECIP_INFO_free); sk_PKCS7_RECIP_INFO_pop_free(a->recipientinfo,PKCS7_RECIP_INFO_free);
sk_X509_ALGOR_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); PKCS7_ENC_CONTENT_free(a->enc_data);
sk_X509_pop_free(a->cert,X509_free); sk_X509_pop_free(a->cert,X509_free);
sk_X509_CRL_pop_free(a->crl,X509_CRL_free); sk_X509_CRL_pop_free(a->crl,X509_CRL_free);
sk_PKCS7_SIGNER_INFO_pop_free(a->signer_info,PKCS7_SIGNER_INFO_free); sk_PKCS7_SIGNER_INFO_pop_free(a->signer_info,PKCS7_SIGNER_INFO_free);
Free((char *)a); Free(a);
} }
...@@ -74,7 +74,7 @@ BIO *PKCS7_dataInit(PKCS7 *p7, BIO *bio) ...@@ -74,7 +74,7 @@ BIO *PKCS7_dataInit(PKCS7 *p7, BIO *bio)
const EVP_MD *evp_md; const EVP_MD *evp_md;
const EVP_CIPHER *evp_cipher=NULL; const EVP_CIPHER *evp_cipher=NULL;
STACK_OF(X509_ALGOR) *md_sk=NULL; STACK_OF(X509_ALGOR) *md_sk=NULL;
STACK *rsk=NULL; STACK_OF(PKCS7_RECIP_INFO) *rsk=NULL;
X509_ALGOR *xalg=NULL; X509_ALGOR *xalg=NULL;
PKCS7_RECIP_INFO *ri=NULL; PKCS7_RECIP_INFO *ri=NULL;
EVP_PKEY *pkey; EVP_PKEY *pkey;
...@@ -174,9 +174,9 @@ BIO *PKCS7_dataInit(PKCS7 *p7, BIO *bio) ...@@ -174,9 +174,9 @@ BIO *PKCS7_dataInit(PKCS7 *p7, BIO *bio)
/* Lets do the pub key stuff :-) */ /* Lets do the pub key stuff :-) */
max=0; max=0;
for (i=0; i<sk_num(rsk); i++) for (i=0; i<sk_PKCS7_RECIP_INFO_num(rsk); i++)
{ {
ri=(PKCS7_RECIP_INFO *)sk_value(rsk,i); ri=sk_PKCS7_RECIP_INFO_value(rsk,i);
if (ri->cert == NULL) if (ri->cert == NULL)
{ {
PKCS7err(PKCS7_F_PKCS7_DATAINIT,PKCS7_R_MISSING_CERIPEND_INFO); PKCS7err(PKCS7_F_PKCS7_DATAINIT,PKCS7_R_MISSING_CERIPEND_INFO);
...@@ -192,9 +192,9 @@ BIO *PKCS7_dataInit(PKCS7 *p7, BIO *bio) ...@@ -192,9 +192,9 @@ BIO *PKCS7_dataInit(PKCS7 *p7, BIO *bio)
PKCS7err(PKCS7_F_PKCS7_DATAINIT,ERR_R_MALLOC_FAILURE); PKCS7err(PKCS7_F_PKCS7_DATAINIT,ERR_R_MALLOC_FAILURE);
goto err; goto err;
} }
for (i=0; i<sk_num(rsk); i++) for (i=0; i<sk_PKCS7_RECIP_INFO_num(rsk); i++)
{ {
ri=(PKCS7_RECIP_INFO *)sk_value(rsk,i); ri=sk_PKCS7_RECIP_INFO_value(rsk,i);
pkey=X509_get_pubkey(ri->cert); pkey=X509_get_pubkey(ri->cert);
jj=EVP_PKEY_encrypt(tmp,key,keylen,pkey); jj=EVP_PKEY_encrypt(tmp,key,keylen,pkey);
EVP_PKEY_free(pkey); EVP_PKEY_free(pkey);
...@@ -267,7 +267,7 @@ BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert) ...@@ -267,7 +267,7 @@ BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert)
EVP_CIPHER_CTX *evp_ctx=NULL; EVP_CIPHER_CTX *evp_ctx=NULL;
X509_ALGOR *enc_alg=NULL; X509_ALGOR *enc_alg=NULL;
STACK_OF(X509_ALGOR) *md_sk=NULL; STACK_OF(X509_ALGOR) *md_sk=NULL;
STACK *rsk=NULL; STACK_OF(PKCS7_RECIP_INFO) *rsk=NULL;
X509_ALGOR *xalg=NULL; X509_ALGOR *xalg=NULL;
PKCS7_RECIP_INFO *ri=NULL; PKCS7_RECIP_INFO *ri=NULL;
/* EVP_PKEY *pkey; */ /* EVP_PKEY *pkey; */
...@@ -368,8 +368,8 @@ BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert) ...@@ -368,8 +368,8 @@ BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert)
* (if any) * (if any)
*/ */
for (i=0; i<sk_num(rsk); i++) { for (i=0; i<sk_PKCS7_RECIP_INFO_num(rsk); i++) {
ri=(PKCS7_RECIP_INFO *)sk_value(rsk,i); ri=sk_PKCS7_RECIP_INFO_value(rsk,i);
if(!X509_NAME_cmp(ri->issuer_and_serial->issuer, if(!X509_NAME_cmp(ri->issuer_and_serial->issuer,
pcert->cert_info->issuer) && pcert->cert_info->issuer) &&
!ASN1_INTEGER_cmp(pcert->cert_info->serialNumber, !ASN1_INTEGER_cmp(pcert->cert_info->serialNumber,
...@@ -767,16 +767,16 @@ err: ...@@ -767,16 +767,16 @@ err:
PKCS7_ISSUER_AND_SERIAL *PKCS7_get_issuer_and_serial(PKCS7 *p7, int idx) PKCS7_ISSUER_AND_SERIAL *PKCS7_get_issuer_and_serial(PKCS7 *p7, int idx)
{ {
STACK *rsk; STACK_OF(PKCS7_RECIP_INFO) *rsk;
PKCS7_RECIP_INFO *ri; PKCS7_RECIP_INFO *ri;
int i; int i;
i=OBJ_obj2nid(p7->type); i=OBJ_obj2nid(p7->type);
if (i != NID_pkcs7_signedAndEnveloped) return(NULL); if (i != NID_pkcs7_signedAndEnveloped) return(NULL);
rsk=p7->d.signed_and_enveloped->recipientinfo; rsk=p7->d.signed_and_enveloped->recipientinfo;
ri=(PKCS7_RECIP_INFO *)sk_value(rsk,0); ri=sk_PKCS7_RECIP_INFO_value(rsk,0);
if (sk_num(rsk) <= idx) return(NULL); if (sk_PKCS7_RECIP_INFO_num(rsk) <= idx) return(NULL);
ri=(PKCS7_RECIP_INFO *)sk_value(rsk,idx); ri=sk_PKCS7_RECIP_INFO_value(rsk,idx);
return(ri->issuer_and_serial); return(ri->issuer_and_serial);
} }
......
...@@ -371,7 +371,7 @@ err: ...@@ -371,7 +371,7 @@ err:
int PKCS7_add_recipient_info(PKCS7 *p7, PKCS7_RECIP_INFO *ri) int PKCS7_add_recipient_info(PKCS7 *p7, PKCS7_RECIP_INFO *ri)
{ {
int i; int i;
STACK *sk; STACK_OF(PKCS7_RECIP_INFO) *sk;
i=OBJ_obj2nid(p7->type); i=OBJ_obj2nid(p7->type);
switch (i) switch (i)
...@@ -387,7 +387,7 @@ int PKCS7_add_recipient_info(PKCS7 *p7, PKCS7_RECIP_INFO *ri) ...@@ -387,7 +387,7 @@ int PKCS7_add_recipient_info(PKCS7 *p7, PKCS7_RECIP_INFO *ri)
return(0); return(0);
} }
sk_push(sk,(char *)ri); sk_PKCS7_RECIP_INFO_push(sk,ri);
return(1); return(1);
} }
......
...@@ -110,6 +110,9 @@ typedef struct pkcs7_recip_info_st ...@@ -110,6 +110,9 @@ typedef struct pkcs7_recip_info_st
X509 *cert; /* get the pub-key from this */ X509 *cert; /* get the pub-key from this */
} PKCS7_RECIP_INFO; } PKCS7_RECIP_INFO;
DECLARE_STACK_OF(PKCS7_RECIP_INFO)
DECLARE_ASN1_SET_OF(PKCS7_RECIP_INFO)
typedef struct pkcs7_signed_st typedef struct pkcs7_signed_st
{ {
ASN1_INTEGER *version; /* version 1 */ ASN1_INTEGER *version; /* version 1 */
...@@ -134,7 +137,7 @@ typedef struct pkcs7_enc_content_st ...@@ -134,7 +137,7 @@ typedef struct pkcs7_enc_content_st
typedef struct pkcs7_enveloped_st typedef struct pkcs7_enveloped_st
{ {
ASN1_INTEGER *version; /* version 0 */ ASN1_INTEGER *version; /* version 0 */
STACK /* PKCS7_RECIP_INFO */ *recipientinfo; STACK_OF(PKCS7_RECIP_INFO) *recipientinfo;
PKCS7_ENC_CONTENT *enc_data; PKCS7_ENC_CONTENT *enc_data;
} PKCS7_ENVELOPE; } PKCS7_ENVELOPE;
...@@ -147,7 +150,7 @@ typedef struct pkcs7_signedandenveloped_st ...@@ -147,7 +150,7 @@ typedef struct pkcs7_signedandenveloped_st
STACK_OF(PKCS7_SIGNER_INFO) *signer_info; STACK_OF(PKCS7_SIGNER_INFO) *signer_info;
PKCS7_ENC_CONTENT *enc_data; PKCS7_ENC_CONTENT *enc_data;
STACK /* PKCS7_RECIP_INFO */ *recipientinfo; STACK_OF(PKCS7_RECIP_INFO) *recipientinfo;
} PKCS7_SIGN_ENVELOPE; } PKCS7_SIGN_ENVELOPE;
typedef struct pkcs7_digest_st typedef struct pkcs7_digest_st
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册