@astrox/identity 0.0.24 → 0.0.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/lib/cjs/buffer.d.ts +10 -0
  2. package/lib/cjs/buffer.js +21 -0
  3. package/lib/cjs/buffer.js.map +1 -0
  4. package/lib/cjs/identity/delegation.d.ts +131 -0
  5. package/lib/cjs/identity/delegation.js +244 -0
  6. package/lib/cjs/identity/delegation.js.map +1 -0
  7. package/lib/cjs/identity/der.d.ts +35 -0
  8. package/lib/cjs/identity/der.js +178 -0
  9. package/lib/cjs/identity/der.js.map +1 -0
  10. package/lib/cjs/identity/ed25519.d.ts +45 -0
  11. package/lib/cjs/identity/ed25519.js +134 -0
  12. package/lib/cjs/identity/ed25519.js.map +1 -0
  13. package/lib/cjs/identity/secp256k1.d.ts +73 -0
  14. package/lib/cjs/identity/secp256k1.js +156 -0
  15. package/lib/cjs/identity/secp256k1.js.map +1 -0
  16. package/lib/cjs/identity/webauthn.d.ts +40 -0
  17. package/lib/cjs/identity/webauthn.js +205 -0
  18. package/lib/cjs/identity/webauthn.js.map +1 -0
  19. package/lib/cjs/index.d.ts +4 -0
  20. package/lib/cjs/index.js +18 -0
  21. package/lib/cjs/index.js.map +1 -0
  22. package/lib/esm/buffer.d.ts +10 -0
  23. package/lib/esm/buffer.js +16 -0
  24. package/lib/esm/buffer.js.map +1 -0
  25. package/lib/esm/identity/delegation.d.ts +131 -0
  26. package/lib/esm/identity/delegation.js +219 -0
  27. package/lib/esm/identity/delegation.js.map +1 -0
  28. package/lib/esm/identity/der.d.ts +35 -0
  29. package/lib/esm/identity/der.js +168 -0
  30. package/lib/esm/identity/der.js.map +1 -0
  31. package/lib/esm/identity/ed25519.d.ts +45 -0
  32. package/lib/esm/identity/ed25519.js +110 -0
  33. package/lib/esm/identity/ed25519.js.map +1 -0
  34. package/lib/esm/identity/secp256k1.d.ts +73 -0
  35. package/lib/esm/identity/secp256k1.js +148 -0
  36. package/lib/esm/identity/secp256k1.js.map +1 -0
  37. package/lib/esm/identity/webauthn.d.ts +40 -0
  38. package/lib/esm/identity/webauthn.js +178 -0
  39. package/lib/esm/identity/webauthn.js.map +1 -0
  40. package/lib/esm/index.d.ts +4 -0
  41. package/lib/esm/index.js +5 -0
  42. package/lib/esm/index.js.map +1 -0
  43. package/lib/tsconfig-cjs.tsbuildinfo +2451 -0
  44. package/lib/tsconfig.tsbuildinfo +2441 -0
  45. package/package.json +20 -2
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Return an array buffer from its hexadecimal representation.
3
+ * @param hexString The hexadecimal string.
4
+ */
5
+ export declare function fromHexString(hexString: string): ArrayBuffer;
6
+ /**
7
+ * Returns an hexadecimal representation of an array buffer.
8
+ * @param bytes The array buffer.
9
+ */
10
+ export declare function toHexString(bytes: ArrayBuffer): string;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toHexString = exports.fromHexString = void 0;
4
+ /**
5
+ * Return an array buffer from its hexadecimal representation.
6
+ * @param hexString The hexadecimal string.
7
+ */
8
+ function fromHexString(hexString) {
9
+ var _a;
10
+ return new Uint8Array(((_a = hexString.match(/.{1,2}/g)) !== null && _a !== void 0 ? _a : []).map(byte => parseInt(byte, 16))).buffer;
11
+ }
12
+ exports.fromHexString = fromHexString;
13
+ /**
14
+ * Returns an hexadecimal representation of an array buffer.
15
+ * @param bytes The array buffer.
16
+ */
17
+ function toHexString(bytes) {
18
+ return new Uint8Array(bytes).reduce((str, byte) => str + byte.toString(16).padStart(2, '0'), '');
19
+ }
20
+ exports.toHexString = toHexString;
21
+ //# sourceMappingURL=buffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buffer.js","sourceRoot":"","sources":["../../src/buffer.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,SAAgB,aAAa,CAAC,SAAiB;;IAC7C,OAAO,IAAI,UAAU,CAAC,CAAC,MAAA,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,mCAAI,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AACnG,CAAC;AAFD,sCAEC;AAED;;;GAGG;AACH,SAAgB,WAAW,CAAC,KAAkB;IAC5C,OAAO,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;AACnG,CAAC;AAFD,kCAEC"}
@@ -0,0 +1,131 @@
1
+ import { DerEncodedPublicKey, HttpAgentRequest, PublicKey, Signature, SignIdentity } from '@astrox/agent';
2
+ import { Principal } from '@astrox/principal';
3
+ import * as cbor from 'simple-cbor';
4
+ /**
5
+ * A single delegation object that is signed by a private key. This is constructed by
6
+ * `DelegationChain.create()`.
7
+ *
8
+ * {@see DelegationChain}
9
+ */
10
+ export declare class Delegation {
11
+ readonly pubkey: ArrayBuffer;
12
+ readonly expiration: bigint;
13
+ readonly targets?: Principal[] | undefined;
14
+ constructor(pubkey: ArrayBuffer, expiration: bigint, targets?: Principal[] | undefined);
15
+ toCBOR(): cbor.CborValue;
16
+ toJSON(): JsonnableDelegation;
17
+ }
18
+ /**
19
+ * Type of ReturnType<Delegation.toJSON>.
20
+ * The goal here is to stringify all non-JSON-compatible types to some bytes representation we can
21
+ * stringify as hex.
22
+ * (Hex shouldn't be ambiguous ever, because you can encode as DER with semantic OIDs).
23
+ */
24
+ interface JsonnableDelegation {
25
+ expiration: string;
26
+ pubkey: string;
27
+ targets?: string[];
28
+ }
29
+ /**
30
+ * A signed delegation, which lends its identity to the public key in the delegation
31
+ * object. This is constructed by `DelegationChain.create()`.
32
+ *
33
+ * {@see DelegationChain}
34
+ */
35
+ export interface SignedDelegation {
36
+ delegation: Delegation;
37
+ signature: Signature;
38
+ }
39
+ export interface JsonnableDelegationChain {
40
+ publicKey: string;
41
+ delegations: Array<{
42
+ signature: string;
43
+ delegation: {
44
+ pubkey: string;
45
+ expiration: string;
46
+ targets?: string[];
47
+ };
48
+ }>;
49
+ }
50
+ /**
51
+ * A chain of delegations. This is JSON Serializable.
52
+ * This is the object to serialize and pass to a DelegationIdentity. It does not keep any
53
+ * private keys.
54
+ */
55
+ export declare class DelegationChain {
56
+ readonly delegations: SignedDelegation[];
57
+ readonly publicKey: DerEncodedPublicKey;
58
+ /**
59
+ * Create a delegation chain between two (or more) keys. By default, the expiration time
60
+ * will be very short (15 minutes).
61
+ *
62
+ * To build a chain of more than 2 identities, this function needs to be called multiple times,
63
+ * passing the previous delegation chain into the options argument. For example:
64
+ *
65
+ * @example
66
+ * const rootKey = createKey();
67
+ * const middleKey = createKey();
68
+ * const bottomeKey = createKey();
69
+ *
70
+ * const rootToMiddle = await DelegationChain.create(
71
+ * root, middle.getPublicKey(), Date.parse('2100-01-01'),
72
+ * );
73
+ * const middleToBottom = await DelegationChain.create(
74
+ * middle, bottom.getPublicKey(), Date.parse('2100-01-01'), { previous: rootToMiddle },
75
+ * );
76
+ *
77
+ * // We can now use a delegation identity that uses the delegation above:
78
+ * const identity = DelegationIdentity.fromDelegation(bottomKey, middleToBottom);
79
+ *
80
+ * @param from The identity that will delegate.
81
+ * @param to The identity that gets delegated. It can now sign messages as if it was the
82
+ * identity above.
83
+ * @param expiration The length the delegation is valid. By default, 15 minutes from calling
84
+ * this function.
85
+ * @param options A set of options for this delegation. expiration and previous
86
+ * @param options.previous - Another DelegationChain that this chain should start with.
87
+ * @param options.targets - targets that scope the delegation (e.g. Canister Principals)
88
+ */
89
+ static create(from: SignIdentity, to: PublicKey, expiration?: Date, options?: {
90
+ previous?: DelegationChain;
91
+ targets?: Principal[];
92
+ }): Promise<DelegationChain>;
93
+ /**
94
+ * Creates a DelegationChain object from a JSON string.
95
+ *
96
+ * @param json The JSON string to parse.
97
+ */
98
+ static fromJSON(json: string | JsonnableDelegationChain): DelegationChain;
99
+ /**
100
+ * Creates a DelegationChain object from a list of delegations and a DER-encoded public key.
101
+ *
102
+ * @param delegations The list of delegations.
103
+ * @param publicKey The DER-encoded public key of the key-pair signing the first delegation.
104
+ */
105
+ static fromDelegations(delegations: SignedDelegation[], publicKey: DerEncodedPublicKey): DelegationChain;
106
+ protected constructor(delegations: SignedDelegation[], publicKey: DerEncodedPublicKey);
107
+ toJSON(): JsonnableDelegationChain;
108
+ }
109
+ /**
110
+ * An Identity that adds delegation to a request. Everywhere in this class, the name
111
+ * innerKey refers to the SignIdentity that is being used to sign the requests, while
112
+ * originalKey is the identity that is being borrowed. More identities can be used
113
+ * in the middle to delegate.
114
+ */
115
+ export declare class DelegationIdentity extends SignIdentity {
116
+ private _inner;
117
+ private _delegation;
118
+ /**
119
+ * Create a delegation without having access to delegateKey.
120
+ *
121
+ * @param key The key used to sign the reqyests.
122
+ * @param delegation A delegation object created using `createDelegation`.
123
+ */
124
+ static fromDelegation(key: Pick<SignIdentity, 'sign'>, delegation: DelegationChain): DelegationIdentity;
125
+ protected constructor(_inner: Pick<SignIdentity, 'sign'>, _delegation: DelegationChain);
126
+ getDelegation(): DelegationChain;
127
+ getPublicKey(): PublicKey;
128
+ sign(blob: ArrayBuffer): Promise<Signature>;
129
+ transformRequest(request: HttpAgentRequest): Promise<unknown>;
130
+ }
131
+ export {};
@@ -0,0 +1,244 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ var __rest = (this && this.__rest) || function (s, e) {
22
+ var t = {};
23
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
24
+ t[p] = s[p];
25
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
26
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
27
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
28
+ t[p[i]] = s[p[i]];
29
+ }
30
+ return t;
31
+ };
32
+ Object.defineProperty(exports, "__esModule", { value: true });
33
+ exports.DelegationIdentity = exports.DelegationChain = exports.Delegation = void 0;
34
+ const agent_1 = require("@astrox/agent");
35
+ const principal_1 = require("@astrox/principal");
36
+ const cbor = __importStar(require("simple-cbor"));
37
+ const buffer_1 = require("../buffer");
38
+ const domainSeparator = new TextEncoder().encode('\x1Aic-request-auth-delegation');
39
+ const requestDomainSeparator = new TextEncoder().encode('\x0Aic-request');
40
+ function _parseBlob(value) {
41
+ if (typeof value !== 'string' || value.length < 64) {
42
+ throw new Error('Invalid public key.');
43
+ }
44
+ return buffer_1.fromHexString(value);
45
+ }
46
+ /**
47
+ * A single delegation object that is signed by a private key. This is constructed by
48
+ * `DelegationChain.create()`.
49
+ *
50
+ * {@see DelegationChain}
51
+ */
52
+ class Delegation {
53
+ constructor(pubkey, expiration, targets) {
54
+ this.pubkey = pubkey;
55
+ this.expiration = expiration;
56
+ this.targets = targets;
57
+ }
58
+ toCBOR() {
59
+ // Expiration field needs to be encoded as a u64 specifically.
60
+ return cbor.value.map(Object.assign({ pubkey: cbor.value.bytes(this.pubkey), expiration: cbor.value.u64(this.expiration.toString(16), 16) }, (this.targets && {
61
+ targets: cbor.value.array(this.targets.map(t => cbor.value.bytes(t.toUint8Array()))),
62
+ })));
63
+ }
64
+ toJSON() {
65
+ // every string should be hex and once-de-hexed,
66
+ // discoverable what it is (e.g. de-hex to get JSON with a 'type' property, or de-hex to DER
67
+ // with an OID). After de-hex, if it's not obvious what it is, it's an ArrayBuffer.
68
+ return Object.assign({ expiration: this.expiration.toString(16), pubkey: buffer_1.toHexString(this.pubkey) }, (this.targets && { targets: this.targets.map(p => p.toHex()) }));
69
+ }
70
+ }
71
+ exports.Delegation = Delegation;
72
+ /**
73
+ * Sign a single delegation object for a period of time.
74
+ *
75
+ * @param from The identity that lends its delegation.
76
+ * @param to The identity that receives the delegation.
77
+ * @param expiration An expiration date for this delegation.
78
+ * @param targets Limit this delegation to the target principals.
79
+ */
80
+ async function _createSingleDelegation(from, to, expiration, targets) {
81
+ const delegation = new Delegation(to.toDer(), BigInt(+expiration) * BigInt(1000000), // In nanoseconds.
82
+ targets);
83
+ // The signature is calculated by signing the concatenation of the domain separator
84
+ // and the message.
85
+ // Note: To ensure Safari treats this as a user gesture, ensure to not use async methods
86
+ // besides the actualy webauthn functionality (such as `sign`). Safari will de-register
87
+ // a user gesture if you await an async call thats not fetch, xhr, or setTimeout.
88
+ const challenge = new Uint8Array([
89
+ ...domainSeparator,
90
+ ...new Uint8Array(agent_1.requestIdOf(delegation)),
91
+ ]);
92
+ const signature = await from.sign(challenge);
93
+ return {
94
+ delegation,
95
+ signature,
96
+ };
97
+ }
98
+ /**
99
+ * A chain of delegations. This is JSON Serializable.
100
+ * This is the object to serialize and pass to a DelegationIdentity. It does not keep any
101
+ * private keys.
102
+ */
103
+ class DelegationChain {
104
+ constructor(delegations, publicKey) {
105
+ this.delegations = delegations;
106
+ this.publicKey = publicKey;
107
+ }
108
+ /**
109
+ * Create a delegation chain between two (or more) keys. By default, the expiration time
110
+ * will be very short (15 minutes).
111
+ *
112
+ * To build a chain of more than 2 identities, this function needs to be called multiple times,
113
+ * passing the previous delegation chain into the options argument. For example:
114
+ *
115
+ * @example
116
+ * const rootKey = createKey();
117
+ * const middleKey = createKey();
118
+ * const bottomeKey = createKey();
119
+ *
120
+ * const rootToMiddle = await DelegationChain.create(
121
+ * root, middle.getPublicKey(), Date.parse('2100-01-01'),
122
+ * );
123
+ * const middleToBottom = await DelegationChain.create(
124
+ * middle, bottom.getPublicKey(), Date.parse('2100-01-01'), { previous: rootToMiddle },
125
+ * );
126
+ *
127
+ * // We can now use a delegation identity that uses the delegation above:
128
+ * const identity = DelegationIdentity.fromDelegation(bottomKey, middleToBottom);
129
+ *
130
+ * @param from The identity that will delegate.
131
+ * @param to The identity that gets delegated. It can now sign messages as if it was the
132
+ * identity above.
133
+ * @param expiration The length the delegation is valid. By default, 15 minutes from calling
134
+ * this function.
135
+ * @param options A set of options for this delegation. expiration and previous
136
+ * @param options.previous - Another DelegationChain that this chain should start with.
137
+ * @param options.targets - targets that scope the delegation (e.g. Canister Principals)
138
+ */
139
+ static async create(from, to, expiration = new Date(Date.now() + 15 * 60 * 1000), options = {}) {
140
+ var _a, _b;
141
+ const delegation = await _createSingleDelegation(from, to, expiration, options.targets);
142
+ return new DelegationChain([...(((_a = options.previous) === null || _a === void 0 ? void 0 : _a.delegations) || []), delegation], ((_b = options.previous) === null || _b === void 0 ? void 0 : _b.publicKey) || from.getPublicKey().toDer());
143
+ }
144
+ /**
145
+ * Creates a DelegationChain object from a JSON string.
146
+ *
147
+ * @param json The JSON string to parse.
148
+ */
149
+ static fromJSON(json) {
150
+ const { publicKey, delegations } = typeof json === 'string' ? JSON.parse(json) : json;
151
+ if (!Array.isArray(delegations)) {
152
+ throw new Error('Invalid delegations.');
153
+ }
154
+ const parsedDelegations = delegations.map(signedDelegation => {
155
+ const { delegation, signature } = signedDelegation;
156
+ const { pubkey, expiration, targets } = delegation;
157
+ if (targets !== undefined && !Array.isArray(targets)) {
158
+ throw new Error('Invalid targets.');
159
+ }
160
+ return {
161
+ delegation: new Delegation(_parseBlob(pubkey), BigInt(`0x${expiration}`), // expiration in JSON is an hexa string (See toJSON() below).
162
+ targets &&
163
+ targets.map((t) => {
164
+ if (typeof t !== 'string') {
165
+ throw new Error('Invalid target.');
166
+ }
167
+ return principal_1.Principal.fromHex(t);
168
+ })),
169
+ signature: _parseBlob(signature),
170
+ };
171
+ });
172
+ return new this(parsedDelegations, _parseBlob(publicKey));
173
+ }
174
+ /**
175
+ * Creates a DelegationChain object from a list of delegations and a DER-encoded public key.
176
+ *
177
+ * @param delegations The list of delegations.
178
+ * @param publicKey The DER-encoded public key of the key-pair signing the first delegation.
179
+ */
180
+ static fromDelegations(delegations, publicKey) {
181
+ return new this(delegations, publicKey);
182
+ }
183
+ toJSON() {
184
+ return {
185
+ delegations: this.delegations.map(signedDelegation => {
186
+ const { delegation, signature } = signedDelegation;
187
+ const { targets } = delegation;
188
+ return {
189
+ delegation: Object.assign({ expiration: delegation.expiration.toString(16), pubkey: buffer_1.toHexString(delegation.pubkey) }, (targets && {
190
+ targets: targets.map(t => t.toHex()),
191
+ })),
192
+ signature: buffer_1.toHexString(signature),
193
+ };
194
+ }),
195
+ publicKey: buffer_1.toHexString(this.publicKey),
196
+ };
197
+ }
198
+ }
199
+ exports.DelegationChain = DelegationChain;
200
+ /**
201
+ * An Identity that adds delegation to a request. Everywhere in this class, the name
202
+ * innerKey refers to the SignIdentity that is being used to sign the requests, while
203
+ * originalKey is the identity that is being borrowed. More identities can be used
204
+ * in the middle to delegate.
205
+ */
206
+ class DelegationIdentity extends agent_1.SignIdentity {
207
+ constructor(_inner, _delegation) {
208
+ super();
209
+ this._inner = _inner;
210
+ this._delegation = _delegation;
211
+ }
212
+ /**
213
+ * Create a delegation without having access to delegateKey.
214
+ *
215
+ * @param key The key used to sign the reqyests.
216
+ * @param delegation A delegation object created using `createDelegation`.
217
+ */
218
+ static fromDelegation(key, delegation) {
219
+ return new this(key, delegation);
220
+ }
221
+ getDelegation() {
222
+ return this._delegation;
223
+ }
224
+ getPublicKey() {
225
+ return {
226
+ toDer: () => this._delegation.publicKey,
227
+ };
228
+ }
229
+ sign(blob) {
230
+ return this._inner.sign(blob);
231
+ }
232
+ async transformRequest(request) {
233
+ const { body } = request, fields = __rest(request, ["body"]);
234
+ const requestId = await agent_1.requestIdOf(body);
235
+ return Object.assign(Object.assign({}, fields), { body: {
236
+ content: body,
237
+ sender_sig: await this.sign(new Uint8Array([...requestDomainSeparator, ...new Uint8Array(requestId)])),
238
+ sender_delegation: this._delegation.delegations,
239
+ sender_pubkey: this._delegation.publicKey,
240
+ } });
241
+ }
242
+ }
243
+ exports.DelegationIdentity = DelegationIdentity;
244
+ //# sourceMappingURL=delegation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delegation.js","sourceRoot":"","sources":["../../../src/identity/delegation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ export declare const bufEquals: (b1: ArrayBuffer, b2: ArrayBuffer) => boolean;
2
+ export declare const encodeLenBytes: (len: number) => number;
3
+ export declare const encodeLen: (buf: Uint8Array, offset: number, len: number) => number;
4
+ export declare const decodeLenBytes: (buf: Uint8Array, offset: number) => number;
5
+ export declare const decodeLen: (buf: Uint8Array, offset: number) => number;
6
+ /**
7
+ * A DER encoded `SEQUENCE(OID)` for DER-encoded-COSE
8
+ */
9
+ export declare const DER_COSE_OID: Uint8Array;
10
+ /**
11
+ * A DER encoded `SEQUENCE(OID)` for the Ed25519 algorithm
12
+ */
13
+ export declare const ED25519_OID: Uint8Array;
14
+ /**
15
+ * A DER encoded `SEQUENCE(OID)` for secp256k1 with the ECDSA algorithm
16
+ */
17
+ export declare const SECP256K1_OID: Uint8Array;
18
+ /**
19
+ * Wraps the given `payload` in a DER encoding tagged with the given encoded `oid` like so:
20
+ * `SEQUENCE(oid, BITSTRING(payload))`
21
+ *
22
+ * @param payload The payload to encode as the bit string
23
+ * @param oid The DER encoded (and SEQUENCE wrapped!) OID to tag the payload with
24
+ */
25
+ export declare function wrapDER(payload: ArrayBuffer, oid: Uint8Array): Uint8Array;
26
+ /**
27
+ * Extracts a payload from the given `derEncoded` data, and checks that it was tagged with the given `oid`.
28
+ *
29
+ * `derEncoded = SEQUENCE(oid, BITSTRING(payload))`
30
+ *
31
+ * @param derEncoded The DER encoded and tagged data
32
+ * @param oid The DER encoded (and SEQUENCE wrapped!) expected OID
33
+ * @returns The unwrapped payload
34
+ */
35
+ export declare const unwrapDER: (derEncoded: ArrayBuffer, oid: Uint8Array) => Uint8Array;
@@ -0,0 +1,178 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.unwrapDER = exports.wrapDER = exports.SECP256K1_OID = exports.ED25519_OID = exports.DER_COSE_OID = exports.decodeLen = exports.decodeLenBytes = exports.encodeLen = exports.encodeLenBytes = exports.bufEquals = void 0;
4
+ const bufEquals = (b1, b2) => {
5
+ if (b1.byteLength !== b2.byteLength)
6
+ return false;
7
+ const u1 = new Uint8Array(b1);
8
+ const u2 = new Uint8Array(b2);
9
+ for (let i = 0; i < u1.length; i++) {
10
+ if (u1[i] !== u2[i])
11
+ return false;
12
+ }
13
+ return true;
14
+ };
15
+ exports.bufEquals = bufEquals;
16
+ const encodeLenBytes = (len) => {
17
+ if (len <= 0x7f) {
18
+ return 1;
19
+ }
20
+ else if (len <= 0xff) {
21
+ return 2;
22
+ }
23
+ else if (len <= 0xffff) {
24
+ return 3;
25
+ }
26
+ else if (len <= 0xffffff) {
27
+ return 4;
28
+ }
29
+ else {
30
+ throw new Error('Length too long (> 4 bytes)');
31
+ }
32
+ };
33
+ exports.encodeLenBytes = encodeLenBytes;
34
+ const encodeLen = (buf, offset, len) => {
35
+ if (len <= 0x7f) {
36
+ buf[offset] = len;
37
+ return 1;
38
+ }
39
+ else if (len <= 0xff) {
40
+ buf[offset] = 0x81;
41
+ buf[offset + 1] = len;
42
+ return 2;
43
+ }
44
+ else if (len <= 0xffff) {
45
+ buf[offset] = 0x82;
46
+ buf[offset + 1] = len >> 8;
47
+ buf[offset + 2] = len;
48
+ return 3;
49
+ }
50
+ else if (len <= 0xffffff) {
51
+ buf[offset] = 0x83;
52
+ buf[offset + 1] = len >> 16;
53
+ buf[offset + 2] = len >> 8;
54
+ buf[offset + 3] = len;
55
+ return 4;
56
+ }
57
+ else {
58
+ throw new Error('Length too long (> 4 bytes)');
59
+ }
60
+ };
61
+ exports.encodeLen = encodeLen;
62
+ const decodeLenBytes = (buf, offset) => {
63
+ if (buf[offset] < 0x80)
64
+ return 1;
65
+ if (buf[offset] === 0x80)
66
+ throw new Error('Invalid length 0');
67
+ if (buf[offset] === 0x81)
68
+ return 2;
69
+ if (buf[offset] === 0x82)
70
+ return 3;
71
+ if (buf[offset] === 0x83)
72
+ return 4;
73
+ throw new Error('Length too long (> 4 bytes)');
74
+ };
75
+ exports.decodeLenBytes = decodeLenBytes;
76
+ const decodeLen = (buf, offset) => {
77
+ const lenBytes = exports.decodeLenBytes(buf, offset);
78
+ if (lenBytes === 1)
79
+ return buf[offset];
80
+ else if (lenBytes === 2)
81
+ return buf[offset + 1];
82
+ else if (lenBytes === 3)
83
+ return (buf[offset + 1] << 8) + buf[offset + 2];
84
+ else if (lenBytes === 4)
85
+ return (buf[offset + 1] << 16) + (buf[offset + 2] << 8) + buf[offset + 3];
86
+ throw new Error('Length too long (> 4 bytes)');
87
+ };
88
+ exports.decodeLen = decodeLen;
89
+ /**
90
+ * A DER encoded `SEQUENCE(OID)` for DER-encoded-COSE
91
+ */
92
+ exports.DER_COSE_OID = Uint8Array.from([
93
+ ...[0x30, 0x0c],
94
+ ...[0x06, 0x0a],
95
+ ...[0x2b, 0x06, 0x01, 0x04, 0x01, 0x83, 0xb8, 0x43, 0x01, 0x01], // DER encoded COSE
96
+ ]);
97
+ /**
98
+ * A DER encoded `SEQUENCE(OID)` for the Ed25519 algorithm
99
+ */
100
+ exports.ED25519_OID = Uint8Array.from([
101
+ ...[0x30, 0x05],
102
+ ...[0x06, 0x03],
103
+ ...[0x2b, 0x65, 0x70], // id-Ed25519 OID
104
+ ]);
105
+ /**
106
+ * A DER encoded `SEQUENCE(OID)` for secp256k1 with the ECDSA algorithm
107
+ */
108
+ exports.SECP256K1_OID = Uint8Array.from([
109
+ ...[0x30, 0x10],
110
+ ...[0x06, 0x07],
111
+ ...[0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01],
112
+ ...[0x06, 0x05],
113
+ ...[0x2b, 0x81, 0x04, 0x00, 0x0a], // OID secp256k1
114
+ ]);
115
+ /**
116
+ * Wraps the given `payload` in a DER encoding tagged with the given encoded `oid` like so:
117
+ * `SEQUENCE(oid, BITSTRING(payload))`
118
+ *
119
+ * @param payload The payload to encode as the bit string
120
+ * @param oid The DER encoded (and SEQUENCE wrapped!) OID to tag the payload with
121
+ */
122
+ function wrapDER(payload, oid) {
123
+ // The Bit String header needs to include the unused bit count byte in its length
124
+ const bitStringHeaderLength = 2 + exports.encodeLenBytes(payload.byteLength + 1);
125
+ const len = oid.byteLength + bitStringHeaderLength + payload.byteLength;
126
+ let offset = 0;
127
+ const buf = new Uint8Array(1 + exports.encodeLenBytes(len) + len);
128
+ // Sequence
129
+ buf[offset++] = 0x30;
130
+ // Sequence Length
131
+ offset += exports.encodeLen(buf, offset, len);
132
+ // OID
133
+ buf.set(oid, offset);
134
+ offset += oid.byteLength;
135
+ // Bit String Header
136
+ buf[offset++] = 0x03;
137
+ offset += exports.encodeLen(buf, offset, payload.byteLength + 1);
138
+ // 0 padding
139
+ buf[offset++] = 0x00;
140
+ buf.set(new Uint8Array(payload), offset);
141
+ return buf;
142
+ }
143
+ exports.wrapDER = wrapDER;
144
+ /**
145
+ * Extracts a payload from the given `derEncoded` data, and checks that it was tagged with the given `oid`.
146
+ *
147
+ * `derEncoded = SEQUENCE(oid, BITSTRING(payload))`
148
+ *
149
+ * @param derEncoded The DER encoded and tagged data
150
+ * @param oid The DER encoded (and SEQUENCE wrapped!) expected OID
151
+ * @returns The unwrapped payload
152
+ */
153
+ const unwrapDER = (derEncoded, oid) => {
154
+ let offset = 0;
155
+ const expect = (n, msg) => {
156
+ if (buf[offset++] !== n) {
157
+ throw new Error('Expected: ' + msg);
158
+ }
159
+ };
160
+ const buf = new Uint8Array(derEncoded);
161
+ expect(0x30, 'sequence');
162
+ offset += exports.decodeLenBytes(buf, offset);
163
+ if (!exports.bufEquals(buf.slice(offset, offset + oid.byteLength), oid)) {
164
+ throw new Error('Not the expected OID.');
165
+ }
166
+ offset += oid.byteLength;
167
+ expect(0x03, 'bit string');
168
+ const payloadLen = exports.decodeLen(buf, offset) - 1; // Subtracting 1 to account for the 0 padding
169
+ offset += exports.decodeLenBytes(buf, offset);
170
+ expect(0x00, '0 padding');
171
+ const result = buf.slice(offset);
172
+ if (payloadLen !== result.length) {
173
+ throw new Error(`DER payload mismatch: Expected length ${payloadLen} actual length ${result.length}`);
174
+ }
175
+ return result;
176
+ };
177
+ exports.unwrapDER = unwrapDER;
178
+ //# sourceMappingURL=der.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"der.js","sourceRoot":"","sources":["../../../src/identity/der.ts"],"names":[],"mappings":";;;AAAO,MAAM,SAAS,GAAG,CAAC,EAAe,EAAE,EAAe,EAAW,EAAE;IACrE,IAAI,EAAE,CAAC,UAAU,KAAK,EAAE,CAAC,UAAU;QAAE,OAAO,KAAK,CAAC;IAClD,MAAM,EAAE,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IAC9B,MAAM,EAAE,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QAClC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;KACnC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AARW,QAAA,SAAS,aAQpB;AAEK,MAAM,cAAc,GAAG,CAAC,GAAW,EAAU,EAAE;IACpD,IAAI,GAAG,IAAI,IAAI,EAAE;QACf,OAAO,CAAC,CAAC;KACV;SAAM,IAAI,GAAG,IAAI,IAAI,EAAE;QACtB,OAAO,CAAC,CAAC;KACV;SAAM,IAAI,GAAG,IAAI,MAAM,EAAE;QACxB,OAAO,CAAC,CAAC;KACV;SAAM,IAAI,GAAG,IAAI,QAAQ,EAAE;QAC1B,OAAO,CAAC,CAAC;KACV;SAAM;QACL,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;KAChD;AACH,CAAC,CAAC;AAZW,QAAA,cAAc,kBAYzB;AAEK,MAAM,SAAS,GAAG,CAAC,GAAe,EAAE,MAAc,EAAE,GAAW,EAAU,EAAE;IAChF,IAAI,GAAG,IAAI,IAAI,EAAE;QACf,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC;QAClB,OAAO,CAAC,CAAC;KACV;SAAM,IAAI,GAAG,IAAI,IAAI,EAAE;QACtB,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;QACnB,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;QACtB,OAAO,CAAC,CAAC;KACV;SAAM,IAAI,GAAG,IAAI,MAAM,EAAE;QACxB,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;QACnB,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;QAC3B,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;QACtB,OAAO,CAAC,CAAC;KACV;SAAM,IAAI,GAAG,IAAI,QAAQ,EAAE;QAC1B,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;QACnB,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC;QAC5B,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;QAC3B,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;QACtB,OAAO,CAAC,CAAC;KACV;SAAM;QACL,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;KAChD;AACH,CAAC,CAAC;AAtBW,QAAA,SAAS,aAsBpB;AAEK,MAAM,cAAc,GAAG,CAAC,GAAe,EAAE,MAAc,EAAU,EAAE;IACxE,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI;QAAE,OAAO,CAAC,CAAC;IACjC,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAC9D,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI;QAAE,OAAO,CAAC,CAAC;IACnC,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI;QAAE,OAAO,CAAC,CAAC;IACnC,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI;QAAE,OAAO,CAAC,CAAC;IACnC,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;AACjD,CAAC,CAAC;AAPW,QAAA,cAAc,kBAOzB;AAEK,MAAM,SAAS,GAAG,CAAC,GAAe,EAAE,MAAc,EAAU,EAAE;IACnE,MAAM,QAAQ,GAAG,sBAAc,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC7C,IAAI,QAAQ,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC;SAClC,IAAI,QAAQ,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;SAC3C,IAAI,QAAQ,KAAK,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;SACpE,IAAI,QAAQ,KAAK,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC5E,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;AACjD,CAAC,CAAC;AARW,QAAA,SAAS,aAQpB;AAEF;;GAEG;AACU,QAAA,YAAY,GAAG,UAAU,CAAC,IAAI,CAAC;IAC1C,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC;IACf,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC;IACf,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,mBAAmB;CACrF,CAAC,CAAC;AAEH;;GAEG;AACU,QAAA,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC;IACzC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC;IACf,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC;IACf,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,iBAAiB;CACzC,CAAC,CAAC;AAEH;;GAEG;AACU,QAAA,aAAa,GAAG,UAAU,CAAC,IAAI,CAAC;IAC3C,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC;IACf,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC;IACf,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC7C,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC;IACf,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,gBAAgB;CACpD,CAAC,CAAC;AAEH;;;;;;GAMG;AACH,SAAgB,OAAO,CAAC,OAAoB,EAAE,GAAe;IAC3D,iFAAiF;IACjF,MAAM,qBAAqB,GAAG,CAAC,GAAG,sBAAc,CAAC,OAAO,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;IACzE,MAAM,GAAG,GAAG,GAAG,CAAC,UAAU,GAAG,qBAAqB,GAAG,OAAO,CAAC,UAAU,CAAC;IACxE,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,CAAC,GAAG,sBAAc,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;IAC1D,WAAW;IACX,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;IACrB,kBAAkB;IAClB,MAAM,IAAI,iBAAS,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;IAEtC,MAAM;IACN,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACrB,MAAM,IAAI,GAAG,CAAC,UAAU,CAAC;IAEzB,oBAAoB;IACpB,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;IACrB,MAAM,IAAI,iBAAS,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;IACzD,YAAY;IACZ,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;IACrB,GAAG,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;IAEzC,OAAO,GAAG,CAAC;AACb,CAAC;AAvBD,0BAuBC;AAED;;;;;;;;GAQG;AACI,MAAM,SAAS,GAAG,CAAC,UAAuB,EAAE,GAAe,EAAc,EAAE;IAChF,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,GAAW,EAAE,EAAE;QACxC,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE;YACvB,MAAM,IAAI,KAAK,CAAC,YAAY,GAAG,GAAG,CAAC,CAAC;SACrC;IACH,CAAC,CAAC;IAEF,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC;IACvC,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACzB,MAAM,IAAI,sBAAc,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAEtC,IAAI,CAAC,iBAAS,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,EAAE;QAC/D,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;KAC1C;IACD,MAAM,IAAI,GAAG,CAAC,UAAU,CAAC;IAEzB,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAC3B,MAAM,UAAU,GAAG,iBAAS,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,6CAA6C;IAC5F,MAAM,IAAI,sBAAc,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACtC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAC1B,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACjC,IAAI,UAAU,KAAK,MAAM,CAAC,MAAM,EAAE;QAChC,MAAM,IAAI,KAAK,CACb,yCAAyC,UAAU,kBAAkB,MAAM,CAAC,MAAM,EAAE,CACrF,CAAC;KACH;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AA5BW,QAAA,SAAS,aA4BpB"}