New function PKCS7_signatureVerify to allow the signing certificate to
be explicitly stated with PKCS#7 verify. Also fix for util/mkerr.pl: if the -nostatic option is being used this will be for an external library so the autogenerated C file should include the header file as: #include "any/path/to/header.h" rather than the internal library form: #include <openssl/header.h>
This commit is contained in:
8
CHANGES
8
CHANGES
@@ -4,6 +4,14 @@
|
|||||||
|
|
||||||
Changes between 0.9.3a and 0.9.4
|
Changes between 0.9.3a and 0.9.4
|
||||||
|
|
||||||
|
*) Add a new function PKCS7_signatureVerify. This allows the verification
|
||||||
|
of a PKCS#7 signature but with the signing certificate passed to the
|
||||||
|
function itself. This contrasts with PKCS7_dataVerify which assumes the
|
||||||
|
certificate is present in the PKCS#7 structure. This isn't always the
|
||||||
|
case: certificates can be omitted from a PKCS#7 structure and be
|
||||||
|
distributed by "out of band" means (such as a certificate database).
|
||||||
|
[Steve Henson]
|
||||||
|
|
||||||
*) Complete the PEM_* macros with DECLARE_PEM versions to replace the
|
*) Complete the PEM_* macros with DECLARE_PEM versions to replace the
|
||||||
function prototypes in pem.h, also change util/mkdef.pl to add the
|
function prototypes in pem.h, also change util/mkdef.pl to add the
|
||||||
necessary function names.
|
necessary function names.
|
||||||
|
@@ -626,18 +626,10 @@ err:
|
|||||||
int PKCS7_dataVerify(X509_STORE *cert_store, X509_STORE_CTX *ctx, BIO *bio,
|
int PKCS7_dataVerify(X509_STORE *cert_store, X509_STORE_CTX *ctx, BIO *bio,
|
||||||
PKCS7 *p7, PKCS7_SIGNER_INFO *si)
|
PKCS7 *p7, PKCS7_SIGNER_INFO *si)
|
||||||
{
|
{
|
||||||
/* PKCS7_SIGNED *s; */
|
|
||||||
ASN1_OCTET_STRING *os;
|
|
||||||
EVP_MD_CTX mdc_tmp,*mdc;
|
|
||||||
unsigned char *pp,*p;
|
|
||||||
PKCS7_ISSUER_AND_SERIAL *ias;
|
PKCS7_ISSUER_AND_SERIAL *ias;
|
||||||
int ret=0,i;
|
int ret=0,i;
|
||||||
int md_type;
|
|
||||||
STACK_OF(X509_ATTRIBUTE) *sk;
|
|
||||||
STACK_OF(X509) *cert;
|
STACK_OF(X509) *cert;
|
||||||
BIO *btmp;
|
|
||||||
X509 *x509;
|
X509 *x509;
|
||||||
EVP_PKEY *pkey;
|
|
||||||
|
|
||||||
if (PKCS7_type_is_signed(p7))
|
if (PKCS7_type_is_signed(p7))
|
||||||
{
|
{
|
||||||
@@ -674,7 +666,30 @@ int PKCS7_dataVerify(X509_STORE *cert_store, X509_STORE_CTX *ctx, BIO *bio,
|
|||||||
}
|
}
|
||||||
X509_STORE_CTX_cleanup(ctx);
|
X509_STORE_CTX_cleanup(ctx);
|
||||||
|
|
||||||
/* So we like 'x509', lets check the signature. */
|
return PKCS7_signatureVerify(bio, p7, si, x509);
|
||||||
|
err:
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int PKCS7_signatureVerify(BIO *bio, PKCS7 *p7, PKCS7_SIGNER_INFO *si,
|
||||||
|
X509 *x509)
|
||||||
|
{
|
||||||
|
ASN1_OCTET_STRING *os;
|
||||||
|
EVP_MD_CTX mdc_tmp,*mdc;
|
||||||
|
unsigned char *pp,*p;
|
||||||
|
int ret=0,i;
|
||||||
|
int md_type;
|
||||||
|
STACK_OF(X509_ATTRIBUTE) *sk;
|
||||||
|
BIO *btmp;
|
||||||
|
EVP_PKEY *pkey;
|
||||||
|
|
||||||
|
if (!PKCS7_type_is_signed(p7) &&
|
||||||
|
!PKCS7_type_is_signedAndEnveloped(p7)) {
|
||||||
|
PKCS7err(PKCS7_F_PKCS7_SIGNATUREVERIFY,
|
||||||
|
PKCS7_R_WRONG_PKCS7_TYPE);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
md_type=OBJ_obj2nid(si->digest_alg->algorithm);
|
md_type=OBJ_obj2nid(si->digest_alg->algorithm);
|
||||||
|
|
||||||
btmp=bio;
|
btmp=bio;
|
||||||
@@ -683,13 +698,15 @@ int PKCS7_dataVerify(X509_STORE *cert_store, X509_STORE_CTX *ctx, BIO *bio,
|
|||||||
if ((btmp == NULL) ||
|
if ((btmp == NULL) ||
|
||||||
((btmp=BIO_find_type(btmp,BIO_TYPE_MD)) == NULL))
|
((btmp=BIO_find_type(btmp,BIO_TYPE_MD)) == NULL))
|
||||||
{
|
{
|
||||||
PKCS7err(PKCS7_F_PKCS7_DATAVERIFY,PKCS7_R_UNABLE_TO_FIND_MESSAGE_DIGEST);
|
PKCS7err(PKCS7_F_PKCS7_SIGNATUREVERIFY,
|
||||||
|
PKCS7_R_UNABLE_TO_FIND_MESSAGE_DIGEST);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
BIO_get_md_ctx(btmp,&mdc);
|
BIO_get_md_ctx(btmp,&mdc);
|
||||||
if (mdc == NULL)
|
if (mdc == NULL)
|
||||||
{
|
{
|
||||||
PKCS7err(PKCS7_F_PKCS7_DATAVERIFY,PKCS7_R_INTERNAL_ERROR);
|
PKCS7err(PKCS7_F_PKCS7_SIGNATUREVERIFY,
|
||||||
|
PKCS7_R_INTERNAL_ERROR);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
if (EVP_MD_type(EVP_MD_CTX_type(mdc)) == md_type)
|
if (EVP_MD_type(EVP_MD_CTX_type(mdc)) == md_type)
|
||||||
@@ -712,7 +729,8 @@ int PKCS7_dataVerify(X509_STORE *cert_store, X509_STORE_CTX *ctx, BIO *bio,
|
|||||||
message_digest=PKCS7_digest_from_attributes(sk);
|
message_digest=PKCS7_digest_from_attributes(sk);
|
||||||
if (!message_digest)
|
if (!message_digest)
|
||||||
{
|
{
|
||||||
PKCS7err(PKCS7_F_PKCS7_DATAVERIFY,PKCS7_R_UNABLE_TO_FIND_MESSAGE_DIGEST);
|
PKCS7err(PKCS7_F_PKCS7_SIGNATUREVERIFY,
|
||||||
|
PKCS7_R_UNABLE_TO_FIND_MESSAGE_DIGEST);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
if ((message_digest->length != (int)md_len) ||
|
if ((message_digest->length != (int)md_len) ||
|
||||||
@@ -726,7 +744,8 @@ for (ii=0; ii<message_digest->length; ii++)
|
|||||||
for (ii=0; ii<md_len; ii++) printf("%02X",md_dat[ii]); printf(" calc\n");
|
for (ii=0; ii<md_len; ii++) printf("%02X",md_dat[ii]); printf(" calc\n");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
PKCS7err(PKCS7_F_PKCS7_DATAVERIFY,PKCS7_R_DIGEST_FAILURE);
|
PKCS7err(PKCS7_F_PKCS7_SIGNATUREVERIFY,
|
||||||
|
PKCS7_R_DIGEST_FAILURE);
|
||||||
ret= -1;
|
ret= -1;
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
@@ -755,7 +774,8 @@ for (ii=0; ii<md_len; ii++) printf("%02X",md_dat[ii]); printf(" calc\n");
|
|||||||
EVP_PKEY_free(pkey);
|
EVP_PKEY_free(pkey);
|
||||||
if (i <= 0)
|
if (i <= 0)
|
||||||
{
|
{
|
||||||
PKCS7err(PKCS7_F_PKCS7_DATAVERIFY,PKCS7_R_SIGNATURE_FAILURE);
|
PKCS7err(PKCS7_F_PKCS7_SIGNATUREVERIFY,
|
||||||
|
PKCS7_R_SIGNATURE_FAILURE);
|
||||||
ret= -1;
|
ret= -1;
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
@@ -333,6 +333,8 @@ int PKCS7_add_crl(PKCS7 *p7, X509_CRL *x509);
|
|||||||
int PKCS7_content_new(PKCS7 *p7, int nid);
|
int PKCS7_content_new(PKCS7 *p7, int nid);
|
||||||
int PKCS7_dataVerify(X509_STORE *cert_store, X509_STORE_CTX *ctx,
|
int PKCS7_dataVerify(X509_STORE *cert_store, X509_STORE_CTX *ctx,
|
||||||
BIO *bio, PKCS7 *p7, PKCS7_SIGNER_INFO *si);
|
BIO *bio, PKCS7 *p7, PKCS7_SIGNER_INFO *si);
|
||||||
|
int PKCS7_signatureVerify(BIO *bio, PKCS7 *p7, PKCS7_SIGNER_INFO *si,
|
||||||
|
X509 *x509);
|
||||||
|
|
||||||
BIO *PKCS7_dataInit(PKCS7 *p7, BIO *bio);
|
BIO *PKCS7_dataInit(PKCS7 *p7, BIO *bio);
|
||||||
int PKCS7_dataFinal(PKCS7 *p7, BIO *bio);
|
int PKCS7_dataFinal(PKCS7 *p7, BIO *bio);
|
||||||
@@ -383,6 +385,7 @@ int PKCS7_set_attributes(PKCS7_SIGNER_INFO *p7si,STACK_OF(X509_ATTRIBUTE) *sk);
|
|||||||
#define PKCS7_F_PKCS7_SET_CIPHER 108
|
#define PKCS7_F_PKCS7_SET_CIPHER 108
|
||||||
#define PKCS7_F_PKCS7_SET_CONTENT 109
|
#define PKCS7_F_PKCS7_SET_CONTENT 109
|
||||||
#define PKCS7_F_PKCS7_SET_TYPE 110
|
#define PKCS7_F_PKCS7_SET_TYPE 110
|
||||||
|
#define PKCS7_F_PKCS7_SIGNATUREVERIFY 113
|
||||||
|
|
||||||
/* Reason codes. */
|
/* Reason codes. */
|
||||||
#define PKCS7_R_CIPHER_NOT_INITIALIZED 116
|
#define PKCS7_R_CIPHER_NOT_INITIALIZED 116
|
||||||
|
@@ -77,6 +77,7 @@ static ERR_STRING_DATA PKCS7_str_functs[]=
|
|||||||
{ERR_PACK(0,PKCS7_F_PKCS7_SET_CIPHER,0), "PKCS7_set_cipher"},
|
{ERR_PACK(0,PKCS7_F_PKCS7_SET_CIPHER,0), "PKCS7_set_cipher"},
|
||||||
{ERR_PACK(0,PKCS7_F_PKCS7_SET_CONTENT,0), "PKCS7_set_content"},
|
{ERR_PACK(0,PKCS7_F_PKCS7_SET_CONTENT,0), "PKCS7_set_content"},
|
||||||
{ERR_PACK(0,PKCS7_F_PKCS7_SET_TYPE,0), "PKCS7_set_type"},
|
{ERR_PACK(0,PKCS7_F_PKCS7_SET_TYPE,0), "PKCS7_set_type"},
|
||||||
|
{ERR_PACK(0,PKCS7_F_PKCS7_SIGNATUREVERIFY,0), "PKCS7_signatureVerify"},
|
||||||
{0,NULL}
|
{0,NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -1817,3 +1817,4 @@ sk_ASN1_OBJECT_zero 1841
|
|||||||
sk_ASN1_OBJECT_insert 1842
|
sk_ASN1_OBJECT_insert 1842
|
||||||
sk_ASN1_OBJECT_push 1843
|
sk_ASN1_OBJECT_push 1843
|
||||||
d2i_ASN1_SET_OF_ASN1_OBJECT 1844
|
d2i_ASN1_SET_OF_ASN1_OBJECT 1844
|
||||||
|
PKCS7_signatureVerify 1845
|
||||||
|
@@ -284,8 +284,14 @@ EOF
|
|||||||
|
|
||||||
# Rewrite the C source file containing the error details.
|
# Rewrite the C source file containing the error details.
|
||||||
|
|
||||||
|
my $hincf;
|
||||||
|
if($static) {
|
||||||
$hfile =~ /([^\/]+)$/;
|
$hfile =~ /([^\/]+)$/;
|
||||||
my $hincf = $1;
|
$hincf = "<openssl/$1>";
|
||||||
|
} else {
|
||||||
|
$hincf = "\"$hfile\"";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
open (OUT,">$cfile") || die "Can't open $cfile for writing";
|
open (OUT,">$cfile") || die "Can't open $cfile for writing";
|
||||||
|
|
||||||
@@ -351,7 +357,7 @@ EOF
|
|||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <openssl/err.h>
|
#include <openssl/err.h>
|
||||||
#include <openssl/$hincf>
|
#include $hincf
|
||||||
|
|
||||||
/* BEGIN ERROR CODES */
|
/* BEGIN ERROR CODES */
|
||||||
#ifndef NO_ERR
|
#ifndef NO_ERR
|
||||||
|
Reference in New Issue
Block a user