@unicitylabs/nostr-js-sdk 0.0.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 +290 -0
- package/dist/browser/index.js +8444 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/index.min.js +12 -0
- package/dist/browser/index.min.js.map +1 -0
- package/dist/browser/index.umd.js +8524 -0
- package/dist/browser/index.umd.js.map +1 -0
- package/dist/browser/index.umd.min.js +12 -0
- package/dist/browser/index.umd.min.js.map +1 -0
- package/dist/cjs/NostrKeyManager.js +265 -0
- package/dist/cjs/NostrKeyManager.js.map +1 -0
- package/dist/cjs/client/NostrClient.js +518 -0
- package/dist/cjs/client/NostrClient.js.map +1 -0
- package/dist/cjs/client/NostrEventListener.js +31 -0
- package/dist/cjs/client/NostrEventListener.js.map +1 -0
- package/dist/cjs/client/WebSocketAdapter.js +90 -0
- package/dist/cjs/client/WebSocketAdapter.js.map +1 -0
- package/dist/cjs/client/index.js +18 -0
- package/dist/cjs/client/index.js.map +1 -0
- package/dist/cjs/crypto/bech32.js +201 -0
- package/dist/cjs/crypto/bech32.js.map +1 -0
- package/dist/cjs/crypto/index.js +49 -0
- package/dist/cjs/crypto/index.js.map +1 -0
- package/dist/cjs/crypto/nip04.js +327 -0
- package/dist/cjs/crypto/nip04.js.map +1 -0
- package/dist/cjs/crypto/schnorr.js +101 -0
- package/dist/cjs/crypto/schnorr.js.map +1 -0
- package/dist/cjs/index.js +57 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/nametag/NametagBinding.js +196 -0
- package/dist/cjs/nametag/NametagBinding.js.map +1 -0
- package/dist/cjs/nametag/NametagUtils.js +156 -0
- package/dist/cjs/nametag/NametagUtils.js.map +1 -0
- package/dist/cjs/nametag/index.js +47 -0
- package/dist/cjs/nametag/index.js.map +1 -0
- package/dist/cjs/protocol/Event.js +209 -0
- package/dist/cjs/protocol/Event.js.map +1 -0
- package/dist/cjs/protocol/EventKinds.js +126 -0
- package/dist/cjs/protocol/EventKinds.js.map +1 -0
- package/dist/cjs/protocol/Filter.js +202 -0
- package/dist/cjs/protocol/Filter.js.map +1 -0
- package/dist/cjs/protocol/index.js +50 -0
- package/dist/cjs/protocol/index.js.map +1 -0
- package/dist/cjs/token/TokenTransferProtocol.js +196 -0
- package/dist/cjs/token/TokenTransferProtocol.js.map +1 -0
- package/dist/cjs/token/index.js +45 -0
- package/dist/cjs/token/index.js.map +1 -0
- package/dist/esm/NostrKeyManager.js +228 -0
- package/dist/esm/NostrKeyManager.js.map +1 -0
- package/dist/esm/client/NostrClient.js +481 -0
- package/dist/esm/client/NostrClient.js.map +1 -0
- package/dist/esm/client/NostrEventListener.js +27 -0
- package/dist/esm/client/NostrEventListener.js.map +1 -0
- package/dist/esm/client/WebSocketAdapter.js +52 -0
- package/dist/esm/client/WebSocketAdapter.js.map +1 -0
- package/dist/esm/client/index.js +7 -0
- package/dist/esm/client/index.js.map +1 -0
- package/dist/esm/crypto/bech32.js +193 -0
- package/dist/esm/crypto/bech32.js.map +1 -0
- package/dist/esm/crypto/index.js +10 -0
- package/dist/esm/crypto/index.js.map +1 -0
- package/dist/esm/crypto/nip04.js +286 -0
- package/dist/esm/crypto/nip04.js.map +1 -0
- package/dist/esm/crypto/schnorr.js +93 -0
- package/dist/esm/crypto/schnorr.js.map +1 -0
- package/dist/esm/index.js +32 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/nametag/NametagBinding.js +155 -0
- package/dist/esm/nametag/NametagBinding.js.map +1 -0
- package/dist/esm/nametag/NametagUtils.js +149 -0
- package/dist/esm/nametag/NametagUtils.js.map +1 -0
- package/dist/esm/nametag/index.js +8 -0
- package/dist/esm/nametag/index.js.map +1 -0
- package/dist/esm/protocol/Event.js +172 -0
- package/dist/esm/protocol/Event.js.map +1 -0
- package/dist/esm/protocol/EventKinds.js +119 -0
- package/dist/esm/protocol/EventKinds.js.map +1 -0
- package/dist/esm/protocol/Filter.js +197 -0
- package/dist/esm/protocol/Filter.js.map +1 -0
- package/dist/esm/protocol/index.js +8 -0
- package/dist/esm/protocol/index.js.map +1 -0
- package/dist/esm/token/TokenTransferProtocol.js +154 -0
- package/dist/esm/token/TokenTransferProtocol.js.map +1 -0
- package/dist/esm/token/index.js +6 -0
- package/dist/esm/token/index.js.map +1 -0
- package/dist/types/NostrKeyManager.d.ts +150 -0
- package/dist/types/NostrKeyManager.d.ts.map +1 -0
- package/dist/types/client/NostrClient.d.ts +154 -0
- package/dist/types/client/NostrClient.d.ts.map +1 -0
- package/dist/types/client/NostrEventListener.d.ts +40 -0
- package/dist/types/client/NostrEventListener.d.ts.map +1 -0
- package/dist/types/client/WebSocketAdapter.d.ts +55 -0
- package/dist/types/client/WebSocketAdapter.d.ts.map +1 -0
- package/dist/types/client/index.d.ts +9 -0
- package/dist/types/client/index.d.ts.map +1 -0
- package/dist/types/crypto/bech32.d.ts +51 -0
- package/dist/types/crypto/bech32.d.ts.map +1 -0
- package/dist/types/crypto/index.d.ts +10 -0
- package/dist/types/crypto/index.d.ts.map +1 -0
- package/dist/types/crypto/nip04.d.ts +56 -0
- package/dist/types/crypto/nip04.d.ts.map +1 -0
- package/dist/types/crypto/schnorr.d.ts +47 -0
- package/dist/types/crypto/schnorr.d.ts.map +1 -0
- package/dist/types/index.d.ts +31 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/nametag/NametagBinding.d.ts +68 -0
- package/dist/types/nametag/NametagBinding.d.ts.map +1 -0
- package/dist/types/nametag/NametagUtils.d.ts +44 -0
- package/dist/types/nametag/NametagUtils.d.ts.map +1 -0
- package/dist/types/nametag/index.d.ts +8 -0
- package/dist/types/nametag/index.d.ts.map +1 -0
- package/dist/types/protocol/Event.d.ts +112 -0
- package/dist/types/protocol/Event.d.ts.map +1 -0
- package/dist/types/protocol/EventKinds.d.ts +62 -0
- package/dist/types/protocol/EventKinds.d.ts.map +1 -0
- package/dist/types/protocol/Filter.d.ts +146 -0
- package/dist/types/protocol/Filter.d.ts.map +1 -0
- package/dist/types/protocol/index.d.ts +10 -0
- package/dist/types/protocol/index.d.ts.map +1 -0
- package/dist/types/token/TokenTransferProtocol.d.ts +67 -0
- package/dist/types/token/TokenTransferProtocol.d.ts.map +1 -0
- package/dist/types/token/index.d.ts +6 -0
- package/dist/types/token/index.d.ts.map +1 -0
- package/package.json +89 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Client module - Nostr relay client
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.CLOSED = exports.CLOSING = exports.OPEN = exports.CONNECTING = exports.extractMessageData = exports.createWebSocket = exports.CallbackEventListener = exports.NostrClient = void 0;
|
|
7
|
+
var NostrClient_js_1 = require("./NostrClient.js");
|
|
8
|
+
Object.defineProperty(exports, "NostrClient", { enumerable: true, get: function () { return NostrClient_js_1.NostrClient; } });
|
|
9
|
+
var NostrEventListener_js_1 = require("./NostrEventListener.js");
|
|
10
|
+
Object.defineProperty(exports, "CallbackEventListener", { enumerable: true, get: function () { return NostrEventListener_js_1.CallbackEventListener; } });
|
|
11
|
+
var WebSocketAdapter_js_1 = require("./WebSocketAdapter.js");
|
|
12
|
+
Object.defineProperty(exports, "createWebSocket", { enumerable: true, get: function () { return WebSocketAdapter_js_1.createWebSocket; } });
|
|
13
|
+
Object.defineProperty(exports, "extractMessageData", { enumerable: true, get: function () { return WebSocketAdapter_js_1.extractMessageData; } });
|
|
14
|
+
Object.defineProperty(exports, "CONNECTING", { enumerable: true, get: function () { return WebSocketAdapter_js_1.CONNECTING; } });
|
|
15
|
+
Object.defineProperty(exports, "OPEN", { enumerable: true, get: function () { return WebSocketAdapter_js_1.OPEN; } });
|
|
16
|
+
Object.defineProperty(exports, "CLOSING", { enumerable: true, get: function () { return WebSocketAdapter_js_1.CLOSING; } });
|
|
17
|
+
Object.defineProperty(exports, "CLOSED", { enumerable: true, get: function () { return WebSocketAdapter_js_1.CLOSED; } });
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/client/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,mDAA+C;AAAtC,6GAAA,WAAW,OAAA;AACpB,iEAAgE;AAAvD,8HAAA,qBAAqB,OAAA;AAE9B,6DAO+B;AAN7B,sHAAA,eAAe,OAAA;AACf,yHAAA,kBAAkB,OAAA;AAClB,iHAAA,UAAU,OAAA;AACV,2GAAA,IAAI,OAAA;AACJ,8GAAA,OAAO,OAAA;AACP,6GAAA,MAAM,OAAA"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Bech32 encoding/decoding for NIP-19 key formats (npub, nsec).
|
|
4
|
+
* Implements the Bech32 specification for Nostr key encoding.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.encode = encode;
|
|
8
|
+
exports.decode = decode;
|
|
9
|
+
exports.encodeNpub = encodeNpub;
|
|
10
|
+
exports.decodeNpub = decodeNpub;
|
|
11
|
+
exports.encodeNsec = encodeNsec;
|
|
12
|
+
exports.decodeNsec = decodeNsec;
|
|
13
|
+
const CHARSET = 'qpzry9x8gf2tvdw0s3jn54khce6mua7l';
|
|
14
|
+
const GENERATOR = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3];
|
|
15
|
+
/**
|
|
16
|
+
* Compute the Bech32 polymod checksum
|
|
17
|
+
*/
|
|
18
|
+
function polymod(values) {
|
|
19
|
+
let chk = 1;
|
|
20
|
+
for (const v of values) {
|
|
21
|
+
const top = chk >> 25;
|
|
22
|
+
chk = ((chk & 0x1ffffff) << 5) ^ v;
|
|
23
|
+
for (let i = 0; i < 5; i++) {
|
|
24
|
+
if ((top >> i) & 1) {
|
|
25
|
+
chk ^= GENERATOR[i];
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return chk;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Expand the human-readable part for checksum computation
|
|
33
|
+
*/
|
|
34
|
+
function hrpExpand(hrp) {
|
|
35
|
+
const result = [];
|
|
36
|
+
for (let i = 0; i < hrp.length; i++) {
|
|
37
|
+
result.push(hrp.charCodeAt(i) >> 5);
|
|
38
|
+
}
|
|
39
|
+
result.push(0);
|
|
40
|
+
for (let i = 0; i < hrp.length; i++) {
|
|
41
|
+
result.push(hrp.charCodeAt(i) & 31);
|
|
42
|
+
}
|
|
43
|
+
return result;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Verify the Bech32 checksum
|
|
47
|
+
*/
|
|
48
|
+
function verifyChecksum(hrp, data) {
|
|
49
|
+
return polymod(hrpExpand(hrp).concat(data)) === 1;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Create the Bech32 checksum
|
|
53
|
+
*/
|
|
54
|
+
function createChecksum(hrp, data) {
|
|
55
|
+
const values = hrpExpand(hrp).concat(data).concat([0, 0, 0, 0, 0, 0]);
|
|
56
|
+
const mod = polymod(values) ^ 1;
|
|
57
|
+
const result = [];
|
|
58
|
+
for (let i = 0; i < 6; i++) {
|
|
59
|
+
result.push((mod >> (5 * (5 - i))) & 31);
|
|
60
|
+
}
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Convert bits between different widths
|
|
65
|
+
*/
|
|
66
|
+
function convertBits(data, fromBits, toBits, pad) {
|
|
67
|
+
let acc = 0;
|
|
68
|
+
let bits = 0;
|
|
69
|
+
const result = [];
|
|
70
|
+
const maxv = (1 << toBits) - 1;
|
|
71
|
+
for (const value of data) {
|
|
72
|
+
if (value < 0 || value >> fromBits !== 0) {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
acc = (acc << fromBits) | value;
|
|
76
|
+
bits += fromBits;
|
|
77
|
+
while (bits >= toBits) {
|
|
78
|
+
bits -= toBits;
|
|
79
|
+
result.push((acc >> bits) & maxv);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (pad) {
|
|
83
|
+
if (bits > 0) {
|
|
84
|
+
result.push((acc << (toBits - bits)) & maxv);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
else if (bits >= fromBits || ((acc << (toBits - bits)) & maxv) !== 0) {
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
return result;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Encode data with Bech32 checksum
|
|
94
|
+
* @param hrp Human-readable part (e.g., "npub", "nsec")
|
|
95
|
+
* @param data Data bytes to encode
|
|
96
|
+
* @returns Bech32-encoded string
|
|
97
|
+
*/
|
|
98
|
+
function encode(hrp, data) {
|
|
99
|
+
const values = convertBits(Array.from(data), 8, 5, true);
|
|
100
|
+
if (values === null) {
|
|
101
|
+
throw new Error('Failed to convert bits for Bech32 encoding');
|
|
102
|
+
}
|
|
103
|
+
const checksum = createChecksum(hrp, values);
|
|
104
|
+
const combined = values.concat(checksum);
|
|
105
|
+
let result = hrp + '1';
|
|
106
|
+
for (const v of combined) {
|
|
107
|
+
result += CHARSET.charAt(v);
|
|
108
|
+
}
|
|
109
|
+
return result;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Decode a Bech32-encoded string
|
|
113
|
+
* @param bech32String The Bech32 string to decode
|
|
114
|
+
* @returns Decoded data with human-readable part
|
|
115
|
+
*/
|
|
116
|
+
function decode(bech32String) {
|
|
117
|
+
const str = bech32String.toLowerCase();
|
|
118
|
+
// Find separator
|
|
119
|
+
const pos = str.lastIndexOf('1');
|
|
120
|
+
if (pos < 1 || pos + 7 > str.length || str.length > 90) {
|
|
121
|
+
throw new Error('Invalid Bech32 string');
|
|
122
|
+
}
|
|
123
|
+
const hrp = str.slice(0, pos);
|
|
124
|
+
const dataChars = str.slice(pos + 1);
|
|
125
|
+
// Decode data characters
|
|
126
|
+
const data = [];
|
|
127
|
+
for (const char of dataChars) {
|
|
128
|
+
const idx = CHARSET.indexOf(char);
|
|
129
|
+
if (idx === -1) {
|
|
130
|
+
throw new Error(`Invalid character '${char}' in Bech32 string`);
|
|
131
|
+
}
|
|
132
|
+
data.push(idx);
|
|
133
|
+
}
|
|
134
|
+
// Verify checksum
|
|
135
|
+
if (!verifyChecksum(hrp, data)) {
|
|
136
|
+
throw new Error('Invalid Bech32 checksum');
|
|
137
|
+
}
|
|
138
|
+
// Remove checksum and convert bits
|
|
139
|
+
const dataWithoutChecksum = data.slice(0, -6);
|
|
140
|
+
const converted = convertBits(dataWithoutChecksum, 5, 8, false);
|
|
141
|
+
if (converted === null) {
|
|
142
|
+
throw new Error('Failed to convert bits in Bech32 decoding');
|
|
143
|
+
}
|
|
144
|
+
return {
|
|
145
|
+
hrp,
|
|
146
|
+
data: new Uint8Array(converted),
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Encode a public key as npub
|
|
151
|
+
* @param publicKey 32-byte public key
|
|
152
|
+
* @returns npub-encoded string
|
|
153
|
+
*/
|
|
154
|
+
function encodeNpub(publicKey) {
|
|
155
|
+
if (publicKey.length !== 32) {
|
|
156
|
+
throw new Error('Public key must be 32 bytes');
|
|
157
|
+
}
|
|
158
|
+
return encode('npub', publicKey);
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Decode an npub string to public key bytes
|
|
162
|
+
* @param npub npub-encoded string
|
|
163
|
+
* @returns 32-byte public key
|
|
164
|
+
*/
|
|
165
|
+
function decodeNpub(npub) {
|
|
166
|
+
const decoded = decode(npub);
|
|
167
|
+
if (decoded.hrp !== 'npub') {
|
|
168
|
+
throw new Error(`Expected 'npub' prefix, got '${decoded.hrp}'`);
|
|
169
|
+
}
|
|
170
|
+
if (decoded.data.length !== 32) {
|
|
171
|
+
throw new Error(`Expected 32 bytes, got ${decoded.data.length}`);
|
|
172
|
+
}
|
|
173
|
+
return decoded.data;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Encode a private key as nsec
|
|
177
|
+
* @param privateKey 32-byte private key
|
|
178
|
+
* @returns nsec-encoded string
|
|
179
|
+
*/
|
|
180
|
+
function encodeNsec(privateKey) {
|
|
181
|
+
if (privateKey.length !== 32) {
|
|
182
|
+
throw new Error('Private key must be 32 bytes');
|
|
183
|
+
}
|
|
184
|
+
return encode('nsec', privateKey);
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Decode an nsec string to private key bytes
|
|
188
|
+
* @param nsec nsec-encoded string
|
|
189
|
+
* @returns 32-byte private key
|
|
190
|
+
*/
|
|
191
|
+
function decodeNsec(nsec) {
|
|
192
|
+
const decoded = decode(nsec);
|
|
193
|
+
if (decoded.hrp !== 'nsec') {
|
|
194
|
+
throw new Error(`Expected 'nsec' prefix, got '${decoded.hrp}'`);
|
|
195
|
+
}
|
|
196
|
+
if (decoded.data.length !== 32) {
|
|
197
|
+
throw new Error(`Expected 32 bytes, got ${decoded.data.length}`);
|
|
198
|
+
}
|
|
199
|
+
return decoded.data;
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=bech32.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bech32.js","sourceRoot":"","sources":["../../../src/crypto/bech32.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Crypto module - Cryptographic utilities for Nostr protocol
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
22
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
23
|
+
};
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.NIP04 = exports.SchnorrSigner = exports.Bech32 = void 0;
|
|
43
|
+
__exportStar(require("./bech32.js"), exports);
|
|
44
|
+
exports.Bech32 = __importStar(require("./bech32.js"));
|
|
45
|
+
__exportStar(require("./schnorr.js"), exports);
|
|
46
|
+
exports.SchnorrSigner = __importStar(require("./schnorr.js"));
|
|
47
|
+
__exportStar(require("./nip04.js"), exports);
|
|
48
|
+
exports.NIP04 = __importStar(require("./nip04.js"));
|
|
49
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/crypto/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,8CAA4B;AAC5B,sDAAsC;AACtC,+CAA6B;AAC7B,8DAA8C;AAC9C,6CAA2B;AAC3B,oDAAoC"}
|
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* NIP-04 Encryption implementation.
|
|
4
|
+
* AES-256-CBC encryption with ECDH key agreement and optional GZIP compression.
|
|
5
|
+
* Works in both Node.js and browser environments.
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
+
}) : function(o, v) {
|
|
21
|
+
o["default"] = v;
|
|
22
|
+
});
|
|
23
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
+
var ownKeys = function(o) {
|
|
25
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
+
var ar = [];
|
|
27
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
+
return ar;
|
|
29
|
+
};
|
|
30
|
+
return ownKeys(o);
|
|
31
|
+
};
|
|
32
|
+
return function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
40
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
exports.deriveSharedSecret = deriveSharedSecret;
|
|
42
|
+
exports.deriveSharedSecretHex = deriveSharedSecretHex;
|
|
43
|
+
exports.encrypt = encrypt;
|
|
44
|
+
exports.encryptHex = encryptHex;
|
|
45
|
+
exports.decrypt = decrypt;
|
|
46
|
+
exports.decryptHex = decryptHex;
|
|
47
|
+
const secp256k1_1 = require("@noble/curves/secp256k1");
|
|
48
|
+
const sha256_1 = require("@noble/hashes/sha256");
|
|
49
|
+
const utils_1 = require("@noble/hashes/utils");
|
|
50
|
+
/** Compression threshold in bytes */
|
|
51
|
+
const COMPRESSION_THRESHOLD = 1024;
|
|
52
|
+
/** Prefix for compressed messages */
|
|
53
|
+
const COMPRESSION_PREFIX = 'gz:';
|
|
54
|
+
/**
|
|
55
|
+
* Convert a Uint8Array to base64 string (browser and Node.js compatible)
|
|
56
|
+
*/
|
|
57
|
+
function toBase64(bytes) {
|
|
58
|
+
if (typeof Buffer !== 'undefined') {
|
|
59
|
+
return Buffer.from(bytes).toString('base64');
|
|
60
|
+
}
|
|
61
|
+
// Browser environment
|
|
62
|
+
let binary = '';
|
|
63
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
64
|
+
binary += String.fromCharCode(bytes[i]);
|
|
65
|
+
}
|
|
66
|
+
return btoa(binary);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Convert a base64 string to Uint8Array (browser and Node.js compatible)
|
|
70
|
+
*/
|
|
71
|
+
function fromBase64(base64) {
|
|
72
|
+
if (typeof Buffer !== 'undefined') {
|
|
73
|
+
return new Uint8Array(Buffer.from(base64, 'base64'));
|
|
74
|
+
}
|
|
75
|
+
// Browser environment
|
|
76
|
+
const binary = atob(base64);
|
|
77
|
+
const bytes = new Uint8Array(binary.length);
|
|
78
|
+
for (let i = 0; i < binary.length; i++) {
|
|
79
|
+
bytes[i] = binary.charCodeAt(i);
|
|
80
|
+
}
|
|
81
|
+
return bytes;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Convert Uint8Array to a standard ArrayBuffer view for Web Crypto API compatibility
|
|
85
|
+
*/
|
|
86
|
+
function toBufferSource(data) {
|
|
87
|
+
// Create a new ArrayBuffer to ensure compatibility with Web Crypto API
|
|
88
|
+
const buffer = new ArrayBuffer(data.length);
|
|
89
|
+
new Uint8Array(buffer).set(data);
|
|
90
|
+
return buffer;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* GZIP compress data (browser and Node.js compatible)
|
|
94
|
+
*/
|
|
95
|
+
async function compress(data) {
|
|
96
|
+
// Check for Node.js environment first
|
|
97
|
+
if (typeof process !== 'undefined' && process.versions?.node) {
|
|
98
|
+
// Node.js environment - use native zlib
|
|
99
|
+
const { gzipSync } = await Promise.resolve().then(() => __importStar(require('zlib')));
|
|
100
|
+
return new Uint8Array(gzipSync(Buffer.from(data)));
|
|
101
|
+
}
|
|
102
|
+
else if (typeof CompressionStream !== 'undefined') {
|
|
103
|
+
// Browser with Compression Streams API
|
|
104
|
+
const stream = new CompressionStream('gzip');
|
|
105
|
+
const writer = stream.writable.getWriter();
|
|
106
|
+
writer.write(toBufferSource(data));
|
|
107
|
+
writer.close();
|
|
108
|
+
const chunks = [];
|
|
109
|
+
const reader = stream.readable.getReader();
|
|
110
|
+
while (true) {
|
|
111
|
+
const { done, value } = await reader.read();
|
|
112
|
+
if (done)
|
|
113
|
+
break;
|
|
114
|
+
chunks.push(value);
|
|
115
|
+
}
|
|
116
|
+
const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);
|
|
117
|
+
const result = new Uint8Array(totalLength);
|
|
118
|
+
let offset = 0;
|
|
119
|
+
for (const chunk of chunks) {
|
|
120
|
+
result.set(chunk, offset);
|
|
121
|
+
offset += chunk.length;
|
|
122
|
+
}
|
|
123
|
+
return result;
|
|
124
|
+
}
|
|
125
|
+
throw new Error('GZIP compression not supported in this environment');
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* GZIP decompress data (browser and Node.js compatible)
|
|
129
|
+
*/
|
|
130
|
+
async function decompress(data) {
|
|
131
|
+
// Check for Node.js environment first
|
|
132
|
+
if (typeof process !== 'undefined' && process.versions?.node) {
|
|
133
|
+
// Node.js environment - use native zlib
|
|
134
|
+
const { gunzipSync } = await Promise.resolve().then(() => __importStar(require('zlib')));
|
|
135
|
+
return new Uint8Array(gunzipSync(Buffer.from(data)));
|
|
136
|
+
}
|
|
137
|
+
else if (typeof DecompressionStream !== 'undefined') {
|
|
138
|
+
// Browser with Compression Streams API
|
|
139
|
+
const stream = new DecompressionStream('gzip');
|
|
140
|
+
const writer = stream.writable.getWriter();
|
|
141
|
+
writer.write(toBufferSource(data));
|
|
142
|
+
writer.close();
|
|
143
|
+
const chunks = [];
|
|
144
|
+
const reader = stream.readable.getReader();
|
|
145
|
+
while (true) {
|
|
146
|
+
const { done, value } = await reader.read();
|
|
147
|
+
if (done)
|
|
148
|
+
break;
|
|
149
|
+
chunks.push(value);
|
|
150
|
+
}
|
|
151
|
+
const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);
|
|
152
|
+
const result = new Uint8Array(totalLength);
|
|
153
|
+
let offset = 0;
|
|
154
|
+
for (const chunk of chunks) {
|
|
155
|
+
result.set(chunk, offset);
|
|
156
|
+
offset += chunk.length;
|
|
157
|
+
}
|
|
158
|
+
return result;
|
|
159
|
+
}
|
|
160
|
+
throw new Error('GZIP decompression not supported in this environment');
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Import an AES-256-CBC key for encryption/decryption
|
|
164
|
+
*/
|
|
165
|
+
async function importKey(keyBytes) {
|
|
166
|
+
const crypto = globalThis.crypto;
|
|
167
|
+
return crypto.subtle.importKey('raw', toBufferSource(keyBytes), { name: 'AES-CBC' }, false, [
|
|
168
|
+
'encrypt',
|
|
169
|
+
'decrypt',
|
|
170
|
+
]);
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* AES-256-CBC encrypt
|
|
174
|
+
*/
|
|
175
|
+
async function aesEncrypt(plaintext, key, iv) {
|
|
176
|
+
const crypto = globalThis.crypto;
|
|
177
|
+
const cryptoKey = await importKey(key);
|
|
178
|
+
const ciphertext = await crypto.subtle.encrypt({ name: 'AES-CBC', iv: toBufferSource(iv) }, cryptoKey, toBufferSource(plaintext));
|
|
179
|
+
return new Uint8Array(ciphertext);
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* AES-256-CBC decrypt
|
|
183
|
+
*/
|
|
184
|
+
async function aesDecrypt(ciphertext, key, iv) {
|
|
185
|
+
const crypto = globalThis.crypto;
|
|
186
|
+
const cryptoKey = await importKey(key);
|
|
187
|
+
const plaintext = await crypto.subtle.decrypt({ name: 'AES-CBC', iv: toBufferSource(iv) }, cryptoKey, toBufferSource(ciphertext));
|
|
188
|
+
return new Uint8Array(plaintext);
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Derive a shared secret using ECDH (NIP-04 compatible).
|
|
192
|
+
* Returns SHA-256(sharedPoint.x) as the shared secret.
|
|
193
|
+
* @param myPrivateKey 32-byte private key
|
|
194
|
+
* @param theirPublicKey 32-byte x-only public key
|
|
195
|
+
* @returns 32-byte shared secret
|
|
196
|
+
*/
|
|
197
|
+
function deriveSharedSecret(myPrivateKey, theirPublicKey) {
|
|
198
|
+
if (myPrivateKey.length !== 32) {
|
|
199
|
+
throw new Error('Private key must be 32 bytes');
|
|
200
|
+
}
|
|
201
|
+
if (theirPublicKey.length !== 32) {
|
|
202
|
+
throw new Error('Public key must be 32 bytes');
|
|
203
|
+
}
|
|
204
|
+
// Reconstruct the full public key point from x-coordinate (assume even y)
|
|
205
|
+
// For secp256k1, we need to prefix with 02 for even y
|
|
206
|
+
const fullPublicKey = new Uint8Array(33);
|
|
207
|
+
fullPublicKey[0] = 0x02;
|
|
208
|
+
fullPublicKey.set(theirPublicKey, 1);
|
|
209
|
+
// Compute ECDH shared point
|
|
210
|
+
const sharedPoint = secp256k1_1.secp256k1.getSharedSecret(myPrivateKey, fullPublicKey);
|
|
211
|
+
// Extract x-coordinate (skip the 0x04 prefix byte, take next 32 bytes)
|
|
212
|
+
const sharedX = sharedPoint.slice(1, 33);
|
|
213
|
+
// Return SHA-256 of the x-coordinate
|
|
214
|
+
return (0, sha256_1.sha256)(sharedX);
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Derive a shared secret from hex-encoded keys
|
|
218
|
+
* @param myPrivateKeyHex Hex-encoded private key
|
|
219
|
+
* @param theirPublicKeyHex Hex-encoded public key
|
|
220
|
+
* @returns Hex-encoded shared secret
|
|
221
|
+
*/
|
|
222
|
+
function deriveSharedSecretHex(myPrivateKeyHex, theirPublicKeyHex) {
|
|
223
|
+
const myPrivateKey = (0, utils_1.hexToBytes)(myPrivateKeyHex);
|
|
224
|
+
const theirPublicKey = (0, utils_1.hexToBytes)(theirPublicKeyHex);
|
|
225
|
+
return (0, utils_1.bytesToHex)(deriveSharedSecret(myPrivateKey, theirPublicKey));
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Encrypt a message using NIP-04 encryption.
|
|
229
|
+
* Format: "base64(ciphertext)?iv=base64(iv)"
|
|
230
|
+
* If message > 1KB, automatically compresses with GZIP: "gz:base64(compressed)?iv=base64(iv)"
|
|
231
|
+
* @param message Message to encrypt
|
|
232
|
+
* @param myPrivateKey 32-byte private key
|
|
233
|
+
* @param theirPublicKey 32-byte x-only public key
|
|
234
|
+
* @returns Encrypted content string
|
|
235
|
+
*/
|
|
236
|
+
async function encrypt(message, myPrivateKey, theirPublicKey) {
|
|
237
|
+
const encoder = new TextEncoder();
|
|
238
|
+
let plaintext = encoder.encode(message);
|
|
239
|
+
// Check if compression is needed
|
|
240
|
+
let useCompression = false;
|
|
241
|
+
let plaintextToEncrypt = plaintext;
|
|
242
|
+
if (plaintext.length > COMPRESSION_THRESHOLD) {
|
|
243
|
+
const compressed = await compress(plaintext);
|
|
244
|
+
// Only use compression if it actually reduces size
|
|
245
|
+
if (compressed.length < plaintext.length) {
|
|
246
|
+
plaintextToEncrypt = new Uint8Array(compressed);
|
|
247
|
+
useCompression = true;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
// Derive shared secret
|
|
251
|
+
const sharedSecret = deriveSharedSecret(myPrivateKey, theirPublicKey);
|
|
252
|
+
// Generate random IV
|
|
253
|
+
const iv = (0, utils_1.randomBytes)(16);
|
|
254
|
+
// Encrypt
|
|
255
|
+
const ciphertext = await aesEncrypt(plaintextToEncrypt, sharedSecret, iv);
|
|
256
|
+
// Format output
|
|
257
|
+
const ciphertextBase64 = toBase64(ciphertext);
|
|
258
|
+
const ivBase64 = toBase64(iv);
|
|
259
|
+
if (useCompression) {
|
|
260
|
+
return `${COMPRESSION_PREFIX}${ciphertextBase64}?iv=${ivBase64}`;
|
|
261
|
+
}
|
|
262
|
+
return `${ciphertextBase64}?iv=${ivBase64}`;
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Encrypt a message using hex-encoded keys
|
|
266
|
+
* @param message Message to encrypt
|
|
267
|
+
* @param myPrivateKeyHex Hex-encoded private key
|
|
268
|
+
* @param theirPublicKeyHex Hex-encoded public key
|
|
269
|
+
* @returns Encrypted content string
|
|
270
|
+
*/
|
|
271
|
+
async function encryptHex(message, myPrivateKeyHex, theirPublicKeyHex) {
|
|
272
|
+
const myPrivateKey = (0, utils_1.hexToBytes)(myPrivateKeyHex);
|
|
273
|
+
const theirPublicKey = (0, utils_1.hexToBytes)(theirPublicKeyHex);
|
|
274
|
+
return encrypt(message, myPrivateKey, theirPublicKey);
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Decrypt a NIP-04 encrypted message.
|
|
278
|
+
* Automatically decompresses if the message was compressed.
|
|
279
|
+
* @param encryptedContent Encrypted content string
|
|
280
|
+
* @param myPrivateKey 32-byte private key
|
|
281
|
+
* @param theirPublicKey 32-byte x-only public key
|
|
282
|
+
* @returns Decrypted message
|
|
283
|
+
*/
|
|
284
|
+
async function decrypt(encryptedContent, myPrivateKey, theirPublicKey) {
|
|
285
|
+
// Check for compression prefix
|
|
286
|
+
let content = encryptedContent;
|
|
287
|
+
let isCompressed = false;
|
|
288
|
+
if (content.startsWith(COMPRESSION_PREFIX)) {
|
|
289
|
+
content = content.slice(COMPRESSION_PREFIX.length);
|
|
290
|
+
isCompressed = true;
|
|
291
|
+
}
|
|
292
|
+
// Parse format: "base64(ciphertext)?iv=base64(iv)"
|
|
293
|
+
const parts = content.split('?iv=');
|
|
294
|
+
if (parts.length !== 2) {
|
|
295
|
+
throw new Error('Invalid encrypted content format');
|
|
296
|
+
}
|
|
297
|
+
const ciphertextBase64 = parts[0];
|
|
298
|
+
const ivBase64 = parts[1];
|
|
299
|
+
const ciphertext = fromBase64(ciphertextBase64);
|
|
300
|
+
const iv = fromBase64(ivBase64);
|
|
301
|
+
if (iv.length !== 16) {
|
|
302
|
+
throw new Error('Invalid IV length');
|
|
303
|
+
}
|
|
304
|
+
// Derive shared secret
|
|
305
|
+
const sharedSecret = deriveSharedSecret(myPrivateKey, theirPublicKey);
|
|
306
|
+
// Decrypt
|
|
307
|
+
let plaintext = await aesDecrypt(ciphertext, sharedSecret, iv);
|
|
308
|
+
// Decompress if needed
|
|
309
|
+
if (isCompressed) {
|
|
310
|
+
plaintext = await decompress(plaintext);
|
|
311
|
+
}
|
|
312
|
+
const decoder = new TextDecoder();
|
|
313
|
+
return decoder.decode(plaintext);
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Decrypt a message using hex-encoded keys
|
|
317
|
+
* @param encryptedContent Encrypted content string
|
|
318
|
+
* @param myPrivateKeyHex Hex-encoded private key
|
|
319
|
+
* @param theirPublicKeyHex Hex-encoded public key
|
|
320
|
+
* @returns Decrypted message
|
|
321
|
+
*/
|
|
322
|
+
async function decryptHex(encryptedContent, myPrivateKeyHex, theirPublicKeyHex) {
|
|
323
|
+
const myPrivateKey = (0, utils_1.hexToBytes)(myPrivateKeyHex);
|
|
324
|
+
const theirPublicKey = (0, utils_1.hexToBytes)(theirPublicKeyHex);
|
|
325
|
+
return decrypt(encryptedContent, myPrivateKey, theirPublicKey);
|
|
326
|
+
}
|
|
327
|
+
//# sourceMappingURL=nip04.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip04.js","sourceRoot":"","sources":["../../../src/crypto/nip04.ts"],"names":[],"mappings":"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"}
|