blob: 5fd8f6444687b924fabff1dab67c303c33556fa8 [file] [log] [blame]
Nick Child5d881c32022-02-28 10:09:16 -06001/*
2 * Copyright The Mbed TLS Contributors
3 * SPDX-License-Identifier: Apache-2.0
Nayna Jainc9deb182020-11-16 19:03:12 +00004 *
Nick Child5d881c32022-02-28 10:09:16 -06005 * Licensed under the Apache License, Version 2.0 (the "License"); you may
6 * not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
Nayna Jainc9deb182020-11-16 19:03:12 +00008 *
Nick Child5d881c32022-02-28 10:09:16 -06009 * http://www.apache.org/licenses/LICENSE-2.0
Nayna Jainc9deb182020-11-16 19:03:12 +000010 *
Nick Child5d881c32022-02-28 10:09:16 -060011 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
Nayna Jainc9deb182020-11-16 19:03:12 +000016 */
17#include "common.h"
18
19#include "mbedtls/build_info.h"
20#if defined(MBEDTLS_PKCS7_C)
21#include "mbedtls/pkcs7.h"
22#include "mbedtls/x509.h"
23#include "mbedtls/asn1.h"
24#include "mbedtls/x509_crt.h"
25#include "mbedtls/x509_crl.h"
26#include "mbedtls/oid.h"
Nick Child9f4fb3e2022-09-12 16:21:02 -050027#include "mbedtls/error.h"
Nayna Jainc9deb182020-11-16 19:03:12 +000028
29#include <stdlib.h>
30#include <stdio.h>
31#include <string.h>
32#if defined(MBEDTLS_FS_IO)
33#include <sys/types.h>
34#include <sys/stat.h>
35#endif
36
Nayna Jainc9deb182020-11-16 19:03:12 +000037#include "mbedtls/platform.h"
38#include "mbedtls/platform_util.h"
Nayna Jainc9deb182020-11-16 19:03:12 +000039
40#if defined(MBEDTLS_HAVE_TIME)
41#include "mbedtls/platform_time.h"
42#endif
43#if defined(MBEDTLS_HAVE_TIME_DATE)
44#include <time.h>
45#endif
46
47/**
48 * Initializes the pkcs7 structure.
49 */
Gilles Peskine449bd832023-01-11 14:50:10 +010050void mbedtls_pkcs7_init(mbedtls_pkcs7 *pkcs7)
Nayna Jainc9deb182020-11-16 19:03:12 +000051{
Gilles Peskine449bd832023-01-11 14:50:10 +010052 memset(pkcs7, 0, sizeof(*pkcs7));
Nayna Jainc9deb182020-11-16 19:03:12 +000053}
54
Gilles Peskine449bd832023-01-11 14:50:10 +010055static int pkcs7_get_next_content_len(unsigned char **p, unsigned char *end,
56 size_t *len)
Nayna Jainc9deb182020-11-16 19:03:12 +000057{
Nick Child9f4fb3e2022-09-12 16:21:02 -050058 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Nayna Jainc9deb182020-11-16 19:03:12 +000059
Gilles Peskine449bd832023-01-11 14:50:10 +010060 ret = mbedtls_asn1_get_tag(p, end, len, MBEDTLS_ASN1_CONSTRUCTED
61 | MBEDTLS_ASN1_CONTEXT_SPECIFIC);
62 if (ret != 0) {
63 ret = MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PKCS7_INVALID_FORMAT, ret);
Nayna Jainc9deb182020-11-16 19:03:12 +000064 }
65
Gilles Peskine449bd832023-01-11 14:50:10 +010066 return ret;
Nayna Jainc9deb182020-11-16 19:03:12 +000067}
68
69/**
70 * version Version
71 * Version ::= INTEGER
72 **/
Gilles Peskine449bd832023-01-11 14:50:10 +010073static int pkcs7_get_version(unsigned char **p, unsigned char *end, int *ver)
Nayna Jainc9deb182020-11-16 19:03:12 +000074{
Nick Child9f4fb3e2022-09-12 16:21:02 -050075 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Nayna Jainc9deb182020-11-16 19:03:12 +000076
Gilles Peskine449bd832023-01-11 14:50:10 +010077 ret = mbedtls_asn1_get_int(p, end, ver);
78 if (ret != 0) {
79 ret = MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PKCS7_INVALID_VERSION, ret);
80 }
Nayna Jainc9deb182020-11-16 19:03:12 +000081
82 /* If version != 1, return invalid version */
Gilles Peskine449bd832023-01-11 14:50:10 +010083 if (*ver != MBEDTLS_PKCS7_SUPPORTED_VERSION) {
Nick Child9f4fb3e2022-09-12 16:21:02 -050084 ret = MBEDTLS_ERR_PKCS7_INVALID_VERSION;
Gilles Peskine449bd832023-01-11 14:50:10 +010085 }
Nayna Jainc9deb182020-11-16 19:03:12 +000086
Gilles Peskine449bd832023-01-11 14:50:10 +010087 return ret;
Nayna Jainc9deb182020-11-16 19:03:12 +000088}
89
90/**
91 * ContentInfo ::= SEQUENCE {
92 * contentType ContentType,
93 * content
94 * [0] EXPLICIT ANY DEFINED BY contentType OPTIONAL }
95 **/
Gilles Peskine449bd832023-01-11 14:50:10 +010096static int pkcs7_get_content_info_type(unsigned char **p, unsigned char *end,
97 mbedtls_pkcs7_buf *pkcs7)
Nayna Jainc9deb182020-11-16 19:03:12 +000098{
99 size_t len = 0;
Nick Child9f4fb3e2022-09-12 16:21:02 -0500100 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Nayna Jain673a2262020-12-14 22:44:49 +0000101 unsigned char *start = *p;
Nayna Jainc9deb182020-11-16 19:03:12 +0000102
Gilles Peskine449bd832023-01-11 14:50:10 +0100103 ret = mbedtls_asn1_get_tag(p, end, &len, MBEDTLS_ASN1_CONSTRUCTED
104 | MBEDTLS_ASN1_SEQUENCE);
105 if (ret != 0) {
Nick Childc448c942021-07-01 15:29:50 -0400106 *p = start;
Gilles Peskine449bd832023-01-11 14:50:10 +0100107 return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PKCS7_INVALID_CONTENT_INFO, ret);
Nick Childc448c942021-07-01 15:29:50 -0400108 }
Nayna Jainc9deb182020-11-16 19:03:12 +0000109
Gilles Peskine449bd832023-01-11 14:50:10 +0100110 ret = mbedtls_asn1_get_tag(p, end, &len, MBEDTLS_ASN1_OID);
111 if (ret != 0) {
Nayna Jain673a2262020-12-14 22:44:49 +0000112 *p = start;
Gilles Peskine449bd832023-01-11 14:50:10 +0100113 return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PKCS7_INVALID_CONTENT_INFO, ret);
Nayna Jain673a2262020-12-14 22:44:49 +0000114 }
Nayna Jainc9deb182020-11-16 19:03:12 +0000115
116 pkcs7->tag = MBEDTLS_ASN1_OID;
117 pkcs7->len = len;
118 pkcs7->p = *p;
Nick Childbb82ab72022-10-28 12:28:54 -0500119 *p += len;
Nayna Jainc9deb182020-11-16 19:03:12 +0000120
Gilles Peskine449bd832023-01-11 14:50:10 +0100121 return ret;
Nayna Jainc9deb182020-11-16 19:03:12 +0000122}
123
124/**
125 * DigestAlgorithmIdentifier ::= AlgorithmIdentifier
126 *
127 * This is from x509.h
128 **/
Gilles Peskine449bd832023-01-11 14:50:10 +0100129static int pkcs7_get_digest_algorithm(unsigned char **p, unsigned char *end,
130 mbedtls_x509_buf *alg)
Nayna Jainc9deb182020-11-16 19:03:12 +0000131{
Nick Child9f4fb3e2022-09-12 16:21:02 -0500132 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Nayna Jainc9deb182020-11-16 19:03:12 +0000133
Gilles Peskine449bd832023-01-11 14:50:10 +0100134 if ((ret = mbedtls_asn1_get_alg_null(p, end, alg)) != 0) {
135 ret = MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PKCS7_INVALID_ALG, ret);
136 }
Nayna Jainc9deb182020-11-16 19:03:12 +0000137
Gilles Peskine449bd832023-01-11 14:50:10 +0100138 return ret;
Nayna Jainc9deb182020-11-16 19:03:12 +0000139}
140
141/**
142 * DigestAlgorithmIdentifiers :: SET of DigestAlgorithmIdentifier
143 **/
Gilles Peskine449bd832023-01-11 14:50:10 +0100144static int pkcs7_get_digest_algorithm_set(unsigned char **p,
145 unsigned char *end,
146 mbedtls_x509_buf *alg)
Nayna Jainc9deb182020-11-16 19:03:12 +0000147{
148 size_t len = 0;
Nick Child9f4fb3e2022-09-12 16:21:02 -0500149 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Nayna Jainc9deb182020-11-16 19:03:12 +0000150
Gilles Peskine449bd832023-01-11 14:50:10 +0100151 ret = mbedtls_asn1_get_tag(p, end, &len, MBEDTLS_ASN1_CONSTRUCTED
152 | MBEDTLS_ASN1_SET);
153 if (ret != 0) {
154 return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PKCS7_INVALID_ALG, ret);
Nick Child9f4fb3e2022-09-12 16:21:02 -0500155 }
Nayna Jainc9deb182020-11-16 19:03:12 +0000156
157 end = *p + len;
158
Gilles Peskine449bd832023-01-11 14:50:10 +0100159 ret = mbedtls_asn1_get_alg_null(p, end, alg);
160 if (ret != 0) {
161 return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PKCS7_INVALID_ALG, ret);
Nick Child9f4fb3e2022-09-12 16:21:02 -0500162 }
Nayna Jainc9deb182020-11-16 19:03:12 +0000163
Nick Child34d5e932022-09-14 14:44:03 -0500164 /** For now, it assumes there is only one digest algorithm specified **/
Gilles Peskine449bd832023-01-11 14:50:10 +0100165 if (*p != end) {
166 return MBEDTLS_ERR_PKCS7_FEATURE_UNAVAILABLE;
167 }
Nayna Jainc9deb182020-11-16 19:03:12 +0000168
Gilles Peskine449bd832023-01-11 14:50:10 +0100169 return 0;
Nayna Jainc9deb182020-11-16 19:03:12 +0000170}
171
172/**
173 * certificates :: SET OF ExtendedCertificateOrCertificate,
174 * ExtendedCertificateOrCertificate ::= CHOICE {
175 * certificate Certificate -- x509,
176 * extendedCertificate[0] IMPLICIT ExtendedCertificate }
177 * Return number of certificates added to the signed data,
178 * 0 or higher is valid.
179 * Return negative error code for failure.
180 **/
Gilles Peskine449bd832023-01-11 14:50:10 +0100181static int pkcs7_get_certificates(unsigned char **p, unsigned char *end,
182 mbedtls_x509_crt *certs)
Nayna Jainc9deb182020-11-16 19:03:12 +0000183{
Nick Child9f4fb3e2022-09-12 16:21:02 -0500184 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Nayna Jainc9deb182020-11-16 19:03:12 +0000185 size_t len1 = 0;
186 size_t len2 = 0;
Nick Childbb82ab72022-10-28 12:28:54 -0500187 unsigned char *end_set, *end_cert, *start;
Nayna Jainc9deb182020-11-16 19:03:12 +0000188
Gilles Peskine449bd832023-01-11 14:50:10 +0100189 if ((ret = mbedtls_asn1_get_tag(p, end, &len1, MBEDTLS_ASN1_CONSTRUCTED
190 | MBEDTLS_ASN1_CONTEXT_SPECIFIC)) != 0) {
191 if (ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG) {
192 return 0;
193 } else {
194 return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PKCS7_INVALID_FORMAT, ret);
195 }
Nayna Jainc9deb182020-11-16 19:03:12 +0000196 }
197 start = *p;
198 end_set = *p + len1;
199
Gilles Peskine449bd832023-01-11 14:50:10 +0100200 ret = mbedtls_asn1_get_tag(p, end_set, &len2, MBEDTLS_ASN1_CONSTRUCTED
201 | MBEDTLS_ASN1_SEQUENCE);
202 if (ret != 0) {
203 return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PKCS7_INVALID_CERT, ret);
Nick Child9f4fb3e2022-09-12 16:21:02 -0500204 }
Nayna Jainc9deb182020-11-16 19:03:12 +0000205
206 end_cert = *p + len2;
207
208 /*
209 * This is to verify that there is only one signer certificate. It seems it is
210 * not easy to differentiate between the chain vs different signer's certificate.
211 * So, we support only the root certificate and the single signer.
212 * The behaviour would be improved with addition of multiple signer support.
213 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100214 if (end_cert != end_set) {
215 return MBEDTLS_ERR_PKCS7_FEATURE_UNAVAILABLE;
Nick Child9f4fb3e2022-09-12 16:21:02 -0500216 }
Nayna Jainc9deb182020-11-16 19:03:12 +0000217
218 *p = start;
Gilles Peskine449bd832023-01-11 14:50:10 +0100219 if ((ret = mbedtls_x509_crt_parse_der(certs, *p, len1)) < 0) {
220 return MBEDTLS_ERR_PKCS7_INVALID_CERT;
Nick Child9f4fb3e2022-09-12 16:21:02 -0500221 }
Nayna Jainc9deb182020-11-16 19:03:12 +0000222
223 *p = *p + len1;
224
Nick Child5f9456f2022-09-19 10:01:25 -0500225 /*
Nick Child9f4fb3e2022-09-12 16:21:02 -0500226 * Since in this version we strictly support single certificate, and reaching
Nick Child5f9456f2022-09-19 10:01:25 -0500227 * here implies we have parsed successfully, we return 1.
Nick Child9f4fb3e2022-09-12 16:21:02 -0500228 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100229 return 1;
Nayna Jainc9deb182020-11-16 19:03:12 +0000230}
231
232/**
233 * EncryptedDigest ::= OCTET STRING
234 **/
Gilles Peskine449bd832023-01-11 14:50:10 +0100235static int pkcs7_get_signature(unsigned char **p, unsigned char *end,
236 mbedtls_pkcs7_buf *signature)
Nayna Jainc9deb182020-11-16 19:03:12 +0000237{
Nick Child9f4fb3e2022-09-12 16:21:02 -0500238 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Nayna Jainc9deb182020-11-16 19:03:12 +0000239 size_t len = 0;
240
Gilles Peskine449bd832023-01-11 14:50:10 +0100241 ret = mbedtls_asn1_get_tag(p, end, &len, MBEDTLS_ASN1_OCTET_STRING);
242 if (ret != 0) {
243 return ret;
244 }
Nayna Jainc9deb182020-11-16 19:03:12 +0000245
246 signature->tag = MBEDTLS_ASN1_OCTET_STRING;
247 signature->len = len;
248 signature->p = *p;
249
250 *p = *p + len;
251
Gilles Peskine449bd832023-01-11 14:50:10 +0100252 return 0;
Nayna Jainc9deb182020-11-16 19:03:12 +0000253}
254
Gilles Peskine449bd832023-01-11 14:50:10 +0100255static void pkcs7_free_signer_info(mbedtls_pkcs7_signer_info *signer)
Bence Szépkútif7641542022-12-12 21:37:36 +0100256{
257 mbedtls_x509_name *name_cur;
258 mbedtls_x509_name *name_prv;
259
Gilles Peskine449bd832023-01-11 14:50:10 +0100260 if (signer == NULL) {
Bence Szépkútif7641542022-12-12 21:37:36 +0100261 return;
Gilles Peskine449bd832023-01-11 14:50:10 +0100262 }
Bence Szépkútif7641542022-12-12 21:37:36 +0100263
264 name_cur = signer->issuer.next;
Gilles Peskine449bd832023-01-11 14:50:10 +0100265 while (name_cur != NULL) {
Bence Szépkútif7641542022-12-12 21:37:36 +0100266 name_prv = name_cur;
267 name_cur = name_cur->next;
Gilles Peskine449bd832023-01-11 14:50:10 +0100268 mbedtls_free(name_prv);
Bence Szépkútif7641542022-12-12 21:37:36 +0100269 }
270 signer->issuer.next = NULL;
271}
272
Nayna Jainc9deb182020-11-16 19:03:12 +0000273/**
Nayna Jainc9deb182020-11-16 19:03:12 +0000274 * SignerInfo ::= SEQUENCE {
275 * version Version;
276 * issuerAndSerialNumber IssuerAndSerialNumber,
277 * digestAlgorithm DigestAlgorithmIdentifier,
278 * authenticatedAttributes
279 * [0] IMPLICIT Attributes OPTIONAL,
280 * digestEncryptionAlgorithm DigestEncryptionAlgorithmIdentifier,
281 * encryptedDigest EncryptedDigest,
282 * unauthenticatedAttributes
283 * [1] IMPLICIT Attributes OPTIONAL,
Daniel Axtens35384792020-09-02 14:48:45 +1000284 * Returns 0 if the signerInfo is valid.
285 * Return negative error code for failure.
Nick Childbb82ab72022-10-28 12:28:54 -0500286 * Structure must not contain vales for authenticatedAttributes
287 * and unauthenticatedAttributes.
Daniel Axtens35384792020-09-02 14:48:45 +1000288 **/
Gilles Peskine449bd832023-01-11 14:50:10 +0100289static int pkcs7_get_signer_info(unsigned char **p, unsigned char *end,
290 mbedtls_pkcs7_signer_info *signer)
Daniel Axtens35384792020-09-02 14:48:45 +1000291{
292 unsigned char *end_signer;
Nick Child9f4fb3e2022-09-12 16:21:02 -0500293 int asn1_ret = 0, ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Daniel Axtens35384792020-09-02 14:48:45 +1000294 size_t len = 0;
295
Gilles Peskine449bd832023-01-11 14:50:10 +0100296 asn1_ret = mbedtls_asn1_get_tag(p, end, &len, MBEDTLS_ASN1_CONSTRUCTED
297 | MBEDTLS_ASN1_SEQUENCE);
298 if (asn1_ret != 0) {
Nick Child9f4fb3e2022-09-12 16:21:02 -0500299 goto out;
Gilles Peskine449bd832023-01-11 14:50:10 +0100300 }
Daniel Axtens35384792020-09-02 14:48:45 +1000301
302 end_signer = *p + len;
303
Gilles Peskine449bd832023-01-11 14:50:10 +0100304 ret = pkcs7_get_version(p, end_signer, &signer->version);
305 if (ret != 0) {
Nick Child9f4fb3e2022-09-12 16:21:02 -0500306 goto out;
Gilles Peskine449bd832023-01-11 14:50:10 +0100307 }
Daniel Axtens35384792020-09-02 14:48:45 +1000308
Gilles Peskine449bd832023-01-11 14:50:10 +0100309 asn1_ret = mbedtls_asn1_get_tag(p, end_signer, &len,
310 MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE);
311 if (asn1_ret != 0) {
Nick Child9f4fb3e2022-09-12 16:21:02 -0500312 goto out;
Gilles Peskine449bd832023-01-11 14:50:10 +0100313 }
Daniel Axtens35384792020-09-02 14:48:45 +1000314
315 /* Parsing IssuerAndSerialNumber */
316 signer->issuer_raw.p = *p;
317
Gilles Peskine449bd832023-01-11 14:50:10 +0100318 asn1_ret = mbedtls_asn1_get_tag(p, end_signer, &len,
319 MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE);
320 if (asn1_ret != 0) {
Nick Child9f4fb3e2022-09-12 16:21:02 -0500321 goto out;
Gilles Peskine449bd832023-01-11 14:50:10 +0100322 }
Daniel Axtens35384792020-09-02 14:48:45 +1000323
Gilles Peskine449bd832023-01-11 14:50:10 +0100324 ret = mbedtls_x509_get_name(p, *p + len, &signer->issuer);
325 if (ret != 0) {
Nick Child9f4fb3e2022-09-12 16:21:02 -0500326 goto out;
Gilles Peskine449bd832023-01-11 14:50:10 +0100327 }
Daniel Axtens35384792020-09-02 14:48:45 +1000328
329 signer->issuer_raw.len = *p - signer->issuer_raw.p;
330
Gilles Peskine449bd832023-01-11 14:50:10 +0100331 ret = mbedtls_x509_get_serial(p, end_signer, &signer->serial);
332 if (ret != 0) {
Nick Child9f4fb3e2022-09-12 16:21:02 -0500333 goto out;
Gilles Peskine449bd832023-01-11 14:50:10 +0100334 }
Daniel Axtens35384792020-09-02 14:48:45 +1000335
Gilles Peskine449bd832023-01-11 14:50:10 +0100336 ret = pkcs7_get_digest_algorithm(p, end_signer, &signer->alg_identifier);
337 if (ret != 0) {
Nick Child9f4fb3e2022-09-12 16:21:02 -0500338 goto out;
Gilles Peskine449bd832023-01-11 14:50:10 +0100339 }
Daniel Axtens35384792020-09-02 14:48:45 +1000340
Tom Cosgrove1797b052022-12-04 17:19:59 +0000341 /* Assume authenticatedAttributes is nonexistent */
Nick Childbb82ab72022-10-28 12:28:54 -0500342
Gilles Peskine449bd832023-01-11 14:50:10 +0100343 ret = pkcs7_get_digest_algorithm(p, end_signer, &signer->sig_alg_identifier);
344 if (ret != 0) {
Nick Child9f4fb3e2022-09-12 16:21:02 -0500345 goto out;
Bence Szépkútif7641542022-12-12 21:37:36 +0100346 }
Nick Child9f4fb3e2022-09-12 16:21:02 -0500347
Gilles Peskine449bd832023-01-11 14:50:10 +0100348 ret = pkcs7_get_signature(p, end_signer, &signer->sig);
349 if (ret != 0) {
350 goto out;
351 }
352
353 /* Do not permit any unauthenticated attributes */
354 if (*p != end_signer) {
355 ret = MBEDTLS_ERR_PKCS7_INVALID_SIGNER_INFO;
356 }
357
358out:
359 if (asn1_ret != 0 || ret != 0) {
360 pkcs7_free_signer_info(signer);
361 ret = MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PKCS7_INVALID_SIGNER_INFO,
362 asn1_ret);
363 }
364
365 return ret;
Daniel Axtens35384792020-09-02 14:48:45 +1000366}
367
Daniel Axtens35384792020-09-02 14:48:45 +1000368/**
369 * SignerInfos ::= SET of SignerInfo
Nayna Jainc9deb182020-11-16 19:03:12 +0000370 * Return number of signers added to the signed data,
371 * 0 or higher is valid.
372 * Return negative error code for failure.
373 **/
Gilles Peskine449bd832023-01-11 14:50:10 +0100374static int pkcs7_get_signers_info_set(unsigned char **p, unsigned char *end,
375 mbedtls_pkcs7_signer_info *signers_set)
Nayna Jainc9deb182020-11-16 19:03:12 +0000376{
Daniel Axtens35384792020-09-02 14:48:45 +1000377 unsigned char *end_set;
Nick Child9f4fb3e2022-09-12 16:21:02 -0500378 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Daniel Axtens35384792020-09-02 14:48:45 +1000379 int count = 0;
Nayna Jainc9deb182020-11-16 19:03:12 +0000380 size_t len = 0;
381
Gilles Peskine449bd832023-01-11 14:50:10 +0100382 ret = mbedtls_asn1_get_tag(p, end, &len, MBEDTLS_ASN1_CONSTRUCTED
383 | MBEDTLS_ASN1_SET);
384 if (ret != 0) {
385 return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PKCS7_INVALID_SIGNER_INFO, ret);
Nick Child9f4fb3e2022-09-12 16:21:02 -0500386 }
Nayna Jainc9deb182020-11-16 19:03:12 +0000387
Daniel Axtens35384792020-09-02 14:48:45 +1000388 /* Detect zero signers */
Gilles Peskine449bd832023-01-11 14:50:10 +0100389 if (len == 0) {
390 return 0;
Nick Child9f4fb3e2022-09-12 16:21:02 -0500391 }
Daniel Axtens35384792020-09-02 14:48:45 +1000392
Nayna Jainc9deb182020-11-16 19:03:12 +0000393 end_set = *p + len;
394
Gilles Peskine449bd832023-01-11 14:50:10 +0100395 ret = pkcs7_get_signer_info(p, end_set, signers_set);
396 if (ret != 0) {
397 return ret;
398 }
Daniel Axtens35384792020-09-02 14:48:45 +1000399 count++;
Nayna Jainc9deb182020-11-16 19:03:12 +0000400
Gilles Peskine47a73262022-11-27 21:46:56 +0100401 mbedtls_pkcs7_signer_info *prev = signers_set;
Gilles Peskine449bd832023-01-11 14:50:10 +0100402 while (*p != end_set) {
Gilles Peskine47a73262022-11-27 21:46:56 +0100403 mbedtls_pkcs7_signer_info *signer =
Gilles Peskine449bd832023-01-11 14:50:10 +0100404 mbedtls_calloc(1, sizeof(mbedtls_pkcs7_signer_info));
405 if (!signer) {
Daniel Axtens35384792020-09-02 14:48:45 +1000406 ret = MBEDTLS_ERR_PKCS7_ALLOC_FAILED;
407 goto cleanup;
408 }
Nayna Jainc9deb182020-11-16 19:03:12 +0000409
Gilles Peskine449bd832023-01-11 14:50:10 +0100410 ret = pkcs7_get_signer_info(p, end_set, signer);
411 if (ret != 0) {
412 mbedtls_free(signer);
Daniel Axtens35384792020-09-02 14:48:45 +1000413 goto cleanup;
414 }
415 prev->next = signer;
416 prev = signer;
417 count++;
418 }
Nayna Jainc9deb182020-11-16 19:03:12 +0000419
Gilles Peskine449bd832023-01-11 14:50:10 +0100420 return count;
Nayna Jainc9deb182020-11-16 19:03:12 +0000421
Daniel Axtens35384792020-09-02 14:48:45 +1000422cleanup:
Gilles Peskine449bd832023-01-11 14:50:10 +0100423 pkcs7_free_signer_info(signers_set);
Gilles Peskine47a73262022-11-27 21:46:56 +0100424 mbedtls_pkcs7_signer_info *signer = signers_set->next;
Gilles Peskine449bd832023-01-11 14:50:10 +0100425 while (signer != NULL) {
Daniel Axtens35384792020-09-02 14:48:45 +1000426 prev = signer;
427 signer = signer->next;
Gilles Peskine449bd832023-01-11 14:50:10 +0100428 pkcs7_free_signer_info(prev);
429 mbedtls_free(prev);
Daniel Axtens35384792020-09-02 14:48:45 +1000430 }
Gilles Peskine290f01b2022-11-27 21:28:31 +0100431 signers_set->next = NULL;
Gilles Peskine449bd832023-01-11 14:50:10 +0100432 return ret;
Nayna Jainc9deb182020-11-16 19:03:12 +0000433}
434
435/**
436 * SignedData ::= SEQUENCE {
437 * version Version,
438 * digestAlgorithms DigestAlgorithmIdentifiers,
439 * contentInfo ContentInfo,
440 * certificates
441 * [0] IMPLICIT ExtendedCertificatesAndCertificates
442 * OPTIONAL,
443 * crls
444 * [0] IMPLICIT CertificateRevocationLists OPTIONAL,
445 * signerInfos SignerInfos }
446 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100447static int pkcs7_get_signed_data(unsigned char *buf, size_t buflen,
448 mbedtls_pkcs7_signed_data *signed_data)
Nayna Jainc9deb182020-11-16 19:03:12 +0000449{
450 unsigned char *p = buf;
451 unsigned char *end = buf + buflen;
452 unsigned char *end_set;
453 size_t len = 0;
Nick Child9f4fb3e2022-09-12 16:21:02 -0500454 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Nayna Jainc9deb182020-11-16 19:03:12 +0000455 mbedtls_md_type_t md_alg;
456
Gilles Peskine449bd832023-01-11 14:50:10 +0100457 ret = mbedtls_asn1_get_tag(&p, end, &len, MBEDTLS_ASN1_CONSTRUCTED
458 | MBEDTLS_ASN1_SEQUENCE);
459 if (ret != 0) {
460 return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PKCS7_INVALID_FORMAT, ret);
Nick Child9f4fb3e2022-09-12 16:21:02 -0500461 }
Nayna Jainc9deb182020-11-16 19:03:12 +0000462
463 end_set = p + len;
464
465 /* Get version of signed data */
Gilles Peskine449bd832023-01-11 14:50:10 +0100466 ret = pkcs7_get_version(&p, end_set, &signed_data->version);
467 if (ret != 0) {
468 return ret;
469 }
Nayna Jainc9deb182020-11-16 19:03:12 +0000470
471 /* Get digest algorithm */
Gilles Peskine449bd832023-01-11 14:50:10 +0100472 ret = pkcs7_get_digest_algorithm_set(&p, end_set,
473 &signed_data->digest_alg_identifiers);
474 if (ret != 0) {
475 return ret;
476 }
Nayna Jainc9deb182020-11-16 19:03:12 +0000477
Gilles Peskine449bd832023-01-11 14:50:10 +0100478 ret = mbedtls_oid_get_md_alg(&signed_data->digest_alg_identifiers, &md_alg);
479 if (ret != 0) {
480 return MBEDTLS_ERR_PKCS7_INVALID_ALG;
Nick Child9f4fb3e2022-09-12 16:21:02 -0500481 }
Nayna Jainc9deb182020-11-16 19:03:12 +0000482
483 /* Do not expect any content */
Gilles Peskine449bd832023-01-11 14:50:10 +0100484 ret = pkcs7_get_content_info_type(&p, end_set, &signed_data->content.oid);
485 if (ret != 0) {
486 return ret;
487 }
Nayna Jainc9deb182020-11-16 19:03:12 +0000488
Gilles Peskine449bd832023-01-11 14:50:10 +0100489 if (MBEDTLS_OID_CMP(MBEDTLS_OID_PKCS7_DATA, &signed_data->content.oid)) {
490 return MBEDTLS_ERR_PKCS7_INVALID_CONTENT_INFO;
Nayna Jainc9deb182020-11-16 19:03:12 +0000491 }
492
Nayna Jainc9deb182020-11-16 19:03:12 +0000493 /* Look for certificates, there may or may not be any */
Gilles Peskine449bd832023-01-11 14:50:10 +0100494 mbedtls_x509_crt_init(&signed_data->certs);
495 ret = pkcs7_get_certificates(&p, end_set, &signed_data->certs);
496 if (ret < 0) {
497 return ret;
498 }
Nayna Jainc9deb182020-11-16 19:03:12 +0000499
500 signed_data->no_of_certs = ret;
501
502 /*
503 * Currently CRLs are not supported. If CRL exist, the parsing will fail
504 * at next step of getting signers info and return error as invalid
505 * signer info.
506 */
507
508 signed_data->no_of_crls = 0;
509
510 /* Get signers info */
Gilles Peskine449bd832023-01-11 14:50:10 +0100511 ret = pkcs7_get_signers_info_set(&p, end_set, &signed_data->signers);
512 if (ret < 0) {
513 return ret;
514 }
Nayna Jainc9deb182020-11-16 19:03:12 +0000515
516 signed_data->no_of_signers = ret;
517
Daniel Axtens35384792020-09-02 14:48:45 +1000518 /* Don't permit trailing data */
Gilles Peskine449bd832023-01-11 14:50:10 +0100519 if (p != end) {
520 return MBEDTLS_ERR_PKCS7_INVALID_FORMAT;
521 }
Nayna Jainc9deb182020-11-16 19:03:12 +0000522
Gilles Peskine449bd832023-01-11 14:50:10 +0100523 return 0;
Nayna Jainc9deb182020-11-16 19:03:12 +0000524}
525
Gilles Peskine449bd832023-01-11 14:50:10 +0100526int mbedtls_pkcs7_parse_der(mbedtls_pkcs7 *pkcs7, const unsigned char *buf,
527 const size_t buflen)
Nayna Jainc9deb182020-11-16 19:03:12 +0000528{
Nick Childbb82ab72022-10-28 12:28:54 -0500529 unsigned char *p;
Nayna Jainc9deb182020-11-16 19:03:12 +0000530 unsigned char *end;
531 size_t len = 0;
Nick Child9f4fb3e2022-09-12 16:21:02 -0500532 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Nayna Jain673a2262020-12-14 22:44:49 +0000533 int isoidset = 0;
Nayna Jainc9deb182020-11-16 19:03:12 +0000534
Gilles Peskine449bd832023-01-11 14:50:10 +0100535 if (pkcs7 == NULL) {
536 return MBEDTLS_ERR_PKCS7_BAD_INPUT_DATA;
Nick Child9f4fb3e2022-09-12 16:21:02 -0500537 }
Nayna Jainc9deb182020-11-16 19:03:12 +0000538
539 /* make an internal copy of the buffer for parsing */
Gilles Peskine449bd832023-01-11 14:50:10 +0100540 pkcs7->raw.p = p = mbedtls_calloc(1, buflen);
541 if (pkcs7->raw.p == NULL) {
Nick Child9f4fb3e2022-09-12 16:21:02 -0500542 ret = MBEDTLS_ERR_PKCS7_ALLOC_FAILED;
543 goto out;
Nayna Jainc9deb182020-11-16 19:03:12 +0000544 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100545 memcpy(p, buf, buflen);
Nayna Jainc9deb182020-11-16 19:03:12 +0000546 pkcs7->raw.len = buflen;
Nick Childbb82ab72022-10-28 12:28:54 -0500547 end = p + buflen;
Nayna Jainc9deb182020-11-16 19:03:12 +0000548
Gilles Peskine449bd832023-01-11 14:50:10 +0100549 ret = pkcs7_get_content_info_type(&p, end, &pkcs7->content_type_oid);
550 if (ret != 0) {
Nayna Jain673a2262020-12-14 22:44:49 +0000551 len = buflen;
552 goto try_data;
553 }
Nayna Jainc9deb182020-11-16 19:03:12 +0000554
Gilles Peskine449bd832023-01-11 14:50:10 +0100555 if (!MBEDTLS_OID_CMP(MBEDTLS_OID_PKCS7_DATA, &pkcs7->content_type_oid)
556 || !MBEDTLS_OID_CMP(MBEDTLS_OID_PKCS7_ENCRYPTED_DATA, &pkcs7->content_type_oid)
557 || !MBEDTLS_OID_CMP(MBEDTLS_OID_PKCS7_ENVELOPED_DATA, &pkcs7->content_type_oid)
558 || !MBEDTLS_OID_CMP(MBEDTLS_OID_PKCS7_SIGNED_AND_ENVELOPED_DATA, &pkcs7->content_type_oid)
559 || !MBEDTLS_OID_CMP(MBEDTLS_OID_PKCS7_DIGESTED_DATA, &pkcs7->content_type_oid)
560 || !MBEDTLS_OID_CMP(MBEDTLS_OID_PKCS7_ENCRYPTED_DATA, &pkcs7->content_type_oid)) {
Nayna Jainc9deb182020-11-16 19:03:12 +0000561 ret = MBEDTLS_ERR_PKCS7_FEATURE_UNAVAILABLE;
562 goto out;
563 }
564
Gilles Peskine449bd832023-01-11 14:50:10 +0100565 if (MBEDTLS_OID_CMP(MBEDTLS_OID_PKCS7_SIGNED_DATA, &pkcs7->content_type_oid)) {
Nayna Jainc9deb182020-11-16 19:03:12 +0000566 ret = MBEDTLS_ERR_PKCS7_BAD_INPUT_DATA;
567 goto out;
568 }
569
Nayna Jain673a2262020-12-14 22:44:49 +0000570 isoidset = 1;
Nayna Jainc9deb182020-11-16 19:03:12 +0000571
Gilles Peskine449bd832023-01-11 14:50:10 +0100572 ret = pkcs7_get_next_content_len(&p, end, &len);
573 if (ret != 0) {
Nayna Jainc9deb182020-11-16 19:03:12 +0000574 goto out;
Gilles Peskine449bd832023-01-11 14:50:10 +0100575 }
Nayna Jainc9deb182020-11-16 19:03:12 +0000576
Nayna Jain673a2262020-12-14 22:44:49 +0000577try_data:
Gilles Peskine449bd832023-01-11 14:50:10 +0100578 ret = pkcs7_get_signed_data(p, len, &pkcs7->signed_data);
579 if (ret != 0) {
Nayna Jain673a2262020-12-14 22:44:49 +0000580 goto out;
Gilles Peskine449bd832023-01-11 14:50:10 +0100581 }
Nayna Jain673a2262020-12-14 22:44:49 +0000582
Gilles Peskine449bd832023-01-11 14:50:10 +0100583 if (!isoidset) {
Nayna Jain673a2262020-12-14 22:44:49 +0000584 pkcs7->content_type_oid.tag = MBEDTLS_ASN1_OID;
Gilles Peskine449bd832023-01-11 14:50:10 +0100585 pkcs7->content_type_oid.len = MBEDTLS_OID_SIZE(MBEDTLS_OID_PKCS7_SIGNED_DATA);
586 pkcs7->content_type_oid.p = (unsigned char *) MBEDTLS_OID_PKCS7_SIGNED_DATA;
Nayna Jain673a2262020-12-14 22:44:49 +0000587 }
588
589 ret = MBEDTLS_PKCS7_SIGNED_DATA;
Nayna Jainc9deb182020-11-16 19:03:12 +0000590
591out:
Gilles Peskine449bd832023-01-11 14:50:10 +0100592 if (ret < 0) {
593 mbedtls_pkcs7_free(pkcs7);
594 }
Nayna Jain673a2262020-12-14 22:44:49 +0000595
Gilles Peskine449bd832023-01-11 14:50:10 +0100596 return ret;
Nayna Jainc9deb182020-11-16 19:03:12 +0000597}
598
Gilles Peskine449bd832023-01-11 14:50:10 +0100599static int mbedtls_pkcs7_data_or_hash_verify(mbedtls_pkcs7 *pkcs7,
Nick Child73621ef2022-10-28 11:23:15 -0500600 const mbedtls_x509_crt *cert,
601 const unsigned char *data,
602 size_t datalen,
Gilles Peskine449bd832023-01-11 14:50:10 +0100603 const int is_data_hash)
Nayna Jainc9deb182020-11-16 19:03:12 +0000604{
Nick Child9f4fb3e2022-09-12 16:21:02 -0500605 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Nayna Jainc9deb182020-11-16 19:03:12 +0000606 unsigned char *hash;
607 mbedtls_pk_context pk_cxt = cert->pk;
608 const mbedtls_md_info_t *md_info;
609 mbedtls_md_type_t md_alg;
Daniel Axtens35384792020-09-02 14:48:45 +1000610 mbedtls_pkcs7_signer_info *signer;
Nayna Jainc9deb182020-11-16 19:03:12 +0000611
Gilles Peskine449bd832023-01-11 14:50:10 +0100612 if (pkcs7->signed_data.no_of_signers == 0) {
613 return MBEDTLS_ERR_PKCS7_INVALID_CERT;
Nick Child9f4fb3e2022-09-12 16:21:02 -0500614 }
Nayna Jainc9deb182020-11-16 19:03:12 +0000615
Gilles Peskine449bd832023-01-11 14:50:10 +0100616 if (mbedtls_x509_time_is_past(&cert->valid_to) ||
617 mbedtls_x509_time_is_future(&cert->valid_from)) {
618 return MBEDTLS_ERR_PKCS7_CERT_DATE_INVALID;
Nick Child73621ef2022-10-28 11:23:15 -0500619 }
620
Daniel Axtens35384792020-09-02 14:48:45 +1000621 /*
622 * Potential TODOs
623 * Currently we iterate over all signers and return success if any of them
624 * verify.
625 *
626 * However, we could make this better by checking against the certificate's
627 * identification and SignerIdentifier fields first. That would also allow
628 * us to distinguish between 'no signature for key' and 'signature for key
629 * failed to validate'.
630 *
631 * We could also cache hashes by md, so if there are several sigs all using
632 * the same algo we don't recalculate the hash each time.
633 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100634 for (signer = &pkcs7->signed_data.signers; signer; signer = signer->next) {
635 ret = mbedtls_oid_get_md_alg(&signer->alg_identifier, &md_alg);
636 if (ret != 0) {
Nick Child9f4fb3e2022-09-12 16:21:02 -0500637 ret = MBEDTLS_ERR_PKCS7_VERIFY_FAIL;
Nick Child7089ce82022-09-14 14:10:00 -0500638 continue;
Nick Child9f4fb3e2022-09-12 16:21:02 -0500639 }
Nayna Jainc9deb182020-11-16 19:03:12 +0000640
Gilles Peskine449bd832023-01-11 14:50:10 +0100641 md_info = mbedtls_md_info_from_type(md_alg);
642 if (md_info == NULL) {
Nick Child7089ce82022-09-14 14:10:00 -0500643 ret = MBEDTLS_ERR_PKCS7_VERIFY_FAIL;
644 continue;
645 }
Daniel Axtens35384792020-09-02 14:48:45 +1000646
Gilles Peskine449bd832023-01-11 14:50:10 +0100647 hash = mbedtls_calloc(mbedtls_md_get_size(md_info), 1);
648 if (hash == NULL) {
649 return MBEDTLS_ERR_PKCS7_ALLOC_FAILED;
Daniel Axtens35384792020-09-02 14:48:45 +1000650 }
Gilles Peskine47a73262022-11-27 21:46:56 +0100651 /* BEGIN must free hash before jumping out */
Gilles Peskine449bd832023-01-11 14:50:10 +0100652 if (is_data_hash) {
653 if (datalen != mbedtls_md_get_size(md_info)) {
Nick Child73621ef2022-10-28 11:23:15 -0500654 ret = MBEDTLS_ERR_PKCS7_VERIFY_FAIL;
Gilles Peskine449bd832023-01-11 14:50:10 +0100655 } else {
Nick Child73621ef2022-10-28 11:23:15 -0500656 memcpy(hash, data, datalen);
Gilles Peskine449bd832023-01-11 14:50:10 +0100657 }
658 } else {
659 ret = mbedtls_md(md_info, data, datalen, hash);
Nick Child73621ef2022-10-28 11:23:15 -0500660 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100661 if (ret != 0) {
Nick Child7089ce82022-09-14 14:10:00 -0500662 ret = MBEDTLS_ERR_PKCS7_VERIFY_FAIL;
Gilles Peskine449bd832023-01-11 14:50:10 +0100663 mbedtls_free(hash);
Nick Child7089ce82022-09-14 14:10:00 -0500664 continue;
Daniel Axtens35384792020-09-02 14:48:45 +1000665 }
666
Gilles Peskine449bd832023-01-11 14:50:10 +0100667 ret = mbedtls_pk_verify(&pk_cxt, md_alg, hash,
668 mbedtls_md_get_size(md_info),
669 signer->sig.p, signer->sig.len);
670 mbedtls_free(hash);
Gilles Peskine47a73262022-11-27 21:46:56 +0100671 /* END must free hash before jumping out */
Daniel Axtens35384792020-09-02 14:48:45 +1000672
Gilles Peskine449bd832023-01-11 14:50:10 +0100673 if (ret == 0) {
Daniel Axtens35384792020-09-02 14:48:45 +1000674 break;
Gilles Peskine449bd832023-01-11 14:50:10 +0100675 }
Daniel Axtens35384792020-09-02 14:48:45 +1000676 }
Nayna Jainc9deb182020-11-16 19:03:12 +0000677
Gilles Peskine449bd832023-01-11 14:50:10 +0100678 return ret;
Nayna Jainc9deb182020-11-16 19:03:12 +0000679}
Gilles Peskine449bd832023-01-11 14:50:10 +0100680int mbedtls_pkcs7_signed_data_verify(mbedtls_pkcs7 *pkcs7,
681 const mbedtls_x509_crt *cert,
682 const unsigned char *data,
683 size_t datalen)
Nick Child73621ef2022-10-28 11:23:15 -0500684{
Gilles Peskine449bd832023-01-11 14:50:10 +0100685 return mbedtls_pkcs7_data_or_hash_verify(pkcs7, cert, data, datalen, 0);
Nick Child73621ef2022-10-28 11:23:15 -0500686}
Nayna Jainc9deb182020-11-16 19:03:12 +0000687
Gilles Peskine449bd832023-01-11 14:50:10 +0100688int mbedtls_pkcs7_signed_hash_verify(mbedtls_pkcs7 *pkcs7,
689 const mbedtls_x509_crt *cert,
690 const unsigned char *hash,
691 size_t hashlen)
Nayna Jainc9deb182020-11-16 19:03:12 +0000692{
Gilles Peskine449bd832023-01-11 14:50:10 +0100693 return mbedtls_pkcs7_data_or_hash_verify(pkcs7, cert, hash, hashlen, 1);
Nayna Jainc9deb182020-11-16 19:03:12 +0000694}
695
696/*
697 * Unallocate all pkcs7 data
698 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100699void mbedtls_pkcs7_free(mbedtls_pkcs7 *pkcs7)
Nayna Jainc9deb182020-11-16 19:03:12 +0000700{
Daniel Axtens35384792020-09-02 14:48:45 +1000701 mbedtls_pkcs7_signer_info *signer_cur;
702 mbedtls_pkcs7_signer_info *signer_prev;
Nayna Jainc9deb182020-11-16 19:03:12 +0000703
Gilles Peskine449bd832023-01-11 14:50:10 +0100704 if (pkcs7 == NULL || pkcs7->raw.p == NULL) {
Nayna Jainc9deb182020-11-16 19:03:12 +0000705 return;
Gilles Peskine449bd832023-01-11 14:50:10 +0100706 }
Nayna Jainc9deb182020-11-16 19:03:12 +0000707
Gilles Peskine449bd832023-01-11 14:50:10 +0100708 mbedtls_free(pkcs7->raw.p);
Nayna Jainc9deb182020-11-16 19:03:12 +0000709
Gilles Peskine449bd832023-01-11 14:50:10 +0100710 mbedtls_x509_crt_free(&pkcs7->signed_data.certs);
711 mbedtls_x509_crl_free(&pkcs7->signed_data.crl);
Nayna Jainc9deb182020-11-16 19:03:12 +0000712
Daniel Axtens35384792020-09-02 14:48:45 +1000713 signer_cur = pkcs7->signed_data.signers.next;
Gilles Peskine449bd832023-01-11 14:50:10 +0100714 pkcs7_free_signer_info(&pkcs7->signed_data.signers);
715 while (signer_cur != NULL) {
Daniel Axtens35384792020-09-02 14:48:45 +1000716 signer_prev = signer_cur;
717 signer_cur = signer_prev->next;
Gilles Peskine449bd832023-01-11 14:50:10 +0100718 pkcs7_free_signer_info(signer_prev);
719 mbedtls_free(signer_prev);
Nayna Jainc9deb182020-11-16 19:03:12 +0000720 }
721
722 pkcs7->raw.p = NULL;
723}
724
725#endif