mirror of
https://github.com/dergigi/boris.git
synced 2025-12-18 23:24:22 +01:00
- Add project structure with TypeScript, React, and Vite - Implement nostr authentication using browser extension (NIP-07) - Add NIP-51 compliant bookmark fetching and display - Create minimal UI with login and bookmark components - Integrate applesauce-core and applesauce-react libraries - Add responsive styling with dark/light mode support - Include comprehensive README with setup instructions This is a minimal MVP for a nostr bookmark client that allows users to view their bookmarks according to NIP-51 specification.
85 lines
3.4 KiB
JavaScript
85 lines
3.4 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.deriveKeysetId = exports.deserializeMintKeys = exports.serializeMintKeys = exports.createRandomPrivateKey = exports.getKeysetIdInt = exports.pointFromHex = exports.hashToCurve = void 0;
|
|
const secp256k1_1 = require("@noble/curves/secp256k1");
|
|
const sha256_1 = require("@noble/hashes/sha256");
|
|
const utils_1 = require("@noble/curves/abstract/utils");
|
|
const utils_js_1 = require("../util/utils.js");
|
|
const buffer_1 = require("buffer/");
|
|
const DOMAIN_SEPARATOR = (0, utils_1.hexToBytes)('536563703235366b315f48617368546f43757276655f43617368755f');
|
|
function hashToCurve(secret) {
|
|
const msgToHash = (0, sha256_1.sha256)(buffer_1.Buffer.concat([DOMAIN_SEPARATOR, secret]));
|
|
const counter = new Uint32Array(1);
|
|
const maxIterations = 2 ** 16;
|
|
for (let i = 0; i < maxIterations; i++) {
|
|
const counterBytes = new Uint8Array(counter.buffer);
|
|
const hash = (0, sha256_1.sha256)(buffer_1.Buffer.concat([msgToHash, counterBytes]));
|
|
try {
|
|
return pointFromHex((0, utils_1.bytesToHex)(buffer_1.Buffer.concat([new Uint8Array([0x02]), hash])));
|
|
}
|
|
catch (error) {
|
|
counter[0]++;
|
|
}
|
|
}
|
|
throw new Error('No valid point found');
|
|
}
|
|
exports.hashToCurve = hashToCurve;
|
|
function pointFromHex(hex) {
|
|
return secp256k1_1.secp256k1.ProjectivePoint.fromHex(hex);
|
|
}
|
|
exports.pointFromHex = pointFromHex;
|
|
const getKeysetIdInt = (keysetId) => {
|
|
let keysetIdInt;
|
|
if (/^[a-fA-F0-9]+$/.test(keysetId)) {
|
|
keysetIdInt = (0, utils_js_1.hexToNumber)(keysetId) % BigInt(2 ** 31 - 1);
|
|
}
|
|
else {
|
|
//legacy keyset compatibility
|
|
keysetIdInt = (0, utils_js_1.bytesToNumber)((0, utils_js_1.encodeBase64toUint8)(keysetId)) % BigInt(2 ** 31 - 1);
|
|
}
|
|
return keysetIdInt;
|
|
};
|
|
exports.getKeysetIdInt = getKeysetIdInt;
|
|
function createRandomPrivateKey() {
|
|
return secp256k1_1.secp256k1.utils.randomPrivateKey();
|
|
}
|
|
exports.createRandomPrivateKey = createRandomPrivateKey;
|
|
function serializeMintKeys(mintKeys) {
|
|
const serializedMintKeys = {};
|
|
Object.keys(mintKeys).forEach((p) => {
|
|
serializedMintKeys[p] = (0, utils_1.bytesToHex)(mintKeys[p]);
|
|
});
|
|
return serializedMintKeys;
|
|
}
|
|
exports.serializeMintKeys = serializeMintKeys;
|
|
function deserializeMintKeys(serializedMintKeys) {
|
|
const mintKeys = {};
|
|
Object.keys(serializedMintKeys).forEach((p) => {
|
|
mintKeys[p] = (0, utils_1.hexToBytes)(serializedMintKeys[p]);
|
|
});
|
|
return mintKeys;
|
|
}
|
|
exports.deserializeMintKeys = deserializeMintKeys;
|
|
function deriveKeysetId(keys) {
|
|
const KEYSET_VERSION = '00';
|
|
const mapBigInt = (k) => {
|
|
return [BigInt(k[0]), k[1]];
|
|
};
|
|
const pubkeysConcat = Object.entries(serializeMintKeys(keys))
|
|
.map(mapBigInt)
|
|
.sort((a, b) => (a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0))
|
|
.map(([, pubKey]) => (0, utils_1.hexToBytes)(pubKey))
|
|
.reduce((prev, curr) => mergeUInt8Arrays(prev, curr), new Uint8Array());
|
|
const hash = (0, sha256_1.sha256)(pubkeysConcat);
|
|
const hashHex = buffer_1.Buffer.from(hash).toString('hex').slice(0, 14);
|
|
return '00' + hashHex;
|
|
}
|
|
exports.deriveKeysetId = deriveKeysetId;
|
|
function mergeUInt8Arrays(a1, a2) {
|
|
// sum of individual array lengths
|
|
const mergedArray = new Uint8Array(a1.length + a2.length);
|
|
mergedArray.set(a1);
|
|
mergedArray.set(a2, a1.length);
|
|
return mergedArray;
|
|
}
|
|
//# sourceMappingURL=index.js.map
|