oidc-lib
Version:
A library for creating OIDC Service Providers
131 lines (111 loc) • 3.75 kB
JavaScript
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"
}]
};