signify-ts 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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 +239 -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 +7835 -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 +7811 -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 +820 -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/siger.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {IdxSigDex, Indexer, IndexerArgs} from
|
|
2
|
-
import {Verfer} from
|
|
1
|
+
import { IdxSigDex, Indexer, IndexerArgs } from './indexer';
|
|
2
|
+
import { Verfer } from './verfer';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
Siger is subclass of Indexer, indexed signature material,
|
|
@@ -17,23 +17,24 @@ import {Verfer} from "./verfer";
|
|
|
17
17
|
**/
|
|
18
18
|
|
|
19
19
|
export class Siger extends Indexer {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
20
|
+
private _verfer?: Verfer;
|
|
21
|
+
constructor(
|
|
22
|
+
{ raw, code, index, ondex, qb64, qb64b, qb2 }: IndexerArgs,
|
|
23
|
+
verfer?: Verfer
|
|
24
|
+
) {
|
|
25
|
+
super({ raw, code, index, ondex, qb64, qb64b, qb2 });
|
|
26
|
+
|
|
27
|
+
if (!IdxSigDex.has(this.code)) {
|
|
28
|
+
throw new Error(`Invalid code = ${this.code} for Siger.`);
|
|
29
|
+
}
|
|
30
|
+
this._verfer = verfer;
|
|
27
31
|
}
|
|
28
|
-
this._verfer = verfer
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
get verfer(): Verfer | undefined {
|
|
32
|
-
return this._verfer;
|
|
33
|
-
}
|
|
34
32
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
33
|
+
get verfer(): Verfer | undefined {
|
|
34
|
+
return this._verfer;
|
|
35
|
+
}
|
|
38
36
|
|
|
37
|
+
set verfer(verfer: Verfer | undefined) {
|
|
38
|
+
this._verfer = verfer;
|
|
39
|
+
}
|
|
39
40
|
}
|
package/src/keri/core/signer.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import {EmptyMaterialError} from
|
|
1
|
+
import { EmptyMaterialError } from './kering';
|
|
2
2
|
|
|
3
3
|
export {};
|
|
4
4
|
import libsodium from 'libsodium-wrappers-sumo';
|
|
5
|
-
import {Matter} from './matter';
|
|
6
|
-
import {MtrDex} from './matter';
|
|
7
|
-
import {Verfer} from
|
|
8
|
-
import {Cigar} from
|
|
9
|
-
import {Siger} from
|
|
10
|
-
import {IdrDex} from
|
|
5
|
+
import { Matter } from './matter';
|
|
6
|
+
import { MtrDex } from './matter';
|
|
7
|
+
import { Verfer } from './verfer';
|
|
8
|
+
import { Cigar } from './cigar';
|
|
9
|
+
import { Siger } from './siger';
|
|
10
|
+
import { IdrDex } from './indexer';
|
|
11
11
|
import { Buffer } from 'buffer';
|
|
12
12
|
|
|
13
13
|
/**
|
|
@@ -19,48 +19,57 @@ import { Buffer } from 'buffer';
|
|
|
19
19
|
as cipher suite for creating key-pair.
|
|
20
20
|
*/
|
|
21
21
|
interface SignerArgs {
|
|
22
|
-
raw?: Uint8Array | undefined
|
|
23
|
-
code?: string
|
|
24
|
-
qb64b?: Uint8Array | undefined
|
|
25
|
-
qb64?: string
|
|
26
|
-
qb2?: Uint8Array | undefined
|
|
27
|
-
transferable?: boolean
|
|
22
|
+
raw?: Uint8Array | undefined;
|
|
23
|
+
code?: string;
|
|
24
|
+
qb64b?: Uint8Array | undefined;
|
|
25
|
+
qb64?: string;
|
|
26
|
+
qb2?: Uint8Array | undefined;
|
|
27
|
+
transferable?: boolean;
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
export class Signer extends Matter {
|
|
31
|
-
private readonly _sign: Function
|
|
32
|
-
private readonly _verfer: Verfer
|
|
33
|
-
|
|
34
|
-
constructor({
|
|
31
|
+
private readonly _sign: Function;
|
|
32
|
+
private readonly _verfer: Verfer;
|
|
33
|
+
|
|
34
|
+
constructor({
|
|
35
|
+
raw,
|
|
36
|
+
code = MtrDex.Ed25519_Seed,
|
|
37
|
+
qb64,
|
|
38
|
+
qb64b,
|
|
39
|
+
qb2,
|
|
40
|
+
transferable = true,
|
|
41
|
+
}: SignerArgs) {
|
|
35
42
|
try {
|
|
36
|
-
super({raw, code, qb64, qb64b, qb2})
|
|
43
|
+
super({ raw, code, qb64, qb64b, qb2 });
|
|
37
44
|
} catch (e) {
|
|
38
45
|
if (e instanceof EmptyMaterialError) {
|
|
39
46
|
if (code == MtrDex.Ed25519_Seed) {
|
|
40
|
-
|
|
41
|
-
|
|
47
|
+
const raw = libsodium.randombytes_buf(
|
|
48
|
+
libsodium.crypto_sign_SEEDBYTES
|
|
49
|
+
);
|
|
50
|
+
super({ raw, code, qb64, qb64b, qb2 });
|
|
42
51
|
} else {
|
|
43
|
-
throw new Error(`Unsupported signer code = ${code}.`)
|
|
52
|
+
throw new Error(`Unsupported signer code = ${code}.`);
|
|
44
53
|
}
|
|
45
54
|
} else {
|
|
46
|
-
throw e
|
|
55
|
+
throw e;
|
|
47
56
|
}
|
|
48
57
|
}
|
|
49
|
-
let verfer
|
|
58
|
+
let verfer;
|
|
50
59
|
if (this.code == MtrDex.Ed25519_Seed) {
|
|
51
|
-
this._sign = this._ed25519
|
|
52
|
-
const keypair = libsodium.crypto_sign_seed_keypair(this.raw)
|
|
53
|
-
verfer = new Verfer({
|
|
54
|
-
|
|
60
|
+
this._sign = this._ed25519;
|
|
61
|
+
const keypair = libsodium.crypto_sign_seed_keypair(this.raw);
|
|
62
|
+
verfer = new Verfer({
|
|
63
|
+
raw: keypair.publicKey,
|
|
64
|
+
code: transferable ? MtrDex.Ed25519 : MtrDex.Ed25519N,
|
|
65
|
+
});
|
|
55
66
|
} else {
|
|
56
|
-
throw new Error(`Unsupported signer code = ${this.code}.`)
|
|
67
|
+
throw new Error(`Unsupported signer code = ${this.code}.`);
|
|
57
68
|
}
|
|
58
69
|
|
|
59
|
-
this._verfer = verfer
|
|
60
|
-
|
|
70
|
+
this._verfer = verfer;
|
|
61
71
|
}
|
|
62
72
|
|
|
63
|
-
|
|
64
73
|
/**
|
|
65
74
|
* @description Property verfer:
|
|
66
75
|
Returns Verfer instance
|
|
@@ -70,44 +79,55 @@ export class Signer extends Matter {
|
|
|
70
79
|
return this._verfer;
|
|
71
80
|
}
|
|
72
81
|
|
|
73
|
-
sign(
|
|
74
|
-
|
|
75
|
-
|
|
82
|
+
sign(
|
|
83
|
+
ser: Uint8Array,
|
|
84
|
+
index: number | null = null,
|
|
85
|
+
only: boolean = false,
|
|
86
|
+
ondex: number | undefined = undefined
|
|
87
|
+
): Siger | Cigar {
|
|
88
|
+
return this._sign(ser, this.raw, this.verfer, index, only, ondex);
|
|
76
89
|
}
|
|
77
90
|
|
|
78
|
-
_ed25519(
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
91
|
+
_ed25519(
|
|
92
|
+
ser: Uint8Array,
|
|
93
|
+
seed: Uint8Array,
|
|
94
|
+
verfer: Verfer,
|
|
95
|
+
index: number | null,
|
|
96
|
+
only: boolean = false,
|
|
97
|
+
ondex: number | undefined
|
|
98
|
+
) {
|
|
99
|
+
const sig = libsodium.crypto_sign_detached(
|
|
82
100
|
ser,
|
|
83
|
-
Buffer.concat([seed, verfer.raw])
|
|
101
|
+
Buffer.concat([seed, verfer.raw])
|
|
84
102
|
);
|
|
85
103
|
|
|
86
104
|
if (index == null) {
|
|
87
|
-
return new Cigar({raw: sig, code: MtrDex.Ed25519_Sig}, verfer);
|
|
105
|
+
return new Cigar({ raw: sig, code: MtrDex.Ed25519_Sig }, verfer);
|
|
88
106
|
} else {
|
|
89
107
|
let code;
|
|
90
108
|
if (only) {
|
|
91
|
-
ondex = undefined
|
|
109
|
+
ondex = undefined;
|
|
92
110
|
if (index <= 63) {
|
|
93
|
-
code = IdrDex.Ed25519_Crt_Sig
|
|
111
|
+
code = IdrDex.Ed25519_Crt_Sig;
|
|
94
112
|
} else {
|
|
95
|
-
code = IdrDex.Ed25519_Big_Crt_Sig
|
|
113
|
+
code = IdrDex.Ed25519_Big_Crt_Sig;
|
|
96
114
|
}
|
|
97
115
|
} else {
|
|
98
|
-
if(ondex == undefined) {
|
|
99
|
-
ondex = index
|
|
116
|
+
if (ondex == undefined) {
|
|
117
|
+
ondex = index;
|
|
100
118
|
}
|
|
101
119
|
|
|
102
|
-
if (ondex == index && index <= 63)
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
120
|
+
if (ondex == index && index <= 63)
|
|
121
|
+
// both same and small
|
|
122
|
+
code = IdrDex.Ed25519_Sig; // use small both same
|
|
123
|
+
// otherwise big or both not same so use big both
|
|
124
|
+
else code = IdrDex.Ed25519_Big_Sig; // use use big both
|
|
107
125
|
}
|
|
108
126
|
|
|
109
|
-
return new Siger(
|
|
127
|
+
return new Siger(
|
|
128
|
+
{ raw: sig, code: code, index: index, ondex: ondex },
|
|
129
|
+
verfer
|
|
130
|
+
);
|
|
110
131
|
}
|
|
111
|
-
|
|
112
132
|
}
|
|
113
|
-
}
|
|
133
|
+
}
|
package/src/keri/core/tholder.ts
CHANGED
|
@@ -1,52 +1,218 @@
|
|
|
1
|
-
|
|
1
|
+
import { BexDex, Matter, NumDex } from './matter';
|
|
2
|
+
import { CesrNumber } from './number';
|
|
3
|
+
import { Fraction } from 'mathjs';
|
|
4
|
+
import { math } from '../../index';
|
|
2
5
|
|
|
3
6
|
export class Tholder {
|
|
4
|
-
private _weighted: boolean = false
|
|
5
|
-
private _thold:
|
|
6
|
-
private _size: number = 0
|
|
7
|
-
private
|
|
8
|
-
private
|
|
7
|
+
private _weighted: boolean = false;
|
|
8
|
+
private _thold: any = undefined;
|
|
9
|
+
private _size: number = 0;
|
|
10
|
+
private _number: CesrNumber | undefined = undefined;
|
|
11
|
+
private _satisfy: any = undefined;
|
|
9
12
|
|
|
10
|
-
|
|
11
|
-
this.processSith(sith)
|
|
12
|
-
}
|
|
13
|
+
// private _bexter: any
|
|
13
14
|
|
|
14
|
-
|
|
15
|
-
|
|
15
|
+
constructor(kargs: { thold?: any; limen?: any; sith?: any }) {
|
|
16
|
+
if (kargs.thold !== undefined) {
|
|
17
|
+
this._processThold(kargs.thold);
|
|
18
|
+
} else if (kargs.limen != undefined) {
|
|
19
|
+
this._processLimen(kargs.limen);
|
|
20
|
+
} else if (kargs.sith !== undefined) {
|
|
21
|
+
this._processSith(kargs.sith);
|
|
22
|
+
} else {
|
|
23
|
+
throw new Error('Missing threshold expression');
|
|
24
|
+
}
|
|
16
25
|
}
|
|
17
26
|
|
|
18
|
-
get
|
|
19
|
-
return this.
|
|
27
|
+
get weighted(): boolean {
|
|
28
|
+
return this._weighted;
|
|
20
29
|
}
|
|
21
30
|
|
|
22
|
-
get thold():
|
|
31
|
+
get thold(): any {
|
|
23
32
|
return this._thold;
|
|
24
33
|
}
|
|
25
|
-
|
|
26
|
-
|
|
34
|
+
|
|
35
|
+
get size(): number {
|
|
36
|
+
return this._size;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
get limen(): any {
|
|
40
|
+
return this._number?.qb64b;
|
|
27
41
|
}
|
|
28
42
|
|
|
29
43
|
get sith(): string {
|
|
30
44
|
if (this.weighted) {
|
|
31
|
-
|
|
32
|
-
return
|
|
45
|
+
let sith = this.thold.map((clause: Fraction[]) => {
|
|
46
|
+
return clause.map((c) => {
|
|
47
|
+
if (0 < Number(c) && Number(c) < 1) {
|
|
48
|
+
return math.format(c, { fraction: 'ratio' });
|
|
49
|
+
} else {
|
|
50
|
+
return math.format(c, { fraction: 'decimal' });
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
if (sith.length == 1) {
|
|
55
|
+
sith = sith[0];
|
|
33
56
|
}
|
|
34
|
-
|
|
57
|
+
|
|
58
|
+
return sith;
|
|
35
59
|
} else {
|
|
36
|
-
return this.thold.toString(16)
|
|
60
|
+
return this.thold.toString(16);
|
|
37
61
|
}
|
|
38
62
|
}
|
|
39
63
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
64
|
+
get json(): string {
|
|
65
|
+
return JSON.stringify(this.sith);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
get num(): number | undefined {
|
|
69
|
+
return this._weighted ? undefined : this._thold;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
private _processThold(thold: number | Array<Array<Fraction>>) {
|
|
73
|
+
if (typeof thold === 'number') {
|
|
74
|
+
this._processUnweighted(thold);
|
|
75
|
+
} else {
|
|
76
|
+
this._processWeighted(thold);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
private _processLimen(limen: string) {
|
|
81
|
+
const matter = new Matter({ qb64: limen });
|
|
82
|
+
if (NumDex.has(matter.code)) {
|
|
83
|
+
const number = new CesrNumber({
|
|
84
|
+
raw: matter.raw,
|
|
85
|
+
code: matter.code,
|
|
86
|
+
});
|
|
87
|
+
this._processUnweighted(number.num);
|
|
88
|
+
} else if (BexDex.has(matter.code)) {
|
|
89
|
+
// TODO: Implement Bexter
|
|
47
90
|
} else {
|
|
48
|
-
|
|
49
|
-
|
|
91
|
+
throw new Error('Invalid code for limen=' + matter.code);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
private _processSith(sith: string | number | Array<string>) {
|
|
96
|
+
if (typeof sith == 'number') {
|
|
97
|
+
this._processUnweighted(sith);
|
|
98
|
+
} else if (typeof sith == 'string' && sith.indexOf('[') == -1) {
|
|
99
|
+
this._processUnweighted(parseInt(sith, 16));
|
|
100
|
+
} else {
|
|
101
|
+
let _sith: any = sith;
|
|
102
|
+
if (typeof sith == 'string') {
|
|
103
|
+
_sith = JSON.parse(sith);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
if (_sith.length == 0) {
|
|
107
|
+
throw new Error('Empty weight list');
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const mask = _sith.map((x: any) => {
|
|
111
|
+
return typeof x !== 'string';
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
if (mask.length > 0 && !mask.every((x: boolean) => x)) {
|
|
115
|
+
_sith = [_sith];
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
for (const c of _sith) {
|
|
119
|
+
const mask = c.map((x: any) => {
|
|
120
|
+
return typeof x === 'string';
|
|
121
|
+
});
|
|
122
|
+
if (mask.length > 0 && !mask.every((x: boolean) => x)) {
|
|
123
|
+
throw new Error(
|
|
124
|
+
'Invalid sith, some weights in clause ' +
|
|
125
|
+
mask +
|
|
126
|
+
' are non string'
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const thold = this._processClauses(_sith);
|
|
132
|
+
this._processWeighted(thold);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
private _processClauses(sith: Array<Array<string>>): Fraction[][] {
|
|
137
|
+
const thold = new Array<Array<Fraction>>();
|
|
138
|
+
sith.forEach((clause) => {
|
|
139
|
+
thold.push(
|
|
140
|
+
clause.map((w) => {
|
|
141
|
+
return this.weight(w);
|
|
142
|
+
})
|
|
143
|
+
);
|
|
144
|
+
});
|
|
145
|
+
return thold;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
private _processUnweighted(thold: number) {
|
|
149
|
+
if (thold < 0) {
|
|
150
|
+
throw new Error('Non-positive int threshold = {thold}.');
|
|
151
|
+
}
|
|
152
|
+
this._thold = thold;
|
|
153
|
+
this._weighted = false;
|
|
154
|
+
this._size = this._thold; // used to verify that keys list size is at least size
|
|
155
|
+
this._satisfy = this._satisfy_numeric;
|
|
156
|
+
this._number = new CesrNumber({}, thold);
|
|
157
|
+
// this._bexter = undefined
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
private _processWeighted(thold: Array<Array<Fraction>>) {
|
|
161
|
+
for (const clause of thold) {
|
|
162
|
+
if (Number(math.sum(clause)) < 1) {
|
|
163
|
+
throw new Error(
|
|
164
|
+
'Invalid sith clause: ' +
|
|
165
|
+
thold +
|
|
166
|
+
'all clause weight sums must be >= 1'
|
|
167
|
+
);
|
|
168
|
+
}
|
|
50
169
|
}
|
|
170
|
+
|
|
171
|
+
this._thold = thold;
|
|
172
|
+
this._weighted = true;
|
|
173
|
+
this._size = thold.reduce((acc, currentValue) => {
|
|
174
|
+
return acc + currentValue.length;
|
|
175
|
+
}, 0);
|
|
176
|
+
this._satisfy = this._satisfy_weighted;
|
|
177
|
+
//TODO: created Bexter if needed
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
private weight(w: string): Fraction {
|
|
181
|
+
return math.fraction(w);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
private _satisfy_numeric(indices: any[]) {
|
|
185
|
+
return this.thold > 0 && indices.length >= this.thold; // at least one
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
private _satisfy_weighted(indices: any) {
|
|
189
|
+
if (indices.length === 0) {
|
|
190
|
+
return false;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
const indexes: Set<number> = new Set(indices.sort());
|
|
194
|
+
const sats = new Array(indices.length).fill(false);
|
|
195
|
+
for (const idx of indexes) {
|
|
196
|
+
sats[idx] = true;
|
|
197
|
+
}
|
|
198
|
+
let wio = 0;
|
|
199
|
+
for (const clause of this.thold) {
|
|
200
|
+
let cw = 0;
|
|
201
|
+
for (const w of clause) {
|
|
202
|
+
if (sats[wio]) {
|
|
203
|
+
cw += Number(w);
|
|
204
|
+
}
|
|
205
|
+
wio += 1;
|
|
206
|
+
}
|
|
207
|
+
if (cw < 1) {
|
|
208
|
+
return false;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
return true;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
public satisfy(indices: any): boolean {
|
|
216
|
+
return this._satisfy(indices);
|
|
51
217
|
}
|
|
52
|
-
}
|
|
218
|
+
}
|
package/src/keri/core/utils.ts
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
|
+
import { Counter, CtrDex } from './counter';
|
|
2
|
+
import { Seqner } from './seqner';
|
|
3
|
+
import { Prefixer } from './prefixer';
|
|
4
|
+
import { Saider } from './saider';
|
|
5
|
+
import { Serder } from './serder';
|
|
6
|
+
import { b } from './core';
|
|
1
7
|
|
|
2
8
|
export function pad(n: any, width = 3, z = 0) {
|
|
3
|
-
|
|
9
|
+
return (String(z).repeat(width) + String(n)).slice(String(n).length);
|
|
4
10
|
}
|
|
5
11
|
|
|
6
12
|
/**
|
|
@@ -11,19 +17,19 @@ export function pad(n: any, width = 3, z = 0) {
|
|
|
11
17
|
* @param {*} labels labels is list of element labels in ked from which to extract values
|
|
12
18
|
*/
|
|
13
19
|
export function extractValues(ked: any, labels: any) {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
20
|
+
let values = [];
|
|
21
|
+
for (const label of labels) {
|
|
22
|
+
values = extractElementValues(ked[label], values);
|
|
23
|
+
}
|
|
18
24
|
|
|
19
|
-
|
|
25
|
+
return values;
|
|
20
26
|
}
|
|
21
27
|
|
|
22
28
|
export function arrayEquals(ar1: Uint8Array, ar2: Uint8Array) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
29
|
+
return (
|
|
30
|
+
ar1.length === ar2.length &&
|
|
31
|
+
ar1.every((val, index) => val === ar2[index])
|
|
32
|
+
);
|
|
27
33
|
}
|
|
28
34
|
|
|
29
35
|
/**
|
|
@@ -36,27 +42,22 @@ export function arrayEquals(ar1: Uint8Array, ar2: Uint8Array) {
|
|
|
36
42
|
*/
|
|
37
43
|
|
|
38
44
|
function extractElementValues(element: any, values: any) {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
45
|
+
let data = [];
|
|
46
|
+
|
|
47
|
+
try {
|
|
48
|
+
if (element instanceof Array && !(typeof element == 'string')) {
|
|
49
|
+
for (const k in element) extractElementValues(element[k], values);
|
|
50
|
+
} else if (typeof element == 'string') {
|
|
51
|
+
values.push(element);
|
|
52
|
+
}
|
|
53
|
+
data = values;
|
|
54
|
+
} catch (error) {
|
|
55
|
+
throw new Error(error as string);
|
|
48
56
|
}
|
|
49
|
-
data = values;
|
|
50
|
-
} catch (error) {
|
|
51
|
-
throw new Error(error as string);
|
|
52
|
-
}
|
|
53
57
|
|
|
54
|
-
|
|
58
|
+
return data;
|
|
55
59
|
}
|
|
56
60
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
61
|
/**
|
|
61
62
|
* @description Returns True if obj is non-string iterable, False otherwise
|
|
62
63
|
|
|
@@ -68,31 +69,101 @@ function extractElementValues(element: any, values: any) {
|
|
|
68
69
|
// return instanceof(obj, (str, bytes)) && instanceof(obj, Iterable))
|
|
69
70
|
// }
|
|
70
71
|
|
|
71
|
-
|
|
72
72
|
export function nowUTC(): Date {
|
|
73
|
-
|
|
73
|
+
return new Date();
|
|
74
74
|
}
|
|
75
75
|
|
|
76
|
-
|
|
77
76
|
export function range(start: number, stop: number, step: number) {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
77
|
+
if (typeof stop == 'undefined') {
|
|
78
|
+
// one param defined
|
|
79
|
+
stop = start;
|
|
80
|
+
start = 0;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if (typeof step == 'undefined') {
|
|
84
|
+
step = 1;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if ((step > 0 && start >= stop) || (step < 0 && start <= stop)) {
|
|
88
|
+
return [];
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const result = new Array<number>();
|
|
92
|
+
for (let i: number = start; step > 0 ? i < stop : i > stop; i += step) {
|
|
93
|
+
result.push(i);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return result;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export function intToBytes(value: number, length: number): Uint8Array {
|
|
100
|
+
const byteArray = new Uint8Array(length); // Assuming a 4-byte integer (32 bits)
|
|
101
|
+
|
|
102
|
+
for (let index = byteArray.length - 1; index >= 0; index--) {
|
|
103
|
+
const byte = value & 0xff;
|
|
104
|
+
byteArray[index] = byte;
|
|
105
|
+
value = (value - byte) / 256;
|
|
106
|
+
}
|
|
107
|
+
return byteArray;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export function bytesToInt(ar: Uint8Array): number {
|
|
111
|
+
let value = 0;
|
|
112
|
+
for (let i = 0; i < ar.length; i++) {
|
|
113
|
+
value = value * 256 + ar[i];
|
|
114
|
+
}
|
|
115
|
+
return value;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export function serializeACDCAttachment(anc: Serder): Uint8Array {
|
|
119
|
+
const prefixer = new Prefixer({ qb64: anc.pre });
|
|
120
|
+
const seqner = new Seqner({ sn: anc.sn });
|
|
121
|
+
const saider = new Saider({ qb64: anc.ked['d'] });
|
|
122
|
+
const craw = new Uint8Array();
|
|
123
|
+
const ctr = new Counter({ code: CtrDex.SealSourceTriples, count: 1 }).qb64b;
|
|
124
|
+
const prefix = prefixer.qb64b;
|
|
125
|
+
const seq = seqner.qb64b;
|
|
126
|
+
const said = saider.qb64b;
|
|
127
|
+
const newCraw = new Uint8Array(
|
|
128
|
+
craw.length + ctr.length + prefix.length + seq.length + said.length
|
|
129
|
+
);
|
|
130
|
+
newCraw.set(craw);
|
|
131
|
+
newCraw.set(ctr, craw.length);
|
|
132
|
+
newCraw.set(prefix, craw.length + ctr.length);
|
|
133
|
+
newCraw.set(seq, craw.length + ctr.length + prefix.length);
|
|
134
|
+
newCraw.set(said, craw.length + ctr.length + prefix.length + seq.length);
|
|
135
|
+
return newCraw;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export function serializeIssExnAttachment(anc: Serder): Uint8Array {
|
|
139
|
+
const seqner = new Seqner({ sn: anc.sn });
|
|
140
|
+
const ancSaider = new Saider({ qb64: anc.ked['d'] });
|
|
141
|
+
const coupleArray = new Uint8Array(
|
|
142
|
+
seqner.qb64b.length + ancSaider.qb64b.length
|
|
143
|
+
);
|
|
144
|
+
coupleArray.set(seqner.qb64b);
|
|
145
|
+
coupleArray.set(ancSaider.qb64b, seqner.qb64b.length);
|
|
146
|
+
const counter = new Counter({
|
|
147
|
+
code: CtrDex.SealSourceCouples,
|
|
148
|
+
count: 1,
|
|
149
|
+
});
|
|
150
|
+
const counterQb64b = counter.qb64b;
|
|
151
|
+
const atc = new Uint8Array(counter.qb64b.length + coupleArray.length);
|
|
152
|
+
atc.set(counterQb64b);
|
|
153
|
+
atc.set(coupleArray, counterQb64b.length);
|
|
154
|
+
|
|
155
|
+
if (atc.length % 4 !== 0) {
|
|
156
|
+
throw new Error(
|
|
157
|
+
`Invalid attachments size: ${atc.length}, non-integral quadlets detected.`
|
|
158
|
+
);
|
|
159
|
+
}
|
|
160
|
+
const pcnt = new Counter({
|
|
161
|
+
code: CtrDex.AttachedMaterialQuadlets,
|
|
162
|
+
count: Math.floor(atc.length / 4),
|
|
163
|
+
});
|
|
164
|
+
const msg = new Uint8Array(pcnt.qb64b.length + atc.length);
|
|
165
|
+
msg.set(pcnt.qb64b);
|
|
166
|
+
msg.set(atc, pcnt.qb64b.length);
|
|
167
|
+
|
|
168
|
+
return msg;
|
|
98
169
|
}
|