@bitspark/archon-sdk 0.8.2 → 0.9.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/dist/src/envelope.d.ts +15 -0
- package/dist/src/envelope.js +36 -1
- package/dist/src/envelope.js.map +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +5 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/login.d.ts +17 -0
- package/dist/src/login.js +28 -1
- package/dist/src/login.js.map +1 -1
- package/dist/src/possession.d.ts +11 -0
- package/dist/src/possession.js +25 -0
- package/dist/src/possession.js.map +1 -1
- package/dist/src/signer.d.ts +54 -0
- package/dist/src/signer.js +116 -0
- package/dist/src/signer.js.map +1 -0
- package/package.json +2 -2
package/dist/src/envelope.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type Signer, type SigningRequest } from "./signer.js";
|
|
1
2
|
/** The first four bytes of every envelope. */
|
|
2
3
|
export declare const ENVELOPE_MAGIC: Uint8Array<ArrayBuffer>;
|
|
3
4
|
/** The envelope format version. */
|
|
@@ -17,6 +18,20 @@ export interface Opened {
|
|
|
17
18
|
* because of the scheme tag.
|
|
18
19
|
*/
|
|
19
20
|
export declare function seal(seed: Uint8Array, domain: string, payload: Uint8Array): Uint8Array;
|
|
21
|
+
/**
|
|
22
|
+
* The signing request sealing `payload` in `domain` needs, for a signer whose key is
|
|
23
|
+
* `publicKey` (ADR 0009 §4). Pure; throws on an invalid domain. The message is
|
|
24
|
+
* `envelopeMessageBytes(payload)`, so an envelope made through it is the same bytes.
|
|
25
|
+
*/
|
|
26
|
+
export declare function prepareSeal(publicKey: Uint8Array, domain: string, payload: Uint8Array): SigningRequest;
|
|
27
|
+
/**
|
|
28
|
+
* The envelope, from a signature over a prepared seal request: the signature is checked
|
|
29
|
+
* against the request, then the envelope is assembled from the request's own key, domain and
|
|
30
|
+
* payload. Pure.
|
|
31
|
+
*/
|
|
32
|
+
export declare function completeSeal(request: SigningRequest, signature: Uint8Array): Uint8Array;
|
|
33
|
+
/** `seal` through a signer instead of a seed. */
|
|
34
|
+
export declare function sealWith(signer: Signer, domain: string, payload: Uint8Array, signal?: AbortSignal): Promise<Uint8Array>;
|
|
20
35
|
/**
|
|
21
36
|
* Open `envelope`, which the caller expects to be sealed in `domain`. Throws — never
|
|
22
37
|
* returns a payload — when the bytes are not an envelope (magic, version, length), the
|
package/dist/src/envelope.js
CHANGED
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
// another. The verifier chooses the domain; an envelope never gets to choose it for
|
|
16
16
|
// them. Whether to trust the key it names is, again, the verifier's.
|
|
17
17
|
import { getPublicKey, signInDomain, verifyInDomain, MAX_DOMAIN_SIZE, PUBLIC_KEY_SIZE, SIGNATURE_SIZE, } from "@bitspark/archon";
|
|
18
|
+
import { checkSignature, signWith, validateSigningRequest } from "./signer.js";
|
|
18
19
|
/** The first four bytes of every envelope. */
|
|
19
20
|
export const ENVELOPE_MAGIC = new Uint8Array([0x61, 0x72, 0x63, 0x6e]); // "arcn"
|
|
20
21
|
/** The envelope format version. */
|
|
@@ -28,7 +29,41 @@ export const ENVELOPE_SCHEME_TAG = 0x02;
|
|
|
28
29
|
*/
|
|
29
30
|
export function seal(seed, domain, payload) {
|
|
30
31
|
const signature = signInDomain(seed, domain, envelopeMessageBytes(payload));
|
|
31
|
-
|
|
32
|
+
return pack(domain, getPublicKey(seed), signature, payload);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* The signing request sealing `payload` in `domain` needs, for a signer whose key is
|
|
36
|
+
* `publicKey` (ADR 0009 §4). Pure; throws on an invalid domain. The message is
|
|
37
|
+
* `envelopeMessageBytes(payload)`, so an envelope made through it is the same bytes.
|
|
38
|
+
*/
|
|
39
|
+
export function prepareSeal(publicKey, domain, payload) {
|
|
40
|
+
const request = {
|
|
41
|
+
expectedPublicKey: publicKey,
|
|
42
|
+
scheme: { kind: "ed25519ph-context", domain },
|
|
43
|
+
message: envelopeMessageBytes(payload),
|
|
44
|
+
};
|
|
45
|
+
validateSigningRequest(request);
|
|
46
|
+
return request;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* The envelope, from a signature over a prepared seal request: the signature is checked
|
|
50
|
+
* against the request, then the envelope is assembled from the request's own key, domain and
|
|
51
|
+
* payload. Pure.
|
|
52
|
+
*/
|
|
53
|
+
export function completeSeal(request, signature) {
|
|
54
|
+
if (request.scheme.kind !== "ed25519ph-context" || request.message[0] !== ENVELOPE_SCHEME_TAG) {
|
|
55
|
+
throw new Error("not a seal request");
|
|
56
|
+
}
|
|
57
|
+
checkSignature(request, signature);
|
|
58
|
+
return pack(request.scheme.domain, request.expectedPublicKey, signature, request.message.subarray(1));
|
|
59
|
+
}
|
|
60
|
+
/** `seal` through a signer instead of a seed. */
|
|
61
|
+
export async function sealWith(signer, domain, payload, signal) {
|
|
62
|
+
const request = prepareSeal(signer.publicKey, domain, payload);
|
|
63
|
+
return completeSeal(request, await signWith(signer, request, signal));
|
|
64
|
+
}
|
|
65
|
+
/** The container layout, from parts already checked: the domain fits a u8 (≤ 255 bytes). */
|
|
66
|
+
function pack(domain, pubkey, signature, payload) {
|
|
32
67
|
const d = new TextEncoder().encode(domain);
|
|
33
68
|
const out = new Uint8Array(4 + 1 + 1 + d.length + PUBLIC_KEY_SIZE + SIGNATURE_SIZE + payload.length);
|
|
34
69
|
let at = 0;
|
package/dist/src/envelope.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"envelope.js","sourceRoot":"","sources":["../../src/envelope.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,EAAE;AACF,wEAAwE;AACxE,EAAE;AACF,mFAAmF;AACnF,EAAE;AACF,sFAAsF;AACtF,mFAAmF;AACnF,mFAAmF;AACnF,wFAAwF;AACxF,wFAAwF;AACxF,0BAA0B;AAC1B,EAAE;AACF,mFAAmF;AACnF,oFAAoF;AACpF,qEAAqE;AACrE,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,eAAe,EACf,eAAe,EACf,cAAc,GACf,MAAM,kBAAkB,CAAC;AAE1B,8CAA8C;AAC9C,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;AACjF,mCAAmC;AACnC,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC;AACrC,kGAAkG;AAClG,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAUxC;;;;GAIG;AACH,MAAM,UAAU,IAAI,CAAC,IAAgB,EAAE,MAAc,EAAE,OAAmB;IACxE,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5E,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"envelope.js","sourceRoot":"","sources":["../../src/envelope.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.d.ts
CHANGED
package/dist/src/index.js
CHANGED
|
@@ -7,11 +7,16 @@
|
|
|
7
7
|
// binding is what makes it a proof, so an empty one is refused.
|
|
8
8
|
// - envelope — these bytes, signed by this key, in this domain. JWS, never JWT.
|
|
9
9
|
//
|
|
10
|
+
// Each signing helper takes a seed, or — through its prepare / complete pair and its `…With`
|
|
11
|
+
// form — a Signer (ADR 0009 §4): signing capability rather than the key, for keys that do not
|
|
12
|
+
// live in this process.
|
|
13
|
+
//
|
|
10
14
|
// The rule that keeps this layer honest: entropy, time and channel binding are
|
|
11
15
|
// ARGUMENTS. This package never sources them. That is what lets every byte it emits be a
|
|
12
16
|
// deterministic function of its inputs and be pinned by vectors/sdk.json across three
|
|
13
17
|
// languages — the same way the floor is pinned. Connection setup is not here and never
|
|
14
18
|
// will be: that is the transport's (ADR 0004).
|
|
19
|
+
export * from "./signer.js";
|
|
15
20
|
export * from "./possession.js";
|
|
16
21
|
export * from "./envelope.js";
|
|
17
22
|
export * from "./login.js";
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,EAAE;AACF,uFAAuF;AACvF,wEAAwE;AACxE,EAAE;AACF,qFAAqF;AACrF,kEAAkE;AAClE,gFAAgF;AAChF,EAAE;AACF,+EAA+E;AAC/E,yFAAyF;AACzF,sFAAsF;AACtF,uFAAuF;AACvF,+CAA+C;AAC/C,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,EAAE;AACF,uFAAuF;AACvF,wEAAwE;AACxE,EAAE;AACF,qFAAqF;AACrF,kEAAkE;AAClE,gFAAgF;AAChF,EAAE;AACF,6FAA6F;AAC7F,8FAA8F;AAC9F,wBAAwB;AACxB,EAAE;AACF,+EAA+E;AAC/E,yFAAyF;AACzF,sFAAsF;AACtF,uFAAuF;AACvF,+CAA+C;AAC/C,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC"}
|
package/dist/src/login.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type Signer, type SigningRequest } from "./signer.js";
|
|
1
2
|
/** The RFC 8032 context every login-scheme proof is made in. */
|
|
2
3
|
export declare const LOGIN_DOMAIN = "archon-login/1";
|
|
3
4
|
/** The binding's first byte for the person's proof (made by P). */
|
|
@@ -59,5 +60,21 @@ export declare function verifyLogin(pub: Uint8Array, audience: string, req: Logi
|
|
|
59
60
|
* `req.browser` throws: the proof is only meaningful from the key the request names.
|
|
60
61
|
*/
|
|
61
62
|
export declare function proveCollect(seed: Uint8Array, audience: string, req: LoginRequest): Uint8Array;
|
|
63
|
+
/**
|
|
64
|
+
* The signing request the person's login proof needs, for a signer whose key is `publicKey`
|
|
65
|
+
* (ADR 0009 §4). Pure; throws for what `proveLogin` throws about the request. Complete it
|
|
66
|
+
* with `completePossession`: a login proof is a possession proof.
|
|
67
|
+
*/
|
|
68
|
+
export declare function prepareLogin(publicKey: Uint8Array, audience: string, req: LoginRequest): SigningRequest;
|
|
69
|
+
/** `proveLogin` through a signer instead of a seed. */
|
|
70
|
+
export declare function proveLoginWith(signer: Signer, audience: string, req: LoginRequest, signal?: AbortSignal): Promise<Uint8Array>;
|
|
71
|
+
/**
|
|
72
|
+
* The signing request the browser's collect proof needs. Pure. The expected key is the
|
|
73
|
+
* browser key `req` names, so only that key's signer can complete it — `proveCollect`'s
|
|
74
|
+
* refusal of any other seed, carried into the request itself.
|
|
75
|
+
*/
|
|
76
|
+
export declare function prepareCollect(audience: string, req: LoginRequest): SigningRequest;
|
|
77
|
+
/** `proveCollect` through a signer instead of a seed. A signer for any other key is refused. */
|
|
78
|
+
export declare function proveCollectWith(signer: Signer, audience: string, req: LoginRequest, signal?: AbortSignal): Promise<Uint8Array>;
|
|
62
79
|
/** Whether `signature` is the collect proof by `req.browser` for `req` at `audience`. Total. */
|
|
63
80
|
export declare function verifyCollect(audience: string, req: LoginRequest, signature: Uint8Array): boolean;
|
package/dist/src/login.js
CHANGED
|
@@ -17,7 +17,8 @@
|
|
|
17
17
|
// the collect proof (0x02) is made by K when the browser collects the answer, so a bystander
|
|
18
18
|
// who saw the request id cannot consume the login.
|
|
19
19
|
import { getPublicKey, PUBLIC_KEY_SIZE, SEED_SIZE } from "@bitspark/archon";
|
|
20
|
-
import { MAX_FIELD_SIZE as POSSESSION_MAX_FIELD_SIZE, provePossession, verifyPossession } from "./possession.js";
|
|
20
|
+
import { completePossession, MAX_FIELD_SIZE as POSSESSION_MAX_FIELD_SIZE, preparePossession, provePossession, verifyPossession, } from "./possession.js";
|
|
21
|
+
import { signWith } from "./signer.js";
|
|
21
22
|
/** The RFC 8032 context every login-scheme proof is made in. */
|
|
22
23
|
export const LOGIN_DOMAIN = "archon-login/1";
|
|
23
24
|
/** The binding's first byte for the person's proof (made by P). */
|
|
@@ -123,6 +124,32 @@ export function proveCollect(seed, audience, req) {
|
|
|
123
124
|
}
|
|
124
125
|
return provePossession(seed, LOGIN_DOMAIN, req.nonce, loginBinding(LOGIN_ROLE_COLLECT, audience, req));
|
|
125
126
|
}
|
|
127
|
+
/**
|
|
128
|
+
* The signing request the person's login proof needs, for a signer whose key is `publicKey`
|
|
129
|
+
* (ADR 0009 §4). Pure; throws for what `proveLogin` throws about the request. Complete it
|
|
130
|
+
* with `completePossession`: a login proof is a possession proof.
|
|
131
|
+
*/
|
|
132
|
+
export function prepareLogin(publicKey, audience, req) {
|
|
133
|
+
return preparePossession(publicKey, LOGIN_DOMAIN, req.nonce, loginBinding(LOGIN_ROLE_LOGIN, audience, req));
|
|
134
|
+
}
|
|
135
|
+
/** `proveLogin` through a signer instead of a seed. */
|
|
136
|
+
export async function proveLoginWith(signer, audience, req, signal) {
|
|
137
|
+
const request = prepareLogin(signer.publicKey, audience, req);
|
|
138
|
+
return completePossession(request, await signWith(signer, request, signal));
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* The signing request the browser's collect proof needs. Pure. The expected key is the
|
|
142
|
+
* browser key `req` names, so only that key's signer can complete it — `proveCollect`'s
|
|
143
|
+
* refusal of any other seed, carried into the request itself.
|
|
144
|
+
*/
|
|
145
|
+
export function prepareCollect(audience, req) {
|
|
146
|
+
return preparePossession(req.browser, LOGIN_DOMAIN, req.nonce, loginBinding(LOGIN_ROLE_COLLECT, audience, req));
|
|
147
|
+
}
|
|
148
|
+
/** `proveCollect` through a signer instead of a seed. A signer for any other key is refused. */
|
|
149
|
+
export async function proveCollectWith(signer, audience, req, signal) {
|
|
150
|
+
const request = prepareCollect(audience, req);
|
|
151
|
+
return completePossession(request, await signWith(signer, request, signal));
|
|
152
|
+
}
|
|
126
153
|
/** Whether `signature` is the collect proof by `req.browser` for `req` at `audience`. Total. */
|
|
127
154
|
export function verifyCollect(audience, req, signature) {
|
|
128
155
|
let binding;
|
package/dist/src/login.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/login.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAC1F,EAAE;AACF,6FAA6F;AAC7F,6FAA6F;AAC7F,yFAAyF;AACzF,yFAAyF;AACzF,4FAA4F;AAC5F,mCAAmC;AACnC,EAAE;AACF,2FAA2F;AAC3F,6FAA6F;AAC7F,4FAA4F;AAC5F,6FAA6F;AAC7F,uDAAuD;AACvD,EAAE;AACF,8FAA8F;AAC9F,6FAA6F;AAC7F,mDAAmD;AACnD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE5E,OAAO,
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/login.ts"],"names":[],"mappings":"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"}
|
package/dist/src/possession.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type Signer, type SigningRequest } from "./signer.js";
|
|
1
2
|
/** The first byte of every possession message. Distinct from the envelope's `SCHEME_TAG`. */
|
|
2
3
|
export declare const POSSESSION_SCHEME_TAG = 1;
|
|
3
4
|
/** The shortest nonce accepted, in bytes. Below this a proof is guessable, so it is refused. */
|
|
@@ -16,5 +17,15 @@ export declare function provePossession(seed: Uint8Array, domain: string, nonce:
|
|
|
16
17
|
* nonce, empty binding, wrong-sized key or signature — is `false`.
|
|
17
18
|
*/
|
|
18
19
|
export declare function verifyPossession(pub: Uint8Array, domain: string, nonce: Uint8Array, binding: Uint8Array, signature: Uint8Array): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* The signing request a possession proof needs, for a signer whose key is `publicKey`
|
|
22
|
+
* (ADR 0009 §4). Pure, and throws for what `provePossession` throws. The message is
|
|
23
|
+
* `possessionMessageBytes(nonce, binding)`, so a proof made through it is the same bytes.
|
|
24
|
+
*/
|
|
25
|
+
export declare function preparePossession(publicKey: Uint8Array, domain: string, nonce: Uint8Array, binding: Uint8Array): SigningRequest;
|
|
26
|
+
/** The proof, from a signature over a prepared request: checked, then returned. Pure. */
|
|
27
|
+
export declare function completePossession(request: SigningRequest, signature: Uint8Array): Uint8Array;
|
|
28
|
+
/** `provePossession` through a signer instead of a seed. */
|
|
29
|
+
export declare function provePossessionWith(signer: Signer, domain: string, nonce: Uint8Array, binding: Uint8Array, signal?: AbortSignal): Promise<Uint8Array>;
|
|
19
30
|
/** The pinned layout of what gets signed. Exported so a consumer can pin it too. */
|
|
20
31
|
export declare function possessionMessageBytes(nonce: Uint8Array, binding: Uint8Array): Uint8Array;
|
package/dist/src/possession.js
CHANGED
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
// possession message and an envelope payload in the same domain from ever being the
|
|
18
18
|
// same bytes.
|
|
19
19
|
import { signInDomain, verifyInDomain } from "@bitspark/archon";
|
|
20
|
+
import { checkSignature, signWith, validateSigningRequest } from "./signer.js";
|
|
20
21
|
/** The first byte of every possession message. Distinct from the envelope's `SCHEME_TAG`. */
|
|
21
22
|
export const POSSESSION_SCHEME_TAG = 0x01;
|
|
22
23
|
/** The shortest nonce accepted, in bytes. Below this a proof is guessable, so it is refused. */
|
|
@@ -46,6 +47,30 @@ export function verifyPossession(pub, domain, nonce, binding, signature) {
|
|
|
46
47
|
}
|
|
47
48
|
return verifyInDomain(pub, domain, message, signature);
|
|
48
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* The signing request a possession proof needs, for a signer whose key is `publicKey`
|
|
52
|
+
* (ADR 0009 §4). Pure, and throws for what `provePossession` throws. The message is
|
|
53
|
+
* `possessionMessageBytes(nonce, binding)`, so a proof made through it is the same bytes.
|
|
54
|
+
*/
|
|
55
|
+
export function preparePossession(publicKey, domain, nonce, binding) {
|
|
56
|
+
const request = {
|
|
57
|
+
expectedPublicKey: publicKey,
|
|
58
|
+
scheme: { kind: "ed25519ph-context", domain },
|
|
59
|
+
message: possessionMessageBytes(nonce, binding),
|
|
60
|
+
};
|
|
61
|
+
validateSigningRequest(request);
|
|
62
|
+
return request;
|
|
63
|
+
}
|
|
64
|
+
/** The proof, from a signature over a prepared request: checked, then returned. Pure. */
|
|
65
|
+
export function completePossession(request, signature) {
|
|
66
|
+
checkSignature(request, signature);
|
|
67
|
+
return new Uint8Array(signature);
|
|
68
|
+
}
|
|
69
|
+
/** `provePossession` through a signer instead of a seed. */
|
|
70
|
+
export async function provePossessionWith(signer, domain, nonce, binding, signal) {
|
|
71
|
+
const request = preparePossession(signer.publicKey, domain, nonce, binding);
|
|
72
|
+
return completePossession(request, await signWith(signer, request, signal));
|
|
73
|
+
}
|
|
49
74
|
/** The pinned layout of what gets signed. Exported so a consumer can pin it too. */
|
|
50
75
|
export function possessionMessageBytes(nonce, binding) {
|
|
51
76
|
if (nonce.length < MIN_NONCE_SIZE)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"possession.js","sourceRoot":"","sources":["../../src/possession.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,EAAE;AACF,kFAAkF;AAClF,oFAAoF;AACpF,uFAAuF;AACvF,0FAA0F;AAC1F,uBAAuB;AACvB,EAAE;AACF,yFAAyF;AACzF,uFAAuF;AACvF,iFAAiF;AACjF,sFAAsF;AACtF,4DAA4D;AAC5D,EAAE;AACF,qFAAqF;AACrF,+EAA+E;AAC/E,oFAAoF;AACpF,cAAc;AACd,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEhE,6FAA6F;AAC7F,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAC1C,gGAAgG;AAChG,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AACjC,8EAA8E;AAC9E,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC;AAErC;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAgB,EAChB,MAAc,EACd,KAAiB,EACjB,OAAmB;IAEnB,OAAO,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,sBAAsB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAC9B,GAAe,EACf,MAAc,EACd,KAAiB,EACjB,OAAmB,EACnB,SAAqB;IAErB,IAAI,OAAmB,CAAC;IACxB,IAAI,CAAC;QACH,OAAO,GAAG,sBAAsB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;AACzD,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,sBAAsB,CAAC,KAAiB,EAAE,OAAmB;IAC3E,IAAI,KAAK,CAAC,MAAM,GAAG,cAAc;QAAE,MAAM,IAAI,KAAK,CAAC,YAAY,KAAK,CAAC,MAAM,eAAe,cAAc,EAAE,CAAC,CAAC;IAC5G,IAAI,KAAK,CAAC,MAAM,GAAG,cAAc;QAAE,MAAM,IAAI,KAAK,CAAC,YAAY,KAAK,CAAC,MAAM,eAAe,cAAc,EAAE,CAAC,CAAC;IAC5G,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IAChG,IAAI,OAAO,CAAC,MAAM,GAAG,cAAc;QAAE,MAAM,IAAI,KAAK,CAAC,cAAc,OAAO,CAAC,MAAM,eAAe,cAAc,EAAE,CAAC,CAAC;IAClH,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACtE,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,qBAAqB,CAAC;IAClC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;IAC9B,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;IAChC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACnB,EAAE,IAAI,KAAK,CAAC,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;IAChC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAClC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACrB,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
1
|
+
{"version":3,"file":"possession.js","sourceRoot":"","sources":["../../src/possession.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/** Raw Ed25519 over the message, or Ed25519ph with the domain as the RFC 8032 context. */
|
|
2
|
+
export type SigningScheme = {
|
|
3
|
+
readonly kind: "ed25519-raw";
|
|
4
|
+
} | {
|
|
5
|
+
readonly kind: "ed25519ph-context";
|
|
6
|
+
readonly domain: string;
|
|
7
|
+
};
|
|
8
|
+
/** What a signer is asked to sign. `message` is always the original bytes. */
|
|
9
|
+
export interface SigningRequest {
|
|
10
|
+
readonly expectedPublicKey: Uint8Array;
|
|
11
|
+
readonly scheme: SigningScheme;
|
|
12
|
+
readonly message: Uint8Array;
|
|
13
|
+
}
|
|
14
|
+
/** What a signer can do. `domains`, when present, is the only set it will sign in. */
|
|
15
|
+
export interface SignerCapabilities {
|
|
16
|
+
readonly schemes: readonly SigningScheme["kind"][];
|
|
17
|
+
readonly domains?: readonly string[];
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* A source of signatures. `sign` may prompt, call a subprocess or wait on a device; it is
|
|
21
|
+
* given the abort signal, and a signature it returns after the signal fired is discarded,
|
|
22
|
+
* never packaged.
|
|
23
|
+
*/
|
|
24
|
+
export interface Signer {
|
|
25
|
+
readonly publicKey: Uint8Array;
|
|
26
|
+
readonly capabilities: SignerCapabilities;
|
|
27
|
+
sign(request: SigningRequest, signal?: AbortSignal): Promise<Uint8Array>;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Throws unless `request` is in range: a 32-byte expected key, a known scheme, and — for
|
|
31
|
+
* Ed25519ph — a domain the floor accepts. The domain is checked by the floor's own rule (it
|
|
32
|
+
* signs nothing with a throwaway key), so no copy of ADR 0008 §2 lives here to drift.
|
|
33
|
+
*/
|
|
34
|
+
export declare function validateSigningRequest(request: SigningRequest): void;
|
|
35
|
+
/**
|
|
36
|
+
* Throws unless `signature` verifies for exactly what was REQUESTED: its key, scheme, domain
|
|
37
|
+
* and original bytes.
|
|
38
|
+
*/
|
|
39
|
+
export declare function checkSignature(request: SigningRequest, signature: Uint8Array): void;
|
|
40
|
+
/**
|
|
41
|
+
* Throws unless `signer` claims to be able to sign `request`: its key is the expected one,
|
|
42
|
+
* and the scheme and domain are among its capabilities. Called before it is invoked.
|
|
43
|
+
*/
|
|
44
|
+
export declare function checkCapability(signer: Signer, request: SigningRequest): void;
|
|
45
|
+
/**
|
|
46
|
+
* Validates, checks the signer's capabilities, invokes it, and returns the signature only
|
|
47
|
+
* if the call was not aborted and the signature verifies for what was requested.
|
|
48
|
+
*/
|
|
49
|
+
export declare function signWith(signer: Signer, request: SigningRequest, signal?: AbortSignal): Promise<Uint8Array>;
|
|
50
|
+
/**
|
|
51
|
+
* The software signer: a seed held in this process, both schemes, any domain the floor
|
|
52
|
+
* accepts, deterministic by the floor's construction. The seed is copied.
|
|
53
|
+
*/
|
|
54
|
+
export declare function seedSigner(seed: Uint8Array): Signer;
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
// The signer contract — SIGNING CAPABILITY, NOT SEEDS (ADR 0009 §2–4).
|
|
2
|
+
//
|
|
3
|
+
// Every helper in this package can take a seed, which is right for a key held in software
|
|
4
|
+
// and wrong for one that is not: a stored key behind `archon sign --key`, or any backend a
|
|
5
|
+
// caller wires in. So each signing helper also comes in three parts — a PURE prepare (the
|
|
6
|
+
// exact request it needs signed), the signer's own work, and a PURE complete (the checked
|
|
7
|
+
// signature, then packaging) — with a convenience that runs the signer between them. The
|
|
8
|
+
// seed functions are unchanged and stay synchronous.
|
|
9
|
+
//
|
|
10
|
+
// A request is three things, and the scheme is a discriminated value, never a scheme name
|
|
11
|
+
// plus an optional domain: the public key the caller expects, raw Ed25519 or Ed25519ph with
|
|
12
|
+
// the domain as the RFC 8032 context, and the ORIGINAL message bytes — never a digest; a
|
|
13
|
+
// backend that wants a prehash computes it inside its own adapter.
|
|
14
|
+
//
|
|
15
|
+
// Three rules, all enforced here rather than trusted to a signer:
|
|
16
|
+
//
|
|
17
|
+
// - A request is validated BEFORE the signer is invoked: a wrong-length key or a domain the
|
|
18
|
+
// floor refuses never reaches it.
|
|
19
|
+
// - A signer REPORTS what it can do, and a request outside that is refused before it is
|
|
20
|
+
// invoked. A signer that cannot carry a context declares raw only; it must never sign an
|
|
21
|
+
// Ed25519ph request with an empty context instead, and if it does anyway, the check below
|
|
22
|
+
// catches it.
|
|
23
|
+
// - Every returned signature is VERIFIED against the requested key, scheme, domain and bytes
|
|
24
|
+
// — never against values the signer echoes back. That catches a wrong key, a dropped
|
|
25
|
+
// context, raw substituted for ph, and a wrong prehash adaptation. It does not prove that a
|
|
26
|
+
// signer signs deterministically (ADR 0008 §1.7 requires it); that is a property of the
|
|
27
|
+
// backend, tested against the `domain_sign` vectors, not something one signature can show.
|
|
28
|
+
//
|
|
29
|
+
// Domain separation is not authorization: whoever may ask for signatures in a domain gets
|
|
30
|
+
// any signature in that domain. Consent belongs to the caller that knows what the bytes mean.
|
|
31
|
+
import { getPublicKey, sign, signInDomain, verify, verifyInDomain, PUBLIC_KEY_SIZE, SEED_SIZE, SIGNATURE_SIZE, } from "@bitspark/archon";
|
|
32
|
+
const sameBytes = (a, b) => a.length === b.length && a.every((x, i) => x === b[i]);
|
|
33
|
+
/**
|
|
34
|
+
* Throws unless `request` is in range: a 32-byte expected key, a known scheme, and — for
|
|
35
|
+
* Ed25519ph — a domain the floor accepts. The domain is checked by the floor's own rule (it
|
|
36
|
+
* signs nothing with a throwaway key), so no copy of ADR 0008 §2 lives here to drift.
|
|
37
|
+
*/
|
|
38
|
+
export function validateSigningRequest(request) {
|
|
39
|
+
if (!(request.expectedPublicKey instanceof Uint8Array) || request.expectedPublicKey.length !== PUBLIC_KEY_SIZE) {
|
|
40
|
+
throw new Error(`signer: the expected public key must be ${PUBLIC_KEY_SIZE} bytes`);
|
|
41
|
+
}
|
|
42
|
+
if (!(request.message instanceof Uint8Array))
|
|
43
|
+
throw new Error("signer: the message must be bytes");
|
|
44
|
+
const scheme = request.scheme;
|
|
45
|
+
if (scheme.kind === "ed25519-raw") {
|
|
46
|
+
if ("domain" in scheme)
|
|
47
|
+
throw new Error("signer: a raw request carries no domain");
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
if (scheme.kind !== "ed25519ph-context")
|
|
51
|
+
throw new Error(`signer: unknown scheme ${JSON.stringify(scheme.kind)}`);
|
|
52
|
+
if (typeof scheme.domain !== "string")
|
|
53
|
+
throw new Error("signer: an ed25519ph-context request needs a domain");
|
|
54
|
+
signInDomain(new Uint8Array(SEED_SIZE), scheme.domain, new Uint8Array(0));
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Throws unless `signature` verifies for exactly what was REQUESTED: its key, scheme, domain
|
|
58
|
+
* and original bytes.
|
|
59
|
+
*/
|
|
60
|
+
export function checkSignature(request, signature) {
|
|
61
|
+
validateSigningRequest(request);
|
|
62
|
+
const ok = signature instanceof Uint8Array &&
|
|
63
|
+
signature.length === SIGNATURE_SIZE &&
|
|
64
|
+
(request.scheme.kind === "ed25519-raw"
|
|
65
|
+
? verify(signature, request.message, request.expectedPublicKey)
|
|
66
|
+
: verifyInDomain(request.expectedPublicKey, request.scheme.domain, request.message, signature));
|
|
67
|
+
if (!ok) {
|
|
68
|
+
throw new Error("signer: the signature does not verify for the requested key, scheme and message");
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Throws unless `signer` claims to be able to sign `request`: its key is the expected one,
|
|
73
|
+
* and the scheme and domain are among its capabilities. Called before it is invoked.
|
|
74
|
+
*/
|
|
75
|
+
export function checkCapability(signer, request) {
|
|
76
|
+
if (!sameBytes(signer.publicKey, request.expectedPublicKey)) {
|
|
77
|
+
throw new Error("signer: this signer's key is not the expected key");
|
|
78
|
+
}
|
|
79
|
+
const caps = signer.capabilities;
|
|
80
|
+
if (!caps.schemes.includes(request.scheme.kind)) {
|
|
81
|
+
throw new Error(`signer: this signer cannot produce ${request.scheme.kind}`);
|
|
82
|
+
}
|
|
83
|
+
if (request.scheme.kind === "ed25519ph-context" && caps.domains !== undefined && !caps.domains.includes(request.scheme.domain)) {
|
|
84
|
+
throw new Error(`signer: this signer does not sign in domain ${JSON.stringify(request.scheme.domain)}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Validates, checks the signer's capabilities, invokes it, and returns the signature only
|
|
89
|
+
* if the call was not aborted and the signature verifies for what was requested.
|
|
90
|
+
*/
|
|
91
|
+
export async function signWith(signer, request, signal) {
|
|
92
|
+
validateSigningRequest(request);
|
|
93
|
+
checkCapability(signer, request);
|
|
94
|
+
signal?.throwIfAborted();
|
|
95
|
+
const signature = await signer.sign(request, signal);
|
|
96
|
+
signal?.throwIfAborted();
|
|
97
|
+
checkSignature(request, signature);
|
|
98
|
+
return new Uint8Array(signature);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* The software signer: a seed held in this process, both schemes, any domain the floor
|
|
102
|
+
* accepts, deterministic by the floor's construction. The seed is copied.
|
|
103
|
+
*/
|
|
104
|
+
export function seedSigner(seed) {
|
|
105
|
+
if (seed.length !== SEED_SIZE)
|
|
106
|
+
throw new Error(`signer: seed is ${seed.length} bytes, want ${SEED_SIZE}`);
|
|
107
|
+
const held = new Uint8Array(seed);
|
|
108
|
+
return {
|
|
109
|
+
publicKey: getPublicKey(held),
|
|
110
|
+
capabilities: { schemes: ["ed25519-raw", "ed25519ph-context"] },
|
|
111
|
+
sign: (request) => Promise.resolve(request.scheme.kind === "ed25519-raw"
|
|
112
|
+
? sign(request.message, held)
|
|
113
|
+
: signInDomain(held, request.scheme.domain, request.message)),
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=signer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signer.js","sourceRoot":"","sources":["../../src/signer.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bitspark/archon-sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "archon-sdk: proof of possession and the signed envelope, one layer above the identity floor. Deterministic given its inputs; no RNG, no clock, no socket.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"test": "tsc -p tsconfig.json && node --test dist/test/*.test.js"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@bitspark/archon": "^0.
|
|
25
|
+
"@bitspark/archon": "^0.9.0"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"@types/node": "^26",
|