diff --git a/src/crypto/public_key/post_quantum/kem/ecc_kem.js b/src/crypto/public_key/post_quantum/kem/ecc_kem.js index a133c18a..1233eba8 100644 --- a/src/crypto/public_key/post_quantum/kem/ecc_kem.js +++ b/src/crypto/public_key/post_quantum/kem/ecc_kem.js @@ -1,6 +1,4 @@ import * as ecdhX from '../../elliptic/ecdh_x'; -import { computeDigest } from '../../../hash'; -import util from '../../../../util'; import enums from '../../../../enums'; export async function generate(algo) { @@ -20,12 +18,8 @@ export async function generate(algo) { export async function encaps(eccAlgo, eccRecipientPublicKey) { switch (eccAlgo) { case enums.publicKey.pqc_mlkem_x25519: { - const { ephemeralPublicKey: eccCipherText, sharedSecret: eccSharedSecret } = await ecdhX.generateEphemeralEncryptionMaterial(enums.publicKey.x25519, eccRecipientPublicKey); - const eccKeyShare = await computeDigest(enums.hash.sha3_256, util.concatUint8Array([ - eccSharedSecret, - eccCipherText, - eccRecipientPublicKey - ])); + const { ephemeralPublicKey: eccCipherText, sharedSecret: eccKeyShare } = await ecdhX.generateEphemeralEncryptionMaterial(enums.publicKey.x25519, eccRecipientPublicKey); + return { eccCipherText, eccKeyShare @@ -39,12 +33,7 @@ export async function encaps(eccAlgo, eccRecipientPublicKey) { export async function decaps(eccAlgo, eccCipherText, eccSecretKey, eccPublicKey) { switch (eccAlgo) { case enums.publicKey.pqc_mlkem_x25519: { - const eccSharedSecret = await ecdhX.recomputeSharedSecret(enums.publicKey.x25519, eccCipherText, eccPublicKey, eccSecretKey); - const eccKeyShare = await computeDigest(enums.hash.sha3_256, util.concatUint8Array([ - eccSharedSecret, - eccCipherText, - eccPublicKey - ])); + const eccKeyShare = await ecdhX.recomputeSharedSecret(enums.publicKey.x25519, eccCipherText, eccPublicKey, eccSecretKey); return eccKeyShare; } default: diff --git a/src/crypto/public_key/post_quantum/kem/kem.js b/src/crypto/public_key/post_quantum/kem/kem.js index 1a78de5d..1626eb03 100644 --- a/src/crypto/public_key/post_quantum/kem/kem.js +++ b/src/crypto/public_key/post_quantum/kem/kem.js @@ -31,7 +31,7 @@ export async function decrypt(algo, eccCipherText, mlkemCipherText, eccSecretKey async function multiKeyCombine(algo, ecdhKeyShare, ecdhCipherText, ecdhPublicKey, mlkemKeyShare, mlkemCipherText, mlkemPublicKey) { // LAMPS-aligned and NIST compatible combiner, proposed in: https://mailarchive.ietf.org/arch/msg/openpgp/NMTCy707LICtxIhP3Xt1U5C8MF0/ // 2a. KDF(mlkemSS || tradSS || tradCT || tradPK || Domain) - // where Domain is "Domain" for LAMPS, and "mlkemCT || mlkemPK || algId" for OpenPGP + // where Domain is "Domain" for LAMPS, and "mlkemCT || mlkemPK || algId || const" for OpenPGP const encData = util.concatUint8Array([ mlkemKeyShare, ecdhKeyShare, @@ -40,7 +40,8 @@ async function multiKeyCombine(algo, ecdhKeyShare, ecdhCipherText, ecdhPublicKey // domSep mlkemCipherText, mlkemPublicKey, - new Uint8Array([algo]) + new Uint8Array([algo]), + util.encodeUTF8('OpenPGPCompositeKDFv1') ]); const kek = await computeDigest(enums.hash.sha3_256, encData); diff --git a/test/crypto/postQuantum.js b/test/crypto/postQuantum.js index 5d93a84d..9614cd45 100644 --- a/test/crypto/postQuantum.js +++ b/test/crypto/postQuantum.js @@ -655,35 +655,35 @@ zdmQk3zZBuwE/KAXTAY= it('ML-KEM + X25519 - Test vector', async function () { const armoredMessage = `-----BEGIN PGP MESSAGE----- -wcPUA7w9P/Y4tvvTaUZQqpafFZ6WRHDl5y8FJcqxWgQ8kK3P++vG3p2aW0Vb -BuxUbAzplFMVjybzf8n0qa/92R6IeFKWMilaM+iAf81VyTIBv12lfQy27RFx -itM0v/CAWrEvPf1RkB0ZnEX9lKhIfBp7QRSVEp2QOh3pWtYQ6AkS0JtOGeiI -befPigAVtmDlnYHYYEFbrKlE8pvLF2bMCJkHredQue7AmsGLpnXZpna19rvG -3kB38YiM6777jxW8yb7h77jOZgnclJXYkSHly7LKa6z6omOYqn6rA5izbE0e -s/yqucighBVnjiwNEwrPlQbogh6EtRsGXkYLPGRSVSM2MCSsigl2Xs2cgWJV -7outF2Qr8BauBRqHW5ScJF/yAmVP7NfQ9PfoUPMiHFJE8U6ffow6lnNWzhn2 -Wqp8GkBccTmzwD/6XXf23yKGO6AIc1xvNpE99QBzTkPslPuXDiocMHfAXpbW -HzVyOwXu/tQmRNe+ISNpQsMmQDUM05kq0diazBXOiZGRMRFndEpa1Qhhgj7V -4GgLyr/HdylNbzbiUGFjovN8/pUwO6APu1jU/CmFEUrjjOFpXaOLZ6svt5mW -iNlVNfWVq35CrJdWVFInLjD/GmsQNSiPe34LcDS3TVRzAhS5HehTVrkFDOD+ -e7wBnHFKDquYTzc3pqP3gHmzCLueUfo3Z6cTgXz6T3+RlRfZDNQzLZ7XHC3W -VWuwjViv0mQncau6bCnhhCK4VwAqXCvjy9m598cqKQZ5Sf3DAGY1+ZGqbID+ -0zCdVKC0v4eUEGg2D9K1f1XiTfaJv6AO0sS5RqjAZxBpw2/m5ruxMyJxqTE1 -h0GZLEY1ZQKxe9E0bDvTi0ogbYicLEokgRyKN/ojZE+hwpA7msjLVV7E0tDg -rz8jxp4AwQ8O/FXX/X0Dp04QsZgJhdwEYt4HPTogSff/NaC8KNSTzxEvJIMa -N+dPAp3Ypz7pGU6y73odwBCJ58nAPaI06f3Ev4gWJai8sUxeHe6amQX+SYqL -jbTP838PgbRbNCwBUiH2I5WX2bdIeRbEiQerVr7f76Kpdo2FC93A8VlW/wyK -VYWINPBfB/ktLAzmohR9wq+E+uMCOnyz6+vE1Bf2fbljGBSBjyUwED07tlDd -B9EvUlLgr7TAiideveSXHAx0G0qK5NBzfoY3Ca3WETiqkDTWpBSPDQUsbXrF -u2QUJKIcXcQptuiC+nKFFbDoFvCJzgcuRS/H1ZyOcI0dgmx9T1GGrID65R0z -FqdpenxdaHncrMmOlYI/cwyrfhHV0wZB6Y0XAv5Ujwsfg0fdCxJclkAI1k/x -N2xIhjwFdh62sKZqCJgfgKlrkSv4DDUVAooR/yHIIKpeJQgC2ZUfL3XLNycJ -eBf5V5ZmyRhIVgAThhb4cGVtNahP0IuIHk7eMdALC5Yhl+PTlSlhqVkbyi05 -Ae7dcaTW/KAEzZw2mqvVQX2MABaShv49reFhsCfI7EWbdI0CpTQbrCxp9mTI -Lw2nVxF5SGApCQtVJ+cajQ48p2MNwYMbsnMU9oEjy89nXZfU0G3CBRnAnhUP -Sw5WYSDSOgGTtzkIxvyRfaLftZRNfT/5XmvtpCqVWwBKHJ1/qcLEIRWfenqT -M/UQCkZrgB2Ry+4Oc1hgibIUzOM= -=8HM/ +wcPUA7w9P/Y4tvvTafGcykbHOZebb4UEiUzy7MdOx0v3nPOv8JfjdcbC3Ucz +4couZg5vJI7En+EBaT8f2aU+ZTmCmuZMVy5BHp9YKLhGmSU6tT3eUrhh63Z9 +IC44aS0m0vH/4f1vpsJmbpuPLxi+Q6DS4Sl4UOr0U8FOXzcb6uGMhWtOOdwI +iPZKgVpjgzwzxM1xh44hJz0iRSWKPPnFg9mbIHVPtuDMDNUYdOkRQhyQKYQE +z/ok0X9jCFKmAvKHpNjl4lFCxwcscJ5q5OYPO9I2BrJMyK2oyHmtgCojSvW1 +hSTeVNoXO0cwfQzWSNBQvBQEcuQ5gGKkQtbkBGds2LUmf2PASbZb8sZkN6EQ +8zdljhU3r4mHjTdNedTi8bN00/VQwsKFeN928f9k6SZDCU0XQxq/wZKmDhnI +vhvd5GbzFgeFSiPV+WY2sajZvh2cPuz0SGhW91ue0h3F2yKEzSQrloxZvV6Q +aFHWtBdzwx/Tx4oAvLvbBjV5qKC/C5f4RTNBoZ1doa4y8jxeeBEXBR7K7+mz +sS5GkVv5tpI1Z8UO/I450XdSYFS+dESgpZNLwy3Hu4TFMAxH78jjN21byr7S +Nx0ZmYrqQcfrW9m4YFsqpn50CJfbzRven84tgM9LqONIufCFhPv6K57MPSWR +l/YAut3fT2Mt/Bc3RS0xqiH7pi+/RxzKzY2nJ1takd2r4uWFLU3oLZBZrgck +M9+ZW9wwlgLOt5zmG+zZG9yfnpCBQIdmEJ31mH+j7oGemoM7r9UuLhbizlEE +Nx/TtsEXpuKTbzsrxjp9zVhgoF0ivV9mKWuGY1yGYaeT73RbyIzxVYjJTPsZ +Z9AWXNOmaRTFmrHHstQGz6AwcAZXoQ3Od2hiZ9BtgQ92Q5YZICFH3cbjCIEU +Pvj0f/1ruhHO20Q+uUcACAWRjWD9r1ijMnY1ke5GA+LZNXstEnzZPCqrhk5Z +NIFhuu+o47fakDvciMEqbdk6L2r620GLFG6F7cOO0vm/SrOm4drrvIpTbUe4 +DrgXhQuusUiXHKm4oB1/zNTEOpL4wqXLyyqcsN3EWXb3j+ZMwo+hm/ynEvPl +Gj76dvaJx5hRAtga4ZD8L6E1LS82bMmQKTp3uBJ3vcBxhKsSAYXO3ZQWeq0X +YSyvJiyy7We7gsjjN7RcYm8tOohoGvr2thf3LhN7hTBJWU1js7yq6UlAY+0A +so0dbkne00G77pRsy+nRYjVOFTm+57U/7UUTKsDtZf2Vsrv/nfAK2l507WAJ +8oioHhaDb4kxR92UR+cPkdqNzeMFEShgkRTRNG8d6cyRBa5/sYPtuSrKB0VX +S/t2UXgFWqTWPzcRv/NTDq89+yY5UvwfSFlRaKa32DHcUYq9L77Wq3bEZJiE +KYWFPla4cz1PnckU6DGUXxMAe2KrJ/ALhnTXavwLptqKSktgMS6FfBT8NJTX +Cf691DI9fikwHXZVGEKdh2CQpyZkJCoe+qOhKHEwrErMHHaajYYBHkGk6P9y +UifBYpdwZcspCcv6z78hlprAKcSAnXRKj2zIP5z36dbTN3z+vEa8HKM3lfAz +9Vbc34PSOgHX0jeD+RNwY7bt13n8MmNwsEUIUyHl/ivKTqhp2MKGnc622oXb +MdhqSPQkCscEVIT6fTh/vIyMTs0= +=OmpP -----END PGP MESSAGE-----`; const privateKey = await openpgp.readKey({ armoredKey: `-----BEGIN PGP PRIVATE KEY BLOCK----- @@ -1078,113 +1078,113 @@ fJWWnLW7yOAAAAAAAAAAAAAAAAAAAAAAAAAACgwOExkk // since we use a different KEM combiner const armoredMessage = `-----BEGIN PGP MESSAGE----- -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 -6LfQlrZ3DteWPwEVWDEBfKKhFyTzzgk= +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 +jXoyrGhDDakI/1XygauU5DpNuhgApoA= -----END PGP MESSAGE-----`; const { data: decryptedData, signatures: [{ verified }] } = await openpgp.decrypt({