mbedtls/external: support Microsoft Authentication Code

Populate Microsoft Authentication Code from the content data
into PKCS7 decoding context if it exists in a PKCS7 message.
Add OIDs for describing objects using for Microsoft Authentication
Code.

The PR for this patch is at:
https://github.com/Mbed-TLS/mbedtls/pull/9001

For enabling EFI loader PKCS7 features with MbedTLS build,
we need this patch on top of MbedTLS v3.6.0 before it is merged into
the next MbedTLS LTS release.

Signed-off-by: Raymond Mao <raymond.mao@linaro.org>
Acked-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
This commit is contained in:
Raymond Mao
2024-10-03 14:50:21 -07:00
committed by Tom Rini
parent c60e99ff62
commit 9acdd5339a
3 changed files with 90 additions and 10 deletions

View File

@@ -352,6 +352,36 @@
#define MBEDTLS_OID_PKCS12_PBE_SHA1_RC2_128_CBC MBEDTLS_OID_PKCS12_PBE "\x05" /**< pbeWithSHAAnd128BitRC2-CBC OBJECT IDENTIFIER ::= {pkcs-12PbeIds 5} */ #define MBEDTLS_OID_PKCS12_PBE_SHA1_RC2_128_CBC MBEDTLS_OID_PKCS12_PBE "\x05" /**< pbeWithSHAAnd128BitRC2-CBC OBJECT IDENTIFIER ::= {pkcs-12PbeIds 5} */
#define MBEDTLS_OID_PKCS12_PBE_SHA1_RC2_40_CBC MBEDTLS_OID_PKCS12_PBE "\x06" /**< pbeWithSHAAnd40BitRC2-CBC OBJECT IDENTIFIER ::= {pkcs-12PbeIds 6} */ #define MBEDTLS_OID_PKCS12_PBE_SHA1_RC2_40_CBC MBEDTLS_OID_PKCS12_PBE "\x06" /**< pbeWithSHAAnd40BitRC2-CBC OBJECT IDENTIFIER ::= {pkcs-12PbeIds 6} */
/*
* MicroSoft Authenticate Code OIDs
*/
#define MBEDTLS_OID_PRIVATE_ENTERPRISE MBEDTLS_OID_INTERNET "\x04\x01" /* {iso(1) identified-organization(3) dod(6) internet(1) private(4) enterprise(1) */
#define MBEDTLS_OID_MICROSOFT "\x82\x37" /* {microsoft(311)} */
/*
* OID_msIndirectData: (1.3.6.1.4.1.311.2.1.4)
* {iso(1) identified-organization(3) dod(6) internet(1) private(4) enterprise(1) microsoft(311) 2(2) 1(1) 4(4)}
*/
#define MBEDTLS_OID_MICROSOFT_INDIRECTDATA MBEDTLS_OID_PRIVATE_ENTERPRISE MBEDTLS_OID_MICROSOFT \
"\x02\x01\x04"
/*
* OID_msStatementType: (1.3.6.1.4.1.311.2.1.11)
* {iso(1) identified-organization(3) dod(6) internet(1) private(4) enterprise(1) microsoft(311) 2(2) 1(1) 11(11)}
*/
#define MBEDTLS_OID_MICROSOFT_STATETYPE MBEDTLS_OID_PRIVATE_ENTERPRISE MBEDTLS_OID_MICROSOFT \
"\x02\x01\x0b"
/*
* OID_msSpOpusInfo: (1.3.6.1.4.1.311.2.1.12)
* {iso(1) identified-organization(3) dod(6) internet(1) private(4) enterprise(1) microsoft(311) 2(2) 1(1) 12(12)}
*/
#define MBEDTLS_OID_MICROSOFT_SPOPUSINFO MBEDTLS_OID_PRIVATE_ENTERPRISE MBEDTLS_OID_MICROSOFT \
"\x02\x01\x0b"
/*
* OID_msPeImageDataObjId: (1.3.6.1.4.1.311.2.1.15)
* {iso(1) identified-organization(3) dod(6) internet(1) private(4) enterprise(1) microsoft(311) 2(2) 1(1) 15(15)}
*/
#define MBEDTLS_OID_MICROSOFT_PEIMAGEDATA MBEDTLS_OID_PRIVATE_ENTERPRISE MBEDTLS_OID_MICROSOFT \
"\x02\x01\x0f"
/* /*
* EC key algorithms from RFC 5480 * EC key algorithms from RFC 5480
*/ */

View File

@@ -132,12 +132,22 @@ typedef struct mbedtls_pkcs7_signed_data {
} }
mbedtls_pkcs7_signed_data; mbedtls_pkcs7_signed_data;
/* Content Data for MicroSoft Authentication Code using in U-Boot Secure Boot */
typedef struct mbedtls_pkcs7_conten_data {
int data_type; /* Type of Data */
size_t data_len; /* Length of Data */
size_t data_hdrlen; /* Length of Data ASN.1 header */
void *data; /* Content Data */
}
mbedtls_pkcs7_conten_data;
/** /**
* Structure holding PKCS #7 structure, only signed data for now * Structure holding PKCS #7 structure, only signed data for now
*/ */
typedef struct mbedtls_pkcs7 { typedef struct mbedtls_pkcs7 {
mbedtls_pkcs7_buf MBEDTLS_PRIVATE(raw); mbedtls_pkcs7_buf MBEDTLS_PRIVATE(raw);
mbedtls_pkcs7_signed_data MBEDTLS_PRIVATE(signed_data); mbedtls_pkcs7_signed_data MBEDTLS_PRIVATE(signed_data);
mbedtls_pkcs7_conten_data content_data;
} }
mbedtls_pkcs7; mbedtls_pkcs7;

