@bcts/provenance-mark 1.0.0-alpha.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +48 -0
- package/README.md +15 -0
- package/dist/index.cjs +1703 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +711 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.mts +711 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.iife.js +1700 -0
- package/dist/index.iife.js.map +1 -0
- package/dist/index.mjs +1657 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +79 -0
- package/src/crypto-utils.ts +75 -0
- package/src/date.ts +216 -0
- package/src/error.ts +141 -0
- package/src/generator.ts +182 -0
- package/src/index.ts +90 -0
- package/src/mark-info.ts +126 -0
- package/src/mark.ts +597 -0
- package/src/resolution.ts +294 -0
- package/src/rng-state.ts +68 -0
- package/src/seed.ts +98 -0
- package/src/utils.ts +103 -0
- package/src/validate.ts +449 -0
- package/src/xoshiro256starstar.ts +150 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["sha256Hash","s: [bigint, bigint, bigint, bigint]","randomData","BytewordsStyle","PROVENANCE_MARK","result: Record<string, unknown>","infoBytes: Uint8Array","randomData","key: Uint8Array","lines: string[]","annotations: string[]","issueStr: string","sequences: SequenceReport[]","currentSequence: FlaggedMark[]","deduplicatedMarks: ProvenanceMark[]","chains: ChainReport[]","PROVENANCE_MARK","UR","lines: string[]","result: Record<string, unknown>"],"sources":["../src/error.ts","../src/date.ts","../src/resolution.ts","../src/crypto-utils.ts","../src/xoshiro256starstar.ts","../src/rng-state.ts","../src/seed.ts","../src/utils.ts","../src/mark.ts","../src/generator.ts","../src/validate.ts","../src/mark-info.ts"],"sourcesContent":["// Ported from provenance-mark-rust/src/error.rs\n\n/**\n * Error types for Provenance Mark operations.\n */\nexport enum ProvenanceMarkErrorType {\n /** Invalid Seed length */\n InvalidSeedLength = \"InvalidSeedLength\",\n /** Duplicate key */\n DuplicateKey = \"DuplicateKey\",\n /** Missing key */\n MissingKey = \"MissingKey\",\n /** Invalid key */\n InvalidKey = \"InvalidKey\",\n /** Extra keys */\n ExtraKeys = \"ExtraKeys\",\n /** Invalid key length for the given resolution */\n InvalidKeyLength = \"InvalidKeyLength\",\n /** Invalid next key length for the given resolution */\n InvalidNextKeyLength = \"InvalidNextKeyLength\",\n /** Invalid chain ID length for the given resolution */\n InvalidChainIdLength = \"InvalidChainIdLength\",\n /** Invalid message length for the given resolution */\n InvalidMessageLength = \"InvalidMessageLength\",\n /** Invalid CBOR data in info field */\n InvalidInfoCbor = \"InvalidInfoCbor\",\n /** Date out of range for serialization */\n DateOutOfRange = \"DateOutOfRange\",\n /** Invalid date components */\n InvalidDate = \"InvalidDate\",\n /** Missing required URL parameter */\n MissingUrlParameter = \"MissingUrlParameter\",\n /** Year out of range for 2-byte serialization */\n YearOutOfRange = \"YearOutOfRange\",\n /** Invalid month or day */\n InvalidMonthOrDay = \"InvalidMonthOrDay\",\n /** Resolution serialization error */\n ResolutionError = \"ResolutionError\",\n /** Bytewords encoding/decoding error */\n BytewordsError = \"BytewordsError\",\n /** CBOR encoding/decoding error */\n CborError = \"CborError\",\n /** URL parsing error */\n UrlError = \"UrlError\",\n /** Base64 decoding error */\n Base64Error = \"Base64Error\",\n /** JSON serialization error */\n JsonError = \"JsonError\",\n /** Integer conversion error */\n IntegerConversionError = \"IntegerConversionError\",\n /** Validation error */\n ValidationError = \"ValidationError\",\n}\n\n/**\n * Error class for Provenance Mark operations.\n */\nexport class ProvenanceMarkError extends Error {\n readonly type: ProvenanceMarkErrorType;\n readonly details?: Record<string, unknown> | undefined;\n\n constructor(type: ProvenanceMarkErrorType, message?: string, details?: Record<string, unknown>) {\n const fullMessage =\n message !== undefined && message !== \"\"\n ? `${type}: ${message}`\n : ProvenanceMarkError.defaultMessage(type, details);\n super(fullMessage);\n this.name = \"ProvenanceMarkError\";\n this.type = type;\n this.details = details;\n }\n\n private static defaultMessage(\n type: ProvenanceMarkErrorType,\n details?: Record<string, unknown>,\n ): string {\n const d = (key: string): string => {\n const value = details?.[key];\n if (value === undefined || value === null) return \"?\";\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n return JSON.stringify(value);\n };\n switch (type) {\n case ProvenanceMarkErrorType.InvalidSeedLength:\n return `invalid seed length: expected 32 bytes, got ${d(\"actual\")} bytes`;\n case ProvenanceMarkErrorType.DuplicateKey:\n return `duplicate key: ${d(\"key\")}`;\n case ProvenanceMarkErrorType.MissingKey:\n return `missing key: ${d(\"key\")}`;\n case ProvenanceMarkErrorType.InvalidKey:\n return `invalid key: ${d(\"key\")}`;\n case ProvenanceMarkErrorType.ExtraKeys:\n return `wrong number of keys: expected ${d(\"expected\")}, got ${d(\"actual\")}`;\n case ProvenanceMarkErrorType.InvalidKeyLength:\n return `invalid key length: expected ${d(\"expected\")}, got ${d(\"actual\")}`;\n case ProvenanceMarkErrorType.InvalidNextKeyLength:\n return `invalid next key length: expected ${d(\"expected\")}, got ${d(\"actual\")}`;\n case ProvenanceMarkErrorType.InvalidChainIdLength:\n return `invalid chain ID length: expected ${d(\"expected\")}, got ${d(\"actual\")}`;\n case ProvenanceMarkErrorType.InvalidMessageLength:\n return `invalid message length: expected at least ${d(\"expected\")}, got ${d(\"actual\")}`;\n case ProvenanceMarkErrorType.InvalidInfoCbor:\n return \"invalid CBOR data in info field\";\n case ProvenanceMarkErrorType.DateOutOfRange:\n return `date out of range: ${d(\"details\")}`;\n case ProvenanceMarkErrorType.InvalidDate:\n return `invalid date: ${d(\"details\")}`;\n case ProvenanceMarkErrorType.MissingUrlParameter:\n return `missing required URL parameter: ${d(\"parameter\")}`;\n case ProvenanceMarkErrorType.YearOutOfRange:\n return `year out of range for 2-byte serialization: must be between 2023-2150, got ${d(\"year\")}`;\n case ProvenanceMarkErrorType.InvalidMonthOrDay:\n return `invalid month (${d(\"month\")}) or day (${d(\"day\")}) for year ${d(\"year\")}`;\n case ProvenanceMarkErrorType.ResolutionError:\n return `resolution serialization error: ${d(\"details\")}`;\n case ProvenanceMarkErrorType.BytewordsError:\n return `bytewords error: ${d(\"message\")}`;\n case ProvenanceMarkErrorType.CborError:\n return `CBOR error: ${d(\"message\")}`;\n case ProvenanceMarkErrorType.UrlError:\n return `URL parsing error: ${d(\"message\")}`;\n case ProvenanceMarkErrorType.Base64Error:\n return `base64 decoding error: ${d(\"message\")}`;\n case ProvenanceMarkErrorType.JsonError:\n return `JSON error: ${d(\"message\")}`;\n case ProvenanceMarkErrorType.IntegerConversionError:\n return `integer conversion error: ${d(\"message\")}`;\n case ProvenanceMarkErrorType.ValidationError:\n return `validation error: ${d(\"message\")}`;\n default:\n return type;\n }\n }\n}\n\n/**\n * Result type for Provenance Mark operations.\n */\nexport type ProvenanceMarkResult<T> = T;\n","// Ported from provenance-mark-rust/src/date.rs\n\nimport { ProvenanceMarkError, ProvenanceMarkErrorType } from \"./error.js\";\n\n/**\n * Interface for serializable date operations.\n */\nexport interface SerializableDate {\n serialize2Bytes(): Uint8Array;\n serialize4Bytes(): Uint8Array;\n serialize6Bytes(): Uint8Array;\n}\n\n/**\n * Reference date for 4-byte and 6-byte serialization (2001-01-01T00:00:00Z).\n */\nconst REFERENCE_DATE = Date.UTC(2001, 0, 1, 0, 0, 0, 0);\n\n/**\n * Maximum value for 6-byte millisecond representation.\n */\nconst MAX_6_BYTE_VALUE = 0xe5940a78a7ff;\n\n/**\n * Get the number of days in a month.\n */\nfunction daysInMonth(year: number, month: number): number {\n // month is 1-based\n return new Date(year, month, 0).getDate();\n}\n\n/**\n * Check if a day is valid for a given year and month.\n */\nfunction isValidDay(year: number, month: number, day: number): boolean {\n if (day < 1) return false;\n return day <= daysInMonth(year, month);\n}\n\n/**\n * Serialize a date to 2 bytes (year + month + day only, day precision).\n * Year range: 2023-2150 (128 years)\n * Format: YYYYYYY MMMM DDDDD (7 bits year offset, 4 bits month, 5 bits day)\n */\nexport function serialize2Bytes(date: Date): Uint8Array {\n const year = date.getUTCFullYear();\n const month = date.getUTCMonth() + 1; // 1-based\n const day = date.getUTCDate();\n\n const yy = year - 2023;\n if (yy < 0 || yy >= 128) {\n throw new ProvenanceMarkError(ProvenanceMarkErrorType.YearOutOfRange, undefined, { year });\n }\n if (month < 1 || month > 12 || day < 1 || day > 31) {\n throw new ProvenanceMarkError(ProvenanceMarkErrorType.InvalidMonthOrDay, undefined, {\n year,\n month,\n day,\n });\n }\n\n const value = (yy << 9) | (month << 5) | day;\n const buf = new Uint8Array(2);\n buf[0] = (value >> 8) & 0xff;\n buf[1] = value & 0xff;\n return buf;\n}\n\n/**\n * Deserialize 2 bytes to a date.\n */\nexport function deserialize2Bytes(bytes: Uint8Array): Date {\n if (bytes.length !== 2) {\n throw new ProvenanceMarkError(ProvenanceMarkErrorType.InvalidDate, undefined, {\n details: `expected 2 bytes, got ${bytes.length}`,\n });\n }\n\n const value = (bytes[0] << 8) | bytes[1];\n const day = value & 0b11111;\n const month = (value >> 5) & 0b1111;\n const yy = (value >> 9) & 0b1111111;\n const year = yy + 2023;\n\n if (month < 1 || month > 12 || !isValidDay(year, month, day)) {\n throw new ProvenanceMarkError(ProvenanceMarkErrorType.InvalidMonthOrDay, undefined, {\n year,\n month,\n day,\n });\n }\n\n return new Date(Date.UTC(year, month - 1, day, 0, 0, 0, 0));\n}\n\n/**\n * Serialize a date to 4 bytes (seconds since 2001-01-01).\n */\nexport function serialize4Bytes(date: Date): Uint8Array {\n const duration = date.getTime() - REFERENCE_DATE;\n const seconds = Math.floor(duration / 1000);\n\n if (seconds < 0 || seconds > 0xffffffff) {\n throw new ProvenanceMarkError(ProvenanceMarkErrorType.DateOutOfRange, undefined, {\n details: \"seconds value out of range for u32\",\n });\n }\n\n const buf = new Uint8Array(4);\n buf[0] = (seconds >> 24) & 0xff;\n buf[1] = (seconds >> 16) & 0xff;\n buf[2] = (seconds >> 8) & 0xff;\n buf[3] = seconds & 0xff;\n return buf;\n}\n\n/**\n * Deserialize 4 bytes to a date.\n */\nexport function deserialize4Bytes(bytes: Uint8Array): Date {\n if (bytes.length !== 4) {\n throw new ProvenanceMarkError(ProvenanceMarkErrorType.InvalidDate, undefined, {\n details: `expected 4 bytes, got ${bytes.length}`,\n });\n }\n\n const seconds = ((bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | bytes[3]) >>> 0;\n return new Date(REFERENCE_DATE + seconds * 1000);\n}\n\n/**\n * Serialize a date to 6 bytes (milliseconds since 2001-01-01).\n */\nexport function serialize6Bytes(date: Date): Uint8Array {\n const duration = date.getTime() - REFERENCE_DATE;\n const milliseconds = BigInt(duration);\n\n if (milliseconds < 0n || milliseconds > BigInt(MAX_6_BYTE_VALUE)) {\n throw new ProvenanceMarkError(ProvenanceMarkErrorType.DateOutOfRange, undefined, {\n details: \"date exceeds maximum representable value\",\n });\n }\n\n const buf = new Uint8Array(6);\n buf[0] = Number((milliseconds >> 40n) & 0xffn);\n buf[1] = Number((milliseconds >> 32n) & 0xffn);\n buf[2] = Number((milliseconds >> 24n) & 0xffn);\n buf[3] = Number((milliseconds >> 16n) & 0xffn);\n buf[4] = Number((milliseconds >> 8n) & 0xffn);\n buf[5] = Number(milliseconds & 0xffn);\n return buf;\n}\n\n/**\n * Deserialize 6 bytes to a date.\n */\nexport function deserialize6Bytes(bytes: Uint8Array): Date {\n if (bytes.length !== 6) {\n throw new ProvenanceMarkError(ProvenanceMarkErrorType.InvalidDate, undefined, {\n details: `expected 6 bytes, got ${bytes.length}`,\n });\n }\n\n const milliseconds =\n (BigInt(bytes[0]) << 40n) |\n (BigInt(bytes[1]) << 32n) |\n (BigInt(bytes[2]) << 24n) |\n (BigInt(bytes[3]) << 16n) |\n (BigInt(bytes[4]) << 8n) |\n BigInt(bytes[5]);\n\n if (milliseconds > BigInt(MAX_6_BYTE_VALUE)) {\n throw new ProvenanceMarkError(ProvenanceMarkErrorType.DateOutOfRange, undefined, {\n details: \"date exceeds maximum representable value\",\n });\n }\n\n return new Date(REFERENCE_DATE + Number(milliseconds));\n}\n\n/**\n * Get the range of valid days in a month.\n */\nexport function rangeOfDaysInMonth(year: number, month: number): { min: number; max: number } {\n return { min: 1, max: daysInMonth(year, month) };\n}\n\n/**\n * Format a date as ISO8601 string.\n */\nexport function dateToIso8601(date: Date): string {\n return date.toISOString();\n}\n\n/**\n * Parse an ISO8601 string to a Date.\n */\nexport function dateFromIso8601(str: string): Date {\n const date = new Date(str);\n if (isNaN(date.getTime())) {\n throw new ProvenanceMarkError(ProvenanceMarkErrorType.InvalidDate, undefined, {\n details: `cannot parse date: ${str}`,\n });\n }\n return date;\n}\n\n/**\n * Format a date as a simple date string (YYYY-MM-DD).\n */\nexport function dateToDateString(date: Date): string {\n const year = date.getUTCFullYear();\n const month = (date.getUTCMonth() + 1).toString().padStart(2, \"0\");\n const day = date.getUTCDate().toString().padStart(2, \"0\");\n return `${year}-${month}-${day}`;\n}\n","// Ported from provenance-mark-rust/src/resolution.rs\n\nimport { type Cbor, cbor, expectUnsigned } from \"@bcts/dcbor\";\n\nimport { ProvenanceMarkError, ProvenanceMarkErrorType } from \"./error.js\";\nimport {\n serialize2Bytes,\n deserialize2Bytes,\n serialize4Bytes,\n deserialize4Bytes,\n serialize6Bytes,\n deserialize6Bytes,\n} from \"./date.js\";\n\n// LOW (16 bytes)\n// 0000 0000 0000 00 00\n// 0123 4567 89ab cd ef\n// key hash id seq date\n\n// MEDIUM (32 bytes)\n// 00000000 00000000 11111111 1111 1111\n// 01234567 89abcdef 01234567 89ab cdef\n// key hash id seq date\n\n// QUARTILE (58 bytes)\n// 0000000000000000 1111111111111111 2222222222222222 3333 333333\n// 0123456789abcdef 0123456789abcdef 0123456789abcdef 0123 456789\n// key hash id seq date\n\n// HIGH (106 bytes)\n// 00000000000000001111111111111111 22222222222222223333333333333333\n// 44444444444444445555555555555555 6666 666666\n// 0123456789abcdef0123456789abcdef 0123456789abcdef0123456789abcdef\n// 0123456789abcdef0123456789abcdef 0123 456789 key\n// hash id seq\n// date\n\n/**\n * Resolution levels for provenance marks.\n * Higher resolution provides more security but larger mark sizes.\n */\nexport enum ProvenanceMarkResolution {\n Low = 0,\n Medium = 1,\n Quartile = 2,\n High = 3,\n}\n\n/**\n * Convert a resolution to its numeric value.\n */\nexport function resolutionToNumber(res: ProvenanceMarkResolution): number {\n return res as number;\n}\n\n/**\n * Create a resolution from a numeric value.\n */\nexport function resolutionFromNumber(value: number): ProvenanceMarkResolution {\n switch (value) {\n case 0:\n return ProvenanceMarkResolution.Low;\n case 1:\n return ProvenanceMarkResolution.Medium;\n case 2:\n return ProvenanceMarkResolution.Quartile;\n case 3:\n return ProvenanceMarkResolution.High;\n default:\n throw new ProvenanceMarkError(ProvenanceMarkErrorType.ResolutionError, undefined, {\n details: `invalid provenance mark resolution value: ${value}`,\n });\n }\n}\n\n/**\n * Get the link length (key/hash/chainID length) for a resolution.\n */\nexport function linkLength(res: ProvenanceMarkResolution): number {\n switch (res) {\n case ProvenanceMarkResolution.Low:\n return 4;\n case ProvenanceMarkResolution.Medium:\n return 8;\n case ProvenanceMarkResolution.Quartile:\n return 16;\n case ProvenanceMarkResolution.High:\n return 32;\n }\n}\n\n/**\n * Get the sequence bytes length for a resolution.\n */\nexport function seqBytesLength(res: ProvenanceMarkResolution): number {\n switch (res) {\n case ProvenanceMarkResolution.Low:\n return 2;\n case ProvenanceMarkResolution.Medium:\n case ProvenanceMarkResolution.Quartile:\n case ProvenanceMarkResolution.High:\n return 4;\n }\n}\n\n/**\n * Get the date bytes length for a resolution.\n */\nexport function dateBytesLength(res: ProvenanceMarkResolution): number {\n switch (res) {\n case ProvenanceMarkResolution.Low:\n return 2;\n case ProvenanceMarkResolution.Medium:\n return 4;\n case ProvenanceMarkResolution.Quartile:\n case ProvenanceMarkResolution.High:\n return 6;\n }\n}\n\n/**\n * Get the fixed-length portion size for a resolution.\n */\nexport function fixedLength(res: ProvenanceMarkResolution): number {\n return linkLength(res) * 3 + seqBytesLength(res) + dateBytesLength(res);\n}\n\n/**\n * Get the key range for a resolution.\n */\nexport function keyRange(res: ProvenanceMarkResolution): { start: number; end: number } {\n return { start: 0, end: linkLength(res) };\n}\n\n/**\n * Get the chain ID range for a resolution.\n */\nexport function chainIdRange(res: ProvenanceMarkResolution): { start: number; end: number } {\n return { start: 0, end: linkLength(res) };\n}\n\n/**\n * Get the hash range for a resolution.\n */\nexport function hashRange(res: ProvenanceMarkResolution): { start: number; end: number } {\n const chainIdEnd = chainIdRange(res).end;\n return { start: chainIdEnd, end: chainIdEnd + linkLength(res) };\n}\n\n/**\n * Get the sequence bytes range for a resolution.\n */\nexport function seqBytesRange(res: ProvenanceMarkResolution): { start: number; end: number } {\n const hashEnd = hashRange(res).end;\n return { start: hashEnd, end: hashEnd + seqBytesLength(res) };\n}\n\n/**\n * Get the date bytes range for a resolution.\n */\nexport function dateBytesRange(res: ProvenanceMarkResolution): { start: number; end: number } {\n const seqEnd = seqBytesRange(res).end;\n return { start: seqEnd, end: seqEnd + dateBytesLength(res) };\n}\n\n/**\n * Get the info range start for a resolution.\n */\nexport function infoRangeStart(res: ProvenanceMarkResolution): number {\n return dateBytesRange(res).end;\n}\n\n/**\n * Serialize a Date into bytes based on the resolution.\n */\nexport function serializeDate(res: ProvenanceMarkResolution, date: Date): Uint8Array {\n switch (res) {\n case ProvenanceMarkResolution.Low:\n return serialize2Bytes(date);\n case ProvenanceMarkResolution.Medium:\n return serialize4Bytes(date);\n case ProvenanceMarkResolution.Quartile:\n case ProvenanceMarkResolution.High:\n return serialize6Bytes(date);\n }\n}\n\n/**\n * Deserialize bytes into a Date based on the resolution.\n */\nexport function deserializeDate(res: ProvenanceMarkResolution, data: Uint8Array): Date {\n switch (res) {\n case ProvenanceMarkResolution.Low:\n if (data.length !== 2) {\n throw new ProvenanceMarkError(ProvenanceMarkErrorType.ResolutionError, undefined, {\n details: `invalid date length: expected 2 bytes, got ${data.length}`,\n });\n }\n return deserialize2Bytes(data);\n case ProvenanceMarkResolution.Medium:\n if (data.length !== 4) {\n throw new ProvenanceMarkError(ProvenanceMarkErrorType.ResolutionError, undefined, {\n details: `invalid date length: expected 4 bytes, got ${data.length}`,\n });\n }\n return deserialize4Bytes(data);\n case ProvenanceMarkResolution.Quartile:\n case ProvenanceMarkResolution.High:\n if (data.length !== 6) {\n throw new ProvenanceMarkError(ProvenanceMarkErrorType.ResolutionError, undefined, {\n details: `invalid date length: expected 6 bytes, got ${data.length}`,\n });\n }\n return deserialize6Bytes(data);\n }\n}\n\n/**\n * Serialize a sequence number into bytes based on the resolution.\n */\nexport function serializeSeq(res: ProvenanceMarkResolution, seq: number): Uint8Array {\n const len = seqBytesLength(res);\n if (len === 2) {\n if (seq > 0xffff) {\n throw new ProvenanceMarkError(ProvenanceMarkErrorType.ResolutionError, undefined, {\n details: `sequence number ${seq} out of range for 2-byte format (max ${0xffff})`,\n });\n }\n const buf = new Uint8Array(2);\n buf[0] = (seq >> 8) & 0xff;\n buf[1] = seq & 0xff;\n return buf;\n } else {\n const buf = new Uint8Array(4);\n buf[0] = (seq >> 24) & 0xff;\n buf[1] = (seq >> 16) & 0xff;\n buf[2] = (seq >> 8) & 0xff;\n buf[3] = seq & 0xff;\n return buf;\n }\n}\n\n/**\n * Deserialize bytes into a sequence number based on the resolution.\n */\nexport function deserializeSeq(res: ProvenanceMarkResolution, data: Uint8Array): number {\n const len = seqBytesLength(res);\n if (len === 2) {\n if (data.length !== 2) {\n throw new ProvenanceMarkError(ProvenanceMarkErrorType.ResolutionError, undefined, {\n details: `invalid sequence number length: expected 2 bytes, got ${data.length}`,\n });\n }\n return (data[0] << 8) | data[1];\n } else {\n if (data.length !== 4) {\n throw new ProvenanceMarkError(ProvenanceMarkErrorType.ResolutionError, undefined, {\n details: `invalid sequence number length: expected 4 bytes, got ${data.length}`,\n });\n }\n return ((data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3]) >>> 0;\n }\n}\n\n/**\n * Get the string representation of a resolution.\n */\nexport function resolutionToString(res: ProvenanceMarkResolution): string {\n switch (res) {\n case ProvenanceMarkResolution.Low:\n return \"low\";\n case ProvenanceMarkResolution.Medium:\n return \"medium\";\n case ProvenanceMarkResolution.Quartile:\n return \"quartile\";\n case ProvenanceMarkResolution.High:\n return \"high\";\n }\n}\n\n/**\n * Convert a resolution to CBOR.\n */\nexport function resolutionToCbor(res: ProvenanceMarkResolution): Cbor {\n return cbor(res as number);\n}\n\n/**\n * Create a resolution from CBOR.\n */\nexport function resolutionFromCbor(cborValue: Cbor): ProvenanceMarkResolution {\n const value = expectUnsigned(cborValue);\n return resolutionFromNumber(Number(value));\n}\n","// Ported from provenance-mark-rust/src/crypto_utils.rs\n\nimport { sha256 as sha256Hash } from \"@noble/hashes/sha256\";\nimport { hkdf } from \"@noble/hashes/hkdf\";\nimport { chacha20 } from \"@noble/ciphers/chacha\";\n\nexport const SHA256_SIZE = 32;\n\n/**\n * Compute SHA-256 hash of data.\n */\nexport function sha256(data: Uint8Array): Uint8Array {\n return sha256Hash(data);\n}\n\n/**\n * Compute SHA-256 hash and return a prefix of the given length.\n */\nexport function sha256Prefix(data: Uint8Array, prefix: number): Uint8Array {\n const digest = sha256(data);\n return digest.slice(0, prefix);\n}\n\n/**\n * Extend a key to 32 bytes using HKDF-HMAC-SHA-256.\n */\nexport function extendKey(data: Uint8Array): Uint8Array {\n return hkdfHmacSha256(data, new Uint8Array(0), 32);\n}\n\n/**\n * Compute HKDF-HMAC-SHA-256 for the given key material.\n */\nexport function hkdfHmacSha256(\n keyMaterial: Uint8Array,\n salt: Uint8Array,\n keyLen: number,\n): Uint8Array {\n // HKDF with empty info\n return hkdf(\n sha256Hash,\n keyMaterial,\n salt.length > 0 ? salt : undefined,\n new Uint8Array(0),\n keyLen,\n );\n}\n\n/**\n * Obfuscate (or deobfuscate) a message using ChaCha20.\n * The function is symmetric - applying it twice returns the original message.\n */\nexport function obfuscate(key: Uint8Array, message: Uint8Array): Uint8Array {\n if (message.length === 0) {\n return new Uint8Array(0);\n }\n\n // Ensure key is a proper Uint8Array\n const keyBytes = key instanceof Uint8Array ? key : new Uint8Array(key);\n const extendedKey = extendKey(keyBytes);\n\n // IV is the last 12 bytes of the extended key, reversed\n // Rust: extended_key.iter().rev().take(12).copied().collect()\n const iv = new Uint8Array(12);\n for (let i = 0; i < 12; i++) {\n iv[i] = extendedKey[31 - i];\n }\n\n // Ensure message is a proper Uint8Array\n const messageBytes = message instanceof Uint8Array ? message : new Uint8Array(message);\n\n // ChaCha20 is a XorStream function: (key, nonce, data) => encrypted\n // counter defaults to 0\n return chacha20(extendedKey, iv, messageBytes);\n}\n","// Ported from provenance-mark-rust/src/xoshiro256starstar.rs\n\n/**\n * Xoshiro256** PRNG implementation.\n * A fast, high-quality pseudorandom number generator.\n */\nexport class Xoshiro256StarStar {\n private s: [bigint, bigint, bigint, bigint];\n\n private constructor(s: [bigint, bigint, bigint, bigint]) {\n this.s = s;\n }\n\n /**\n * Get the internal state as an array of 4 u64 values.\n */\n toState(): [bigint, bigint, bigint, bigint] {\n return [...this.s] as [bigint, bigint, bigint, bigint];\n }\n\n /**\n * Create a new PRNG from a state array.\n */\n static fromState(state: [bigint, bigint, bigint, bigint]): Xoshiro256StarStar {\n return new Xoshiro256StarStar([...state] as [bigint, bigint, bigint, bigint]);\n }\n\n /**\n * Serialize the state to 32 bytes (little-endian).\n */\n toData(): Uint8Array {\n const data = new Uint8Array(32);\n for (let i = 0; i < 4; i++) {\n const val = this.s[i];\n for (let j = 0; j < 8; j++) {\n data[i * 8 + j] = Number((val >> BigInt(j * 8)) & 0xffn);\n }\n }\n return data;\n }\n\n /**\n * Create a new PRNG from 32 bytes of seed data (little-endian).\n */\n static fromData(data: Uint8Array): Xoshiro256StarStar {\n if (data.length !== 32) {\n throw new Error(`expected 32 bytes, got ${data.length}`);\n }\n const s: [bigint, bigint, bigint, bigint] = [0n, 0n, 0n, 0n];\n for (let i = 0; i < 4; i++) {\n let val = 0n;\n for (let j = 0; j < 8; j++) {\n val |= BigInt(data[i * 8 + j]) << BigInt(j * 8);\n }\n s[i] = val;\n }\n return new Xoshiro256StarStar(s);\n }\n\n /**\n * Generate the next u64 value.\n */\n nextU64(): bigint {\n const result = this.starstarU64(this.s[1]);\n this.advance();\n return result;\n }\n\n /**\n * Generate the next u32 value (upper bits of u64 for better quality).\n */\n nextU32(): number {\n return Number((this.nextU64() >> 32n) & 0xffffffffn);\n }\n\n /**\n * Generate the next byte.\n */\n nextByte(): number {\n return Number(this.nextU64() & 0xffn);\n }\n\n /**\n * Generate the next n bytes.\n */\n nextBytes(len: number): Uint8Array {\n const bytes = new Uint8Array(len);\n for (let i = 0; i < len; i++) {\n bytes[i] = this.nextByte();\n }\n return bytes;\n }\n\n /**\n * Fill a buffer with random bytes.\n */\n fillBytes(dest: Uint8Array): void {\n // Use fill_bytes_via_next strategy - fill 8 bytes at a time\n let i = 0;\n while (i + 8 <= dest.length) {\n const val = this.nextU64();\n for (let j = 0; j < 8; j++) {\n dest[i + j] = Number((val >> BigInt(j * 8)) & 0xffn);\n }\n i += 8;\n }\n // Handle remaining bytes\n if (i < dest.length) {\n const val = this.nextU64();\n for (let j = 0; i < dest.length; i++, j++) {\n dest[i] = Number((val >> BigInt(j * 8)) & 0xffn);\n }\n }\n }\n\n /**\n * The starstar transformation: x * 5, rotate left 7, * 9\n */\n private starstarU64(x: bigint): bigint {\n const mask64 = 0xffffffffffffffffn;\n const mul5 = (x * 5n) & mask64;\n const rotated = this.rotateLeft64(mul5, 7n);\n return (rotated * 9n) & mask64;\n }\n\n /**\n * Rotate a 64-bit value left by n bits.\n */\n private rotateLeft64(x: bigint, n: bigint): bigint {\n const mask64 = 0xffffffffffffffffn;\n return ((x << n) | (x >> (64n - n))) & mask64;\n }\n\n /**\n * Advance the PRNG state.\n */\n private advance(): void {\n const mask64 = 0xffffffffffffffffn;\n const t = (this.s[1] << 17n) & mask64;\n\n this.s[2] ^= this.s[0];\n this.s[3] ^= this.s[1];\n this.s[1] ^= this.s[2];\n this.s[0] ^= this.s[3];\n\n this.s[2] ^= t;\n\n this.s[3] = this.rotateLeft64(this.s[3], 45n);\n }\n}\n","// Ported from provenance-mark-rust/src/rng_state.rs\n\nimport { type Cbor, cbor, expectBytes } from \"@bcts/dcbor\";\n\nimport { ProvenanceMarkError, ProvenanceMarkErrorType } from \"./error.js\";\n\nexport const RNG_STATE_LENGTH = 32;\n\n/**\n * RNG state for provenance marks (32 bytes).\n */\nexport class RngState {\n private readonly data: Uint8Array;\n\n private constructor(data: Uint8Array) {\n this.data = data;\n }\n\n /**\n * Get the raw bytes.\n */\n toBytes(): Uint8Array {\n return new Uint8Array(this.data);\n }\n\n /**\n * Create from a 32-byte array.\n */\n static fromBytes(bytes: Uint8Array): RngState {\n if (bytes.length !== RNG_STATE_LENGTH) {\n throw new ProvenanceMarkError(ProvenanceMarkErrorType.InvalidSeedLength, undefined, {\n actual: bytes.length,\n });\n }\n return new RngState(new Uint8Array(bytes));\n }\n\n /**\n * Create from a slice (validates length).\n */\n static fromSlice(bytes: Uint8Array): RngState {\n return RngState.fromBytes(bytes);\n }\n\n /**\n * Get the hex representation.\n */\n hex(): string {\n return Array.from(this.data)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n }\n\n /**\n * Convert to CBOR (byte string).\n */\n toCbor(): Cbor {\n return cbor(this.data);\n }\n\n /**\n * Create from CBOR (byte string).\n */\n static fromCbor(cborValue: Cbor): RngState {\n const bytes = expectBytes(cborValue);\n return RngState.fromBytes(bytes);\n }\n}\n","// Ported from provenance-mark-rust/src/seed.rs\n\nimport { type Cbor, cbor, expectBytes } from \"@bcts/dcbor\";\nimport { randomData } from \"@bcts/rand\";\n\nimport { ProvenanceMarkError, ProvenanceMarkErrorType } from \"./error.js\";\nimport { extendKey } from \"./crypto-utils.js\";\n\nexport const PROVENANCE_SEED_LENGTH = 32;\n\n/**\n * A seed for generating provenance marks.\n */\nexport class ProvenanceSeed {\n private readonly data: Uint8Array;\n\n private constructor(data: Uint8Array) {\n this.data = data;\n }\n\n /**\n * Create a new random seed using secure random number generation.\n */\n static new(): ProvenanceSeed {\n const data = randomData(PROVENANCE_SEED_LENGTH);\n return ProvenanceSeed.fromBytes(data);\n }\n\n /**\n * Create a new seed using custom random data.\n */\n static newUsing(randomData: Uint8Array): ProvenanceSeed {\n if (randomData.length < PROVENANCE_SEED_LENGTH) {\n throw new ProvenanceMarkError(ProvenanceMarkErrorType.InvalidSeedLength, undefined, {\n actual: randomData.length,\n });\n }\n return ProvenanceSeed.fromBytes(randomData.slice(0, PROVENANCE_SEED_LENGTH));\n }\n\n /**\n * Create a new seed from a passphrase.\n */\n static newWithPassphrase(passphrase: string): ProvenanceSeed {\n const seedData = extendKey(new TextEncoder().encode(passphrase));\n return ProvenanceSeed.fromBytes(seedData);\n }\n\n /**\n * Get the raw bytes.\n */\n toBytes(): Uint8Array {\n return new Uint8Array(this.data);\n }\n\n /**\n * Create from a 32-byte array.\n */\n static fromBytes(bytes: Uint8Array): ProvenanceSeed {\n if (bytes.length !== PROVENANCE_SEED_LENGTH) {\n throw new ProvenanceMarkError(ProvenanceMarkErrorType.InvalidSeedLength, undefined, {\n actual: bytes.length,\n });\n }\n return new ProvenanceSeed(new Uint8Array(bytes));\n }\n\n /**\n * Create from a slice (validates length).\n */\n static fromSlice(bytes: Uint8Array): ProvenanceSeed {\n return ProvenanceSeed.fromBytes(bytes);\n }\n\n /**\n * Get the hex representation.\n */\n hex(): string {\n return Array.from(this.data)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n }\n\n /**\n * Convert to CBOR (byte string).\n */\n toCbor(): Cbor {\n return cbor(this.data);\n }\n\n /**\n * Create from CBOR (byte string).\n */\n static fromCbor(cborValue: Cbor): ProvenanceSeed {\n const bytes = expectBytes(cborValue);\n return ProvenanceSeed.fromBytes(bytes);\n }\n}\n","/**\n * Utility functions for byte array conversions.\n *\n * These functions provide cross-platform support for common byte manipulation\n * operations needed in provenance mark encoding.\n */\n\n// Declare Node.js types for environments where they might not be available\ndeclare const require: ((module: string) => unknown) | undefined;\n\n/**\n * Convert a Uint8Array to a lowercase hexadecimal string.\n *\n * @param data - The byte array to convert\n * @returns A lowercase hex string representation (2 characters per byte)\n */\nexport function bytesToHex(data: Uint8Array): string {\n return Array.from(data)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\n/**\n * Convert a hexadecimal string to a Uint8Array.\n *\n * @param hex - A hex string (must have even length, case-insensitive)\n * @returns The decoded byte array\n * @throws {Error} If the hex string has odd length or contains invalid characters\n */\nexport function hexToBytes(hex: string): Uint8Array {\n if (hex.length % 2 !== 0) {\n throw new Error(`Hex string must have even length, got ${hex.length}`);\n }\n if (!/^[0-9A-Fa-f]*$/.test(hex)) {\n throw new Error(\"Invalid hex string: contains non-hexadecimal characters\");\n }\n const data = new Uint8Array(hex.length / 2);\n for (let i = 0; i < hex.length; i += 2) {\n data[i / 2] = parseInt(hex.substring(i, i + 2), 16);\n }\n return data;\n}\n\n/**\n * Convert a Uint8Array to a base64-encoded string.\n *\n * This function works in both browser and Node.js environments.\n *\n * @param data - The byte array to encode\n * @returns A base64-encoded string\n */\nexport function toBase64(data: Uint8Array): string {\n // Use globalThis.btoa for browser/modern Node.js compatibility\n const globalBtoa = globalThis.btoa as ((data: string) => string) | undefined;\n if (typeof globalBtoa === \"function\") {\n // Convert bytes to binary string without spread operator to avoid\n // call stack limits for large arrays\n let binary = \"\";\n for (const byte of data) {\n binary += String.fromCharCode(byte);\n }\n return globalBtoa(binary);\n }\n // Node.js environment (fallback for Node < 18)\n const requireFn = require;\n if (typeof requireFn === \"function\") {\n const { Buffer: NodeBuffer } = requireFn(\"buffer\") as {\n Buffer: { from: (data: Uint8Array) => { toString: (encoding: string) => string } };\n };\n return NodeBuffer.from(data).toString(\"base64\");\n }\n throw new Error(\"btoa not available and require is not defined\");\n}\n\n/**\n * Convert a base64-encoded string to a Uint8Array.\n *\n * This function works in both browser and Node.js environments.\n *\n * @param base64 - A base64-encoded string\n * @returns The decoded byte array\n */\nexport function fromBase64(base64: string): Uint8Array {\n // Use globalThis.atob for browser/modern Node.js compatibility\n const globalAtob = globalThis.atob as ((data: string) => string) | undefined;\n if (typeof globalAtob === \"function\") {\n const binary = globalAtob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n }\n // Node.js environment (fallback for Node < 18)\n const requireFn = require;\n if (typeof requireFn === \"function\") {\n const { Buffer: NodeBuffer } = requireFn(\"buffer\") as {\n Buffer: { from: (data: string, encoding: string) => Uint8Array };\n };\n return new Uint8Array(NodeBuffer.from(base64, \"base64\"));\n }\n throw new Error(\"atob not available and require is not defined\");\n}\n","// Ported from provenance-mark-rust/src/mark.rs\n\nimport { toBase64, fromBase64, bytesToHex } from \"./utils.js\";\nimport { type Cbor, cbor, cborData, expectArray, expectBytes, decodeCbor } from \"@bcts/dcbor\";\nimport { PROVENANCE_MARK } from \"@bcts/tags\";\nimport {\n BytewordsStyle,\n encodeBytewords,\n decodeBytewords,\n encodeBytewordsIdentifier,\n encodeBytemojisIdentifier,\n} from \"@bcts/uniform-resources\";\n\nimport { ProvenanceMarkError, ProvenanceMarkErrorType } from \"./error.js\";\nimport {\n type ProvenanceMarkResolution,\n linkLength,\n keyRange,\n chainIdRange,\n hashRange,\n seqBytesRange,\n dateBytesRange,\n infoRangeStart,\n fixedLength,\n serializeDate,\n deserializeDate,\n serializeSeq,\n deserializeSeq,\n resolutionFromCbor,\n resolutionToCbor,\n} from \"./resolution.js\";\nimport { sha256, sha256Prefix, obfuscate } from \"./crypto-utils.js\";\n\n/**\n * A cryptographically-secured provenance mark.\n */\nexport class ProvenanceMark {\n private readonly _res: ProvenanceMarkResolution;\n private readonly _key: Uint8Array;\n private readonly _hash: Uint8Array;\n private readonly _chainId: Uint8Array;\n private readonly _seqBytes: Uint8Array;\n private readonly _dateBytes: Uint8Array;\n private readonly _infoBytes: Uint8Array;\n private readonly _seq: number;\n private readonly _date: Date;\n\n private constructor(\n res: ProvenanceMarkResolution,\n key: Uint8Array,\n hash: Uint8Array,\n chainId: Uint8Array,\n seqBytes: Uint8Array,\n dateBytes: Uint8Array,\n infoBytes: Uint8Array,\n seq: number,\n date: Date,\n ) {\n this._res = res;\n this._key = key;\n this._hash = hash;\n this._chainId = chainId;\n this._seqBytes = seqBytes;\n this._dateBytes = dateBytes;\n this._infoBytes = infoBytes;\n this._seq = seq;\n this._date = date;\n }\n\n res(): ProvenanceMarkResolution {\n return this._res;\n }\n\n key(): Uint8Array {\n return new Uint8Array(this._key);\n }\n\n hash(): Uint8Array {\n return new Uint8Array(this._hash);\n }\n\n chainId(): Uint8Array {\n return new Uint8Array(this._chainId);\n }\n\n seqBytes(): Uint8Array {\n return new Uint8Array(this._seqBytes);\n }\n\n dateBytes(): Uint8Array {\n return new Uint8Array(this._dateBytes);\n }\n\n seq(): number {\n return this._seq;\n }\n\n date(): Date {\n return this._date;\n }\n\n /**\n * Get the message (serialized bytes) of this mark.\n */\n message(): Uint8Array {\n const payload = new Uint8Array([\n ...this._chainId,\n ...this._hash,\n ...this._seqBytes,\n ...this._dateBytes,\n ...this._infoBytes,\n ]);\n const obfuscated = obfuscate(this._key, payload);\n return new Uint8Array([...this._key, ...obfuscated]);\n }\n\n /**\n * Get the info field as CBOR, if present.\n */\n info(): Cbor | undefined {\n if (this._infoBytes.length === 0) {\n return undefined;\n }\n return decodeCbor(this._infoBytes);\n }\n\n /**\n * Create a new provenance mark.\n */\n static new(\n res: ProvenanceMarkResolution,\n key: Uint8Array,\n nextKey: Uint8Array,\n chainId: Uint8Array,\n seq: number,\n date: Date,\n info?: Cbor,\n ): ProvenanceMark {\n const linkLen = linkLength(res);\n\n if (key.length !== linkLen) {\n throw new ProvenanceMarkError(ProvenanceMarkErrorType.InvalidKeyLength, undefined, {\n expected: linkLen,\n actual: key.length,\n });\n }\n if (nextKey.length !== linkLen) {\n throw new ProvenanceMarkError(ProvenanceMarkErrorType.InvalidNextKeyLength, undefined, {\n expected: linkLen,\n actual: nextKey.length,\n });\n }\n if (chainId.length !== linkLen) {\n throw new ProvenanceMarkError(ProvenanceMarkErrorType.InvalidChainIdLength, undefined, {\n expected: linkLen,\n actual: chainId.length,\n });\n }\n\n const dateBytes = serializeDate(res, date);\n const seqBytes = serializeSeq(res, seq);\n\n // Re-deserialize to get normalized date\n const normalizedDate = deserializeDate(res, dateBytes);\n\n const infoBytes = info !== undefined ? cborData(info) : new Uint8Array(0);\n\n const hash = ProvenanceMark.makeHash(\n res,\n key,\n nextKey,\n chainId,\n seqBytes,\n dateBytes,\n infoBytes,\n );\n\n return new ProvenanceMark(\n res,\n new Uint8Array(key),\n hash,\n new Uint8Array(chainId),\n seqBytes,\n dateBytes,\n infoBytes,\n seq,\n normalizedDate,\n );\n }\n\n /**\n * Create a provenance mark from a serialized message.\n */\n static fromMessage(res: ProvenanceMarkResolution, message: Uint8Array): ProvenanceMark {\n const minLen = fixedLength(res);\n if (message.length < minLen) {\n throw new ProvenanceMarkError(ProvenanceMarkErrorType.InvalidMessageLength, undefined, {\n expected: minLen,\n actual: message.length,\n });\n }\n\n const linkLen = linkLength(res);\n const keyRng = keyRange(res);\n const key = message.slice(keyRng.start, keyRng.end);\n\n const payload = obfuscate(key, message.slice(linkLen));\n\n // All ranges are for the payload, not the message\n const chainIdRng = chainIdRange(res);\n const chainId = payload.slice(chainIdRng.start, chainIdRng.end);\n\n const hashRng = hashRange(res);\n const hash = payload.slice(hashRng.start, hashRng.end);\n\n const seqRng = seqBytesRange(res);\n const seqBytes = payload.slice(seqRng.start, seqRng.end);\n const seq = deserializeSeq(res, seqBytes);\n\n const dateRng = dateBytesRange(res);\n const dateBytes = payload.slice(dateRng.start, dateRng.end);\n const date = deserializeDate(res, dateBytes);\n\n const infoStart = infoRangeStart(res);\n const infoBytes = payload.slice(infoStart);\n\n // Validate info CBOR if present\n if (infoBytes.length > 0) {\n try {\n decodeCbor(infoBytes);\n } catch {\n throw new ProvenanceMarkError(ProvenanceMarkErrorType.InvalidInfoCbor);\n }\n }\n\n return new ProvenanceMark(\n res,\n new Uint8Array(key),\n new Uint8Array(hash),\n new Uint8Array(chainId),\n new Uint8Array(seqBytes),\n new Uint8Array(dateBytes),\n new Uint8Array(infoBytes),\n seq,\n date,\n );\n }\n\n private static makeHash(\n res: ProvenanceMarkResolution,\n key: Uint8Array,\n nextKey: Uint8Array,\n chainId: Uint8Array,\n seqBytes: Uint8Array,\n dateBytes: Uint8Array,\n infoBytes: Uint8Array,\n ): Uint8Array {\n const buf = new Uint8Array([\n ...key,\n ...nextKey,\n ...chainId,\n ...seqBytes,\n ...dateBytes,\n ...infoBytes,\n ]);\n return sha256Prefix(buf, linkLength(res));\n }\n\n /**\n * Get the first four bytes of the hash as a hex string identifier.\n */\n identifier(): string {\n return Array.from(this._hash.slice(0, 4))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n }\n\n /**\n * Get the first four bytes of the hash as upper-case ByteWords.\n */\n bytewordsIdentifier(prefix: boolean): string {\n const bytes = this._hash.slice(0, 4);\n const s = encodeBytewordsIdentifier(bytes).toUpperCase();\n return prefix ? `\\u{1F151} ${s}` : s;\n }\n\n /**\n * Get the first four bytes of the hash as Bytemoji.\n */\n bytemojiIdentifier(prefix: boolean): string {\n const bytes = this._hash.slice(0, 4);\n const s = encodeBytemojisIdentifier(bytes).toUpperCase();\n return prefix ? `\\u{1F151} ${s}` : s;\n }\n\n /**\n * Check if this mark precedes another mark in the chain.\n */\n precedes(next: ProvenanceMark): boolean {\n try {\n this.precedesOpt(next);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Check if this mark precedes another mark, throwing on validation errors.\n */\n precedesOpt(next: ProvenanceMark): void {\n // `next` can't be a genesis\n if (next._seq === 0) {\n throw new ProvenanceMarkError(ProvenanceMarkErrorType.ValidationError, undefined, {\n message: \"non-genesis mark at sequence 0\",\n });\n }\n if (arraysEqual(next._key, next._chainId)) {\n throw new ProvenanceMarkError(ProvenanceMarkErrorType.ValidationError, undefined, {\n message: \"genesis mark must have key equal to chain_id\",\n });\n }\n // `next` must have the next highest sequence number\n if (this._seq !== next._seq - 1) {\n throw new ProvenanceMarkError(ProvenanceMarkErrorType.ValidationError, undefined, {\n message: `sequence gap: expected ${this._seq + 1}, got ${next._seq}`,\n });\n }\n // `next` must have an equal or later date\n if (this._date > next._date) {\n throw new ProvenanceMarkError(ProvenanceMarkErrorType.ValidationError, undefined, {\n message: `date ordering: ${this._date.toISOString()} > ${next._date.toISOString()}`,\n });\n }\n // `next` must reveal the key that was used to generate this mark's hash\n const expectedHash = ProvenanceMark.makeHash(\n this._res,\n this._key,\n next._key,\n this._chainId,\n this._seqBytes,\n this._dateBytes,\n this._infoBytes,\n );\n if (!arraysEqual(this._hash, expectedHash)) {\n throw new ProvenanceMarkError(ProvenanceMarkErrorType.ValidationError, undefined, {\n message: \"hash mismatch\",\n expected: Array.from(expectedHash)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\"),\n actual: Array.from(this._hash)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\"),\n });\n }\n }\n\n /**\n * Check if a sequence of marks is valid.\n */\n static isSequenceValid(marks: ProvenanceMark[]): boolean {\n if (marks.length < 2) {\n return false;\n }\n if (marks[0]._seq === 0 && !marks[0].isGenesis()) {\n return false;\n }\n for (let i = 0; i < marks.length - 1; i++) {\n if (!marks[i].precedes(marks[i + 1])) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Check if this is a genesis mark (seq 0 and key equals chain_id).\n */\n isGenesis(): boolean {\n return this._seq === 0 && arraysEqual(this._key, this._chainId);\n }\n\n /**\n * Encode as bytewords with the given style.\n */\n toBytewordsWithStyle(style: BytewordsStyle): string {\n return encodeBytewords(this.message(), style);\n }\n\n /**\n * Encode as standard bytewords.\n */\n toBytewords(): string {\n return this.toBytewordsWithStyle(BytewordsStyle.Standard);\n }\n\n /**\n * Decode from bytewords.\n */\n static fromBytewords(res: ProvenanceMarkResolution, bytewords: string): ProvenanceMark {\n const message = decodeBytewords(bytewords, BytewordsStyle.Standard);\n return ProvenanceMark.fromMessage(res, message);\n }\n\n /**\n * Encode for URL (minimal bytewords of CBOR).\n */\n toUrlEncoding(): string {\n return encodeBytewords(this.toCborData(), BytewordsStyle.Minimal);\n }\n\n /**\n * Decode from URL encoding.\n */\n static fromUrlEncoding(urlEncoding: string): ProvenanceMark {\n const cborData = decodeBytewords(urlEncoding, BytewordsStyle.Minimal);\n const cborValue = decodeCbor(cborData);\n return ProvenanceMark.fromTaggedCbor(cborValue);\n }\n\n /**\n * Build a URL with this mark as a query parameter.\n */\n toUrl(base: string): URL {\n const url = new URL(base);\n url.searchParams.set(\"provenance\", this.toUrlEncoding());\n return url;\n }\n\n /**\n * Parse a provenance mark from a URL.\n */\n static fromUrl(url: URL): ProvenanceMark {\n const param = url.searchParams.get(\"provenance\");\n if (param === null || param === \"\") {\n throw new ProvenanceMarkError(ProvenanceMarkErrorType.MissingUrlParameter, undefined, {\n parameter: \"provenance\",\n });\n }\n return ProvenanceMark.fromUrlEncoding(param);\n }\n\n /**\n * Get the untagged CBOR representation.\n */\n untaggedCbor(): Cbor {\n return cbor([resolutionToCbor(this._res), cbor(this.message())]);\n }\n\n /**\n * Get the tagged CBOR representation.\n */\n taggedCbor(): Cbor {\n return cbor({ tag: PROVENANCE_MARK.value, value: this.untaggedCbor() });\n }\n\n /**\n * Serialize to CBOR bytes (tagged).\n */\n toCborData(): Uint8Array {\n return cborData(this.taggedCbor());\n }\n\n /**\n * Create from untagged CBOR.\n */\n static fromUntaggedCbor(cborValue: Cbor): ProvenanceMark {\n const arr = expectArray(cborValue);\n if (arr.length !== 2) {\n throw new ProvenanceMarkError(ProvenanceMarkErrorType.CborError, undefined, {\n message: \"Invalid provenance mark length\",\n });\n }\n const res = resolutionFromCbor(arr[0]);\n const message = expectBytes(arr[1]);\n return ProvenanceMark.fromMessage(res, message);\n }\n\n /**\n * Create from tagged CBOR.\n */\n static fromTaggedCbor(cborValue: Cbor): ProvenanceMark {\n const cborObj = cborValue as { tag?: number; value?: Cbor };\n if (cborObj.tag !== PROVENANCE_MARK.value) {\n throw new ProvenanceMarkError(ProvenanceMarkErrorType.CborError, undefined, {\n message: `Expected tag ${PROVENANCE_MARK.value}, got ${String(cborObj.tag)}`,\n });\n }\n if (cborObj.value === undefined) {\n throw new ProvenanceMarkError(ProvenanceMarkErrorType.CborError, undefined, {\n message: \"Tagged CBOR value is missing\",\n });\n }\n return ProvenanceMark.fromUntaggedCbor(cborObj.value);\n }\n\n /**\n * Create from CBOR bytes.\n */\n static fromCborData(data: Uint8Array): ProvenanceMark {\n const cborValue = decodeCbor(data);\n return ProvenanceMark.fromTaggedCbor(cborValue);\n }\n\n /**\n * Get the fingerprint (SHA-256 of CBOR data).\n */\n fingerprint(): Uint8Array {\n return sha256(this.toCborData());\n }\n\n /**\n * Debug string representation.\n */\n toString(): string {\n return `ProvenanceMark(${this.identifier()})`;\n }\n\n /**\n * Detailed debug representation.\n */\n toDebugString(): string {\n const components = [\n `key: ${bytesToHex(this._key)}`,\n `hash: ${bytesToHex(this._hash)}`,\n `chainID: ${bytesToHex(this._chainId)}`,\n `seq: ${this._seq}`,\n `date: ${this._date.toISOString()}`,\n ];\n\n const info = this.info();\n if (info !== undefined) {\n components.push(`info: ${JSON.stringify(info)}`);\n }\n\n return `ProvenanceMark(${components.join(\", \")})`;\n }\n\n /**\n * Check equality with another mark.\n */\n equals(other: ProvenanceMark): boolean {\n return this._res === other._res && arraysEqual(this.message(), other.message());\n }\n\n /**\n * JSON serialization.\n */\n toJSON(): Record<string, unknown> {\n const result: Record<string, unknown> = {\n res: this._res,\n key: toBase64(this._key),\n hash: toBase64(this._hash),\n chainID: toBase64(this._chainId),\n seq: this._seq,\n date: this._date.toISOString(),\n };\n if (this._infoBytes.length > 0) {\n result[\"info_bytes\"] = toBase64(this._infoBytes);\n }\n return result;\n }\n\n /**\n * Create from JSON object.\n */\n static fromJSON(json: Record<string, unknown>): ProvenanceMark {\n const res = json[\"res\"] as ProvenanceMarkResolution;\n const key = fromBase64(json[\"key\"] as string);\n const hash = fromBase64(json[\"hash\"] as string);\n const chainId = fromBase64(json[\"chainID\"] as string);\n const seq = json[\"seq\"] as number;\n const dateStr = json[\"date\"] as string;\n const date = new Date(dateStr);\n\n const seqBytes = serializeSeq(res, seq);\n const dateBytes = serializeDate(res, date);\n\n let infoBytes: Uint8Array = new Uint8Array(0);\n if (typeof json[\"info_bytes\"] === \"string\") {\n infoBytes = fromBase64(json[\"info_bytes\"]);\n }\n\n return new ProvenanceMark(res, key, hash, chainId, seqBytes, dateBytes, infoBytes, seq, date);\n }\n}\n\n/**\n * Helper function to compare two Uint8Arrays.\n */\nfunction arraysEqual(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n}\n","// Ported from provenance-mark-rust/src/generator.rs\n\nimport { toBase64, fromBase64, bytesToHex } from \"./utils.js\";\nimport { type Cbor } from \"@bcts/dcbor\";\n\nimport { ProvenanceMarkError, ProvenanceMarkErrorType } from \"./error.js\";\nimport { type ProvenanceMarkResolution, linkLength } from \"./resolution.js\";\nimport { ProvenanceSeed } from \"./seed.js\";\nimport { RngState } from \"./rng-state.js\";\nimport { sha256 } from \"./crypto-utils.js\";\nimport { Xoshiro256StarStar } from \"./xoshiro256starstar.js\";\nimport { ProvenanceMark } from \"./mark.js\";\n\n/**\n * Generator for creating provenance mark chains.\n */\nexport class ProvenanceMarkGenerator {\n private readonly _res: ProvenanceMarkResolution;\n private readonly _seed: ProvenanceSeed;\n private readonly _chainId: Uint8Array;\n private _nextSeq: number;\n private _rngState: RngState;\n\n private constructor(\n res: ProvenanceMarkResolution,\n seed: ProvenanceSeed,\n chainId: Uint8Array,\n nextSeq: number,\n rngState: RngState,\n ) {\n this._res = res;\n this._seed = seed;\n this._chainId = chainId;\n this._nextSeq = nextSeq;\n this._rngState = rngState;\n }\n\n res(): ProvenanceMarkResolution {\n return this._res;\n }\n\n seed(): ProvenanceSeed {\n return this._seed;\n }\n\n chainId(): Uint8Array {\n return new Uint8Array(this._chainId);\n }\n\n nextSeq(): number {\n return this._nextSeq;\n }\n\n rngState(): RngState {\n return this._rngState;\n }\n\n /**\n * Create a new generator with a seed.\n */\n static newWithSeed(res: ProvenanceMarkResolution, seed: ProvenanceSeed): ProvenanceMarkGenerator {\n // Definitely don't use the bare seed as the chain ID!\n const digest1 = sha256(seed.toBytes());\n const chainId = digest1.slice(0, linkLength(res));\n const digest2 = sha256(digest1);\n return ProvenanceMarkGenerator.new(res, seed, chainId, 0, RngState.fromBytes(digest2));\n }\n\n /**\n * Create a new generator with a passphrase.\n */\n static newWithPassphrase(\n res: ProvenanceMarkResolution,\n passphrase: string,\n ): ProvenanceMarkGenerator {\n const seed = ProvenanceSeed.newWithPassphrase(passphrase);\n return ProvenanceMarkGenerator.newWithSeed(res, seed);\n }\n\n /**\n * Create a new generator with custom random data.\n */\n static newUsing(res: ProvenanceMarkResolution, randomData: Uint8Array): ProvenanceMarkGenerator {\n const seed = ProvenanceSeed.newUsing(randomData);\n return ProvenanceMarkGenerator.newWithSeed(res, seed);\n }\n\n /**\n * Create a new generator with random seed.\n */\n static newRandom(res: ProvenanceMarkResolution): ProvenanceMarkGenerator {\n const seed = ProvenanceSeed.new();\n return ProvenanceMarkGenerator.newWithSeed(res, seed);\n }\n\n /**\n * Create a new generator with all parameters.\n */\n static new(\n res: ProvenanceMarkResolution,\n seed: ProvenanceSeed,\n chainId: Uint8Array,\n nextSeq: number,\n rngState: RngState,\n ): ProvenanceMarkGenerator {\n const linkLen = linkLength(res);\n if (chainId.length !== linkLen) {\n throw new ProvenanceMarkError(ProvenanceMarkErrorType.InvalidChainIdLength, undefined, {\n expected: linkLen,\n actual: chainId.length,\n });\n }\n return new ProvenanceMarkGenerator(res, seed, chainId, nextSeq, rngState);\n }\n\n /**\n * Generate the next provenance mark in the chain.\n */\n next(date: Date, info?: Cbor): ProvenanceMark {\n const data = this._rngState.toBytes();\n const rng = Xoshiro256StarStar.fromData(data);\n\n const seq = this._nextSeq;\n this._nextSeq += 1;\n\n let key: Uint8Array;\n if (seq === 0) {\n key = new Uint8Array(this._chainId);\n } else {\n // The randomness generated by the PRNG should be portable across implementations\n key = rng.nextBytes(linkLength(this._res));\n this._rngState = RngState.fromBytes(rng.toData());\n }\n\n // Clone the RNG for generating next_key\n const nextRngData = rng.toData();\n const nextRng = Xoshiro256StarStar.fromData(nextRngData);\n const nextKey = nextRng.nextBytes(linkLength(this._res));\n\n return ProvenanceMark.new(\n this._res,\n key,\n nextKey,\n new Uint8Array(this._chainId),\n seq,\n date,\n info,\n );\n }\n\n /**\n * String representation.\n */\n toString(): string {\n return `ProvenanceMarkGenerator(chainID: ${bytesToHex(this._chainId)}, res: ${this._res}, seed: ${this._seed.hex()}, nextSeq: ${this._nextSeq})`;\n }\n\n /**\n * JSON serialization.\n */\n toJSON(): Record<string, unknown> {\n return {\n res: this._res,\n seed: toBase64(this._seed.toBytes()),\n chainID: toBase64(this._chainId),\n nextSeq: this._nextSeq,\n rngState: toBase64(this._rngState.toBytes()),\n };\n }\n\n /**\n * Create from JSON object.\n */\n static fromJSON(json: Record<string, unknown>): ProvenanceMarkGenerator {\n const res = json[\"res\"] as ProvenanceMarkResolution;\n const seed = ProvenanceSeed.fromBytes(fromBase64(json[\"seed\"] as string));\n const chainId = fromBase64(json[\"chainID\"] as string);\n const nextSeq = json[\"nextSeq\"] as number;\n const rngState = RngState.fromBytes(fromBase64(json[\"rngState\"] as string));\n return ProvenanceMarkGenerator.new(res, seed, chainId, nextSeq, rngState);\n }\n}\n","// Ported from provenance-mark-rust/src/validate.rs\n\nimport type { ProvenanceMark } from \"./mark.js\";\n\n/**\n * Format for validation report output.\n */\nexport enum ValidationReportFormat {\n /** Human-readable text format */\n Text = \"text\",\n /** Compact JSON format (no whitespace) */\n JsonCompact = \"json-compact\",\n /** Pretty-printed JSON format (with indentation) */\n JsonPretty = \"json-pretty\",\n}\n\n/**\n * Issue flagged during validation.\n */\nexport type ValidationIssue =\n | { type: \"HashMismatch\"; expected: string; actual: string }\n | { type: \"KeyMismatch\" }\n | { type: \"SequenceGap\"; expected: number; actual: number }\n | { type: \"DateOrdering\"; previous: string; next: string }\n | { type: \"NonGenesisAtZero\" }\n | { type: \"InvalidGenesisKey\" };\n\n/**\n * Format a validation issue as a string.\n */\nexport function formatValidationIssue(issue: ValidationIssue): string {\n switch (issue.type) {\n case \"HashMismatch\":\n return `hash mismatch: expected ${issue.expected}, got ${issue.actual}`;\n case \"KeyMismatch\":\n return \"key mismatch: current hash was not generated from next key\";\n case \"SequenceGap\":\n return `sequence number gap: expected ${issue.expected}, got ${issue.actual}`;\n case \"DateOrdering\":\n return `date must be equal or later: previous is ${issue.previous}, next is ${issue.next}`;\n case \"NonGenesisAtZero\":\n return \"non-genesis mark at sequence 0\";\n case \"InvalidGenesisKey\":\n return \"genesis mark must have key equal to chain_id\";\n }\n}\n\n/**\n * A mark with any issues flagged during validation.\n */\nexport interface FlaggedMark {\n mark: ProvenanceMark;\n issues: ValidationIssue[];\n}\n\n/**\n * Report for a contiguous sequence of marks within a chain.\n */\nexport interface SequenceReport {\n startSeq: number;\n endSeq: number;\n marks: FlaggedMark[];\n}\n\n/**\n * Report for a chain of marks with the same chain ID.\n */\nexport interface ChainReport {\n chainId: Uint8Array;\n hasGenesis: boolean;\n marks: ProvenanceMark[];\n sequences: SequenceReport[];\n}\n\n/**\n * Get the chain ID as a hex string for display.\n */\nexport function chainIdHex(report: ChainReport): string {\n return hexEncode(report.chainId);\n}\n\n/**\n * Complete validation report.\n */\nexport interface ValidationReport {\n marks: ProvenanceMark[];\n chains: ChainReport[];\n}\n\n/**\n * Check if the validation report has any issues.\n */\nexport function hasIssues(report: ValidationReport): boolean {\n // Missing genesis is considered an issue\n for (const chain of report.chains) {\n if (!chain.hasGenesis) {\n return true;\n }\n }\n\n // Check for validation issues in marks\n for (const chain of report.chains) {\n for (const seq of chain.sequences) {\n for (const mark of seq.marks) {\n if (mark.issues.length > 0) {\n return true;\n }\n }\n }\n }\n\n // Multiple chains or sequences are also considered issues\n if (report.chains.length > 1) {\n return true;\n }\n\n if (report.chains.length === 1 && report.chains[0].sequences.length > 1) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Check if the validation report contains interesting information.\n */\nfunction isInteresting(report: ValidationReport): boolean {\n // Not interesting if empty\n if (report.chains.length === 0) {\n return false;\n }\n\n // Check if any chain is missing genesis\n for (const chain of report.chains) {\n if (!chain.hasGenesis) {\n return true;\n }\n }\n\n // Not interesting if single chain with single perfect sequence\n if (report.chains.length === 1) {\n const chain = report.chains[0];\n if (chain.sequences.length === 1) {\n const seq = chain.sequences[0];\n // Check if the sequence has no issues\n if (seq.marks.every((m) => m.issues.length === 0)) {\n return false;\n }\n }\n }\n\n return true;\n}\n\n/**\n * Format the validation report as human-readable text.\n */\nfunction formatText(report: ValidationReport): string {\n if (!isInteresting(report)) {\n return \"\";\n }\n\n const lines: string[] = [];\n\n // Report summary\n lines.push(`Total marks: ${report.marks.length}`);\n lines.push(`Chains: ${report.chains.length}`);\n lines.push(\"\");\n\n // Report each chain\n for (let chainIdx = 0; chainIdx < report.chains.length; chainIdx++) {\n const chain = report.chains[chainIdx];\n\n // Show short chain ID (first 4 bytes)\n const chainIdStr = chainIdHex(chain);\n const shortChainId = chainIdStr.length > 8 ? chainIdStr.slice(0, 8) : chainIdStr;\n\n lines.push(`Chain ${chainIdx + 1}: ${shortChainId}`);\n\n if (!chain.hasGenesis) {\n lines.push(\" Warning: No genesis mark found\");\n }\n\n // Report each sequence\n for (const seq of chain.sequences) {\n // Report each mark in the sequence\n for (const flaggedMark of seq.marks) {\n const mark = flaggedMark.mark;\n const shortId = mark.identifier();\n const seqNum = mark.seq();\n\n // Build the mark line with annotations\n const annotations: string[] = [];\n\n // Check if it's genesis\n if (mark.isGenesis()) {\n annotations.push(\"genesis mark\");\n }\n\n // Add issue annotations\n for (const issue of flaggedMark.issues) {\n let issueStr: string;\n switch (issue.type) {\n case \"SequenceGap\":\n issueStr = `gap: ${issue.expected} missing`;\n break;\n case \"DateOrdering\":\n issueStr = `date ${issue.previous} < ${issue.next}`;\n break;\n case \"HashMismatch\":\n issueStr = \"hash mismatch\";\n break;\n case \"KeyMismatch\":\n issueStr = \"key mismatch\";\n break;\n case \"NonGenesisAtZero\":\n issueStr = \"non-genesis at seq 0\";\n break;\n case \"InvalidGenesisKey\":\n issueStr = \"invalid genesis key\";\n break;\n }\n annotations.push(issueStr);\n }\n\n // Format the line\n if (annotations.length === 0) {\n lines.push(` ${seqNum}: ${shortId}`);\n } else {\n lines.push(` ${seqNum}: ${shortId} (${annotations.join(\", \")})`);\n }\n }\n }\n\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\").trimEnd();\n}\n\n/**\n * Format the validation report.\n */\nexport function formatReport(report: ValidationReport, format: ValidationReportFormat): string {\n switch (format) {\n case ValidationReportFormat.Text:\n return formatText(report);\n case ValidationReportFormat.JsonCompact:\n return JSON.stringify(reportToJSON(report));\n case ValidationReportFormat.JsonPretty:\n return JSON.stringify(reportToJSON(report), null, 2);\n }\n}\n\n/**\n * Convert a report to a JSON-serializable object.\n */\nfunction reportToJSON(report: ValidationReport): unknown {\n return {\n marks: report.marks.map((m) => m.toUrlEncoding()),\n chains: report.chains.map((chain) => ({\n chain_id: hexEncode(chain.chainId),\n has_genesis: chain.hasGenesis,\n marks: chain.marks.map((m) => m.toUrlEncoding()),\n sequences: chain.sequences.map((seq) => ({\n start_seq: seq.startSeq,\n end_seq: seq.endSeq,\n marks: seq.marks.map((fm) => ({\n mark: fm.mark.toUrlEncoding(),\n issues: fm.issues,\n })),\n })),\n })),\n };\n}\n\n/**\n * Build sequence bins for a chain.\n */\nfunction buildSequenceBins(marks: ProvenanceMark[]): SequenceReport[] {\n const sequences: SequenceReport[] = [];\n let currentSequence: FlaggedMark[] = [];\n\n for (let i = 0; i < marks.length; i++) {\n const mark = marks[i];\n\n if (i === 0) {\n // First mark starts a sequence\n currentSequence.push({ mark, issues: [] });\n } else {\n const prev = marks[i - 1];\n\n // Check if this mark follows the previous one\n try {\n prev.precedesOpt(mark);\n // Continues the current sequence\n currentSequence.push({ mark, issues: [] });\n } catch (e) {\n // Breaks the sequence - save current and start new\n if (currentSequence.length > 0) {\n sequences.push(createSequenceReport(currentSequence));\n }\n\n // Parse the error to determine the issue type\n const issue = parseValidationError(e, prev, mark);\n\n // Start new sequence with this mark, flagged with the issue\n currentSequence = [{ mark, issues: [issue] }];\n }\n }\n }\n\n // Add the final sequence\n if (currentSequence.length > 0) {\n sequences.push(createSequenceReport(currentSequence));\n }\n\n return sequences;\n}\n\n/**\n * Parse a validation error into a ValidationIssue.\n */\nfunction parseValidationError(\n e: unknown,\n prev: ProvenanceMark,\n next: ProvenanceMark,\n): ValidationIssue {\n const message = e instanceof Error ? e.message : \"\";\n\n if (message !== \"\" && message.includes(\"non-genesis mark at sequence 0\")) {\n return { type: \"NonGenesisAtZero\" };\n }\n if (message !== \"\" && message.includes(\"genesis mark must have key equal to chain_id\")) {\n return { type: \"InvalidGenesisKey\" };\n }\n if (message !== \"\" && message.includes(\"sequence gap\")) {\n const seqGapRegex = /expected (\\d+), got (\\d+)/;\n const match = seqGapRegex.exec(message);\n if (match !== null) {\n return {\n type: \"SequenceGap\",\n expected: parseInt(match[1], 10),\n actual: parseInt(match[2], 10),\n };\n }\n }\n if (message !== \"\" && message.includes(\"date ordering\")) {\n return {\n type: \"DateOrdering\",\n previous: prev.date().toISOString(),\n next: next.date().toISOString(),\n };\n }\n if (message !== \"\" && message.includes(\"hash mismatch\")) {\n const hashRegex = /expected: (\\w+), actual: (\\w+)/;\n const match = hashRegex.exec(message);\n if (match !== null) {\n return { type: \"HashMismatch\", expected: match[1], actual: match[2] };\n }\n return { type: \"HashMismatch\", expected: \"\", actual: \"\" };\n }\n\n // Fallback\n return { type: \"KeyMismatch\" };\n}\n\n/**\n * Create a sequence report from flagged marks.\n */\nfunction createSequenceReport(marks: FlaggedMark[]): SequenceReport {\n const startSeq = marks.length > 0 ? marks[0].mark.seq() : 0;\n const endSeq = marks.length > 0 ? marks[marks.length - 1].mark.seq() : 0;\n return { startSeq, endSeq, marks };\n}\n\n/**\n * Validate a collection of provenance marks.\n */\nexport function validate(marks: ProvenanceMark[]): ValidationReport {\n // Deduplicate exact duplicates\n const seen = new Set<string>();\n const deduplicatedMarks: ProvenanceMark[] = [];\n for (const mark of marks) {\n const key = mark.toUrlEncoding();\n if (!seen.has(key)) {\n seen.add(key);\n deduplicatedMarks.push(mark);\n }\n }\n\n // Bin marks by chain ID\n const chainBins = new Map<string, ProvenanceMark[]>();\n for (const mark of deduplicatedMarks) {\n const chainIdKey = hexEncode(mark.chainId());\n const bin = chainBins.get(chainIdKey);\n if (bin !== undefined) {\n bin.push(mark);\n } else {\n chainBins.set(chainIdKey, [mark]);\n }\n }\n\n // Process each chain\n const chains: ChainReport[] = [];\n for (const [chainIdKey, chainMarks] of chainBins) {\n // Sort by sequence number\n chainMarks.sort((a, b) => a.seq() - b.seq());\n\n // Check for genesis mark\n const hasGenesis =\n chainMarks.length > 0 && chainMarks[0].seq() === 0 && chainMarks[0].isGenesis();\n\n // Build sequence bins\n const sequences = buildSequenceBins(chainMarks);\n\n chains.push({\n chainId: hexDecode(chainIdKey),\n hasGenesis,\n marks: chainMarks,\n sequences,\n });\n }\n\n // Sort chains by chain ID for consistent output\n chains.sort((a, b) => hexEncode(a.chainId).localeCompare(hexEncode(b.chainId)));\n\n return { marks: deduplicatedMarks, chains };\n}\n\n/**\n * Helper function to encode bytes as hex.\n */\nfunction hexEncode(bytes: Uint8Array): string {\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\n/**\n * Helper function to decode hex to bytes.\n */\nfunction hexDecode(hex: string): Uint8Array {\n const bytes = new Uint8Array(hex.length / 2);\n for (let i = 0; i < hex.length; i += 2) {\n bytes[i / 2] = parseInt(hex.slice(i, i + 2), 16);\n }\n return bytes;\n}\n","// Ported from provenance-mark-rust/src/mark_info.rs\n\nimport { UR } from \"@bcts/uniform-resources\";\nimport { decodeCbor, cborData } from \"@bcts/dcbor\";\nimport { PROVENANCE_MARK } from \"@bcts/tags\";\n\nimport { ProvenanceMark } from \"./mark.js\";\n\n/**\n * Wrapper for a provenance mark with additional display information.\n */\nexport class ProvenanceMarkInfo {\n private readonly _mark: ProvenanceMark;\n private readonly _ur: UR;\n private readonly _bytewords: string;\n private readonly _bytemoji: string;\n private readonly _comment: string;\n\n private constructor(\n mark: ProvenanceMark,\n ur: UR,\n bytewords: string,\n bytemoji: string,\n comment: string,\n ) {\n this._mark = mark;\n this._ur = ur;\n this._bytewords = bytewords;\n this._bytemoji = bytemoji;\n this._comment = comment;\n }\n\n /**\n * Create a new ProvenanceMarkInfo from a mark.\n */\n static new(mark: ProvenanceMark, comment = \"\"): ProvenanceMarkInfo {\n const tagName = PROVENANCE_MARK.name;\n if (tagName === undefined) {\n throw new Error(\"PROVENANCE_MARK tag has no name\");\n }\n const cborValue = decodeCbor(mark.toCborData());\n const ur = UR.new(tagName, cborValue);\n const bytewords = mark.bytewordsIdentifier(true);\n const bytemoji = mark.bytemojiIdentifier(true);\n return new ProvenanceMarkInfo(mark, ur, bytewords, bytemoji, comment);\n }\n\n mark(): ProvenanceMark {\n return this._mark;\n }\n\n ur(): UR {\n return this._ur;\n }\n\n bytewords(): string {\n return this._bytewords;\n }\n\n bytemoji(): string {\n return this._bytemoji;\n }\n\n comment(): string {\n return this._comment;\n }\n\n /**\n * Generate a markdown summary of the mark.\n */\n markdownSummary(): string {\n const lines: string[] = [];\n\n lines.push(\"---\");\n\n lines.push(\"\");\n lines.push(this._mark.date().toISOString());\n\n lines.push(\"\");\n lines.push(`#### ${this._ur.toString()}`);\n\n lines.push(\"\");\n lines.push(`#### \\`${this._bytewords}\\``);\n\n lines.push(\"\");\n lines.push(this._bytemoji);\n\n lines.push(\"\");\n if (this._comment.length > 0) {\n lines.push(this._comment);\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n }\n\n /**\n * JSON serialization.\n */\n toJSON(): Record<string, unknown> {\n const result: Record<string, unknown> = {\n ur: this._ur.toString(),\n bytewords: this._bytewords,\n bytemoji: this._bytemoji,\n mark: this._mark.toJSON(),\n };\n if (this._comment.length > 0) {\n result[\"comment\"] = this._comment;\n }\n return result;\n }\n\n /**\n * Create from JSON object.\n */\n static fromJSON(json: Record<string, unknown>): ProvenanceMarkInfo {\n const urString = json[\"ur\"] as string;\n const ur = UR.fromURString(urString);\n const cborBytes = cborData(ur.cbor());\n const mark = ProvenanceMark.fromCborData(cborBytes);\n const bytewords = json[\"bytewords\"] as string;\n const bytemoji = json[\"bytemoji\"] as string;\n const comment = typeof json[\"comment\"] === \"string\" ? json[\"comment\"] : \"\";\n return new ProvenanceMarkInfo(mark, ur, bytewords, bytemoji, comment);\n }\n}\n"],"mappings":"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"}
|