@@ -5295,6 +5295,31 @@ static int SetAKID(byte* output, word32 outSz, byte *input, word32 length,
52955295 return (int )idx + enc_valSz ;
52965296}
52975297
5298+ #ifdef WOLFSSL_ACME_OID
5299+ /* encode RFC 8737 id-pe-acmeIdentifier extension, return total bytes written
5300+ * RFC8737 : critical */
5301+ static int SetAcmeIdentifier (byte * output , word32 outSz , const byte * digest ,
5302+ word32 digestSz )
5303+ {
5304+ byte inner [1 + MAX_LENGTH_SZ + WC_SHA256_DIGEST_SIZE ];
5305+ word32 innerSz ;
5306+ const byte acmeId_oid [] = { 0x06 , 0x08 , 0x2B , 0x06 , 0x01 , 0x05 , 0x05 , 0x07 ,
5307+ 0x01 , 0x1F , 0x01 , 0x01 , 0xFF , 0x04 };
5308+
5309+ if (output == NULL || digest == NULL )
5310+ return BAD_FUNC_ARG ;
5311+ if (digestSz != WC_SHA256_DIGEST_SIZE )
5312+ return BAD_FUNC_ARG ;
5313+
5314+ innerSz = SetOctetString (digestSz , inner );
5315+ XMEMCPY (inner + innerSz , digest , digestSz );
5316+ innerSz += digestSz ;
5317+
5318+ return SetOidValue (output , outSz , acmeId_oid , sizeof (acmeId_oid ),
5319+ inner , innerSz );
5320+ }
5321+ #endif /* WOLFSSL_ACME_OID */
5322+
52985323/* encode Key Usage, return total bytes written
52995324 * RFC5280 : critical */
53005325static int SetKeyUsage (byte * output , word32 outSz , word16 input )
@@ -6340,6 +6365,22 @@ static int EncodeCert(Cert* cert, DerCert* der, RsaKey* rsaKey, ecc_key* eccKey,
63406365 der -> certPoliciesSz = 0 ;
63416366#endif /* WOLFSSL_CERT_EXT */
63426367
6368+ #ifdef WOLFSSL_ACME_OID
6369+ /* RFC 8737 id-pe-acmeIdentifier (TLS-ALPN-01 challenge cert).
6370+ * Always critical=TRUE. */
6371+ if (cert -> acmeIdentifierSz == WC_SHA256_DIGEST_SIZE ) {
6372+ der -> acmeIdSz = SetAcmeIdentifier (der -> acmeId , sizeof (der -> acmeId ),
6373+ cert -> acmeIdentifier ,
6374+ (word32 )cert -> acmeIdentifierSz );
6375+ if (der -> acmeIdSz <= 0 )
6376+ return EXTENSIONS_E ;
6377+
6378+ der -> extensionsSz += der -> acmeIdSz ;
6379+ }
6380+ else
6381+ der -> acmeIdSz = 0 ;
6382+ #endif
6383+
63436384 /* put extensions */
63446385 if (der -> extensionsSz > 0 ) {
63456386
@@ -6436,6 +6477,17 @@ static int EncodeCert(Cert* cert, DerCert* der, RsaKey* rsaKey, ecc_key* eccKey,
64366477 return EXTENSIONS_E ;
64376478 }
64386479#endif /* WOLFSSL_CERT_EXT */
6480+
6481+ #ifdef WOLFSSL_ACME_OID
6482+ /* put ACME Identifier */
6483+ if (der -> acmeIdSz ) {
6484+ ret = SetExtensions (der -> extensions , sizeof (der -> extensions ),
6485+ & der -> extensionsSz ,
6486+ der -> acmeId , der -> acmeIdSz );
6487+ if (ret <= 0 )
6488+ return EXTENSIONS_E ;
6489+ }
6490+ #endif
64396491 }
64406492
64416493 der -> total = der -> versionSz + der -> serialSz + der -> sigAlgoSz +
0 commit comments