signify-ts 0.1.1 → 0.2.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 +96 -47
- package/dist/buffer-polyfill.d.ts +1 -0
- package/dist/exports.d.ts +40 -0
- package/dist/index.d.ts +4 -3
- package/dist/keri/app/aiding.d.ts +138 -0
- package/dist/keri/app/clienting.d.ts +182 -0
- package/dist/keri/app/contacting.d.ts +93 -0
- package/dist/keri/app/controller.d.ts +49 -0
- package/dist/keri/app/coring.d.ts +121 -0
- package/dist/keri/app/credentialing.d.ts +245 -0
- package/dist/keri/app/escrowing.d.ts +19 -0
- package/dist/keri/app/exchanging.d.ts +60 -0
- package/dist/keri/app/grouping.d.ts +44 -0
- package/dist/keri/app/habery.d.ts +48 -47
- package/dist/keri/app/notifying.d.ts +34 -0
- package/dist/keri/core/authing.d.ts +10 -9
- package/dist/keri/core/bexter.d.ts +7 -0
- package/dist/keri/core/cigar.d.ts +8 -8
- package/dist/keri/core/cipher.d.ts +5 -5
- package/dist/keri/core/core.d.ts +59 -53
- package/dist/keri/core/counter.d.ts +43 -43
- package/dist/keri/core/decrypter.d.ts +10 -10
- package/dist/keri/core/diger.d.ts +21 -21
- package/dist/keri/core/encrypter.d.ts +9 -9
- package/dist/keri/core/eventing.d.ts +54 -21
- package/dist/keri/core/httping.d.ts +44 -34
- package/dist/keri/core/indexer.d.ts +98 -88
- package/dist/keri/core/keeping.d.ts +103 -1
- package/dist/keri/core/kering.d.ts +5 -5
- package/dist/keri/core/manager.d.ts +174 -172
- package/dist/keri/core/matter.d.ts +116 -69
- package/dist/keri/core/number.d.ts +7 -6
- package/dist/keri/core/pather.d.ts +7 -0
- package/dist/keri/core/prefixer.d.ts +15 -15
- package/dist/keri/core/saider.d.ts +23 -23
- package/dist/keri/core/salter.d.ts +23 -23
- package/dist/keri/core/seqner.d.ts +15 -0
- package/dist/keri/core/serder.d.ts +31 -23
- package/dist/keri/core/siger.d.ts +18 -18
- package/dist/keri/core/signer.d.ts +34 -34
- package/dist/keri/core/tholder.d.ts +29 -14
- package/dist/keri/core/utils.d.ts +20 -15
- package/dist/keri/core/vdring.d.ts +16 -0
- package/dist/keri/core/verfer.d.ts +13 -12
- package/dist/keri/end/ending.d.ts +13 -13
- package/dist/math.d.ts +1 -0
- package/dist/ready.d.ts +1 -0
- package/dist/signify-ts.cjs +7842 -0
- package/dist/signify-ts.cjs.development.js +6369 -256
- package/dist/signify-ts.cjs.development.js.map +1 -1
- package/dist/signify-ts.cjs.map +7 -0
- package/dist/signify-ts.cjs.production.min.js +1 -1
- package/dist/signify-ts.cjs.production.min.js.map +1 -1
- package/dist/signify-ts.esm.js +6205 -229
- package/dist/signify-ts.esm.js.map +1 -1
- package/dist/signify-ts.mjs +7818 -0
- package/dist/signify-ts.mjs.map +7 -0
- package/package.json +49 -49
- package/src/buffer-polyfill.ts +5 -0
- package/src/exports.ts +44 -0
- package/src/index.ts +4 -5
- package/src/keri/app/aiding.ts +493 -0
- package/src/keri/app/clienting.ts +492 -0
- package/src/keri/app/contacting.ts +188 -0
- package/src/keri/app/controller.ts +372 -0
- package/src/keri/app/coring.ts +225 -0
- package/src/keri/app/credentialing.ts +841 -0
- package/src/keri/app/escrowing.ts +34 -0
- package/src/keri/app/exchanging.ts +220 -0
- package/src/keri/app/grouping.ts +90 -0
- package/src/keri/app/habery.ts +118 -85
- package/src/keri/app/notifying.ts +69 -0
- package/src/keri/core/authing.ts +73 -85
- package/src/keri/core/bexter.ts +138 -0
- package/src/keri/core/cigar.ts +10 -11
- package/src/keri/core/cipher.ts +23 -14
- package/src/keri/core/core.ts +223 -81
- package/src/keri/core/counter.ts +182 -116
- package/src/keri/core/decrypter.ts +48 -34
- package/src/keri/core/diger.ts +23 -22
- package/src/keri/core/encrypter.ts +37 -27
- package/src/keri/core/eventing.ts +468 -106
- package/src/keri/core/httping.ts +151 -105
- package/src/keri/core/indexer.ts +313 -211
- package/src/keri/core/keeping.ts +679 -3
- package/src/keri/core/kering.ts +4 -6
- package/src/keri/core/manager.ts +660 -499
- package/src/keri/core/matter.ts +382 -148
- package/src/keri/core/number.ts +56 -11
- package/src/keri/core/pather.ts +98 -0
- package/src/keri/core/prefixer.ts +122 -101
- package/src/keri/core/saider.ts +104 -76
- package/src/keri/core/salter.ts +71 -40
- package/src/keri/core/seqner.ts +46 -0
- package/src/keri/core/serder.ts +102 -38
- package/src/keri/core/siger.ts +19 -18
- package/src/keri/core/signer.ts +73 -53
- package/src/keri/core/tholder.ts +196 -30
- package/src/keri/core/utils.ts +121 -50
- package/src/keri/core/vdring.ts +94 -0
- package/src/keri/core/verfer.ts +22 -9
- package/src/keri/end/ending.ts +111 -101
- package/src/math.ts +3 -0
- package/src/ready.ts +5 -0
- package/dist/keri/app/accountant.d.ts +0 -10
- package/dist/keri/app/apping.d.ts +0 -1
- package/dist/keri/app/client.d.ts +0 -7
- package/dist/keri/app/signify.d.ts +0 -6
- package/src/keri/app/accountant.ts +0 -35
- package/src/keri/app/apping.ts +0 -12
- package/src/keri/app/client.ts +0 -30
- package/src/keri/app/signify.ts +0 -12
- package/src/keri/app/tsconfig.json +0 -100
- package/src/keri/core/tsconfig.json +0 -100
- package/src/keri/end/tsconfig.json +0 -100
package/src/keri/core/authing.ts
CHANGED
|
@@ -1,129 +1,117 @@
|
|
|
1
|
-
import {Signer} from
|
|
2
|
-
import {Verfer} from
|
|
3
|
-
import {desiginput, normalize, siginput} from
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {Cigar} from "./cigar";
|
|
8
|
-
import {Siger} from "./siger";
|
|
9
|
-
|
|
10
|
-
import Base64 from "urlsafe-base64"
|
|
11
|
-
|
|
1
|
+
import { Signer } from './signer';
|
|
2
|
+
import { Verfer } from './verfer';
|
|
3
|
+
import { desiginput, normalize, siginput } from './httping';
|
|
4
|
+
import { Signage, signature, designature } from '../end/ending';
|
|
5
|
+
import { Cigar } from './cigar';
|
|
6
|
+
import { Siger } from './siger';
|
|
12
7
|
export class Authenticater {
|
|
13
|
-
|
|
14
8
|
static DefaultFields = [
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
]
|
|
9
|
+
'@method',
|
|
10
|
+
'@path',
|
|
11
|
+
'signify-resource',
|
|
12
|
+
'signify-timestamp',
|
|
13
|
+
];
|
|
20
14
|
private _verfer: Verfer;
|
|
21
15
|
private readonly _csig: Signer;
|
|
22
16
|
|
|
23
|
-
constructor(csig: Signer,
|
|
24
|
-
this._csig = csig
|
|
25
|
-
this._verfer =
|
|
17
|
+
constructor(csig: Signer, verfer: Verfer) {
|
|
18
|
+
this._csig = csig;
|
|
19
|
+
this._verfer = verfer;
|
|
26
20
|
}
|
|
27
21
|
|
|
28
22
|
verify(headers: Headers, method: string, path: string): boolean {
|
|
29
|
-
|
|
23
|
+
const siginput = headers.get('Signature-Input');
|
|
30
24
|
if (siginput == null) {
|
|
31
|
-
return false
|
|
25
|
+
return false;
|
|
32
26
|
}
|
|
33
|
-
|
|
27
|
+
const signature = headers.get('Signature');
|
|
34
28
|
if (signature == null) {
|
|
35
|
-
return false
|
|
29
|
+
return false;
|
|
36
30
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
inputs = inputs.filter((input) => input.name == "signify")
|
|
40
|
-
|
|
31
|
+
let inputs = desiginput(siginput);
|
|
32
|
+
inputs = inputs.filter((input) => input.name == 'signify');
|
|
41
33
|
if (inputs.length == 0) {
|
|
42
|
-
return false
|
|
34
|
+
return false;
|
|
43
35
|
}
|
|
44
|
-
|
|
45
36
|
inputs.forEach((input) => {
|
|
46
|
-
|
|
37
|
+
const items = new Array<string>();
|
|
47
38
|
input.fields!.forEach((field: string) => {
|
|
48
|
-
if (field.startsWith(
|
|
49
|
-
if (field ==
|
|
50
|
-
items.push(`"${field}": ${method}`)
|
|
51
|
-
} else if (field ==
|
|
52
|
-
items.push(`"${field}": ${path}`)
|
|
39
|
+
if (field.startsWith('@')) {
|
|
40
|
+
if (field == '@method') {
|
|
41
|
+
items.push(`"${field}": ${method}`);
|
|
42
|
+
} else if (field == '@path') {
|
|
43
|
+
items.push(`"${field}": ${path}`);
|
|
53
44
|
}
|
|
54
45
|
} else {
|
|
55
46
|
if (headers.has(field)) {
|
|
56
|
-
|
|
57
|
-
items.push(`"${field}": ${value}`)
|
|
47
|
+
const value = normalize(headers.get(field) as string);
|
|
48
|
+
items.push(`"${field}": ${value}`);
|
|
58
49
|
}
|
|
59
50
|
}
|
|
60
|
-
})
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
values.push(`
|
|
64
|
-
values.push(`created=${input.created}`)
|
|
65
|
-
|
|
51
|
+
});
|
|
52
|
+
const values = new Array<string>();
|
|
53
|
+
values.push(`(${input.fields!.join(' ')})`);
|
|
54
|
+
values.push(`created=${input.created}`);
|
|
66
55
|
if (input.expires != undefined) {
|
|
67
|
-
values.push(`expires=${input.expires}`)
|
|
56
|
+
values.push(`expires=${input.expires}`);
|
|
68
57
|
}
|
|
69
58
|
if (input.nonce != undefined) {
|
|
70
|
-
values.push(`nonce=${input.nonce}`)
|
|
59
|
+
values.push(`nonce=${input.nonce}`);
|
|
71
60
|
}
|
|
72
61
|
if (input.keyid != undefined) {
|
|
73
|
-
values.push(`keyid=${input.keyid}`)
|
|
62
|
+
values.push(`keyid=${input.keyid}`);
|
|
74
63
|
}
|
|
75
64
|
if (input.context != undefined) {
|
|
76
|
-
values.push(`context=${input.context}`)
|
|
65
|
+
values.push(`context=${input.context}`);
|
|
77
66
|
}
|
|
78
67
|
if (input.alg != undefined) {
|
|
79
|
-
values.push(`alg=${input.alg}`)
|
|
68
|
+
values.push(`alg=${input.alg}`);
|
|
80
69
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
if (!signage.has("indexed")) {
|
|
89
|
-
throw new Error(`invalid signate ${signage}`)
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
let item = signage.get("indexed")!
|
|
93
|
-
let raw = Base64.decode(item[1].get(input.name) as string)
|
|
94
|
-
|
|
95
|
-
if (!this._verfer.verify(raw, ser)) {
|
|
96
|
-
throw new Error(`Signature for {inputage} invalid.`)
|
|
70
|
+
const params = values.join(';');
|
|
71
|
+
items.push(`"@signature-params: ${params}"`);
|
|
72
|
+
const ser = items.join('\n');
|
|
73
|
+
const signage = designature(signature!);
|
|
74
|
+
const cig = signage[0].markers.get(input.name);
|
|
75
|
+
if (!this._verfer.verify(cig.raw, ser)) {
|
|
76
|
+
throw new Error(`Signature for ${input.keyid} invalid.`);
|
|
97
77
|
}
|
|
98
|
-
})
|
|
78
|
+
});
|
|
99
79
|
|
|
100
|
-
return true
|
|
80
|
+
return true;
|
|
101
81
|
}
|
|
102
82
|
|
|
103
|
-
sign(
|
|
83
|
+
sign(
|
|
84
|
+
headers: Headers,
|
|
85
|
+
method: string,
|
|
86
|
+
path: string,
|
|
87
|
+
fields?: Array<string>
|
|
88
|
+
): Headers {
|
|
104
89
|
if (fields == undefined) {
|
|
105
|
-
fields = Authenticater.DefaultFields
|
|
90
|
+
fields = Authenticater.DefaultFields;
|
|
106
91
|
}
|
|
107
92
|
|
|
108
|
-
|
|
109
|
-
name:
|
|
110
|
-
|
|
111
|
-
|
|
93
|
+
const [header, sig] = siginput(this._csig, {
|
|
94
|
+
name: 'signify',
|
|
95
|
+
method,
|
|
96
|
+
path,
|
|
97
|
+
headers,
|
|
98
|
+
fields,
|
|
99
|
+
alg: 'ed25519',
|
|
100
|
+
keyid: this._csig.verfer.qb64,
|
|
101
|
+
});
|
|
112
102
|
|
|
113
103
|
header.forEach((value, key) => {
|
|
114
|
-
headers.append(key, value)
|
|
115
|
-
})
|
|
104
|
+
headers.append(key, value);
|
|
105
|
+
});
|
|
116
106
|
|
|
117
|
-
|
|
118
|
-
markers.set(
|
|
119
|
-
|
|
120
|
-
|
|
107
|
+
const markers = new Map<string, Siger | Cigar>();
|
|
108
|
+
markers.set('signify', sig);
|
|
109
|
+
const signage = new Signage(markers, false);
|
|
110
|
+
const signed = signature([signage]);
|
|
121
111
|
signed.forEach((value, key) => {
|
|
122
|
-
headers.append(key, value)
|
|
123
|
-
})
|
|
112
|
+
headers.append(key, value);
|
|
113
|
+
});
|
|
124
114
|
|
|
125
|
-
return headers
|
|
115
|
+
return headers;
|
|
126
116
|
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
}
|
|
117
|
+
}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { BexDex, Matter, MatterArgs, MtrDex } from './matter';
|
|
2
|
+
import { EmptyMaterialError } from './kering';
|
|
3
|
+
import Base64 from 'urlsafe-base64';
|
|
4
|
+
|
|
5
|
+
const B64REX = '^[A-Za-z0-9\\-_]*$';
|
|
6
|
+
export const Reb64 = new RegExp(B64REX);
|
|
7
|
+
|
|
8
|
+
/*
|
|
9
|
+
|
|
10
|
+
Bexter is subclass of Matter, cryptographic material, for variable length
|
|
11
|
+
strings that only contain Base64 URL safe characters, i.e. Base64 text (bext).
|
|
12
|
+
When created using the 'bext' paramaeter, the encoded matter in qb64 format
|
|
13
|
+
in the text domain is more compact than would be the case if the string were
|
|
14
|
+
passed in as raw bytes. The text is used as is to form the value part of the
|
|
15
|
+
qb64 version not including the leader.
|
|
16
|
+
|
|
17
|
+
Due to ambiguity that arises from pre-padding bext whose length is a multiple of
|
|
18
|
+
three with one or more 'A' chars. Any bext that starts with an 'A' and whose length
|
|
19
|
+
is either a multiple of 3 or 4 may not round trip. Bext with a leading 'A'
|
|
20
|
+
whose length is a multiple of four may have the leading 'A' stripped when
|
|
21
|
+
round tripping.
|
|
22
|
+
|
|
23
|
+
Bexter(bext='ABBB').bext == 'BBB'
|
|
24
|
+
Bexter(bext='BBB').bext == 'BBB'
|
|
25
|
+
Bexter(bext='ABBB').qb64 == '4AABABBB' == Bexter(bext='BBB').qb64
|
|
26
|
+
|
|
27
|
+
To avoid this problem, only use for applications of base 64 strings that
|
|
28
|
+
never start with 'A'
|
|
29
|
+
|
|
30
|
+
Examples: base64 text strings:
|
|
31
|
+
|
|
32
|
+
bext = ""
|
|
33
|
+
qb64 = '4AAA'
|
|
34
|
+
|
|
35
|
+
bext = "-"
|
|
36
|
+
qb64 = '6AABAAA-'
|
|
37
|
+
|
|
38
|
+
bext = "-A"
|
|
39
|
+
qb64 = '5AABAA-A'
|
|
40
|
+
|
|
41
|
+
bext = "-A-"
|
|
42
|
+
qb64 = '4AABA-A-'
|
|
43
|
+
|
|
44
|
+
bext = "-A-B"
|
|
45
|
+
qb64 = '4AAB-A-B'
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
Example uses:
|
|
49
|
+
CESR encoded paths for nested SADs and SAIDs
|
|
50
|
+
CESR encoded fractionally weighted threshold expressions
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
Attributes:
|
|
54
|
+
|
|
55
|
+
Inherited Properties: (See Matter)
|
|
56
|
+
.pad is int number of pad chars given raw
|
|
57
|
+
|
|
58
|
+
.code is str derivation code to indicate cypher suite
|
|
59
|
+
.raw is bytes crypto material only without code
|
|
60
|
+
.index is int count of attached crypto material by context (receipts)
|
|
61
|
+
.qb64 is str in Base64 fully qualified with derivation code + crypto mat
|
|
62
|
+
.qb64b is bytes in Base64 fully qualified with derivation code + crypto mat
|
|
63
|
+
.qb2 is bytes in binary with derivation code + crypto material
|
|
64
|
+
.transferable is Boolean, True when transferable derivation code False otherwise
|
|
65
|
+
|
|
66
|
+
Properties:
|
|
67
|
+
.text is the Base64 text value, .qb64 with text code and leader removed.
|
|
68
|
+
|
|
69
|
+
Hidden:
|
|
70
|
+
._pad is method to compute .pad property
|
|
71
|
+
._code is str value for .code property
|
|
72
|
+
._raw is bytes value for .raw property
|
|
73
|
+
._index is int value for .index property
|
|
74
|
+
._infil is method to compute fully qualified Base64 from .raw and .code
|
|
75
|
+
._exfil is method to extract .code and .raw from fully qualified Base64
|
|
76
|
+
|
|
77
|
+
Methods:
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
*/
|
|
83
|
+
|
|
84
|
+
export class Bexter extends Matter {
|
|
85
|
+
constructor(
|
|
86
|
+
{ raw, code = MtrDex.StrB64_L0, qb64b, qb64, qb2 }: MatterArgs,
|
|
87
|
+
bext?: string
|
|
88
|
+
) {
|
|
89
|
+
if (
|
|
90
|
+
raw === undefined &&
|
|
91
|
+
qb64b === undefined &&
|
|
92
|
+
qb64 === undefined &&
|
|
93
|
+
qb2 === undefined
|
|
94
|
+
) {
|
|
95
|
+
if (bext === undefined)
|
|
96
|
+
throw new EmptyMaterialError('Missing bext string.');
|
|
97
|
+
|
|
98
|
+
const match = Reb64.exec(bext);
|
|
99
|
+
if (!match) throw new Error('Invalid Base64.');
|
|
100
|
+
|
|
101
|
+
raw = Bexter._rawify(bext);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
super({ raw, code, qb64b, qb64, qb2 });
|
|
105
|
+
|
|
106
|
+
if (!BexDex.has(this.code))
|
|
107
|
+
throw new Error(`Invalid code = ${this.code} for Bexter.`);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
static _rawify(bext: string): Uint8Array {
|
|
111
|
+
const ts = bext.length % 4; // bext size mod 4
|
|
112
|
+
const ws = (4 - ts) % 4; // pre conv wad size in chars
|
|
113
|
+
const ls = (3 - ts) % 3; // post conv lead size in bytes
|
|
114
|
+
const wad = new Array(ws);
|
|
115
|
+
wad.fill('A');
|
|
116
|
+
const base = wad.join('') + bext; // pre pad with wad of zeros in Base64 == 'A'
|
|
117
|
+
const raw = Base64.decode(base); // [ls:] // convert and remove leader
|
|
118
|
+
|
|
119
|
+
return Uint8Array.from(raw).subarray(ls); // raw binary equivalent of text
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
get bext(): string {
|
|
123
|
+
const sizage = Matter.Sizes.get(this.code);
|
|
124
|
+
const wad = Uint8Array.from(new Array(sizage?.ls).fill(0));
|
|
125
|
+
const bext = Base64.encode(Buffer.from([...wad, ...this.raw]));
|
|
126
|
+
|
|
127
|
+
let ws = 0;
|
|
128
|
+
if (sizage?.ls === 0 && bext !== undefined) {
|
|
129
|
+
if (bext[0] === 'A') {
|
|
130
|
+
ws = 1;
|
|
131
|
+
}
|
|
132
|
+
} else {
|
|
133
|
+
ws = (sizage?.ls! + 1) % 4;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
return bext.substring(ws);
|
|
137
|
+
}
|
|
138
|
+
}
|
package/src/keri/core/cigar.ts
CHANGED
|
@@ -1,19 +1,18 @@
|
|
|
1
|
-
import {Verfer} from
|
|
2
|
-
import {Matter, MatterArgs} from
|
|
3
|
-
|
|
1
|
+
import { Verfer } from './verfer';
|
|
2
|
+
import { Matter, MatterArgs } from './matter';
|
|
4
3
|
|
|
5
4
|
export class Cigar extends Matter {
|
|
6
|
-
private _verfer: Verfer | undefined
|
|
7
|
-
constructor({raw, code, qb64, qb64b, qb2}:MatterArgs, verfer?: Verfer) {
|
|
8
|
-
super({raw, code, qb64, qb64b, qb2});
|
|
9
|
-
this._verfer = verfer
|
|
5
|
+
private _verfer: Verfer | undefined;
|
|
6
|
+
constructor({ raw, code, qb64, qb64b, qb2 }: MatterArgs, verfer?: Verfer) {
|
|
7
|
+
super({ raw, code, qb64, qb64b, qb2 });
|
|
8
|
+
this._verfer = verfer;
|
|
10
9
|
}
|
|
11
10
|
|
|
12
11
|
get verfer(): Verfer | undefined {
|
|
13
|
-
return this._verfer
|
|
12
|
+
return this._verfer;
|
|
14
13
|
}
|
|
15
14
|
|
|
16
|
-
set verfer(verfer:Verfer|undefined) {
|
|
17
|
-
this._verfer = verfer
|
|
15
|
+
set verfer(verfer: Verfer | undefined) {
|
|
16
|
+
this._verfer = verfer;
|
|
18
17
|
}
|
|
19
|
-
}
|
|
18
|
+
}
|
package/src/keri/core/cipher.ts
CHANGED
|
@@ -1,25 +1,34 @@
|
|
|
1
|
-
import {Matter, MatterArgs, MtrDex} from
|
|
2
|
-
import {Decrypter} from
|
|
3
|
-
|
|
1
|
+
import { Matter, MatterArgs, MtrDex } from './matter';
|
|
2
|
+
import { Decrypter } from './decrypter';
|
|
4
3
|
|
|
5
4
|
export class Cipher extends Matter {
|
|
6
|
-
constructor({raw, code, qb64, qb64b, qb2}:MatterArgs) {
|
|
5
|
+
constructor({ raw, code, qb64, qb64b, qb2 }: MatterArgs) {
|
|
7
6
|
if (raw != undefined && code == undefined) {
|
|
8
7
|
if (raw.length == Matter._rawSize(MtrDex.X25519_Cipher_Salt)) {
|
|
9
|
-
code = MtrDex.X25519_Cipher_Salt
|
|
10
|
-
} else if (
|
|
11
|
-
|
|
8
|
+
code = MtrDex.X25519_Cipher_Salt;
|
|
9
|
+
} else if (
|
|
10
|
+
raw.length == Matter._rawSize(MtrDex.X25519_Cipher_Seed)
|
|
11
|
+
) {
|
|
12
|
+
code = MtrDex.X25519_Cipher_Salt;
|
|
12
13
|
}
|
|
13
14
|
}
|
|
14
|
-
super({raw: raw, code: code, qb64b: qb64b, qb64: qb64, qb2: qb2});
|
|
15
|
+
super({ raw: raw, code: code, qb64b: qb64b, qb64: qb64, qb2: qb2 });
|
|
15
16
|
|
|
16
|
-
if (
|
|
17
|
-
|
|
17
|
+
if (
|
|
18
|
+
!Array.from([
|
|
19
|
+
MtrDex.X25519_Cipher_Salt,
|
|
20
|
+
MtrDex.X25519_Cipher_Seed,
|
|
21
|
+
]).includes(this.code)
|
|
22
|
+
) {
|
|
23
|
+
throw new Error(`Unsupported Cipher code == ${this.code}`);
|
|
18
24
|
}
|
|
19
25
|
}
|
|
20
26
|
|
|
21
|
-
decrypt(
|
|
22
|
-
|
|
23
|
-
|
|
27
|
+
decrypt(
|
|
28
|
+
prikey: Uint8Array | undefined = undefined,
|
|
29
|
+
seed: Uint8Array | undefined = undefined
|
|
30
|
+
) {
|
|
31
|
+
const decrypter = new Decrypter({ qb64b: prikey }, seed);
|
|
32
|
+
return decrypter.decrypt(this.qb64b);
|
|
24
33
|
}
|
|
25
|
-
}
|
|
34
|
+
}
|