better-near-auth
Version:
Sign in with NEAR (SIWN) plugin for Better Auth
40 lines • 1.66 kB
JavaScript
export function bytesToBase64(bytes) {
return btoa(String.fromCharCode(...bytes));
}
function base64ToBytes(base64) {
return Uint8Array.from(atob(base64), c => c.charCodeAt(0));
}
export function bytesToHex(bytes) {
return Array.from(bytes).map(b => b.toString(16).padStart(2, "0")).join("");
}
export function hexToBytes(hex) {
const bytes = new Uint8Array(hex.length / 2);
for (let i = 0; i < hex.length; i += 2) {
bytes[i / 2] = parseInt(hex.substring(i, i + 2), 16);
}
return bytes;
}
async function deriveAesKey(secret) {
const keyMaterial = await crypto.subtle.importKey("raw", new TextEncoder().encode(secret), { name: "HKDF" }, false, ["deriveKey"]);
return crypto.subtle.deriveKey({
name: "HKDF",
hash: "SHA-256",
salt: new TextEncoder().encode("better-near-auth-relayer"),
info: new Uint8Array(0),
}, keyMaterial, { name: "AES-GCM", length: 256 }, false, ["encrypt", "decrypt"]);
}
export async function encryptPrivateKey(privateKey, secret) {
const aesKey = await deriveAesKey(secret);
const iv = crypto.getRandomValues(new Uint8Array(12));
const encrypted = await crypto.subtle.encrypt({ name: "AES-GCM", iv }, aesKey, privateKey);
return {
encrypted: bytesToBase64(new Uint8Array(encrypted)),
iv: bytesToBase64(iv),
};
}
export async function decryptPrivateKey(encrypted, iv, secret) {
const aesKey = await deriveAesKey(secret);
const decrypted = await crypto.subtle.decrypt({ name: "AES-GCM", iv: base64ToBytes(iv) }, aesKey, base64ToBytes(encrypted));
return new Uint8Array(decrypted);
}
//# sourceMappingURL=utils.js.map