Skip to content

Instantly share code, notes, and snippets.

View vikramacharya's full-sized avatar

Vikram Acharya vikramacharya

  • Craftsvilla, Plotch.ai
  • Mumbai,India
View GitHub Profile
export const createKeyPair = async () => {
let {publicKey , privateKey} = sodium.crypto_sign_keypair();
const publicKey_base64 = sodium.to_base64(publicKey, base64_variants.ORIGINAL);
const privateKey_base64 = sodium.to_base64(privateKey, base64_variants.ORIGINAL);
return { publicKey : publicKey_base64, privateKey : privateKey_base64 };
export const verifyHeader = async (headerParts: any, body: any, public_key: string) => {
const { signing_string } = await createSigningString(JSON.stringify(body), headerParts['created'], headerParts['expires']);
console.log("recreated signing string:");
console.log(signing_string);
const verified = await verifyMessage(headerParts['signature'], signing_string, public_key);
return verified;
}
export const createAuthorizationHeader = async (message: any) => {
const { signing_string, expires, created } = await createSigningString(JSON.stringify(message));
const signature = await signMessage(signing_string, process.env.sign_private_key || "");
const subscriber_id = config.bap_id;
const header = `Signature keyId="${subscriber_id}|${config.unique_key_id}|ed25519",algorithm="ed25519",created="${created}",expires="${expires}",headers="(created) (expires) digest",signature="${signature}"`
return header;
}
For BAP/BPP
Authorization : Signature keyId="example-bap.com|bap1234|xed25519",algorithm="xed25519",created="1606970629" expires="1607030629",headers="(created) (expires) digest",signature="Base64(XEd25519(BLAKE-512(signing string)))"
export const verifyMessage = async (signedString: string, signingString: string, publicKey: string) => {
try {
await _sodium.ready;
const sodium = _sodium;
return sodium.crypto_sign_verify_detached(sodium.from_base64(signedString, base64_variants.ORIGINAL), signingString, sodium.from_base64(publicKey, base64_variants.ORIGINAL));
} catch (error) {
return false
}
}
export const signMessage = async (signing_string: string, privateKey: string) => {
await _sodium.ready;
const sodium = _sodium;
const signedMessage = sodium.crypto_sign_detached(signing_string, sodium.from_base64(privateKey, base64_variants.ORIGINAL));
return sodium.to_base64(signedMessage, base64_variants.ORIGINAL);
(created): 1402170695
(expires): 1402170995
digest: BLAKE-512=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=
export const createSigningString = async (message: string, created?: string, expires?: string) => {
if (!created) created = Math.floor(new Date().getTime() / 1000).toString();
if (!expires) expires = (parseInt(created) + (1 * 60 * 60)).toString();
await _sodium.ready;
const sodium = _sodium;
const digest = sodium.crypto_generichash(64, sodium.from_string(message));
const digest_base64 = sodium.to_base64(digest, base64_variants.ORIGINAL);
const signing_string =
`(created): ${created}
(expires): ${expires}
const signedMessage = sodium.crypto_sign_detached(signing_string, sodium.from_base64(privateKey, base64_variants.ORIGINAL));
const signedMessage_ = sodium.to_base64(signedMessage, base64_variants.ORIGINAL);
const signing_string = `(created): ${created}
(expires): ${expires}
digest: BLAKE-512=${digest_base64}`;