UNPKG

@toolkit-p2p/mesh-cache

Version:

Content-addressed mesh cache for toolkit-p2p

106 lines 2.81 kB
/** * 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