@onsignet/core 0.1.0 → 0.1.1

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/README.md ADDED
@@ -0,0 +1,57 @@
1
+ # @onsignet/core
2
+
3
+ **AgentMesh protocol core.** Cryptographic primitives, message envelope format, and identity for the Signet agent network.
4
+
5
+ > This is a low-level library used internally by `@onsignet/daemon`. Most developers should install [`signet-agent`](https://www.npmjs.com/package/signet-agent) instead.
6
+
7
+ ## What's included
8
+
9
+ - **Ed25519** keypair generation and signing (via `tweetnacl`)
10
+ - **X25519** key exchange for envelope encryption
11
+ - **XSalsa20-Poly1305** message encryption
12
+ - **Base58** node ID encoding (`am_...` prefix)
13
+ - Signed **attestation** and **capability** types
14
+ - **Key revocation** support
15
+ - TypeScript types for the full wire protocol
16
+
17
+ ## Install
18
+
19
+ ```bash
20
+ npm install @onsignet/core
21
+ ```
22
+
23
+ ## Usage
24
+
25
+ ```typescript
26
+ import { generateKeypair, sign, verify, encodeBase64 } from "@onsignet/core";
27
+
28
+ // Generate an Ed25519 keypair
29
+ const keypair = generateKeypair();
30
+ console.log(keypair.nodeId); // am_...
31
+
32
+ // Sign and verify
33
+ const message = new TextEncoder().encode("hello");
34
+ const signature = sign(message, keypair.secretKey);
35
+ const valid = verify(message, signature, keypair.publicKey);
36
+ ```
37
+
38
+ ## Protocol
39
+
40
+ The AgentMesh wire protocol uses signed envelopes:
41
+
42
+ ```typescript
43
+ interface SignetEnvelopeWire {
44
+ protocol: "agentmesh/1.0";
45
+ from: string; // sender node ID
46
+ to: string; // recipient node ID
47
+ payload: string; // base64-encoded encrypted payload
48
+ signature: string; // Ed25519 signature over payload
49
+ timestamp: number;
50
+ }
51
+ ```
52
+
53
+ The relay routes envelopes without reading payload contents. End-to-end encryption uses X25519 key exchange + XSalsa20-Poly1305.
54
+
55
+ ## License
56
+
57
+ MIT
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Minimal capability helper: build capability blob and sign. Full policy in daemon.
3
+ */
4
+ import type { MessageCapability } from "./types.js";
5
+ export declare function createCapabilityToken(scope: string, constraints: Record<string, unknown>, ownerEd25519SecretKey: Uint8Array): MessageCapability;
6
+ export declare function verifyCapabilitySignature(capability: MessageCapability, ownerEd25519PublicKey: Uint8Array): boolean;
7
+ //# sourceMappingURL=capability%202.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capability 2.d.ts","sourceRoot":"","sources":["../src/capability 2.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,qBAAqB,EAAE,UAAU,GAChC,iBAAiB,CASnB;AAED,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,iBAAiB,EAC7B,qBAAqB,EAAE,UAAU,GAChC,OAAO,CAKT"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ /**
3
+ * Minimal capability helper: build capability blob and sign. Full policy in daemon.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createCapabilityToken = createCapabilityToken;
7
+ exports.verifyCapabilitySignature = verifyCapabilitySignature;
8
+ const crypto_js_1 = require("./crypto.js");
9
+ function createCapabilityToken(scope, constraints, ownerEd25519SecretKey) {
10
+ const payload = JSON.stringify({ scope, constraints });
11
+ const payloadBytes = new TextEncoder().encode(payload);
12
+ const ownerSignature = (0, crypto_js_1.sign)(payloadBytes, ownerEd25519SecretKey);
13
+ return {
14
+ scope,
15
+ constraints,
16
+ ownerSignature: (0, crypto_js_1.encodeBase64)(ownerSignature),
17
+ };
18
+ }
19
+ function verifyCapabilitySignature(capability, ownerEd25519PublicKey) {
20
+ const payload = JSON.stringify({ scope: capability.scope, constraints: capability.constraints });
21
+ const payloadBytes = new TextEncoder().encode(payload);
22
+ const sig = (0, crypto_js_1.decodeBase64)(capability.ownerSignature);
23
+ return (0, crypto_js_1.verify)(payloadBytes, sig, ownerEd25519PublicKey);
24
+ }
25
+ //# sourceMappingURL=capability%202.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capability 2.js","sourceRoot":"","sources":["../src/capability 2.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAKH,sDAaC;AAED,8DAQC;AA1BD,2CAAuE;AAGvE,SAAgB,qBAAqB,CACnC,KAAa,EACb,WAAoC,EACpC,qBAAiC;IAEjC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;IACvD,MAAM,YAAY,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACvD,MAAM,cAAc,GAAG,IAAA,gBAAI,EAAC,YAAY,EAAE,qBAAqB,CAAC,CAAC;IACjE,OAAO;QACL,KAAK;QACL,WAAW;QACX,cAAc,EAAE,IAAA,wBAAY,EAAC,cAAc,CAAC;KAC7C,CAAC;AACJ,CAAC;AAED,SAAgB,yBAAyB,CACvC,UAA6B,EAC7B,qBAAiC;IAEjC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;IACjG,MAAM,YAAY,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACvD,MAAM,GAAG,GAAG,IAAA,wBAAY,EAAC,UAAU,CAAC,cAAc,CAAC,CAAC;IACpD,OAAO,IAAA,kBAAM,EAAC,YAAY,EAAE,GAAG,EAAE,qBAAqB,CAAC,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Cryptographic operations: Ed25519 signing, X25519+XSalsa20-Poly1305 box.
3
+ * Product plan Section 8.2: Ed25519, X25519, XSalsa20-Poly1305.
4
+ */
5
+ export interface Ed25519KeyPair {
6
+ publicKey: Uint8Array;
7
+ secretKey: Uint8Array;
8
+ }
9
+ export interface X25519KeyPair {
10
+ publicKey: Uint8Array;
11
+ secretKey: Uint8Array;
12
+ }
13
+ export declare function generateEd25519KeyPair(): Ed25519KeyPair;
14
+ export declare function generateX25519KeyPair(): X25519KeyPair;
15
+ export declare function sign(payload: Uint8Array, secretKey: Uint8Array): Uint8Array;
16
+ export declare function verify(payload: Uint8Array, signature: Uint8Array, publicKey: Uint8Array): boolean;
17
+ /**
18
+ * NodeId = "am_" + base58(Ed25519 public key). Product plan Section 6.4.
19
+ */
20
+ export declare function nodeIdFromPublicKey(ed25519PublicKey: Uint8Array): string;
21
+ /**
22
+ * Parse nodeId to Ed25519 public key bytes. Returns null if invalid.
23
+ */
24
+ export declare function parseNodeId(nodeId: string): Uint8Array | null;
25
+ /**
26
+ * Encrypt payload for recipient using ephemeral sender key (X25519 box).
27
+ * Returns ciphertext, nonce, and ephemeral public key for the envelope.
28
+ */
29
+ export declare function encrypt(payload: Uint8Array, recipientX25519PublicKey: Uint8Array): {
30
+ ciphertext: Uint8Array;
31
+ nonce: Uint8Array;
32
+ senderPublicKey: Uint8Array;
33
+ };
34
+ /**
35
+ * Decrypt payload from sender's ephemeral key using recipient's X25519 secret key.
36
+ */
37
+ export declare function decrypt(ciphertext: Uint8Array, nonce: Uint8Array, senderEphemeralPublicKey: Uint8Array, recipientX25519SecretKey: Uint8Array): Uint8Array | null;
38
+ export declare function encodeBase64(bytes: Uint8Array): string;
39
+ export declare function decodeBase64(s: string): Uint8Array;
40
+ //# sourceMappingURL=crypto%202.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto 2.d.ts","sourceRoot":"","sources":["../src/crypto 2.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,UAAU,CAAC;IACtB,SAAS,EAAE,UAAU,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,UAAU,CAAC;IACtB,SAAS,EAAE,UAAU,CAAC;CACvB;AAED,wBAAgB,sBAAsB,IAAI,cAAc,CAGvD;AAED,wBAAgB,qBAAqB,IAAI,aAAa,CAGrD;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,GAAG,UAAU,CAE3E;AAED,wBAAgB,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,GAAG,OAAO,CAEjG;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,gBAAgB,EAAE,UAAU,GAAG,MAAM,CAExE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAU7D;AAED;;;GAGG;AACH,wBAAgB,OAAO,CACrB,OAAO,EAAE,UAAU,EACnB,wBAAwB,EAAE,UAAU,GACnC;IAAE,UAAU,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,UAAU,CAAC;IAAC,eAAe,EAAE,UAAU,CAAA;CAAE,CAS5E;AAED;;GAEG;AACH,wBAAgB,OAAO,CACrB,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,UAAU,EACjB,wBAAwB,EAAE,UAAU,EACpC,wBAAwB,EAAE,UAAU,GACnC,UAAU,GAAG,IAAI,CAEnB;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAEtD;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,UAAU,CAElD"}
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ /**
3
+ * Cryptographic operations: Ed25519 signing, X25519+XSalsa20-Poly1305 box.
4
+ * Product plan Section 8.2: Ed25519, X25519, XSalsa20-Poly1305.
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ var __importDefault = (this && this.__importDefault) || function (mod) {
40
+ return (mod && mod.__esModule) ? mod : { "default": mod };
41
+ };
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.generateEd25519KeyPair = generateEd25519KeyPair;
44
+ exports.generateX25519KeyPair = generateX25519KeyPair;
45
+ exports.sign = sign;
46
+ exports.verify = verify;
47
+ exports.nodeIdFromPublicKey = nodeIdFromPublicKey;
48
+ exports.parseNodeId = parseNodeId;
49
+ exports.encrypt = encrypt;
50
+ exports.decrypt = decrypt;
51
+ exports.encodeBase64 = encodeBase64;
52
+ exports.decodeBase64 = decodeBase64;
53
+ const nacl = __importStar(require("tweetnacl"));
54
+ const util = __importStar(require("tweetnacl-util"));
55
+ const bs58_1 = __importDefault(require("bs58"));
56
+ const NODE_ID_PREFIX = "am_";
57
+ const BOX_NONCE_LENGTH = 24;
58
+ function generateEd25519KeyPair() {
59
+ const kp = nacl.sign.keyPair();
60
+ return { publicKey: kp.publicKey, secretKey: kp.secretKey };
61
+ }
62
+ function generateX25519KeyPair() {
63
+ const kp = nacl.box.keyPair();
64
+ return { publicKey: kp.publicKey, secretKey: kp.secretKey };
65
+ }
66
+ function sign(payload, secretKey) {
67
+ return nacl.sign.detached(payload, secretKey);
68
+ }
69
+ function verify(payload, signature, publicKey) {
70
+ return nacl.sign.detached.verify(payload, signature, publicKey);
71
+ }
72
+ /**
73
+ * NodeId = "am_" + base58(Ed25519 public key). Product plan Section 6.4.
74
+ */
75
+ function nodeIdFromPublicKey(ed25519PublicKey) {
76
+ return NODE_ID_PREFIX + bs58_1.default.encode(ed25519PublicKey);
77
+ }
78
+ /**
79
+ * Parse nodeId to Ed25519 public key bytes. Returns null if invalid.
80
+ */
81
+ function parseNodeId(nodeId) {
82
+ if (!nodeId.startsWith(NODE_ID_PREFIX))
83
+ return null;
84
+ const b58 = nodeId.slice(NODE_ID_PREFIX.length);
85
+ if (!b58)
86
+ return null;
87
+ try {
88
+ const bytes = bs58_1.default.decode(b58);
89
+ return bytes.length > 0 ? new Uint8Array(bytes) : null;
90
+ }
91
+ catch {
92
+ return null;
93
+ }
94
+ }
95
+ /**
96
+ * Encrypt payload for recipient using ephemeral sender key (X25519 box).
97
+ * Returns ciphertext, nonce, and ephemeral public key for the envelope.
98
+ */
99
+ function encrypt(payload, recipientX25519PublicKey) {
100
+ const ephemeral = nacl.box.keyPair();
101
+ const nonce = nacl.randomBytes(BOX_NONCE_LENGTH);
102
+ const ciphertext = nacl.box(payload, nonce, recipientX25519PublicKey, ephemeral.secretKey);
103
+ return {
104
+ ciphertext,
105
+ nonce,
106
+ senderPublicKey: ephemeral.publicKey,
107
+ };
108
+ }
109
+ /**
110
+ * Decrypt payload from sender's ephemeral key using recipient's X25519 secret key.
111
+ */
112
+ function decrypt(ciphertext, nonce, senderEphemeralPublicKey, recipientX25519SecretKey) {
113
+ return nacl.box.open(ciphertext, nonce, senderEphemeralPublicKey, recipientX25519SecretKey);
114
+ }
115
+ function encodeBase64(bytes) {
116
+ return util.encodeBase64(bytes);
117
+ }
118
+ function decodeBase64(s) {
119
+ return util.decodeBase64(s);
120
+ }
121
+ //# sourceMappingURL=crypto%202.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto 2.js","sourceRoot":"","sources":["../src/crypto 2.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Minimal identity helper: keypair + nodeId. Full identity logic lives in daemon.
3
+ */
4
+ import { type Ed25519KeyPair, type X25519KeyPair } from "./crypto.js";
5
+ export interface AgentIdentityKeys {
6
+ ed25519: Ed25519KeyPair;
7
+ x25519: X25519KeyPair;
8
+ nodeId: string;
9
+ }
10
+ export declare function createAgentIdentity(): AgentIdentityKeys;
11
+ //# sourceMappingURL=identity%202.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity 2.d.ts","sourceRoot":"","sources":["../src/identity 2.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAIL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,cAAc,CAAC;IACxB,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,mBAAmB,IAAI,iBAAiB,CAKvD"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ /**
3
+ * Minimal identity helper: keypair + nodeId. Full identity logic lives in daemon.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createAgentIdentity = createAgentIdentity;
7
+ const crypto_js_1 = require("./crypto.js");
8
+ function createAgentIdentity() {
9
+ const ed25519 = (0, crypto_js_1.generateEd25519KeyPair)();
10
+ const x25519 = (0, crypto_js_1.generateX25519KeyPair)();
11
+ const nodeId = (0, crypto_js_1.nodeIdFromPublicKey)(ed25519.publicKey);
12
+ return { ed25519, x25519, nodeId };
13
+ }
14
+ //# sourceMappingURL=identity%202.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity 2.js","sourceRoot":"","sources":["../src/identity 2.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAgBH,kDAKC;AAnBD,2CAMqB;AAQrB,SAAgB,mBAAmB;IACjC,MAAM,OAAO,GAAG,IAAA,kCAAsB,GAAE,CAAC;IACzC,MAAM,MAAM,GAAG,IAAA,iCAAqB,GAAE,CAAC;IACvC,MAAM,MAAM,GAAG,IAAA,+BAAmB,EAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACtD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AACrC,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Message envelope: build, serialize, parse, verify. Product plan Section 6.4.
3
+ */
4
+ import { type Ed25519KeyPair, type X25519KeyPair } from "./crypto.js";
5
+ import type { SignetEnvelopeWire, SignetEnvelope, MessagePayload, MessageCapability } from "./types.js";
6
+ export interface CreateEnvelopeOptions {
7
+ recipientX25519PublicKey: Uint8Array;
8
+ ownerAttestation?: string;
9
+ replyTo?: string;
10
+ }
11
+ /**
12
+ * Build a wire envelope: encrypt payload for recipient, sign with from keypair.
13
+ */
14
+ export declare function createEnvelope(fromEd25519: Ed25519KeyPair, _fromX25519: X25519KeyPair, toNodeId: string, payload: MessagePayload, capability: MessageCapability, options: CreateEnvelopeOptions): SignetEnvelopeWire;
15
+ export declare function serializeEnvelope(envelope: SignetEnvelopeWire): string;
16
+ export declare function parseEnvelope(json: string): SignetEnvelopeWire;
17
+ /**
18
+ * Verify envelope signature. Sender's Ed25519 public key must be provided (e.g. from registry).
19
+ */
20
+ export declare function verifyEnvelope(envelope: SignetEnvelopeWire, senderEd25519PublicKey: Uint8Array): boolean;
21
+ /**
22
+ * Decrypt payload and return in-memory envelope. Caller must have verified signature first.
23
+ */
24
+ export declare function decryptEnvelope(wire: SignetEnvelopeWire, recipientX25519SecretKey: Uint8Array): SignetEnvelope;
25
+ //# sourceMappingURL=message%202.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message 2.d.ts","sourceRoot":"","sources":["../src/message 2.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAQL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EACV,kBAAkB,EAClB,cAAc,EAEd,cAAc,EACd,iBAAiB,EAElB,MAAM,YAAY,CAAC;AAkBpB,MAAM,WAAW,qBAAqB;IACpC,wBAAwB,EAAE,UAAU,CAAC;IACrC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,WAAW,EAAE,cAAc,EAC3B,WAAW,EAAE,aAAa,EAC1B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,cAAc,EACvB,UAAU,EAAE,iBAAiB,EAC7B,OAAO,EAAE,qBAAqB,GAC7B,kBAAkB,CAmCpB;AAkBD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,MAAM,CAEtE;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAa9D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,UAAU,GAAG,OAAO,CAQxG;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,kBAAkB,EACxB,wBAAwB,EAAE,UAAU,GACnC,cAAc,CAQhB"}
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+ /**
3
+ * Message envelope: build, serialize, parse, verify. Product plan Section 6.4.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createEnvelope = createEnvelope;
7
+ exports.serializeEnvelope = serializeEnvelope;
8
+ exports.parseEnvelope = parseEnvelope;
9
+ exports.verifyEnvelope = verifyEnvelope;
10
+ exports.decryptEnvelope = decryptEnvelope;
11
+ const crypto_js_1 = require("./crypto.js");
12
+ const types_js_1 = require("./types.js");
13
+ const ENCRYPTION_ALGORITHM = "x25519-xsalsa20-poly1305";
14
+ function randomId() {
15
+ const bytes = new Uint8Array(16);
16
+ if (typeof crypto !== "undefined" && crypto.getRandomValues) {
17
+ crypto.getRandomValues(bytes);
18
+ }
19
+ else {
20
+ for (let i = 0; i < 16; i++)
21
+ bytes[i] = Math.floor(Math.random() * 256);
22
+ }
23
+ const hex = Array.from(bytes)
24
+ .map((b) => b.toString(16).padStart(2, "0"))
25
+ .join("");
26
+ return "msg_" + hex;
27
+ }
28
+ /**
29
+ * Build a wire envelope: encrypt payload for recipient, sign with from keypair.
30
+ */
31
+ function createEnvelope(fromEd25519, _fromX25519, toNodeId, payload, capability, options) {
32
+ const id = randomId();
33
+ const timestamp = new Date().toISOString();
34
+ const from = {
35
+ nodeId: (0, crypto_js_1.nodeIdFromPublicKey)(fromEd25519.publicKey),
36
+ ...(options.ownerAttestation !== undefined && { ownerAttestation: options.ownerAttestation }),
37
+ };
38
+ const payloadBytes = new TextEncoder().encode(JSON.stringify(payload));
39
+ const { ciphertext, nonce, senderPublicKey } = (0, crypto_js_1.encrypt)(payloadBytes, options.recipientX25519PublicKey);
40
+ const encryption = {
41
+ algorithm: ENCRYPTION_ALGORITHM,
42
+ nonce: (0, crypto_js_1.encodeBase64)(nonce),
43
+ senderPublicKey: (0, crypto_js_1.encodeBase64)(senderPublicKey),
44
+ };
45
+ const envelopeWithoutSig = {
46
+ protocol: types_js_1.PROTOCOL_VERSION,
47
+ id,
48
+ timestamp,
49
+ from,
50
+ to: toNodeId,
51
+ ...(options.replyTo !== undefined && { replyTo: options.replyTo }),
52
+ capability,
53
+ payload: (0, crypto_js_1.encodeBase64)(ciphertext),
54
+ encryption,
55
+ signature: "",
56
+ };
57
+ const canonical = canonicalEnvelopeBytes(envelopeWithoutSig);
58
+ const sig = (0, crypto_js_1.sign)(canonical, fromEd25519.secretKey);
59
+ return {
60
+ ...envelopeWithoutSig,
61
+ signature: (0, crypto_js_1.encodeBase64)(sig),
62
+ };
63
+ }
64
+ function canonicalEnvelopeBytes(envelope) {
65
+ const obj = {
66
+ protocol: envelope.protocol,
67
+ id: envelope.id,
68
+ timestamp: envelope.timestamp,
69
+ from: envelope.from,
70
+ to: envelope.to,
71
+ replyTo: envelope.replyTo,
72
+ capability: envelope.capability,
73
+ payload: envelope.payload,
74
+ encryption: envelope.encryption,
75
+ signature: envelope.signature,
76
+ };
77
+ return new TextEncoder().encode(JSON.stringify(obj));
78
+ }
79
+ function serializeEnvelope(envelope) {
80
+ return JSON.stringify(envelope);
81
+ }
82
+ function parseEnvelope(json) {
83
+ const raw = JSON.parse(json);
84
+ if (typeof raw !== "object" || raw === null)
85
+ throw new Error("Invalid envelope: not an object");
86
+ const e = raw;
87
+ for (const key of ["protocol", "id", "timestamp", "from", "to", "capability", "payload", "encryption", "signature"]) {
88
+ if (!(key in e))
89
+ throw new Error(`Invalid envelope: missing ${key}`);
90
+ }
91
+ const from = e.from;
92
+ if (!from.nodeId || typeof from.nodeId !== "string")
93
+ throw new Error("Invalid envelope: from.nodeId");
94
+ if (typeof e.to !== "string")
95
+ throw new Error("Invalid envelope: to");
96
+ if (typeof e.payload !== "string")
97
+ throw new Error("Invalid envelope: payload");
98
+ if (typeof e.signature !== "string")
99
+ throw new Error("Invalid envelope: signature");
100
+ return raw;
101
+ }
102
+ /**
103
+ * Verify envelope signature. Sender's Ed25519 public key must be provided (e.g. from registry).
104
+ */
105
+ function verifyEnvelope(envelope, senderEd25519PublicKey) {
106
+ const envelopeWithoutSig = {
107
+ ...envelope,
108
+ signature: "",
109
+ };
110
+ const canonical = canonicalEnvelopeBytes(envelopeWithoutSig);
111
+ const sig = (0, crypto_js_1.decodeBase64)(envelope.signature);
112
+ return (0, crypto_js_1.verify)(canonical, sig, senderEd25519PublicKey);
113
+ }
114
+ /**
115
+ * Decrypt payload and return in-memory envelope. Caller must have verified signature first.
116
+ */
117
+ function decryptEnvelope(wire, recipientX25519SecretKey) {
118
+ const ciphertext = (0, crypto_js_1.decodeBase64)(wire.payload);
119
+ const nonce = (0, crypto_js_1.decodeBase64)(wire.encryption.nonce);
120
+ const senderPublicKey = (0, crypto_js_1.decodeBase64)(wire.encryption.senderPublicKey);
121
+ const plain = (0, crypto_js_1.decrypt)(ciphertext, nonce, senderPublicKey, recipientX25519SecretKey);
122
+ if (!plain)
123
+ throw new Error("Decryption failed");
124
+ const payload = JSON.parse(new TextDecoder().decode(plain));
125
+ return { ...wire, payload };
126
+ }
127
+ //# sourceMappingURL=message%202.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message 2.js","sourceRoot":"","sources":["../src/message 2.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onsignet/core",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Signet protocol core: crypto, message format, identity",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.js",