Skip to content

Instantly share code, notes, and snippets.

@iameli
Last active September 21, 2022 13:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save iameli/cf32f8219b59a01908724b5e41334213 to your computer and use it in GitHub Desktop.
Save iameli/cf32f8219b59a01908724b5e41334213 to your computer and use it in GitHub Desktop.
==================================
RS256 - generateKeyPairSync("rsa", {"modulusLength":4096})
==================================
"Web-standard" variation (1734 bytes):
eyJhbGciOiJSUzI1NiIsImp3ayI6eyJrdHkiOiJSU0EiLCJuIjoidjh6MnFIRGRneFpBUVNIekx6OFJjZEtsOUl0WWgxWlktZVQ5VUJXMno2M0pkNkZDTG5UT3RqSTFmZ2RKQjh1bWhnRHlSNktrV1FOUkItcXBKNWFMRjlTSUNEU3d5U1h2TTNKV3ViLVk5VlFlRlRIVFRrOThHUDltUTVtQmttc0o3ZUphWUExODRGWm1RSWZVSkl2M0JGQjVNamdTcGp4bjJnTEVhZDl0Zk1rZWVxQ05OQm83WThxM01STWViLXFPMjJCbUJOT2dEWFkwTUZoYlpkRDVxeHd2OFJCMGZXZEZsSVBFTUpMMEFjZnc0OThOYVphUnllWnM5THJ6cWJKbkRhWktLYWJVNFFSdjRZVDlsRmdoQmY4VkhGTkp6UVR2YkZyYUEwaWJoLUtxc2hMc3JXc2ZUVEZVZjJ3TUpvN1dGZVUwS3VUWlVsZkd6VTFhai1GdUxrS3NYMW03cThxZWl1ZVpUMmk4LWg5Vy1NaWJWVTRrc3BHMnJwZkllMHA5alk3NzJidW03S29kc05BTU80azVWOWlQMEVZbTVmS3NidzlxOGtXYUYyZlRucGVrM0xXb2R1dXhuNVhvc015SnRETzRFRGxDS1BvZzhmdDZYa0RnUFNEcUV4dzZIenAzcWdHaFRFbU1TWkJwWWtScGVhbE9YcFQwOVZwTFpJUjJ1RmZPc0JEckxYc2U1V1lSR2VPWFdaaXl4YVhXR0FCSW1Cbjdaa0NlSDQ5LS1tUWtnc3h0UWZEbmU1WVZVUVBiNWt4bkRDRHlPZGkycllOVGU5Y0RfSHJzazBWX0Jzd3RnSDYxcWNBOEtVeEtNXzh6b3VKeEFwNGNPWXM3cVZsTFVIaVlucEFmLUVIZHFUeFIzbGViWVVhYlZfb3hPOGNyR2lEVFdvdUh3dXMiLCJlIjoiQVFBQiJ9fQ.eyJwbGF5YmFja0lkIjoiYjBkY3h2d21sNDhteHQycyIsImV4cCI6MTY2Mzc3Mzg4Mn0.E6LZlDzrCUoZ5UscJvLiDYj62-9nyUz9Pn3Zxok5IWWMOuZISluKILdAD6zcFm2WvOkGBdFa7C-BciD5jJx2qnPOB-5TiRhkAVtCsilH79cGr26U5-W3upOB3ErGlF5bcryZTJTYbpEEzvjCp_SA_m8eWYoE5E3wVLNOWUfi49pPZdBz_TlhIT3kBjZSR8LJu0DpllV4dX8wzbgNhCa2J5s3hyBqLv50VJy2bOTq6AuxFXN6vFpsFOOYz8_bHqwPIJqsz9qRpj8bHJ21gQavr97v-BWlxTFJ8JvUR3VAr11ezv46IrK5QMn_BSxrOXYch5KgM_Wll6sO0ITPvBZaV8BE6YCnTmNZVe5oMlJAGZAAcyMLme6OxLt5yC84XrTW6O2jktrDYAeMrWwnk0MW_A7m_G7pcsqX1g1tIQmYbpPG--l_I2dxzLAgMvI_-BnzDxlH3VPAXEn4yE110c552dYuW0GKeFV_ABz_n1s2L9Vxw9HUP3Ib4W0YD4QTCHloWIshMMsH4szBQmVnoR13T82mCzWbgGZfWmNLkle565lO9iL1SXio5ptYchsKksQs68V7HKOI2zUffruVFdIfKUYz7EtTmDdb_6my5EFRmvzgnTypw2FeXSlV-8X9RSu7m_m6D27F8_l8roR-xIIA1-4-4gjNNFHSZgDXRW0z2lw
"JWK-in-payload" variation (2053 bytes):
eyJhbGciOiJSUzI1NiJ9.eyJwbGF5YmFja0lkIjoiYjBkY3h2d21sNDhteHQycyIsImp3ayI6ImV5SnJkSGtpT2lKU1UwRWlMQ0p1SWpvaWRqaDZNbkZJUkdSbmVGcEJVVk5JZWt4Nk9GSmpaRXRzT1VsMFdXZ3hXbGt0WlZRNVZVSlhNbm8yTTBwa05rWkRURzVVVDNScVNURm1aMlJLUWpoMWJXaG5SSGxTTmt0clYxRk9Va0l0Y1hCS05XRk1SamxUU1VORVUzZDVVMWgyVFROS1YzVmlMVms1VmxGbFJsUklWRlJyT1RoSFVEbHRVVFZ0UW10dGMwbzNaVXBoV1VFeE9EUkdXbTFSU1daVlNrbDJNMEpHUWpWTmFtZFRjR3A0YmpKblRFVmhaRGwwWmsxclpXVnhRMDVPUW04M1dUaHhNMDFTVFdWaUxYRlBNakpDYlVKT1QyZEVXRmt3VFVab1lscGtSRFZ4ZUhkMk9GSkNNR1pYWkVac1NWQkZUVXBNTUVGalpuYzBPVGhPWVZwaFVubGxXbk01VEhKNmNXSktia1JoV2t0TFlXSlZORkZTZGpSWlZEbHNSbWRvUW1ZNFZraEdUa3A2VVZSMllrWnlZVUV3YVdKb0xVdHhjMmhNYzNKWGMyWlVWRVpWWmpKM1RVcHZOMWRHWlZVd1MzVlVXbFZzWmtkNlZURmhhaTFHZFV4clMzTllNVzAzY1RoeFpXbDFaVnBVTW1rNExXZzVWeTFOYVdKV1ZUUnJjM0JITW5Kd1prbGxNSEE1YWxrM056SmlkVzAzUzI5a2MwNUJUVTgwYXpWV09XbFFNRVZaYlRWbVMzTmlkemx4T0d0WFlVWXlabFJ1Y0dWck0weFhiMlIxZFhodU5WaHZjMDE1U25SRVR6UkZSR3hEUzFCdlp6aG1kRFpZYTBSblVGTkVjVVY0ZHpaSWVuQXpjV2RIYUZSRmJVMVRXa0p3V1d0U2NHVmhiRTlZY0ZRd09WWndURnBKVWpKMVJtWlBjMEpFY2t4WWMyVTFWMWxTUjJWUFdGZGFhWGw0WVZoWFIwRkNTVzFDYmpkYWEwTmxTRFE1TFMxdFVXdG5jM2gwVVdaRWJtVTFXVlpWVVZCaU5XdDRia1JEUkhsUFpHa3ljbGxPVkdVNVkwUmZTSEp6YXpCV1gwSnpkM1JuU0RZeGNXTkJPRXRWZUV0Tlh6aDZiM1ZLZUVGd05HTlBXWE0zY1Zac1RGVklhVmx1Y0VGbUxVVklaSEZVZUZJemJHVmlXVlZoWWxaZmIzaFBPR055UjJsRVZGZHZkVWgzZFhNaUxDSmxJam9pUVZGQlFpSjkiLCJleHAiOjE2NjM3NzM4ODJ9.gIF7CZbjbljUEr-4VgWGiGN6yXGylI8dHrET3f0x4WSfxdnLPaZnmrqD3TU5iM4XX6cF-YBqKA9m-A8MZyq82TASy1-wC-z_Yp2K3EpTO6_B1a50Kn-DR18xS8NSnqsS86Np8qMiZVeT2H_ToY9j5C24DytZjug5PTmKqrdNURdLgHObEsRvoZGHeXVdC40JQBJgpR9cpAuzRjV_E33_Bssc15TYVDzwUMiZhVljtQKNH2bl5dNUgsRQWrqrpbrajQJ8g5oNYAb6QJ1C2rHQfyC3zLIkLiEQ4M6jlXHnX5ZkjU1eufDyrJq-HWmuyEbIiQNBA8PNpA0aEkYNSz4p3iqHWnxZDBx7tLcrw5uWjxh-39AhGV_ElyyMBpKp8UgsFOR-uayv27CfdofONKpfBlFuV7c1DLpTGyiUWqp8PZX716P488w29n0LXLmQqywUrYc_gq1KQ8hxNdLmIhpa1Xe-ImrlR-1990icUVJ0jovALvKZ86oFUZIBtb24hc0jr-ev3ydgU-wKDNm6LOdrfDkZxjRwMLGriqsJLAKoiL5OzHNIpHRbietwjyUZncMpiUTNxxsVmqx5CXdTuCpJqkEOfdzhZrd--1aUsOUlfI-scVPIiYOZE0Qflco4AdZNG1f3pMAzpv1_Q-kCInQA4V6GxeWe3vo9nSDee9UBfKY
==================================
ES256 - generateKeyPairSync("ec", {"namedCurve":"P-256"})
==================================
"Web-standard" variation (353 bytes):
eyJhbGciOiJFUzI1NiIsImp3ayI6eyJrdHkiOiJFQyIsIngiOiJzdFBvREdYNW93SjhZM0ZYUkd6eWYwY2Vpa2FPSWpKalp5T0VFU1MycTRnIiwieSI6IkJXMFk1X3FsYkxjN3lSWFNNOVMxUFh1bzFoNDc5Tk4tb0RJQW5obHR4bFkiLCJjcnYiOiJQLTI1NiJ9fQ.eyJwbGF5YmFja0lkIjoiYjBkY3h2d21sNDhteHQycyIsImV4cCI6MTY2Mzc3Mzg4Mn0.ewFfWj0MaL6nVuL08ERevUtqyoIST2imyqvez0Nq38kOcq3NoLeZucxS6QQQVrznxvQLO4pTXFKNZmTwn-PMLA
"JWK-in-payload" variation (411 bytes):
eyJhbGciOiJFUzI1NiJ9.eyJwbGF5YmFja0lkIjoiYjBkY3h2d21sNDhteHQycyIsImp3ayI6ImV5SnJkSGtpT2lKRlF5SXNJbmdpT2lKemRGQnZSRWRZTlc5M1NqaFpNMFpZVWtkNmVXWXdZMlZwYTJGUFNXcEthbHA1VDBWRlUxTXljVFJuSWl3aWVTSTZJa0pYTUZrMVgzRnNZa3hqTjNsU1dGTk5PVk14VUZoMWJ6Rm9ORGM1VGs0dGIwUkpRVzVvYkhSNGJGa2lMQ0pqY25ZaU9pSlFMVEkxTmlKOSIsImV4cCI6MTY2Mzc3Mzg4Mn0.h3Vvkz-MMvPHBCAn_RunOMFk-AJrEPUy7bBGoiBbQddSziSqK-IfHeuhriKRiwNGF9O_uNL6o1fzCGLgkA-0NQ
==================================
EdDSA - generateKeyPairSync("ed25519", {})
==================================
"Web-standard" variation (290 bytes):
eyJhbGciOiJFZERTQSIsImp3ayI6eyJjcnYiOiJFZDI1NTE5IiwieCI6IkNLbEQxc3pLZWFDWnEwMnVjRUZtT0pjNWdUZkhaUndja0tqaWFVazBBWTAiLCJrdHkiOiJPS1AifX0.eyJwbGF5YmFja0lkIjoiYjBkY3h2d21sNDhteHQycyIsImV4cCI6MTY2Mzc3Mzg4Mn0.e0Ku-Gw3NlrNSBFrINAzX5wI5cvkOBGxrZmBkYWWaYpe0Pbf0UFrImUjFOYctpsz5G_duG056T4sZSXt6kWxAA
"JWK-in-payload" variation (331 bytes):
eyJhbGciOiJFZERTQSJ9.eyJwbGF5YmFja0lkIjoiYjBkY3h2d21sNDhteHQycyIsImp3ayI6ImV5SmpjbllpT2lKRlpESTFOVEU1SWl3aWVDSTZJa05MYkVReGMzcExaV0ZEV25Fd01uVmpSVVp0VDBwak5XZFVaa2hhVW5kamEwdHFhV0ZWYXpCQldUQWlMQ0pyZEhraU9pSlBTMUFpZlE9PSIsImV4cCI6MTY2Mzc3Mzg4Mn0.i-tLImyXum9badvRYVQ2-NVwLoMm4L-P_jD-5HQ-pa9r5Mv8-nUCY2NVjlWrTFHi8wbMy3x87_8mjL881Kh0AA
import { SignJWT } from "jose";
import { generateKeyPairSync } from "crypto";
const algos = [
{ alg: "RS256", keypair: "rsa", opts: { modulusLength: 4096 } },
{ alg: "ES256", keypair: "ec", opts: { namedCurve: "P-256" } },
{ alg: "EdDSA", keypair: "ed25519", opts: {} },
];
const generate = async (alg, keypair, opts = {}) => {
console.log("");
console.log(`==================================`);
console.log(
`${alg} - generateKeyPairSync("${keypair}", ${JSON.stringify(opts)})`
);
console.log(`==================================`);
// const { publicKey, privateKey } = generateKeyPairSync("ed25519");
// const { publicKey, privateKey } = generateKeyPairSync("rsa", {
// modulusLength: 4096,
// });
const { publicKey, privateKey } = generateKeyPairSync(keypair, opts);
const jwk = publicKey.export({ format: "jwk", type: "spki" });
// console.log(privateKey.export({ format: "pem", type: "pkcs8" }));
let data = JSON.stringify(jwk);
let buff = new Buffer.from(data);
let base64data = buff.toString("base64");
const header = { alg };
const payload = {
playbackId: "b0dcxvwml48mxt2s",
};
const jwt1 = await new SignJWT(payload)
.setProtectedHeader({ ...header, jwk })
.setExpirationTime("2h")
.sign(privateKey);
const jwt2 = await new SignJWT({ ...payload, jwk: base64data })
.setProtectedHeader({ ...header })
.setExpirationTime("2h")
.sign(privateKey);
console.log(`\n"Web-standard" variation (${jwt1.length} bytes):`);
console.log("");
console.log(jwt1);
console.log(`\n"JWK-in-payload" variation (${jwt2.length} bytes):`);
console.log("");
console.log(jwt2);
};
(async () => {
for (const algo of algos) {
await generate(algo.alg, algo.keypair, algo.opts);
}
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment