@toolkit-p2p/mesh-cache
Version:
Content-addressed mesh cache for toolkit-p2p
106 lines • 2.81 kB
JavaScript
/**
* Content Identifier (CID) generation using SHA-256
*/
import { sha256 } from '@noble/hashes/sha256';
// Base58 alphabet (Bitcoin-style, no 0OIl)
const BASE58_ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
/**
* Generate CID from data using SHA-256
*/
export function generateCID(data) {
const hash = sha256(data);
return base58Encode(hash);
}
/**
* Encode bytes as base58 string
*/
export function base58Encode(bytes) {
if (bytes.length === 0) {
return '';
}
// Count leading zeros
let zeros = 0;
while (zeros < bytes.length && bytes[zeros] === 0) {
zeros++;
}
// Convert to big integer
const digits = [0];
for (let i = zeros; i < bytes.length; i++) {
let carry = bytes[i];
for (let j = 0; j < digits.length; j++) {
carry += digits[j] << 8;
digits[j] = carry % 58;
carry = (carry / 58) | 0;
}
while (carry > 0) {
digits.push(carry % 58);
carry = (carry / 58) | 0;
}
}
// Convert to base58 string
let result = '';
for (let i = 0; i < zeros; i++) {
result += BASE58_ALPHABET[0];
}
for (let i = digits.length - 1; i >= 0; i--) {
result += BASE58_ALPHABET[digits[i]];
}
return result;
}
/**
* Decode base58 string to bytes
*/
export function base58Decode(str) {
if (str.length === 0) {
return new Uint8Array(0);
}
// Count leading '1's (zeros)
let zeros = 0;
while (zeros < str.length && str[zeros] === BASE58_ALPHABET[0]) {
zeros++;
}
// Convert from base58
const digits = [0];
for (let i = zeros; i < str.length; i++) {
const char = str[i];
const digit = BASE58_ALPHABET.indexOf(char);
if (digit < 0) {
throw new Error(`Invalid base58 character: ${char}`);
}
let carry = digit;
for (let j = 0; j < digits.length; j++) {
carry += digits[j] * 58;
digits[j] = carry & 0xff;
carry >>= 8;
}
while (carry > 0) {
digits.push(carry & 0xff);
carry >>= 8;
}
}
// Convert to Uint8Array
const result = new Uint8Array(zeros + digits.length);
for (let i = 0; i < digits.length; i++) {
result[zeros + i] = digits[digits.length - 1 - i];
}
return result;
}
/**
* Verify that a string is a valid CID
*/
export function isValidCID(cid) {
try {
const decoded = base58Decode(cid);
return decoded.length === 32; // SHA-256 produces 32 bytes
}
catch {
return false;
}
}
/**
* Verify that data matches a CID
*/
export function verifyCID(data, cid) {
return generateCID(data) === cid;
}
//# sourceMappingURL=cid.js.map