@@ -36869,7 +36869,8 @@ static const ASNItem edKeyASN[] = {
3686936869 /* privateKey */
3687036870/* PKEY */ { 1, ASN_OCTET_STRING, 0, 1, 0 },
3687136871 /* CurvePrivateKey */
36872- /* PKEY_CURVEPKEY */ { 2, ASN_OCTET_STRING, 0, 0, 0 },
36872+ /* PKEY_CURVEPKEY */ { 2, ASN_OCTET_STRING, 0, 0, 2 },
36873+ /* PKEY_MLDSASEQ */ { 2, ASN_SEQUENCE, 1, 0, 2 },
3687336874 /* attributes */
3687436875/* ATTRS */ { 1, ASN_CONTEXT_SPECIFIC | ASN_ASYMKEY_ATTRS, 1, 1, 1 },
3687536876 /* publicKey */
@@ -36882,6 +36883,7 @@ enum {
3688236883 EDKEYASN_IDX_PKEYALGO_OID,
3688336884 EDKEYASN_IDX_PKEY,
3688436885 EDKEYASN_IDX_PKEY_CURVEPKEY,
36886+ EDKEYASN_IDX_PKEY_MLDSASEQ,
3688536887 EDKEYASN_IDX_ATTRS,
3688636888 EDKEYASN_IDX_PUBKEY
3688736889};
@@ -36947,8 +36949,15 @@ int DecodeAsymKey_Assign(const byte* input, word32* inOutIdx, word32 inSz,
3694736949 if (GetOctetString(input, inOutIdx, &length, inSz) < 0)
3694836950 return ASN_PARSE_E;
3694936951
36950- if (GetOctetString(input, inOutIdx, &privSz, inSz) < 0)
36951- return ASN_PARSE_E;
36952+ if (GetOctetString(input, inOutIdx, &privSz, inSz) < 0) {
36953+ if (oid != ML_DSA_LEVEL2k && oid != ML_DSA_LEVEL3k &&
36954+ oid != ML_DSA_LEVEL5k) {
36955+ return ASN_PARSE_E;
36956+ }
36957+ if (GetSequence(input, inOutIdx, &privSz, inSz) < 0) {
36958+ return ASN_PARSE_E;
36959+ }
36960+ }
3695236961
3695336962 priv = input + *inOutIdx;
3695436963 *inOutIdx += (word32)privSz;
@@ -37026,11 +37035,24 @@ int DecodeAsymKey_Assign(const byte* input, word32* inOutIdx, word32 inSz,
3702637035 (int)dataASN[EDKEYASN_IDX_PKEYALGO_OID].data.oid.sum;
3702737036 }
3702837037 }
37029- if (ret == 0) {
37038+ if (ret == 0 && dataASN[EDKEYASN_IDX_PKEY_CURVEPKEY].data.ref.length != 0 ) {
3703037039 /* Import private value. */
3703137040 *privKeyLen = dataASN[EDKEYASN_IDX_PKEY_CURVEPKEY].data.ref.length;
3703237041 *privKey = dataASN[EDKEYASN_IDX_PKEY_CURVEPKEY].data.ref.data;
3703337042 }
37043+ else if (ret == 0 &&
37044+ dataASN[EDKEYASN_IDX_PKEY_MLDSASEQ].data.ref.length != 0) {
37045+ if (*inOutKeyType != ML_DSA_LEVEL2k &&
37046+ *inOutKeyType != ML_DSA_LEVEL3k &&
37047+ *inOutKeyType != ML_DSA_LEVEL5k) {
37048+ ret = ASN_PARSE_E;
37049+ }
37050+ else {
37051+ /* Import private value. */
37052+ *privKeyLen = dataASN[EDKEYASN_IDX_PKEY_MLDSASEQ].data.ref.length;
37053+ *privKey = dataASN[EDKEYASN_IDX_PKEY_MLDSASEQ].data.ref.data;
37054+ }
37055+ }
3703437056 if ((ret == 0) && dataASN[EDKEYASN_IDX_PUBKEY].tag == 0) {
3703537057 /* Set public length to 0 as not seen. */
3703637058 if (pubKeyLen != NULL)
@@ -37454,6 +37476,8 @@ int SetAsymKeyDer(const byte* privKey, word32 privKeyLen,
3745437476 SetASN_Buffer(&dataASN[EDKEYASN_IDX_PKEY_CURVEPKEY], NULL, privKeyLen);
3745537477 /* Don't write out attributes. */
3745637478 dataASN[EDKEYASN_IDX_ATTRS].noOut = 1;
37479+ /* Don't write sequence. */
37480+ dataASN[EDKEYASN_IDX_PKEY_MLDSASEQ].noOut = 1;
3745737481 if (pubKey) {
3745837482 /* Leave space for public key. */
3745937483 SetASN_Buffer(&dataASN[EDKEYASN_IDX_PUBKEY], NULL, pubKeyLen);
0 commit comments