UNPKG

oidc-lib

Version:

A library for creating OIDC Service Providers

152 lines (139 loc) 3.38 kB
class wallet_key_type { constructor (){ this.keyTypeDefs = [ // [ keytType, alg, crv, signature_alg, multicodec, multicodec_bytes ] [ 'RSA', 'RS256', null, null, null, null ], [ 'oct', 'A128GCM', null, null, null, null ], [ 'EC', 'ECDSA', 'P-256', 'ES256', [0x12, 0x00 ], null], [ 'EC', 'ECDSA', 'P-384', 'ES384', [0x12, 0x01 ], null ], [ 'EC', 'ECDSA', 'P-512', 'ES512', [0x12, 0x02 ], null ], [ 'OKP', 'EdDSA', 'Ed25519', 'Ed25519', [0xed], null ], [ 'OKP', 'EdDSA', 'X25519', null, [0xec], null ], ]; for (var i=0; i < this.keyTypeDefs.length; i++){ this.keyTypeDefs[i][5] = this.calculate_multicodec(i); } } getKeyParams(properties){ var keyParams = {}; var keyTypeDef; var target = new Array(null, null, null, null, null, null); var indices = { 'kty': 0, 'alg': 1, 'crv': 2, 'signature_alg': 3, 'multicodec': 4, 'multicodec_bytes': 5 } for (var key in properties){ var index = indices[key]; if (index === undefined){ throw('undefined key property in getKeyParams: ' + key); } if (properties[key] !== undefined){ target[index] = properties[key]; } } for (var i in this.keyTypeDefs){ keyTypeDef = this.keyTypeDefs[i]; var match = true; for (var j=0; j < target.length; j++){ if (target[j] === null){ continue; } if (Array.isArray(target[j]) && Array.isArray(keyTypeDef[j])){ var targA = target[j]; var typeA = keyTypeDef[j]; var kmatch = true; if (targA.length === typeA.length){ for (var k=0; k<targA.length; k++){ if (targA[k] === typeA[k]){ continue; } else{ kmatch = false; break; } } if (kmatch){ continue; } } } else{ if (target[j] === keyTypeDef[j]){ continue; } } match = false; break; } if (match){ for (var index in indices){ if (keyTypeDef[indices[index]]){ keyParams[index] = keyTypeDef[indices[index]]; } } return keyParams; } } } // brute force calculate_multicodec(offsetOrMulticodec){ if (typeof offsetOrMulticodec == 'number'){ var multicodec_array = this.keyTypeDefs[offsetOrMulticodec][4]; if (multicodec_array === null){ return; } var input = Uint8Array.from(multicodec_array); if (!input.length){ return; } } else{ input = offsetOrMulticodec; } var output = new Uint8Array(9); var o = 0; var i = input.length - 1; var omask = 1; var imask = 1; while (i >= 0){ while (imask < 0x100 && omask < 0x80){ var bit = imask & input[i] ? omask : 0; output[o] |= bit; imask = imask << 1; omask = omask << 1; } if (omask == 0x80){ output[o] |= 0x80; o++; omask = 1; } if (imask == 0x100){ i--; imask = 1; continue; } } if (output[o] == 0){ if (o == 0){ throw ("internal error in calculate_multicodec"); } else{ // elide unnecessary LSB if zero o--; output[o] &= 0x7f; } } var result = new Uint8Array(++o); for (var i=0; i<o; i++){ result[i] = output[i]; } return result; } } module.exports = { wallet_key_type: wallet_key_type };