UNPKG

oidc-lib

Version:

A library for creating OIDC Service Providers

131 lines (111 loc) 3.75 kB
var pk; module.exports = { registerEndpoints: registerEndpoints, create: create, didFromJwk: didFromJwk } function registerEndpoints(pkInput){ pk = pkInput; } async function didFromJwk(didSchemePlusMethod, jwk){ var potential_error = 'config error '; try{ if (!didSchemePlusMethod.startsWith('did:')){ throw ('didSchemePlusMethod in didFromJwk is not a did'); } var method = didSchemePlusMethod.substr(4); var method_len = method.indexOf(':'); if (method_len > 0){ method = method.substr(0, method_len); } if (method !== "peer"){ throw ("'" + method + "' did_method not implemented "); } var fauxKeyObject = new pk.key_management.claimerKeyObject('wallet', pk.key_management.PERSONAKEY, jwk.kty, jwk.alg, jwk.crv); fauxKeyObject.jwk_public = jwk; var did = create(null, method, fauxKeyObject); return did; } catch(err){ throw ("did_management.didFromJwk: " + potential_error + " - " + err); } } async function create(dbInfo, did_method, keyObject){ var potential_error = 'config error '; try{ if (did_method !== "peer"){ throw ("'" + did_method + "' did_method not implemented "); } // todo: figure out ambiguity re: oct/OKP and EC/EdDSA switch (keyObject.kty){ case 'EC': case 'oct': var did_x_bytes = pk.base64url.toBuffer(keyObject.jwk_public.x); var did_y_bytes = pk.base64url.toBuffer(keyObject.jwk_public.y); // msi stands for method specific identifier in the DID var did_msi_buf = new Uint8Array(did_x_bytes.length + did_y_bytes.length + keyObject.multicodec_bytes.length); var j = 0; for (var i = 0; i < keyObject.multicodec_bytes.length; i++){ did_msi_buf[j++] = keyObject.multicodec_bytes[i]; } for (var i = 0; i < did_x_bytes.length; i++){ did_msi_buf[j++] = did_x_bytes[i]; } for (var i = 0; i < did_y_bytes.length; i++){ did_msi_buf[j++] = did_y_bytes[i]; } break; case 'EdDSA': case 'OKP': var did_x_bytes = pk.base64url.toBuffer(keyObject.jwk_public.x); var did_msi_buf = new Uint8Array(did_x_bytes.length + keyObject.multicodec_bytes.length); var j = 0; for (var i = 0; i < keyObject.multicodec_bytes.length; i++){ did_msi_buf[j++] = keyObject.multicodec_bytes[i]; } for (var i = 0; i < did_x_bytes.length; i++){ did_msi_buf[j++] = did_x_bytes[i]; } break; dafault: throw ("'" + keyObject.kty + "' kty keys are not implented in the peer did method"); } keyObject.did = 'did:peer:z0'+ pk.base58.encode(did_msi_buf); if (dbInfo){ await dbInfo.provider.createOrUpdateDocument( dbInfo, 'keys', keyObject, null); } return keyObject.did; } catch(err){ throw ("did_management.create: " + potential_error + " - " + err); } } function decodeSuffix(did){ if (!did){ return; } var encoding = did.substr(10); return base58.decode(encoding); } var didDocumentTemplate = { "@context": "https://w3id.org/did/v1", "id": "{did_peer}", "publicKey": [{ "id": "{did_peer}#{keyid}", "type": "Ed25519VerificationKey2018", "controller": "{did_peer}", "publicKeyBase58": "B12NYF8RrR3h41TDCTJojY59usg3mbtbjnFs7Eud1Y6u" }], "authentication": [ "{did_peer}#{keyid}" ], "assertionMethod": [ "{did_peer}#{keyid}" ], "capabilityDelegation": [ "{did_peer}#{keyid}" ], "capabilityInvocation": [ "{did_peer}#{keyid}" ], "keyAgreement": [{ "id": "{did_peer}#zBzoR5sqFgi6q3iFia8JPNfENCpi7RNSTKF7XNXX96SBY4", "type": "X25519KeyAgreementKey2019", "controller": "{did_peer}", "publicKeyBase58": "JhNWeSVLMYccCk7iopQW4guaSJTojqpMEELgSLhKwRr" }] };