View File

@@ -29,6 +29,13 @@
#include <time.h> #include <time.h>
#endif #endif
enum OID {
/* PKCS#7 {iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs-7(7)} */
MBEDTLS_OID_DATA = 13, /* 1.2.840.113549.1.7.1 */
/* Microsoft Authenticode & Software Publishing */
MBEDTLS_OID_MS_INDIRECTDATA = 24, /* 1.3.6.1.4.1.311.2.1.4 */
};
/** /**
* Initializes the mbedtls_pkcs7 structure. * Initializes the mbedtls_pkcs7 structure.
*/ */
@@ -449,7 +456,7 @@ cleanup:
* signerInfos SignerInfos } * signerInfos SignerInfos }
*/ */
static int pkcs7_get_signed_data(unsigned char *buf, size_t buflen, static int pkcs7_get_signed_data(unsigned char *buf, size_t buflen,
mbedtls_pkcs7_signed_data *signed_data) mbedtls_pkcs7 *pkcs7)
{ {
unsigned char *p = buf; unsigned char *p = buf;
unsigned char *end = buf + buflen; unsigned char *end = buf + buflen;
@@ -457,6 +464,7 @@ static int pkcs7_get_signed_data(unsigned char *buf, size_t buflen,
size_t len = 0; size_t len = 0;
int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
mbedtls_md_type_t md_alg; mbedtls_md_type_t md_alg;
mbedtls_pkcs7_signed_data *signed_data = &pkcs7->signed_data;
ret = mbedtls_asn1_get_tag(&p, end, &len, MBEDTLS_ASN1_CONSTRUCTED ret = mbedtls_asn1_get_tag(&p, end, &len, MBEDTLS_ASN1_CONSTRUCTED
| MBEDTLS_ASN1_SEQUENCE); | MBEDTLS_ASN1_SEQUENCE);
@@ -493,25 +501,57 @@ static int pkcs7_get_signed_data(unsigned char *buf, size_t buflen,
if (ret != 0) { if (ret != 0) {
return ret; return ret;
} }
if (MBEDTLS_OID_CMP(MBEDTLS_OID_PKCS7_DATA, &content_type)) {
/*
* We should only support 1.2.840.113549.1.7.1 (PKCS7 DATA) and
* 1.3.6.1.4.1.311.2.1.4 (MicroSoft Authentication Code) that is for
* U-Boot Secure Boot
*/
if (!MBEDTLS_OID_CMP(MBEDTLS_OID_PKCS7_DATA, &content_type)) {
pkcs7->content_data.data_type = MBEDTLS_OID_DATA;
} else if (!MBEDTLS_OID_CMP(MBEDTLS_OID_MICROSOFT_INDIRECTDATA,
&content_type)) {
pkcs7->content_data.data_type = MBEDTLS_OID_MS_INDIRECTDATA;
} else {
return MBEDTLS_ERR_PKCS7_INVALID_CONTENT_INFO; return MBEDTLS_ERR_PKCS7_INVALID_CONTENT_INFO;
} }
if (p != end_content_info) { if (p != end_content_info) {
unsigned char *tmp_p = p;
/* Determine if valid content is present */ /* Determine if valid content is present */
ret = mbedtls_asn1_get_tag(&p, ret = mbedtls_asn1_get_tag(&p,
end_content_info, end_content_info,
&len, &len,
MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_CONTEXT_SPECIFIC); MBEDTLS_ASN1_CONSTRUCTED |
MBEDTLS_ASN1_CONTEXT_SPECIFIC);
if (ret != 0 || p + len != end_content_info) {
return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PKCS7_INVALID_CONTENT_INFO,
ret);
}
/*
* U-Boot Secure Boot needs to calculate the digest of MicroSoft
* Authentication Code during verifying an EFI image.
* Thus we need to save the context of Content Data.
*/
pkcs7->content_data.data_hdrlen = p - tmp_p;
/* Parse the content data from a sequence */
ret = mbedtls_asn1_get_tag(&p, end_content_info, &len,
MBEDTLS_ASN1_CONSTRUCTED |
MBEDTLS_ASN1_SEQUENCE);
if (ret != 0) { if (ret != 0) {
return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PKCS7_INVALID_CONTENT_INFO, ret); /* TODO: Other Content Data formats are not supported at the moment */
return MBEDTLS_ERR_PKCS7_FEATURE_UNAVAILABLE;
} else if (p + len != end_content_info) {
return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PKCS7_INVALID_CONTENT_INFO,
ret);
} }
pkcs7->content_data.data = p;
pkcs7->content_data.data_len = len;
p += len; p += len;
if (p != end_content_info) {
return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PKCS7_INVALID_CONTENT_INFO, ret);
}
/* Valid content is present - this is not supported */
return MBEDTLS_ERR_PKCS7_FEATURE_UNAVAILABLE;
} }
/* Look for certificates, there may or may not be any */ /* Look for certificates, there may or may not be any */
@@ -624,7 +664,7 @@ int mbedtls_pkcs7_parse_der(mbedtls_pkcs7 *pkcs7, const unsigned char *buf,
} }
try_data: try_data:
ret = pkcs7_get_signed_data(p, len, &pkcs7->signed_data); ret = pkcs7_get_signed_data(p, len, pkcs7);
if (ret != 0) { if (ret != 0) {
goto out; goto out;
} }