cesr-ts 0.4.0 → 0.6.0

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.
Files changed (204) hide show
  1. package/esm/src/adapters/async-iterable.js +8 -0
  2. package/esm/src/adapters/effection.js +6 -0
  3. package/esm/src/annotate/annotator.js +12 -0
  4. package/esm/src/annotate/cli.js +12 -0
  5. package/esm/src/annotate/comments.js +5 -1
  6. package/esm/src/annotate/denot.js +6 -0
  7. package/esm/src/annotate/render.js +15 -3
  8. package/esm/src/core/bytes.js +9 -0
  9. package/esm/src/core/errors.js +3 -0
  10. package/esm/src/core/parser-engine.js +1 -1
  11. package/esm/src/core/parser-frame-parser.js +22 -18
  12. package/esm/src/core/vocabulary.js +47 -0
  13. package/esm/src/index.js +5 -0
  14. package/esm/src/parser/attachment-parser.js +4 -0
  15. package/esm/src/parser/cold-start.js +6 -0
  16. package/esm/src/parser/group-dispatch.js +2 -2
  17. package/esm/src/primitives/aggor.js +374 -30
  18. package/esm/src/primitives/bexter.js +2 -3
  19. package/esm/src/primitives/blinder.js +6 -0
  20. package/esm/src/primitives/byte-like.js +19 -0
  21. package/esm/src/primitives/cigar.js +17 -3
  22. package/esm/src/primitives/cipher.js +91 -6
  23. package/esm/src/primitives/codex.js +39 -6
  24. package/esm/src/primitives/compactor.js +307 -3
  25. package/esm/src/primitives/counter.js +6 -2
  26. package/esm/src/primitives/dater.js +1 -2
  27. package/esm/src/primitives/decimer.js +7 -11
  28. package/esm/src/primitives/decrypter.js +123 -7
  29. package/esm/src/primitives/diger.js +57 -3
  30. package/esm/src/primitives/disclosure.js +300 -0
  31. package/esm/src/primitives/encrypter.js +130 -7
  32. package/esm/src/primitives/hydrate.js +49 -0
  33. package/esm/src/primitives/ilker.js +2 -3
  34. package/esm/src/primitives/indexer.js +21 -4
  35. package/esm/src/primitives/labeler.js +1 -2
  36. package/esm/src/primitives/mapper.js +612 -35
  37. package/esm/src/primitives/matter.js +133 -3
  38. package/esm/src/primitives/mediar.js +6 -0
  39. package/esm/src/primitives/noncer.js +2 -3
  40. package/esm/src/primitives/number.js +1 -2
  41. package/esm/src/primitives/pather.js +102 -5
  42. package/esm/src/primitives/prefixer.js +1 -2
  43. package/esm/src/primitives/primitive.js +14 -0
  44. package/esm/src/primitives/registry.js +2 -0
  45. package/esm/src/primitives/saider.js +80 -3
  46. package/esm/src/primitives/salter.js +96 -2
  47. package/esm/src/primitives/sealed-box.js +41 -0
  48. package/esm/src/primitives/seqner.js +1 -2
  49. package/esm/src/primitives/siger.js +58 -3
  50. package/esm/src/primitives/signer.js +243 -9
  51. package/esm/src/primitives/streamer.js +28 -0
  52. package/esm/src/primitives/structing.js +727 -0
  53. package/esm/src/primitives/structor.js +20 -0
  54. package/esm/src/primitives/tagger.js +1 -2
  55. package/esm/src/primitives/texter.js +1 -2
  56. package/esm/src/primitives/tholder.js +552 -10
  57. package/esm/src/primitives/traitor.js +2 -3
  58. package/esm/src/primitives/verfer.js +50 -6
  59. package/esm/src/primitives/verser.js +16 -6
  60. package/esm/src/router/router-stub.js +1 -0
  61. package/esm/src/serder/native.js +1326 -0
  62. package/esm/src/serder/serder.js +1558 -59
  63. package/esm/src/serder/serdery.js +92 -7
  64. package/esm/src/serder/smell.js +26 -1
  65. package/esm/src/tables/codex-utils.js +2 -0
  66. package/esm/src/tables/counter-codex.js +2 -0
  67. package/esm/src/tables/counter-groups.js +6 -0
  68. package/esm/src/tables/versions.js +4 -0
  69. package/esm/src/version.js +5 -2
  70. package/package.json +5 -2
  71. package/types/src/adapters/async-iterable.d.ts +8 -0
  72. package/types/src/adapters/async-iterable.d.ts.map +1 -1
  73. package/types/src/adapters/effection.d.ts +7 -0
  74. package/types/src/adapters/effection.d.ts.map +1 -1
  75. package/types/src/annotate/annotator.d.ts +12 -0
  76. package/types/src/annotate/annotator.d.ts.map +1 -1
  77. package/types/src/annotate/cli.d.ts +13 -0
  78. package/types/src/annotate/cli.d.ts.map +1 -1
  79. package/types/src/annotate/comments.d.ts +4 -0
  80. package/types/src/annotate/comments.d.ts.map +1 -1
  81. package/types/src/annotate/denot.d.ts +6 -0
  82. package/types/src/annotate/denot.d.ts.map +1 -1
  83. package/types/src/annotate/render.d.ts.map +1 -1
  84. package/types/src/annotate/types.d.ts +2 -0
  85. package/types/src/annotate/types.d.ts.map +1 -1
  86. package/types/src/bench/parser-benchmark.d.ts +3 -0
  87. package/types/src/bench/parser-benchmark.d.ts.map +1 -1
  88. package/types/src/core/bytes.d.ts +9 -0
  89. package/types/src/core/bytes.d.ts.map +1 -1
  90. package/types/src/core/errors.d.ts +3 -0
  91. package/types/src/core/errors.d.ts.map +1 -1
  92. package/types/src/core/parser-engine.d.ts +4 -0
  93. package/types/src/core/parser-engine.d.ts.map +1 -1
  94. package/types/src/core/parser-frame-parser.d.ts.map +1 -1
  95. package/types/src/core/types.d.ts +2 -0
  96. package/types/src/core/types.d.ts.map +1 -1
  97. package/types/src/core/vocabulary.d.ts +48 -0
  98. package/types/src/core/vocabulary.d.ts.map +1 -0
  99. package/types/src/index.d.ts +5 -0
  100. package/types/src/index.d.ts.map +1 -1
  101. package/types/src/parser/attachment-parser.d.ts +4 -0
  102. package/types/src/parser/attachment-parser.d.ts.map +1 -1
  103. package/types/src/parser/cold-start.d.ts +6 -0
  104. package/types/src/parser/cold-start.d.ts.map +1 -1
  105. package/types/src/parser/group-dispatch.d.ts.map +1 -1
  106. package/types/src/primitives/aggor.d.ts +100 -13
  107. package/types/src/primitives/aggor.d.ts.map +1 -1
  108. package/types/src/primitives/bexter.d.ts.map +1 -1
  109. package/types/src/primitives/blinder.d.ts +6 -0
  110. package/types/src/primitives/blinder.d.ts.map +1 -1
  111. package/types/src/primitives/byte-like.d.ts +7 -0
  112. package/types/src/primitives/byte-like.d.ts.map +1 -0
  113. package/types/src/primitives/cigar.d.ts +11 -1
  114. package/types/src/primitives/cigar.d.ts.map +1 -1
  115. package/types/src/primitives/cipher.d.ts +73 -2
  116. package/types/src/primitives/cipher.d.ts.map +1 -1
  117. package/types/src/primitives/codex.d.ts +34 -4
  118. package/types/src/primitives/codex.d.ts.map +1 -1
  119. package/types/src/primitives/compactor.d.ts +94 -2
  120. package/types/src/primitives/compactor.d.ts.map +1 -1
  121. package/types/src/primitives/counter.d.ts.map +1 -1
  122. package/types/src/primitives/dater.d.ts.map +1 -1
  123. package/types/src/primitives/decimer.d.ts.map +1 -1
  124. package/types/src/primitives/decrypter.d.ts +64 -3
  125. package/types/src/primitives/decrypter.d.ts.map +1 -1
  126. package/types/src/primitives/diger.d.ts +16 -0
  127. package/types/src/primitives/diger.d.ts.map +1 -1
  128. package/types/src/primitives/disclosure.d.ts +201 -0
  129. package/types/src/primitives/disclosure.d.ts.map +1 -0
  130. package/types/src/primitives/encrypter.d.ts +66 -4
  131. package/types/src/primitives/encrypter.d.ts.map +1 -1
  132. package/types/src/primitives/hydrate.d.ts +20 -0
  133. package/types/src/primitives/hydrate.d.ts.map +1 -0
  134. package/types/src/primitives/ilker.d.ts.map +1 -1
  135. package/types/src/primitives/indexer.d.ts.map +1 -1
  136. package/types/src/primitives/labeler.d.ts.map +1 -1
  137. package/types/src/primitives/mapper.d.ts +132 -11
  138. package/types/src/primitives/mapper.d.ts.map +1 -1
  139. package/types/src/primitives/matter.d.ts +33 -1
  140. package/types/src/primitives/matter.d.ts.map +1 -1
  141. package/types/src/primitives/mediar.d.ts +6 -0
  142. package/types/src/primitives/mediar.d.ts.map +1 -1
  143. package/types/src/primitives/noncer.d.ts.map +1 -1
  144. package/types/src/primitives/number.d.ts.map +1 -1
  145. package/types/src/primitives/pather.d.ts +21 -0
  146. package/types/src/primitives/pather.d.ts.map +1 -1
  147. package/types/src/primitives/prefixer.d.ts.map +1 -1
  148. package/types/src/primitives/primitive.d.ts +26 -0
  149. package/types/src/primitives/primitive.d.ts.map +1 -1
  150. package/types/src/primitives/registry.d.ts +3 -0
  151. package/types/src/primitives/registry.d.ts.map +1 -1
  152. package/types/src/primitives/saider.d.ts +41 -0
  153. package/types/src/primitives/saider.d.ts.map +1 -1
  154. package/types/src/primitives/salter.d.ts +56 -1
  155. package/types/src/primitives/salter.d.ts.map +1 -1
  156. package/types/src/primitives/sealed-box.d.ts +29 -0
  157. package/types/src/primitives/sealed-box.d.ts.map +1 -0
  158. package/types/src/primitives/seqner.d.ts.map +1 -1
  159. package/types/src/primitives/siger.d.ts +14 -0
  160. package/types/src/primitives/siger.d.ts.map +1 -1
  161. package/types/src/primitives/signer.d.ts +80 -4
  162. package/types/src/primitives/signer.d.ts.map +1 -1
  163. package/types/src/primitives/streamer.d.ts +31 -0
  164. package/types/src/primitives/streamer.d.ts.map +1 -0
  165. package/types/src/primitives/structing.d.ts +4114 -0
  166. package/types/src/primitives/structing.d.ts.map +1 -0
  167. package/types/src/primitives/structor.d.ts +6 -0
  168. package/types/src/primitives/structor.d.ts.map +1 -1
  169. package/types/src/primitives/tagger.d.ts.map +1 -1
  170. package/types/src/primitives/texter.d.ts.map +1 -1
  171. package/types/src/primitives/tholder.d.ts +150 -5
  172. package/types/src/primitives/tholder.d.ts.map +1 -1
  173. package/types/src/primitives/traitor.d.ts.map +1 -1
  174. package/types/src/primitives/unknown.d.ts +1 -0
  175. package/types/src/primitives/unknown.d.ts.map +1 -1
  176. package/types/src/primitives/verfer.d.ts +12 -0
  177. package/types/src/primitives/verfer.d.ts.map +1 -1
  178. package/types/src/primitives/verser.d.ts +14 -3
  179. package/types/src/primitives/verser.d.ts.map +1 -1
  180. package/types/src/router/router-stub.d.ts +3 -0
  181. package/types/src/router/router-stub.d.ts.map +1 -1
  182. package/types/src/serder/native.d.ts +115 -0
  183. package/types/src/serder/native.d.ts.map +1 -0
  184. package/types/src/serder/serder.d.ts +187 -9
  185. package/types/src/serder/serder.d.ts.map +1 -1
  186. package/types/src/serder/serdery.d.ts +42 -0
  187. package/types/src/serder/serdery.d.ts.map +1 -1
  188. package/types/src/serder/smell.d.ts +22 -0
  189. package/types/src/serder/smell.d.ts.map +1 -1
  190. package/types/src/tables/codex-utils.d.ts +3 -0
  191. package/types/src/tables/codex-utils.d.ts.map +1 -1
  192. package/types/src/tables/counter-codex.d.ts +4 -0
  193. package/types/src/tables/counter-codex.d.ts.map +1 -1
  194. package/types/src/tables/counter-groups.d.ts +6 -0
  195. package/types/src/tables/counter-groups.d.ts.map +1 -1
  196. package/types/src/tables/counter.tables.generated.d.ts.map +1 -1
  197. package/types/src/tables/indexer.codex.generated.d.ts.map +1 -1
  198. package/types/src/tables/matter.codex.generated.d.ts.map +1 -1
  199. package/types/src/tables/table-types.d.ts +6 -0
  200. package/types/src/tables/table-types.d.ts.map +1 -1
  201. package/types/src/tables/versions.d.ts +6 -0
  202. package/types/src/tables/versions.d.ts.map +1 -1
  203. package/types/src/version.d.ts +5 -2
  204. package/types/src/version.d.ts.map +1 -1
@@ -1,5 +1,5 @@
1
1
  import { UnknownCodeError } from "../core/errors.js";
2
- import { SIGER_CODES } from "./codex.js";
2
+ import { IdrDex, MtrDex, SIGER_CODES } from "./codex.js";
3
3
  import { Indexer, parseIndexer } from "./indexer.js";
4
4
  /**
5
5
  * Indexed signature primitive with optional verifier association.
@@ -9,8 +9,7 @@ import { Indexer, parseIndexer } from "./indexer.js";
9
9
  */
10
10
  export class Siger extends Indexer {
11
11
  constructor(init, verfer) {
12
- const indexer = init instanceof Indexer ? init : new Indexer(init);
13
- super(indexer);
12
+ super(init);
14
13
  Object.defineProperty(this, "verfer", {
15
14
  enumerable: true,
16
15
  configurable: true,
@@ -22,6 +21,62 @@ export class Siger extends Indexer {
22
21
  }
23
22
  this.verfer = verfer;
24
23
  }
24
+ /** Rebuild indexed signature material from detached signature bytes plus verifier context. */
25
+ static fromCigar(cigar, { index, ondex, only = false, verfer = cigar.verfer }) {
26
+ if (!verfer) {
27
+ throw new Error("Cannot derive indexed signature code from detached signature without verifier context.");
28
+ }
29
+ const normalizedOndex = only ? undefined : ondex ?? index;
30
+ return new Siger({
31
+ code: Siger.indexedSignatureCodeForVerfer(verfer.code, index, {
32
+ only,
33
+ ondex: normalizedOndex ?? undefined,
34
+ }),
35
+ raw: cigar.raw,
36
+ index,
37
+ ondex: normalizedOndex ?? undefined,
38
+ }, verfer);
39
+ }
40
+ /** Resolve the indexed-signature family implied by one verifier suite. */
41
+ static indexedSignatureFamilyForVerfer(verferCode) {
42
+ switch (verferCode) {
43
+ case MtrDex.Ed25519:
44
+ case MtrDex.Ed25519N:
45
+ return {
46
+ both: IdrDex.Ed25519_Sig,
47
+ bigBoth: IdrDex.Ed25519_Big_Sig,
48
+ currentOnly: IdrDex.Ed25519_Crt_Sig,
49
+ bigCurrentOnly: IdrDex.Ed25519_Big_Crt_Sig,
50
+ };
51
+ case MtrDex.ECDSA_256k1:
52
+ case MtrDex.ECDSA_256k1N:
53
+ return {
54
+ both: IdrDex.ECDSA_256k1_Sig,
55
+ bigBoth: IdrDex.ECDSA_256k1_Big_Sig,
56
+ currentOnly: IdrDex.ECDSA_256k1_Crt_Sig,
57
+ bigCurrentOnly: IdrDex.ECDSA_256k1_Big_Crt_Sig,
58
+ };
59
+ case MtrDex.ECDSA_256r1:
60
+ case MtrDex.ECDSA_256r1N:
61
+ return {
62
+ both: IdrDex.ECDSA_256r1_Sig,
63
+ bigBoth: IdrDex.ECDSA_256r1_Big_Sig,
64
+ currentOnly: IdrDex.ECDSA_256r1_Crt_Sig,
65
+ bigCurrentOnly: IdrDex.ECDSA_256r1_Big_Crt_Sig,
66
+ };
67
+ default:
68
+ throw new UnknownCodeError(`Unsupported verifier code ${verferCode} for indexed signature material`);
69
+ }
70
+ }
71
+ /** Resolve the indexed-signature code emitted for one verifier suite and signature shape. */
72
+ static indexedSignatureCodeForVerfer(verferCode, index, { ondex, only = false, } = {}) {
73
+ const family = Siger.indexedSignatureFamilyForVerfer(verferCode);
74
+ if (only) {
75
+ return index <= 63 ? family.currentOnly : family.bigCurrentOnly;
76
+ }
77
+ const ondexValue = ondex ?? index;
78
+ return ondexValue === index && index <= 63 ? family.both : family.bigBoth;
79
+ }
25
80
  }
26
81
  /** Parse and hydrate `Siger` from txt or qb2 encoded bytes. */
27
82
  export function parseSiger(input, cold) {
@@ -1,23 +1,257 @@
1
+ import { ed25519 } from "@noble/curves/ed25519";
2
+ import { p256 } from "@noble/curves/nist";
3
+ import { secp256k1 } from "@noble/curves/secp256k1";
1
4
  import { UnknownCodeError } from "../core/errors.js";
2
- import { SIGNER_CODES } from "./codex.js";
5
+ import { Cigar } from "./cigar.js";
6
+ import { IdrDex, MtrDex, SIGNER_CODES } from "./codex.js";
3
7
  import { Matter } from "./matter.js";
8
+ import { Siger } from "./siger.js";
9
+ import { Verfer } from "./verfer.js";
10
+ /** Resolve the explicit signer transferability choice from the supported init forms. */
11
+ function resolveTransferable(init) {
12
+ if (init instanceof Signer) {
13
+ return init.transferable;
14
+ }
15
+ if (init instanceof Matter) {
16
+ return true;
17
+ }
18
+ return typeof init.transferable === "boolean" ? init.transferable : true;
19
+ }
4
20
  /**
5
21
  * Signing-seed primitive.
6
22
  *
7
- * KERIpy substance: Signer wraps private seed material that is used to derive
8
- * signing key pairs and associated verifier material; this TS layer constrains
9
- * codex validity while higher crypto layers perform key derivation/signing.
23
+ * KERIpy substance: Signer wraps private seed material, derives the associated
24
+ * verifier, and owns suite-driven signature creation.
25
+ *
26
+ * TypeScript difference:
27
+ * - seed derivation codes do not themselves encode transferability, so
28
+ * `Signer` carries an explicit transferability choice rather than inheriting
29
+ * `Matter.transferable`
10
30
  */
11
31
  export class Signer extends Matter {
12
32
  constructor(init) {
13
- const matter = init instanceof Matter ? init : new Matter(init);
14
- super(matter);
15
- if (!SIGNER_CODES.has(this.code)) {
16
- throw new UnknownCodeError(`Expected signer seed code, got ${this.code}`);
17
- }
33
+ super(init);
34
+ Object.defineProperty(this, "_transferable", {
35
+ enumerable: true,
36
+ configurable: true,
37
+ writable: true,
38
+ value: void 0
39
+ });
40
+ Object.defineProperty(this, "_signRaw", {
41
+ enumerable: true,
42
+ configurable: true,
43
+ writable: true,
44
+ value: void 0
45
+ });
46
+ /** Public verifier derived from this seed and the explicit transferability choice. */
47
+ Object.defineProperty(this, "verfer", {
48
+ enumerable: true,
49
+ configurable: true,
50
+ writable: true,
51
+ value: void 0
52
+ });
53
+ Signer.assertSupportedSeedCode(this.code);
54
+ this._transferable = resolveTransferable(init);
55
+ const suite = Signer.bindSuite(this.code, this.raw, this.transferable);
56
+ this.verfer = suite.verfer;
57
+ this._signRaw = suite.signRaw;
58
+ }
59
+ /**
60
+ * Explicit signer transferability override.
61
+ *
62
+ * Seed codes do not encode transferability, so `Signer` intentionally does
63
+ * not inherit the generic `Matter.transferable` rule.
64
+ */
65
+ get transferable() {
66
+ return this._transferable;
18
67
  }
19
68
  /** Raw seed bytes for signer key-derivation/instantiation. */
20
69
  get seed() {
21
70
  return this.raw;
22
71
  }
72
+ /** Return the raw seed size implied by one signer-suite code. */
73
+ static seedSizeForCode(code) {
74
+ Signer.assertSupportedSeedCode(code);
75
+ return 32;
76
+ }
77
+ /**
78
+ * Project one verifier code back to the signer seed code for the same suite.
79
+ *
80
+ * Keeper-style derivation flows use this without reopening a free helper seam.
81
+ */
82
+ static seedCodeForVerferCode(verferCode) {
83
+ Signer.assertSupportedVerferCode(verferCode);
84
+ switch (verferCode) {
85
+ case MtrDex.Ed25519:
86
+ case MtrDex.Ed25519N:
87
+ return MtrDex.Ed25519_Seed;
88
+ case MtrDex.ECDSA_256k1:
89
+ case MtrDex.ECDSA_256k1N:
90
+ return MtrDex.ECDSA_256k1_Seed;
91
+ case MtrDex.ECDSA_256r1:
92
+ case MtrDex.ECDSA_256r1N:
93
+ return MtrDex.ECDSA_256r1_Seed;
94
+ }
95
+ }
96
+ /** Create one explicit random signer seed for creator-style flows. */
97
+ static random({ code = MtrDex.Ed25519_Seed, transferable = true } = {}) {
98
+ const raw = crypto.getRandomValues(new Uint8Array(Signer.seedSizeForCode(code)));
99
+ return new Signer({ code, raw, transferable });
100
+ }
101
+ static assertSupportedSeedCode(code) {
102
+ if (!SIGNER_CODES.has(code)) {
103
+ throw new UnknownCodeError(`Expected signer seed code, got ${code}`);
104
+ }
105
+ }
106
+ static assertSupportedVerferCode(code) {
107
+ if (code !== MtrDex.Ed25519
108
+ && code !== MtrDex.Ed25519N
109
+ && code !== MtrDex.ECDSA_256k1
110
+ && code !== MtrDex.ECDSA_256k1N
111
+ && code !== MtrDex.ECDSA_256r1
112
+ && code !== MtrDex.ECDSA_256r1N) {
113
+ throw new UnknownCodeError(`Unsupported verifier code ${code}`);
114
+ }
115
+ }
116
+ /** Resolve the verifier code implied by one signer seed code and transferability choice. */
117
+ static verferCodeForSeedCode(code, transferable) {
118
+ switch (code) {
119
+ case MtrDex.Ed25519_Seed:
120
+ return transferable ? MtrDex.Ed25519 : MtrDex.Ed25519N;
121
+ case MtrDex.ECDSA_256k1_Seed:
122
+ return transferable ? MtrDex.ECDSA_256k1 : MtrDex.ECDSA_256k1N;
123
+ case MtrDex.ECDSA_256r1_Seed:
124
+ return transferable ? MtrDex.ECDSA_256r1 : MtrDex.ECDSA_256r1N;
125
+ }
126
+ }
127
+ /** Derive one raw public verification key from signer seed bytes and suite code. */
128
+ static publicKeyForSeedCode(code, seed) {
129
+ switch (code) {
130
+ case MtrDex.Ed25519_Seed:
131
+ return ed25519.getPublicKey(seed);
132
+ case MtrDex.ECDSA_256k1_Seed:
133
+ return secp256k1.getPublicKey(seed);
134
+ case MtrDex.ECDSA_256r1_Seed:
135
+ return p256.getPublicKey(seed);
136
+ }
137
+ }
138
+ /** Bind one KERIpy-style signer suite at construction time. */
139
+ static bindSuite(code, seed, transferable) {
140
+ const verfer = new Verfer({
141
+ code: Signer.verferCodeForSeedCode(code, transferable),
142
+ raw: Signer.publicKeyForSeedCode(code, seed),
143
+ });
144
+ switch (code) {
145
+ case MtrDex.Ed25519_Seed:
146
+ return {
147
+ verfer,
148
+ signRaw: (ser) => ed25519.sign(ser, seed),
149
+ };
150
+ case MtrDex.ECDSA_256k1_Seed:
151
+ return {
152
+ verfer,
153
+ signRaw: (ser) => secp256k1.sign(ser, seed, {
154
+ format: "compact",
155
+ lowS: false,
156
+ prehash: true,
157
+ }).toBytes("compact"),
158
+ };
159
+ case MtrDex.ECDSA_256r1_Seed:
160
+ return {
161
+ verfer,
162
+ signRaw: (ser) => p256.sign(ser, seed, {
163
+ format: "compact",
164
+ lowS: false,
165
+ prehash: true,
166
+ }).toBytes("compact"),
167
+ };
168
+ }
169
+ }
170
+ /** Resolve the detached-signature code emitted by this signer suite. */
171
+ detachedSignatureCode() {
172
+ switch (this.code) {
173
+ case MtrDex.Ed25519_Seed:
174
+ return MtrDex.Ed25519_Sig;
175
+ case MtrDex.ECDSA_256k1_Seed:
176
+ return MtrDex.ECDSA_256k1_Sig;
177
+ case MtrDex.ECDSA_256r1_Seed:
178
+ return MtrDex.ECDSA_256r1_Sig;
179
+ default:
180
+ throw new UnknownCodeError(`Unsupported signer seed code ${this.code}`);
181
+ }
182
+ }
183
+ /** Resolve the indexed-signature family emitted by this signer suite. */
184
+ indexedSignatureFamily() {
185
+ switch (this.code) {
186
+ case MtrDex.Ed25519_Seed:
187
+ return {
188
+ both: IdrDex.Ed25519_Sig,
189
+ bigBoth: IdrDex.Ed25519_Big_Sig,
190
+ currentOnly: IdrDex.Ed25519_Crt_Sig,
191
+ bigCurrentOnly: IdrDex.Ed25519_Big_Crt_Sig,
192
+ };
193
+ case MtrDex.ECDSA_256k1_Seed:
194
+ return {
195
+ both: IdrDex.ECDSA_256k1_Sig,
196
+ bigBoth: IdrDex.ECDSA_256k1_Big_Sig,
197
+ currentOnly: IdrDex.ECDSA_256k1_Crt_Sig,
198
+ bigCurrentOnly: IdrDex.ECDSA_256k1_Big_Crt_Sig,
199
+ };
200
+ case MtrDex.ECDSA_256r1_Seed:
201
+ return {
202
+ both: IdrDex.ECDSA_256r1_Sig,
203
+ bigBoth: IdrDex.ECDSA_256r1_Big_Sig,
204
+ currentOnly: IdrDex.ECDSA_256r1_Crt_Sig,
205
+ bigCurrentOnly: IdrDex.ECDSA_256r1_Big_Crt_Sig,
206
+ };
207
+ default:
208
+ throw new UnknownCodeError(`Unsupported signer seed code ${this.code}`);
209
+ }
210
+ }
211
+ /**
212
+ * Resolve the indexed-signature code emitted by this signer and signature shape.
213
+ *
214
+ * KERIpy correspondence:
215
+ * - `only=true` selects the current-list-only family
216
+ * - otherwise `ondex` defaults to `index`
217
+ * - the small `both` family is valid only when `index === ondex <= 63`
218
+ */
219
+ indexedSignatureCode(index, { ondex, only = false, } = {}) {
220
+ const family = this.indexedSignatureFamily();
221
+ if (only) {
222
+ return index <= 63 ? family.currentOnly : family.bigCurrentOnly;
223
+ }
224
+ const ondexValue = ondex ?? index;
225
+ return ondexValue === index && index <= 63 ? family.both : family.bigBoth;
226
+ }
227
+ /**
228
+ * Sign one message and return either a detached `Cigar` or indexed `Siger`.
229
+ *
230
+ * KERIpy correspondence:
231
+ * - `index === undefined` returns a detached non-indexed signature
232
+ * - otherwise the seed suite decides the emitted indexed signature code family
233
+ * - `only=true` selects the current-list-only family and ignores any caller
234
+ * `ondex` override
235
+ * - otherwise `ondex` defaults to `index`, preserving KERIpy's implicit
236
+ * same-index rule for ordinary indexed signatures
237
+ */
238
+ sign(ser, { index, only = false, ondex } = {}) {
239
+ const sig = this._signRaw(ser);
240
+ if (index === undefined) {
241
+ return new Cigar({
242
+ code: this.detachedSignatureCode(),
243
+ raw: sig,
244
+ }, this.verfer);
245
+ }
246
+ const normalizedOndex = only ? undefined : ondex ?? index;
247
+ return new Siger({
248
+ code: this.indexedSignatureCode(index, {
249
+ only,
250
+ ondex: normalizedOndex ?? undefined,
251
+ }),
252
+ raw: sig,
253
+ index,
254
+ ondex: normalizedOndex ?? undefined,
255
+ }, this.verfer);
256
+ }
23
257
  }
@@ -0,0 +1,28 @@
1
+ import { normalizeByteLike } from "./byte-like.js";
2
+ /**
3
+ * Sniffable CESR stream holder.
4
+ *
5
+ * KERIpy substance: `Streamer` is the minimal primitive used when encryption
6
+ * and decryption round-trip whole CESR streams instead of one qualified matter
7
+ * instance.
8
+ *
9
+ * Current `keri-ts` scope:
10
+ * - owns raw stream bytes only
11
+ * - does not yet port KERIpy's `text` / `binary` / `texter` / `bexter`
12
+ * projection helpers or sniffability verification behavior
13
+ */
14
+ export class Streamer {
15
+ constructor({ stream }) {
16
+ Object.defineProperty(this, "_stream", {
17
+ enumerable: true,
18
+ configurable: true,
19
+ writable: true,
20
+ value: void 0
21
+ });
22
+ this._stream = normalizeByteLike(stream);
23
+ }
24
+ /** Raw sniffable CESR stream bytes. */
25
+ get stream() {
26
+ return this._stream.slice();
27
+ }
28
+ }