oidc-lib
Version:
A library for creating OIDC Service Providers
152 lines (139 loc) • 3.38 kB
JavaScript
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
};