@bananahq/banana-sdk
Version:
Smart contract wallet sdk package by Banana Wallet
157 lines • 5.53 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getAddressFromPublicKey = exports.compressPublicKey = exports.preformatGetAssertReq = exports.preformatMakeCredReq = exports.publicKeyCredentialToJSON = exports.generateRandomBuffer = exports.parseAuthData = exports.bufToHex = exports.readBE32 = exports.readBE16 = exports.getEndian = exports.sha256Buffer = exports.sha256 = exports.bufferToString = void 0;
const base64url = require("./base64url-arraybuffer");
const ethers_1 = require("ethers");
var bufferToString = (buff) => {
var enc = new TextDecoder(); // always utf-8
return enc.decode(buff);
};
exports.bufferToString = bufferToString;
var sha256 = async (data) => {
const hash = await window.crypto.subtle.digest('SHA-256', data);
const hashArray = Array.from(new Uint8Array(hash));
const digest = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
return '0x' + digest;
};
exports.sha256 = sha256;
var sha256Buffer = async (data) => {
const hashBuffer = await window.crypto.subtle.digest('SHA-256', data);
return hashBuffer;
};
exports.sha256Buffer = sha256Buffer;
var getEndian = () => {
let arrayBuffer = new ArrayBuffer(2);
let uint8Array = new Uint8Array(arrayBuffer);
let uint16array = new Uint16Array(arrayBuffer);
uint8Array[0] = 0xaa; // set first byte
uint8Array[1] = 0xbb; // set second byte
if (uint16array[0] === 0xbbaa)
return 'little';
else
return 'big';
};
exports.getEndian = getEndian;
var readBE16 = (buffer) => {
if (buffer.length !== 2)
throw new Error('Only 2byte buffer allowed!');
if ((0, exports.getEndian)() !== 'big')
buffer = buffer.reverse();
return new Uint16Array(buffer.buffer)[0];
};
exports.readBE16 = readBE16;
var readBE32 = (buffer) => {
if (buffer.length !== 4)
throw new Error('Only 4byte buffers allowed!');
if ((0, exports.getEndian)() !== 'big')
buffer = buffer.reverse();
return new Uint32Array(buffer.buffer)[0];
};
exports.readBE32 = readBE32;
var bufToHex = (buffer) => {
// buffer is an ArrayBuffer
return Array.prototype.map
.call(new Uint8Array(buffer), x => ('00' + x.toString(16)).slice(-2))
.join('');
};
exports.bufToHex = bufToHex;
// https://gist.github.com/herrjemand/dbeb2c2b76362052e5268224660b6fbc
var parseAuthData = (buffer) => {
console.log(buffer);
let rpIdHash = buffer.slice(0, 32);
buffer = buffer.slice(32);
let flagsBuf = buffer.slice(0, 1);
buffer = buffer.slice(1);
let flagsInt = flagsBuf[0];
let flags = {
up: !!(flagsInt & 0x01),
uv: !!(flagsInt & 0x04),
at: !!(flagsInt & 0x40),
ed: !!(flagsInt & 0x80),
flagsInt,
};
let counterBuf = buffer.slice(0, 4);
buffer = buffer.slice(4);
let counter = (0, exports.readBE32)(counterBuf);
let aaguid = undefined;
let credID = undefined;
let COSEPublicKey = undefined;
if (flags.at) {
aaguid = buffer.slice(0, 16);
buffer = buffer.slice(16);
let credIDLenBuf = buffer.slice(0, 2);
buffer = buffer.slice(2);
let credIDLen = (0, exports.readBE16)(credIDLenBuf);
credID = buffer.slice(0, credIDLen);
buffer = buffer.slice(credIDLen);
COSEPublicKey = buffer;
}
return {
rpIdHash,
flagsBuf,
flags,
counter,
counterBuf,
aaguid,
credID,
COSEPublicKey,
};
};
exports.parseAuthData = parseAuthData;
var generateRandomBuffer = (length) => {
if (!length)
length = 32;
var randomBuff = new Uint8Array(length);
window.crypto.getRandomValues(randomBuff);
return randomBuff;
};
exports.generateRandomBuffer = generateRandomBuffer;
var publicKeyCredentialToJSON = (pubKeyCred) => {
if (pubKeyCred instanceof Array) {
let arr = [];
for (let i of pubKeyCred)
arr.push((0, exports.publicKeyCredentialToJSON)(i));
return arr;
}
if (pubKeyCred instanceof ArrayBuffer) {
return base64url.encode(pubKeyCred);
}
if (pubKeyCred instanceof Object) {
let obj = {};
for (let key in pubKeyCred) {
obj[key] = (0, exports.publicKeyCredentialToJSON)(pubKeyCred[key]);
}
return obj;
}
return pubKeyCred;
};
exports.publicKeyCredentialToJSON = publicKeyCredentialToJSON;
var preformatMakeCredReq = (makeCredReq) => {
makeCredReq.challenge = base64url.decode(makeCredReq.challenge);
makeCredReq.user.id = base64url.decode(makeCredReq.user.id);
return makeCredReq;
};
exports.preformatMakeCredReq = preformatMakeCredReq;
var preformatGetAssertReq = (getAssert) => {
getAssert.challenge = base64url.decode(getAssert.challenge);
if (getAssert.allowCredentials) {
for (let allowCred of getAssert.allowCredentials) {
allowCred.id = base64url.decode(allowCred.id);
}
}
return getAssert;
};
exports.preformatGetAssertReq = preformatGetAssertReq;
function compressPublicKey(q0, q1) {
const odd = q1.mod(2);
const prefix = odd ? '03' : '02';
const xHex = q0.toHexString().slice(2);
return prefix + xHex;
}
exports.compressPublicKey = compressPublicKey;
function getAddressFromPublicKey(publicKey) {
const ethereumAddress = ethers_1.ethers.utils.computeAddress(publicKey);
return ethereumAddress;
}
exports.getAddressFromPublicKey = getAddressFromPublicKey;
//# sourceMappingURL=helpers.js.map