Skip to content

Instantly share code, notes, and snippets.

@panva

panva/keys.js Secret

Last active December 16, 2021 13:16
Show Gist options
  • Save panva/b32b6fdb903c8e940b2982a0e9a148f3 to your computer and use it in GitHub Desktop.
Save panva/b32b6fdb903c8e940b2982a0e9a148f3 to your computer and use it in GitHub Desktop.
function pkcs8(pem) {
return new Uint8Array(
atob(pem.replace(/(?:-----(?:BEGIN|END) PRIVATE KEY-----|\s)/g, ''))
.split('')
.map((c) => c.charCodeAt(0)))
}
function spki(pem) {
return new Uint8Array(
atob(pem.replace(/(?:-----(?:BEGIN|END) PUBLIC KEY-----|\s)/g, ''))
.split('')
.map((c) => c.charCodeAt(0)))
}
const rsaPss = {
oid: 'id-RSASSA-PSS',
algorithm: { name: 'RSA-PSS', hash: 'SHA-256' },
publicKey: spki('-----BEGIN PUBLIC KEY-----\n' +
'MIIBUjA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEaMBgGCSqGSIb3DQEB\n' +
'CDALBglghkgBZQMEAgGiAwIBIAOCAQ8AMIIBCgKCAQEApofJtc9Ti/W6hA4T73Df\n' +
'+TGxgb95XkC50uz0gKYAfbwTUKxAqAa5vtoKzlKp+7+ZfWYNbxTxS0v/0eK/Ss5Y\n' +
'gEcGZV/jn6F2jsHpnOu2hLRY+vKPfC8mDhn6Q9NJZzfdwrrAsuC/H4DlUVbZBMHs\n' +
'Yj4Dsdq/o6fVEGQ+Qs84WZSN2cFc5gHEA/JD8UBXzEnAk2bc2j4udmE8j3PQhEJw\n' +
'jhz7q8Pz3q8dR9y0dHHTW3XuSBozSPYHeDQqN+naSMpsjLjq8N/8vOQT3Pz6zjTn\n' +
's/z20INsFk2jmMSXETYwProZ/g1hIsNo5gPVoJPccIVlxP4ri2UKvScdWPit2mE4\n' +
'cQIDAQAB\n' +
'-----END PUBLIC KEY-----\n'),
privateKey: pkcs8('-----BEGIN PRIVATE KEY-----\n' +
'MIIE7QIBADA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEaMBgGCSqGSIb3\n' +
'DQEBCDALBglghkgBZQMEAgGiAwIBIASCBKcwggSjAgEAAoIBAQCmh8m1z1OL9bqE\n' +
'DhPvcN/5MbGBv3leQLnS7PSApgB9vBNQrECoBrm+2grOUqn7v5l9Zg1vFPFLS//R\n' +
'4r9KzliARwZlX+OfoXaOwemc67aEtFj68o98LyYOGfpD00lnN93CusCy4L8fgOVR\n' +
'VtkEwexiPgOx2r+jp9UQZD5CzzhZlI3ZwVzmAcQD8kPxQFfMScCTZtzaPi52YTyP\n' +
'c9CEQnCOHPurw/Perx1H3LR0cdNbde5IGjNI9gd4NCo36dpIymyMuOrw3/y85BPc\n' +
'/PrONOez/PbQg2wWTaOYxJcRNjA+uhn+DWEiw2jmA9Wgk9xwhWXE/iuLZQq9Jx1Y\n' +
'+K3aYThxAgMBAAECggEAI9IXiF0VWoi72wXwMdP0yXRv+znFkImZrw47NaT/fAxF\n' +
'l1fF/J6du7jJFEJhv/4htQCLqTY3BPxPBcWhYiTqkoU0kf/DRaYEi4aYiqGFPBxS\n' +
'+3/Lb2nw5J2f4JEFPAefUvC63H9NfShLq2hj/Ar+ns86Gjq0eC50vTbi0ZojQ9lA\n' +
'qP0xQv6qduTqOrAcjHB4PpfQNUjSrU8SeljHcICG/T7MMGJoYq9r3sr/0X9aeAAu\n' +
'L4hN2KjO5ZMTyLi14hzBtrsHoiG5eXYj81OYPbuQNG8cQ6LAM7CMByZC/wQV9dNC\n' +
'bVpAtS8CDMt+VWMxrB18+0+3L07WIpbnDgBK1ult5QKBgQDQt2HihXafJNI01+yK\n' +
'uYAR2ss4A136859vtSh5ailFNe8bRkBDBhOl7zK8P0L/r3oNUV95NtPOUywuPjPz\n' +
'KQRInjX1dfKX9RfuuOMAVKYWBjl115sXaEdGnNHDMLxMPbWaYA10hPy/jmq2doYV\n' +
'71hBhYjDlpH/0SI1l0LyZXwx9wKBgQDMQc93LXYIrWDekJPBg4GFVWZB5wmbQX60\n' +
'CeeldO9In1C8U+NzvIR3Nx//bSYJvtvAIstorcnUNHxYqsv+EDMHvRpn4nNLMJZG\n' +
'fgT1BVs1tBiEBxu56caEpqDL+OZS48/+YVn6ZEl2hCcTRY50j8F87SCN1mNVR2rO\n' +
'khaeQHZO1wKBgQDE5QqpiCBkd3b6NOxH3kEsFsx5VevVrvgsiKjbCURPr1aW00oS\n' +
'MGxesG2bWs6YqHCqmaZIkmlzjdDy+ulFLd+FpgLfQdqOcb+XC8HR8QkRY+PXAIOl\n' +
'rFD5Ez1rNtGb1uc37/8hecd56h9PbDaIANewUAm6AZRP0XnFNqIIS6bC9wKBgG/F\n' +
'G1flwo8hAL8JcjEUWw2xG5G4cWNJxaGTQfUiNcYRl8ZWSUKNyBbMTXAiNAxlKi7L\n' +
'W29emfDK/7gtTg8qoiH78rUiD2D3p2PPlbrWQYDzme61TRDAwebYn2i+PJrjGm/i\n' +
'qbAArMpzqkY7a6aQ+5n20DeNNzH1MJb1Dfdu4s5lAoGAWxXdgslx1N50Zr6AAKUM\n' +
'RuT45+cc+kZgQXKfYvN0XtwFZ2xyB0Cw2KeM0ELd4umZXp79scSJQsrO/bmH8oCp\n' +
'UaO7TSv6KQisW1ZbjY4pkqN2xWaLrYYdge3b7wDENdH9KAc68Mk5X3mz+DRYeXeb\n' +
'jqlUB7El/meDQCbyhpHFdqo=\n' +
'-----END PRIVATE KEY-----\n')
}
const ecDH = {
oid: 'id-ecDH',
algorithm: { name: 'ECDH', namedCurve: 'P-256' },
publicKey: spki('-----BEGIN PUBLIC KEY-----\n' +
'MFcwEQYFK4EEAQwGCCqGSM49AwEHA0IABGxCiQD9sEAZT2TpkJZv/d2Y7XZTor6w\n' +
'uGt57PHOpLm7QIIMBg+A7MmvzCNerPaghalRGaqeOf3KgoQUw2M+1Nk=\n' +
'-----END PUBLIC KEY-----'),
privateKey: pkcs8('-----BEGIN PRIVATE KEY-----\n' +
'MIGFAgEAMBEGBSuBBAEMBggqhkjOPQMBBwRtMGsCAQEEIJKqPVc1CJ6ggsiFF0BI\n' +
'9cCmPoCIcGwbwcwynZ/bdTZkoUQDQgAEbEKJAP2wQBlPZOmQlm/93ZjtdlOivrC4\n' +
'a3ns8c6kubtAggwGD4Dsya/MI16s9qCFqVEZqp45/cqChBTDYz7U2Q==\n' +
'-----END PRIVATE KEY-----')
}
async function keyImport(oid, keyFormat, keyData, algorithm, extractable, keyOps) {
await crypto.subtle.importKey(keyFormat, keyData, algorithm, extractable, keyOps)
.then(() => {
console.log(`${keyFormat} ${oid} import ✅ success`)
}, (err) => {
console.log(`${keyFormat} ${oid} import ❌ fail`, err.name)
})
}
keyImport(rsaPss.oid, 'spki', rsaPss.publicKey, rsaPss.algorithm, false, ['verify'])
keyImport(rsaPss.oid, 'pkcs8', rsaPss.privateKey, rsaPss.algorithm, false, ['sign'])
keyImport(ecDH.oid, 'spki', ecDH.publicKey, ecDH.algorithm, false, [])
keyImport(ecDH.oid, 'pkcs8', ecDH.privateKey, ecDH.algorithm, false, ['deriveBits'])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment