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.
- package/esm/src/adapters/async-iterable.js +8 -0
- package/esm/src/adapters/effection.js +6 -0
- package/esm/src/annotate/annotator.js +12 -0
- package/esm/src/annotate/cli.js +12 -0
- package/esm/src/annotate/comments.js +5 -1
- package/esm/src/annotate/denot.js +6 -0
- package/esm/src/annotate/render.js +15 -3
- package/esm/src/core/bytes.js +9 -0
- package/esm/src/core/errors.js +3 -0
- package/esm/src/core/parser-engine.js +1 -1
- package/esm/src/core/parser-frame-parser.js +22 -18
- package/esm/src/core/vocabulary.js +47 -0
- package/esm/src/index.js +5 -0
- package/esm/src/parser/attachment-parser.js +4 -0
- package/esm/src/parser/cold-start.js +6 -0
- package/esm/src/parser/group-dispatch.js +2 -2
- package/esm/src/primitives/aggor.js +374 -30
- package/esm/src/primitives/bexter.js +2 -3
- package/esm/src/primitives/blinder.js +6 -0
- package/esm/src/primitives/byte-like.js +19 -0
- package/esm/src/primitives/cigar.js +17 -3
- package/esm/src/primitives/cipher.js +91 -6
- package/esm/src/primitives/codex.js +39 -6
- package/esm/src/primitives/compactor.js +307 -3
- package/esm/src/primitives/counter.js +6 -2
- package/esm/src/primitives/dater.js +1 -2
- package/esm/src/primitives/decimer.js +7 -11
- package/esm/src/primitives/decrypter.js +123 -7
- package/esm/src/primitives/diger.js +57 -3
- package/esm/src/primitives/disclosure.js +300 -0
- package/esm/src/primitives/encrypter.js +130 -7
- package/esm/src/primitives/hydrate.js +49 -0
- package/esm/src/primitives/ilker.js +2 -3
- package/esm/src/primitives/indexer.js +21 -4
- package/esm/src/primitives/labeler.js +1 -2
- package/esm/src/primitives/mapper.js +612 -35
- package/esm/src/primitives/matter.js +133 -3
- package/esm/src/primitives/mediar.js +6 -0
- package/esm/src/primitives/noncer.js +2 -3
- package/esm/src/primitives/number.js +1 -2
- package/esm/src/primitives/pather.js +102 -5
- package/esm/src/primitives/prefixer.js +1 -2
- package/esm/src/primitives/primitive.js +14 -0
- package/esm/src/primitives/registry.js +2 -0
- package/esm/src/primitives/saider.js +80 -3
- package/esm/src/primitives/salter.js +96 -2
- package/esm/src/primitives/sealed-box.js +41 -0
- package/esm/src/primitives/seqner.js +1 -2
- package/esm/src/primitives/siger.js +58 -3
- package/esm/src/primitives/signer.js +243 -9
- package/esm/src/primitives/streamer.js +28 -0
- package/esm/src/primitives/structing.js +727 -0
- package/esm/src/primitives/structor.js +20 -0
- package/esm/src/primitives/tagger.js +1 -2
- package/esm/src/primitives/texter.js +1 -2
- package/esm/src/primitives/tholder.js +552 -10
- package/esm/src/primitives/traitor.js +2 -3
- package/esm/src/primitives/verfer.js +50 -6
- package/esm/src/primitives/verser.js +16 -6
- package/esm/src/router/router-stub.js +1 -0
- package/esm/src/serder/native.js +1326 -0
- package/esm/src/serder/serder.js +1558 -59
- package/esm/src/serder/serdery.js +92 -7
- package/esm/src/serder/smell.js +26 -1
- package/esm/src/tables/codex-utils.js +2 -0
- package/esm/src/tables/counter-codex.js +2 -0
- package/esm/src/tables/counter-groups.js +6 -0
- package/esm/src/tables/versions.js +4 -0
- package/esm/src/version.js +5 -2
- package/package.json +5 -2
- package/types/src/adapters/async-iterable.d.ts +8 -0
- package/types/src/adapters/async-iterable.d.ts.map +1 -1
- package/types/src/adapters/effection.d.ts +7 -0
- package/types/src/adapters/effection.d.ts.map +1 -1
- package/types/src/annotate/annotator.d.ts +12 -0
- package/types/src/annotate/annotator.d.ts.map +1 -1
- package/types/src/annotate/cli.d.ts +13 -0
- package/types/src/annotate/cli.d.ts.map +1 -1
- package/types/src/annotate/comments.d.ts +4 -0
- package/types/src/annotate/comments.d.ts.map +1 -1
- package/types/src/annotate/denot.d.ts +6 -0
- package/types/src/annotate/denot.d.ts.map +1 -1
- package/types/src/annotate/render.d.ts.map +1 -1
- package/types/src/annotate/types.d.ts +2 -0
- package/types/src/annotate/types.d.ts.map +1 -1
- package/types/src/bench/parser-benchmark.d.ts +3 -0
- package/types/src/bench/parser-benchmark.d.ts.map +1 -1
- package/types/src/core/bytes.d.ts +9 -0
- package/types/src/core/bytes.d.ts.map +1 -1
- package/types/src/core/errors.d.ts +3 -0
- package/types/src/core/errors.d.ts.map +1 -1
- package/types/src/core/parser-engine.d.ts +4 -0
- package/types/src/core/parser-engine.d.ts.map +1 -1
- package/types/src/core/parser-frame-parser.d.ts.map +1 -1
- package/types/src/core/types.d.ts +2 -0
- package/types/src/core/types.d.ts.map +1 -1
- package/types/src/core/vocabulary.d.ts +48 -0
- package/types/src/core/vocabulary.d.ts.map +1 -0
- package/types/src/index.d.ts +5 -0
- package/types/src/index.d.ts.map +1 -1
- package/types/src/parser/attachment-parser.d.ts +4 -0
- package/types/src/parser/attachment-parser.d.ts.map +1 -1
- package/types/src/parser/cold-start.d.ts +6 -0
- package/types/src/parser/cold-start.d.ts.map +1 -1
- package/types/src/parser/group-dispatch.d.ts.map +1 -1
- package/types/src/primitives/aggor.d.ts +100 -13
- package/types/src/primitives/aggor.d.ts.map +1 -1
- package/types/src/primitives/bexter.d.ts.map +1 -1
- package/types/src/primitives/blinder.d.ts +6 -0
- package/types/src/primitives/blinder.d.ts.map +1 -1
- package/types/src/primitives/byte-like.d.ts +7 -0
- package/types/src/primitives/byte-like.d.ts.map +1 -0
- package/types/src/primitives/cigar.d.ts +11 -1
- package/types/src/primitives/cigar.d.ts.map +1 -1
- package/types/src/primitives/cipher.d.ts +73 -2
- package/types/src/primitives/cipher.d.ts.map +1 -1
- package/types/src/primitives/codex.d.ts +34 -4
- package/types/src/primitives/codex.d.ts.map +1 -1
- package/types/src/primitives/compactor.d.ts +94 -2
- package/types/src/primitives/compactor.d.ts.map +1 -1
- package/types/src/primitives/counter.d.ts.map +1 -1
- package/types/src/primitives/dater.d.ts.map +1 -1
- package/types/src/primitives/decimer.d.ts.map +1 -1
- package/types/src/primitives/decrypter.d.ts +64 -3
- package/types/src/primitives/decrypter.d.ts.map +1 -1
- package/types/src/primitives/diger.d.ts +16 -0
- package/types/src/primitives/diger.d.ts.map +1 -1
- package/types/src/primitives/disclosure.d.ts +201 -0
- package/types/src/primitives/disclosure.d.ts.map +1 -0
- package/types/src/primitives/encrypter.d.ts +66 -4
- package/types/src/primitives/encrypter.d.ts.map +1 -1
- package/types/src/primitives/hydrate.d.ts +20 -0
- package/types/src/primitives/hydrate.d.ts.map +1 -0
- package/types/src/primitives/ilker.d.ts.map +1 -1
- package/types/src/primitives/indexer.d.ts.map +1 -1
- package/types/src/primitives/labeler.d.ts.map +1 -1
- package/types/src/primitives/mapper.d.ts +132 -11
- package/types/src/primitives/mapper.d.ts.map +1 -1
- package/types/src/primitives/matter.d.ts +33 -1
- package/types/src/primitives/matter.d.ts.map +1 -1
- package/types/src/primitives/mediar.d.ts +6 -0
- package/types/src/primitives/mediar.d.ts.map +1 -1
- package/types/src/primitives/noncer.d.ts.map +1 -1
- package/types/src/primitives/number.d.ts.map +1 -1
- package/types/src/primitives/pather.d.ts +21 -0
- package/types/src/primitives/pather.d.ts.map +1 -1
- package/types/src/primitives/prefixer.d.ts.map +1 -1
- package/types/src/primitives/primitive.d.ts +26 -0
- package/types/src/primitives/primitive.d.ts.map +1 -1
- package/types/src/primitives/registry.d.ts +3 -0
- package/types/src/primitives/registry.d.ts.map +1 -1
- package/types/src/primitives/saider.d.ts +41 -0
- package/types/src/primitives/saider.d.ts.map +1 -1
- package/types/src/primitives/salter.d.ts +56 -1
- package/types/src/primitives/salter.d.ts.map +1 -1
- package/types/src/primitives/sealed-box.d.ts +29 -0
- package/types/src/primitives/sealed-box.d.ts.map +1 -0
- package/types/src/primitives/seqner.d.ts.map +1 -1
- package/types/src/primitives/siger.d.ts +14 -0
- package/types/src/primitives/siger.d.ts.map +1 -1
- package/types/src/primitives/signer.d.ts +80 -4
- package/types/src/primitives/signer.d.ts.map +1 -1
- package/types/src/primitives/streamer.d.ts +31 -0
- package/types/src/primitives/streamer.d.ts.map +1 -0
- package/types/src/primitives/structing.d.ts +4114 -0
- package/types/src/primitives/structing.d.ts.map +1 -0
- package/types/src/primitives/structor.d.ts +6 -0
- package/types/src/primitives/structor.d.ts.map +1 -1
- package/types/src/primitives/tagger.d.ts.map +1 -1
- package/types/src/primitives/texter.d.ts.map +1 -1
- package/types/src/primitives/tholder.d.ts +150 -5
- package/types/src/primitives/tholder.d.ts.map +1 -1
- package/types/src/primitives/traitor.d.ts.map +1 -1
- package/types/src/primitives/unknown.d.ts +1 -0
- package/types/src/primitives/unknown.d.ts.map +1 -1
- package/types/src/primitives/verfer.d.ts +12 -0
- package/types/src/primitives/verfer.d.ts.map +1 -1
- package/types/src/primitives/verser.d.ts +14 -3
- package/types/src/primitives/verser.d.ts.map +1 -1
- package/types/src/router/router-stub.d.ts +3 -0
- package/types/src/router/router-stub.d.ts.map +1 -1
- package/types/src/serder/native.d.ts +115 -0
- package/types/src/serder/native.d.ts.map +1 -0
- package/types/src/serder/serder.d.ts +187 -9
- package/types/src/serder/serder.d.ts.map +1 -1
- package/types/src/serder/serdery.d.ts +42 -0
- package/types/src/serder/serdery.d.ts.map +1 -1
- package/types/src/serder/smell.d.ts +22 -0
- package/types/src/serder/smell.d.ts.map +1 -1
- package/types/src/tables/codex-utils.d.ts +3 -0
- package/types/src/tables/codex-utils.d.ts.map +1 -1
- package/types/src/tables/counter-codex.d.ts +4 -0
- package/types/src/tables/counter-codex.d.ts.map +1 -1
- package/types/src/tables/counter-groups.d.ts +6 -0
- package/types/src/tables/counter-groups.d.ts.map +1 -1
- package/types/src/tables/counter.tables.generated.d.ts.map +1 -1
- package/types/src/tables/indexer.codex.generated.d.ts.map +1 -1
- package/types/src/tables/matter.codex.generated.d.ts.map +1 -1
- package/types/src/tables/table-types.d.ts +6 -0
- package/types/src/tables/table-types.d.ts.map +1 -1
- package/types/src/tables/versions.d.ts +6 -0
- package/types/src/tables/versions.d.ts.map +1 -1
- package/types/src/version.d.ts +5 -2
- 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
|
-
|
|
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 {
|
|
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
|
|
8
|
-
*
|
|
9
|
-
*
|
|
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
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
+
}
|