Added initial PKCS7_VerifySignedData(). Only saves
the first included certificate if available.
This commit is contained in:
parent
2187955fe9
commit
c35a635fd7
1
.gitignore
vendored
1
.gitignore
vendored
@ -54,6 +54,7 @@ key.der
|
|||||||
key.pem
|
key.pem
|
||||||
certreq.der
|
certreq.der
|
||||||
certreq.pem
|
certreq.pem
|
||||||
|
pkcs7cert.der
|
||||||
pkcs7signedData.der
|
pkcs7signedData.der
|
||||||
pkcs7envelopedData.der
|
pkcs7envelopedData.der
|
||||||
diff
|
diff
|
||||||
|
@ -548,6 +548,99 @@ int PKCS7_EncodeSignedData(PKCS7* pkcs7, byte* output, word32 outputSz)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Finds the certificates in the message and saves it. */
|
||||||
|
int PKCS7_VerifySignedData(PKCS7* pkcs7, byte* pkiMsg, word32 pkiMsgSz)
|
||||||
|
{
|
||||||
|
word32 idx, contentType;
|
||||||
|
int length, version;
|
||||||
|
byte b;
|
||||||
|
|
||||||
|
if (pkcs7 == NULL || pkiMsg == NULL || pkiMsgSz == 0)
|
||||||
|
return BAD_FUNC_ARG;
|
||||||
|
|
||||||
|
idx = 0;
|
||||||
|
|
||||||
|
/* Get the contentInfo sequence */
|
||||||
|
if (GetSequence(pkiMsg, &idx, &length, pkiMsgSz) < 0)
|
||||||
|
return ASN_PARSE_E;
|
||||||
|
|
||||||
|
/* Get the contentInfo contentType */
|
||||||
|
if (GetContentType(pkiMsg, &idx, &contentType, pkiMsgSz) < 0)
|
||||||
|
return ASN_PARSE_E;
|
||||||
|
|
||||||
|
if (contentType != SIGNED_DATA) {
|
||||||
|
CYASSL_MSG("PKCS#7 input not of type SignedData");
|
||||||
|
return PKCS7_OID_E;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* get the ContentInfo content */
|
||||||
|
if (pkiMsg[idx++] != (ASN_CONSTRUCTED | ASN_CONTEXT_SPECIFIC | 0))
|
||||||
|
return ASN_PARSE_E;
|
||||||
|
|
||||||
|
if (GetLength(pkiMsg, &idx, &length, pkiMsgSz) < 0)
|
||||||
|
return ASN_PARSE_E;
|
||||||
|
|
||||||
|
/* Get the signedData sequence */
|
||||||
|
if (GetSequence(pkiMsg, &idx, &length, pkiMsgSz) < 0)
|
||||||
|
return ASN_PARSE_E;
|
||||||
|
|
||||||
|
/* Get the version */
|
||||||
|
if (GetMyVersion(pkiMsg, &idx, &version) < 0)
|
||||||
|
return ASN_PARSE_E;
|
||||||
|
|
||||||
|
if (version != 1) {
|
||||||
|
CYASSL_MSG("PKCS#7 signedData needs to be of version 1");
|
||||||
|
return ASN_VERSION_E;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get the set of DigestAlgorithmIdentifiers */
|
||||||
|
if (GetSet(pkiMsg, &idx, &length, pkiMsgSz) < 0)
|
||||||
|
return ASN_PARSE_E;
|
||||||
|
|
||||||
|
/* Skip the set. */
|
||||||
|
idx += length;
|
||||||
|
|
||||||
|
/* Get the inner ContentInfo sequence */
|
||||||
|
if (GetSequence(pkiMsg, &idx, &length, pkiMsgSz) < 0)
|
||||||
|
return ASN_PARSE_E;
|
||||||
|
|
||||||
|
/* Skip the seqeunce. */
|
||||||
|
idx += length;
|
||||||
|
|
||||||
|
b = pkiMsg[idx];
|
||||||
|
/* Get the implicit[0] set of certificates */
|
||||||
|
if (b == (ASN_CONSTRUCTED | ASN_CONTEXT_SPECIFIC | 0)) {
|
||||||
|
idx++;
|
||||||
|
if (GetLength(pkiMsg, &idx, &length, pkiMsgSz) < 0)
|
||||||
|
return ASN_PARSE_E;
|
||||||
|
|
||||||
|
if (length > 0) {
|
||||||
|
/* At this point, idx is at the first certificate in
|
||||||
|
* a set of certificates. There may be more than one,
|
||||||
|
* or none, or they may be a PKCS 6 extended
|
||||||
|
* certificate. We want to save the first cert if it
|
||||||
|
* is X.509. */
|
||||||
|
|
||||||
|
word32 certIdx = idx;
|
||||||
|
|
||||||
|
b = pkiMsg[certIdx++];
|
||||||
|
if (b == (ASN_CONSTRUCTED | ASN_SEQUENCE)) {
|
||||||
|
int certSz;
|
||||||
|
|
||||||
|
if (GetLength(pkiMsg, &certIdx, &certSz, pkiMsgSz) < 0)
|
||||||
|
return ASN_PARSE_E;
|
||||||
|
|
||||||
|
pkcs7->singleCert = &pkiMsg[idx];
|
||||||
|
pkcs7->singleCertSz = certSz + (certIdx - idx);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* create ASN.1 fomatted RecipientInfo structure, returns sequence size */
|
/* create ASN.1 fomatted RecipientInfo structure, returns sequence size */
|
||||||
CYASSL_LOCAL int CreateRecipientInfo(const byte* cert, word32 certSz,
|
CYASSL_LOCAL int CreateRecipientInfo(const byte* cert, word32 certSz,
|
||||||
int keyEncAlgo, int blockKeySz,
|
int keyEncAlgo, int blockKeySz,
|
||||||
|
@ -4252,7 +4252,38 @@ int pkcs7signed_test(void)
|
|||||||
PKCS7_Free(&msg);
|
PKCS7_Free(&msg);
|
||||||
return -211;
|
return -211;
|
||||||
}
|
}
|
||||||
ret = (int)fwrite(out, outSz, 1, file);
|
ret = (int)fwrite(out, 1, outSz, file);
|
||||||
|
fclose(file);
|
||||||
|
|
||||||
|
PKCS7_Free(&msg);
|
||||||
|
PKCS7_InitWithCert(&msg, NULL, 0);
|
||||||
|
|
||||||
|
ret = PKCS7_VerifySignedData(&msg, out, outSz);
|
||||||
|
if (ret < 0) {
|
||||||
|
free(certDer);
|
||||||
|
free(keyDer);
|
||||||
|
free(out);
|
||||||
|
PKCS7_Free(&msg);
|
||||||
|
return -212;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (msg.singleCert == NULL || msg.singleCertSz == 0) {
|
||||||
|
free(certDer);
|
||||||
|
free(keyDer);
|
||||||
|
free(out);
|
||||||
|
PKCS7_Free(&msg);
|
||||||
|
return -213;
|
||||||
|
}
|
||||||
|
|
||||||
|
file = fopen("./pkcs7cert.der", "wb");
|
||||||
|
if (!file) {
|
||||||
|
free(certDer);
|
||||||
|
free(keyDer);
|
||||||
|
free(out);
|
||||||
|
PKCS7_Free(&msg);
|
||||||
|
return -214;
|
||||||
|
}
|
||||||
|
ret = (int)fwrite(msg.singleCert, 1, msg.singleCertSz, file);
|
||||||
fclose(file);
|
fclose(file);
|
||||||
|
|
||||||
free(certDer);
|
free(certDer);
|
||||||
|
@ -103,6 +103,8 @@ CYASSL_API void PKCS7_Free(PKCS7* pkcs7);
|
|||||||
CYASSL_API int PKCS7_EncodeData(PKCS7* pkcs7, byte* output, word32 outputSz);
|
CYASSL_API int PKCS7_EncodeData(PKCS7* pkcs7, byte* output, word32 outputSz);
|
||||||
CYASSL_API int PKCS7_EncodeSignedData(PKCS7* pkcs7,
|
CYASSL_API int PKCS7_EncodeSignedData(PKCS7* pkcs7,
|
||||||
byte* output, word32 outputSz);
|
byte* output, word32 outputSz);
|
||||||
|
CYASSL_API int PKCS7_VerifySignedData(PKCS7* pkcs7,
|
||||||
|
byte* pkiMsg, word32 pkiMsgSz);
|
||||||
CYASSL_API int PKCS7_EncodeEnvelopedData(PKCS7* pkcs7,
|
CYASSL_API int PKCS7_EncodeEnvelopedData(PKCS7* pkcs7,
|
||||||
byte* output, word32 outputSz);
|
byte* output, word32 outputSz);
|
||||||
CYASSL_API int PKCS7_DecodeEnvelopedData(PKCS7* pkcs7, byte* pkiMsg,
|
CYASSL_API int PKCS7_DecodeEnvelopedData(PKCS7* pkcs7, byte* pkiMsg,
|
||||||
|
Loading…
Reference in New Issue
Block a user