import { KeyEncoder } from "./key"; describe("crypto key encoding", () => { test("public signing keys in PEM format can be imported", function() { const pemKey = ` -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyHXCaEXDalYsrc5+tCoU Cz5gqU3HhRe1NGKLqDjmQac/Wap8Uo1UBGSVR5/AcX9gi+qrtASswbz0adpMHIwh 8+AMBVoBJEWB/t4TmVAsGqVuONsNf3g0kLQPJKFnLoSognVfb6OgMOko2BnkxfNP Yl8CSVCRtSYElp5EmaqZ9iHFS2t1F52O+DRFYgzP9TgCk3xVHvQZHQahXJg2i+ZF +ptc1PPnvZj/RqkbK7YmooXr1UNQGeSmyP/h30maQUzb8RHXGqM0WU+dmWD5pwPz VUOzmNXWhKPer3boD75RsUBhMhF0CscTBKVu4oymv2G8TjGmO4uMKDZQ38Odxeb6 iwIDAQAB -----END PUBLIC KEY----- `.trim(); const keyEncoder = KeyEncoder(); return expect( keyEncoder.decode( pemKey, { name: "RSA-PSS", hash: "SHA-512" }, ["verify"], false ) ).resolves.toBeDefined(); }); test("public encryption keys in JWK format can be imported and exported", async function() { const jwk = { alg: "RSA-OAEP-512", e: "AQAB", ext: true, //eslint-disable-next-line @typescript-eslint/camelcase key_ops: ["wrapKey"], kty: "RSA", n: "sahckkhVN5Wz8vahCQVlb0s5-rj8ukHpIyWYKjiRuigul8PL9435luWs3p74I4E1KWHpgE-XAXvqbe-Qz3MOm5sZvxT3Dq4Ahx01UfW_fFfHW0qIxmMl1fokUXr2HCK1wRLI-37f4Uoe_z6u925Pg1cXwUH8u1lMWCQcEcrG9iKt2vfpS2MA8a9dkEWVh8r56WPLz24_NeJqm1fjnjj8fCXa3Yy92EUsK3LRn45l4WDhOuAsGTVd3AlABkxL3XL7HLULqdumGW4GQmz-RWfDqKxg5EF2U6Swh86LQjpN-VxhCsootwhle9EzQCIHv3PfSVFimIlqygvpWyFpDSRLGw" }; const keyEncoder = KeyEncoder(); const decodedKey = await keyEncoder.decode( jwk, { name: "RSA-OAEP", hash: "SHA-512" }, ["wrapKey"], // We need it to be extractable if we are to encode it again true ); expect(decodedKey).toBeDefined(); const encodedKey = await keyEncoder.encode(decodedKey); expect(encodedKey).toEqual(jwk); }); test("private encryption keys in JWK format can be imported and exported", async function() { const jwk = { alg: "RSA-OAEP-512", d: "RLwR-3q4r3kpZFTGZSnH_lgQg5z2kcfZZvRmzbsGdMkRWTm1x85z893I8LyD1EDL5gFlOghS6fotOVaWWcpez_XGxIqLB1o0gMmfguSNbiRxWfhDozkHawm9Xp9cXGnI9lSBRrUA2w1CGMlowDOsETeE1bSWOj_4RnkbNudkO9hiebbIDFRKTylAEbBix3tmqRK5jUJgUF2Uhha4MzqblcdnyDXYN1tc9wMCxfqyc5J56C2nfH7NXrzsEs5uAkZLIbT6BHZIacwnljyJR5XczklS-gO2aFHDqq1zSjL8F6-UBPbl7QRaxBSl9VKWavr5Y1EPfFT8Ln-YjwCOAP6ggQ", dp: "tgjvk2niNpufip7ghtxMD-KpKlHs8DQZzSZHgdXssc01rQKk3Ra7ihZCY-1EfJ7x147tVTv0_4zEZvnsmemiMzorxNsPeQpcXWRWuH0kX-tg_aNMzQUVTaXFV2LCxzkfpxLnbuRePTGVvPqgmrGEwA9Idu0SyGUbo0dSW_rnNwE", dq: "RHHsne_6HomrXJx4SKfWA0pdhXksGNHBeXZfjDRx-AOY0M8m3Sk1WAOSVlHGh8OCMEqcpsWWgWakjNGjPZTOu6-1Q8YYbzL8Ay-qOYEJYojxv2xWKk0CoanEF0KGM0qTNFH9qvIAvkyndKdda-EwQq2saH8tAkioau-qB28PFg0", e: "AQAB", ext: true, //eslint-disable-next-line @typescript-eslint/camelcase key_ops: ["unwrapKey"], kty: "RSA", n: "xEKd0-VYVQKRwk_gyro4VmrwGN3Mx8kdpjk5yw11cDcfN1xjy7zJWJKFXisR4crPkFiMy4YDj7Jc6gUdsG2UElIQbr8LAHFzk-bodIg7aT-QRObfV63lMu8fr3rnzM6k_pr-0IRou1AIi0dtX0WmnWd_yxqSiE8KEil_ooS0nFzzFQYMRP5KEuuraASokG-3IoT3KIOfb2ZkSVDPiOpo2jNIpfB3Q7Q_fqwYdiUiVqpcYllcqSP8glDYx3y9SuIUWK9AEyP84wgUevmHaJg8EiuoLsYpXd6SIqoxIjlvyWO7DoQMlx9-Ar3DSwBqi-elliJYtTbzvLs_-yGDhvMobw", p: "7-VXuwbqrit1Xv1EbFWiGuf3FszRGAuqOTkswWuiBTgo59E5-R7Wqtq4279YhV3BC4ZUy5zDDs3JwvBBf-8tdaEMgQ8_3TXXyLyi8T7mdkuNw-qZA8nGVo-D8atHRBrYWkjyaKS2-ztzmhNSm737VXwIo5rdZ3B1fs41aPMTK4E", q: "0W9i_U5KO0g9dqOeDNzFlt6pfERjLqk6V9Nbd8nbYgF99gHcVlifUYDmkErtx16FMmzsS3iqGMeJFudCR5KQ6zUzRTKcEXGclKNibm7PlkWE_RWnMzgFVsGnCZHEWsDM_0XyPekMH56JLuli-2rhqa2EMofMkthfqdjOoAivC-8", qi: "oJZ91Kw0cWsbQqEhHmwLTYcHAMdHdEF3YZUtSm6TtCMZCLRbCykLSRwYa1PdllXf2Ocb7P6FvEQAV_T-vepbIjkrwd0Sksy3WcRwBqRDeJj1MPPlT1OBXsrBUemmyNYNG2NKqC1DRHnU8nJ3RZoOtV09gTt5Yw5H83l8l7_3lXk" }; const keyEncoder = KeyEncoder(); const decodedKey = await keyEncoder.decode( jwk, { name: "RSA-OAEP", hash: "SHA-512" }, ["unwrapKey"], // We need it to be extractable if we are to encode it again true ); expect(decodedKey).toBeDefined(); const encodedKey = await keyEncoder.encode(decodedKey); expect(encodedKey).toEqual(jwk); }); });