@sphereon/ssi-sdk-ext.key-utils
Version:
Sphereon SSI-SDK plugin for key creation.
298 lines (285 loc) • 9.49 kB
text/typescript
import {
ICoseCurve,
type ICoseKeyJson,
ICoseKeyOperation,
ICoseKeyType,
ICoseSignatureAlgorithm,
JoseCurve,
type JoseCurveString,
JoseKeyOperation,
type JoseKeyOperationString,
JoseSignatureAlgorithm,
type JoseSignatureAlgorithmString,
type JWK,
JwkKeyType,
type JwkKeyTypeString,
} from '@sphereon/ssi-types'
import { removeNulls } from './functions'
export function coseKeyToJwk(coseKey: ICoseKeyJson): JWK {
const { x5chain, key_ops, crv, alg, baseIV, kty, ...rest } = coseKey
return removeNulls({
...rest,
kty: coseToJoseKty(kty),
...(crv && { crv: coseToJoseCurve(crv) }),
...(key_ops && { key_ops: key_ops.map(coseToJoseKeyOperation) }),
...(alg && { alg: coseToJoseSignatureAlg(alg) }),
...(baseIV && { iv: baseIV }),
...(x5chain && { x5c: x5chain }),
}) satisfies JWK
}
export function jwkToCoseKey(jwk: JWK): ICoseKeyJson {
const { x5c, key_ops, crv, alg, iv, kty, ...rest } = jwk
return removeNulls({
...rest,
kty: joseToCoseKty(kty),
...(crv && { crv: joseToCoseCurve(crv) }),
...(key_ops && { key_ops: key_ops.map(joseToCoseKeyOperation) }),
...(alg && { alg: joseToCoseSignatureAlg(alg) }),
...(iv && { baseIV: iv }),
...(x5c && { x5chain: x5c }),
// @ts-ignore
} satisfies ICoseKeyJson)
}
export function coseToJoseKty(kty: ICoseKeyType): JwkKeyType {
switch (kty) {
case ICoseKeyType.EC2:
return JwkKeyType.EC
case ICoseKeyType.RSA:
return JwkKeyType.RSA
case ICoseKeyType.Symmetric:
return JwkKeyType.oct
case ICoseKeyType.OKP:
return JwkKeyType.OKP
default:
throw Error(`Key type ${kty} not supported in JWA`)
}
}
export function joseToCoseKty(kty: JwkKeyType | JwkKeyTypeString): ICoseKeyType {
switch (kty) {
case 'EC':
return ICoseKeyType.EC2
case 'RSA':
return ICoseKeyType.RSA
case 'oct':
return ICoseKeyType.Symmetric
case 'OKP':
return ICoseKeyType.OKP
default:
throw Error(`Key type ${kty} not supported in Cose`)
}
}
export function coseToJoseSignatureAlg(coseAlg: ICoseSignatureAlgorithm): JoseSignatureAlgorithm {
switch (coseAlg) {
case ICoseSignatureAlgorithm.ES256K:
return JoseSignatureAlgorithm.ES256K
case ICoseSignatureAlgorithm.ES256:
return JoseSignatureAlgorithm.ES256
case ICoseSignatureAlgorithm.ES384:
return JoseSignatureAlgorithm.ES384
case ICoseSignatureAlgorithm.ES512:
return JoseSignatureAlgorithm.ES512
case ICoseSignatureAlgorithm.PS256:
return JoseSignatureAlgorithm.PS256
case ICoseSignatureAlgorithm.PS384:
return JoseSignatureAlgorithm.PS384
case ICoseSignatureAlgorithm.PS512:
return JoseSignatureAlgorithm.PS512
case ICoseSignatureAlgorithm.HS256:
return JoseSignatureAlgorithm.HS256
case ICoseSignatureAlgorithm.HS384:
return JoseSignatureAlgorithm.HS384
case ICoseSignatureAlgorithm.HS512:
return JoseSignatureAlgorithm.HS512
case ICoseSignatureAlgorithm.EdDSA:
return JoseSignatureAlgorithm.EdDSA
default:
throw Error(`Signature algorithm ${coseAlg} not supported in Jose`)
}
}
export function joseToCoseSignatureAlg(joseAlg: JoseSignatureAlgorithm | JoseSignatureAlgorithmString): ICoseSignatureAlgorithm {
switch (joseAlg) {
case JoseSignatureAlgorithm.ES256K:
case 'ES256K':
return ICoseSignatureAlgorithm.ES256K
case JoseSignatureAlgorithm.ES256:
case 'ES256':
return ICoseSignatureAlgorithm.ES256
case JoseSignatureAlgorithm.ES384:
case 'ES384':
return ICoseSignatureAlgorithm.ES384
case JoseSignatureAlgorithm.ES512:
case 'ES512':
return ICoseSignatureAlgorithm.ES512
case JoseSignatureAlgorithm.PS256:
case 'PS256':
return ICoseSignatureAlgorithm.PS256
case JoseSignatureAlgorithm.PS384:
case 'PS384':
return ICoseSignatureAlgorithm.PS384
case JoseSignatureAlgorithm.PS512:
case 'PS512':
return ICoseSignatureAlgorithm.PS512
case JoseSignatureAlgorithm.HS256:
case 'HS256':
return ICoseSignatureAlgorithm.HS256
case JoseSignatureAlgorithm.HS384:
case 'HS384':
return ICoseSignatureAlgorithm.HS384
case JoseSignatureAlgorithm.HS512:
case 'HS512':
return ICoseSignatureAlgorithm.HS512
case JoseSignatureAlgorithm.EdDSA:
case 'EdDSA':
return ICoseSignatureAlgorithm.EdDSA
default:
throw Error(`Signature algorithm ${joseAlg} not supported in Cose`)
}
}
export function joseToCoseKeyOperation(keyOp: JoseKeyOperation | JoseKeyOperationString): ICoseKeyOperation {
switch (keyOp) {
case JoseKeyOperation.SIGN:
case 'sign':
return ICoseKeyOperation.SIGN
case JoseKeyOperation.VERIFY:
case 'verify':
return ICoseKeyOperation.VERIFY
case JoseKeyOperation.ENCRYPT:
case 'encrypt':
return ICoseKeyOperation.ENCRYPT
case JoseKeyOperation.DECRYPT:
case 'decrypt':
return ICoseKeyOperation.DECRYPT
case JoseKeyOperation.WRAP_KEY:
case 'wrapKey':
return ICoseKeyOperation.WRAP_KEY
case JoseKeyOperation.UNWRAP_KEY:
case 'unwrapKey':
return ICoseKeyOperation.UNWRAP_KEY
case JoseKeyOperation.DERIVE_KEY:
case 'deriveKey':
return ICoseKeyOperation.DERIVE_KEY
case JoseKeyOperation.DERIVE_BITS:
case 'deriveBits':
return ICoseKeyOperation.DERIVE_BITS
default:
throw Error(`Key operation ${keyOp} not supported in Cose`)
}
}
export function coseToJoseKeyOperation(keyOp: ICoseKeyOperation): JoseKeyOperation {
switch (keyOp) {
case ICoseKeyOperation.SIGN:
return JoseKeyOperation.SIGN
case ICoseKeyOperation.VERIFY:
return JoseKeyOperation.VERIFY
case ICoseKeyOperation.ENCRYPT:
return JoseKeyOperation.ENCRYPT
case ICoseKeyOperation.DECRYPT:
return JoseKeyOperation.DECRYPT
case ICoseKeyOperation.WRAP_KEY:
return JoseKeyOperation.WRAP_KEY
case ICoseKeyOperation.UNWRAP_KEY:
return JoseKeyOperation.UNWRAP_KEY
case ICoseKeyOperation.DERIVE_KEY:
return JoseKeyOperation.DERIVE_KEY
case ICoseKeyOperation.DERIVE_BITS:
return JoseKeyOperation.DERIVE_BITS
default:
throw Error(`Key operation ${keyOp} not supported in Jose`)
}
}
export function joseToCoseCurve(curve: JoseCurve | JoseCurveString): ICoseCurve {
switch (curve) {
case (JoseCurve.P_256, 'P-256'):
return ICoseCurve.P_256
case (JoseCurve.P_384, 'P-384'):
return ICoseCurve.P_384
case (JoseCurve.P_521, 'P-521'):
return ICoseCurve.P_521
case (JoseCurve.X25519, 'X25519'):
return ICoseCurve.X25519
case (JoseCurve.X448, 'X448'):
return ICoseCurve.X448
case (JoseCurve.Ed25519, 'Ed25519'):
return ICoseCurve.Ed25519
case (JoseCurve.Ed448, 'Ed448'):
return ICoseCurve.Ed448
case (JoseCurve.secp256k1, 'secp256k1'):
return ICoseCurve.secp256k1
default:
throw Error(`Curve ${curve} not supported in Cose`)
}
}
export function coseToJoseCurve(curve: ICoseCurve): JoseCurve {
switch (curve) {
case ICoseCurve.P_256:
return JoseCurve.P_256
case ICoseCurve.P_384:
return JoseCurve.P_384
case ICoseCurve.P_521:
return JoseCurve.P_521
case ICoseCurve.X25519:
return JoseCurve.X25519
case ICoseCurve.X448:
return JoseCurve.X448
case ICoseCurve.Ed25519:
return JoseCurve.Ed25519
case ICoseCurve.Ed448:
return JoseCurve.Ed448
case ICoseCurve.secp256k1:
return JoseCurve.secp256k1
default:
throw Error(`Curve ${curve} not supported in Jose`)
}
}
export function joseSignatureAlgToWebCrypto(alg: JoseSignatureAlgorithm | JoseSignatureAlgorithmString): {
name: string
hash: string
saltLength?: number
} {
switch (alg) {
case JoseSignatureAlgorithm.RS256:
case 'RS256':
return { name: 'RSASSA-PKCS1-v1_5', hash: 'SHA-256' }
case JoseSignatureAlgorithm.RS384:
case 'RS384':
return { name: 'RSASSA-PKCS1-v1_5', hash: 'SHA-384' }
case JoseSignatureAlgorithm.RS512:
case 'RS512':
return { name: 'RSASSA-PKCS1-v1_5', hash: 'SHA-512' }
case JoseSignatureAlgorithm.PS256:
case 'PS256':
return { name: 'RSA-PSS', hash: 'SHA-256', saltLength: 32 }
case JoseSignatureAlgorithm.PS384:
case 'PS384':
return { name: 'RSA-PSS', hash: 'SHA-384', saltLength: 48 }
case JoseSignatureAlgorithm.PS512:
case 'PS512':
return { name: 'RSA-PSS', hash: 'SHA-512', saltLength: 64 }
case JoseSignatureAlgorithm.ES256:
case 'ES256':
return { name: 'ECDSA', hash: 'SHA-256' }
case JoseSignatureAlgorithm.ES384:
case 'ES384':
return { name: 'ECDSA', hash: 'SHA-384' }
case JoseSignatureAlgorithm.ES512:
case 'ES512':
return { name: 'ECDSA', hash: 'SHA-512' }
case JoseSignatureAlgorithm.ES256K:
case 'ES256K':
return { name: 'ECDSA', hash: 'SHA-256' }
case JoseSignatureAlgorithm.EdDSA:
case 'EdDSA':
return { name: 'Ed25519', hash: '' }
case JoseSignatureAlgorithm.HS256:
case 'HS256':
return { name: 'HMAC', hash: 'SHA-256' }
case JoseSignatureAlgorithm.HS384:
case 'HS384':
return { name: 'HMAC', hash: 'SHA-384' }
case JoseSignatureAlgorithm.HS512:
case 'HS512':
return { name: 'HMAC', hash: 'SHA-512' }
default:
throw Error(`Signature algorithm ${alg} not supported in Web Crypto API`)
}
}