signify-ts 0.1.0 → 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.
Files changed (105) hide show
  1. package/README.md +101 -5
  2. package/dist/buffer-polyfill.d.ts +1 -0
  3. package/dist/exports.d.ts +40 -0
  4. package/dist/index.d.ts +4 -1
  5. package/dist/keri/app/aiding.d.ts +138 -0
  6. package/dist/keri/app/clienting.d.ts +182 -0
  7. package/dist/keri/app/contacting.d.ts +93 -0
  8. package/dist/keri/app/controller.d.ts +49 -0
  9. package/dist/keri/app/coring.d.ts +121 -0
  10. package/dist/keri/app/credentialing.d.ts +239 -0
  11. package/dist/keri/app/escrowing.d.ts +19 -0
  12. package/dist/keri/app/exchanging.d.ts +60 -0
  13. package/dist/keri/app/grouping.d.ts +44 -0
  14. package/dist/keri/app/habery.d.ts +48 -0
  15. package/dist/keri/app/notifying.d.ts +34 -0
  16. package/dist/keri/core/authing.d.ts +10 -0
  17. package/dist/keri/core/bexter.d.ts +7 -0
  18. package/dist/keri/core/cigar.d.ts +8 -8
  19. package/dist/keri/core/cipher.d.ts +5 -5
  20. package/dist/keri/core/core.d.ts +59 -68
  21. package/dist/keri/core/counter.d.ts +43 -0
  22. package/dist/keri/core/decrypter.d.ts +10 -10
  23. package/dist/keri/core/diger.d.ts +21 -21
  24. package/dist/keri/core/encrypter.d.ts +9 -9
  25. package/dist/keri/core/eventing.d.ts +54 -0
  26. package/dist/keri/core/httping.d.ts +44 -0
  27. package/dist/keri/core/indexer.d.ts +98 -88
  28. package/dist/keri/core/keeping.d.ts +103 -1
  29. package/dist/keri/core/kering.d.ts +5 -5
  30. package/dist/keri/core/manager.d.ts +174 -151
  31. package/dist/keri/core/matter.d.ts +116 -47
  32. package/dist/keri/core/number.d.ts +7 -0
  33. package/dist/keri/core/pather.d.ts +7 -0
  34. package/dist/keri/core/prefixer.d.ts +15 -0
  35. package/dist/keri/core/saider.d.ts +23 -0
  36. package/dist/keri/core/salter.d.ts +23 -0
  37. package/dist/keri/core/seqner.d.ts +15 -0
  38. package/dist/keri/core/serder.d.ts +31 -0
  39. package/dist/keri/core/siger.d.ts +18 -18
  40. package/dist/keri/core/signer.d.ts +34 -34
  41. package/dist/keri/core/tholder.d.ts +29 -0
  42. package/dist/keri/core/utils.d.ts +20 -14
  43. package/dist/keri/core/vdring.d.ts +16 -0
  44. package/dist/keri/core/verfer.d.ts +13 -0
  45. package/dist/keri/end/ending.d.ts +13 -0
  46. package/dist/math.d.ts +1 -0
  47. package/dist/ready.d.ts +1 -0
  48. package/dist/signify-ts.cjs +7835 -0
  49. package/dist/signify-ts.cjs.development.js +9493 -5
  50. package/dist/signify-ts.cjs.development.js.map +1 -1
  51. package/dist/signify-ts.cjs.map +7 -0
  52. package/dist/signify-ts.cjs.production.min.js +1 -1
  53. package/dist/signify-ts.cjs.production.min.js.map +1 -1
  54. package/dist/signify-ts.esm.js +9341 -5
  55. package/dist/signify-ts.esm.js.map +1 -1
  56. package/dist/signify-ts.mjs +7811 -0
  57. package/dist/signify-ts.mjs.map +7 -0
  58. package/package.json +51 -49
  59. package/src/buffer-polyfill.ts +5 -0
  60. package/src/exports.ts +44 -0
  61. package/src/index.ts +4 -6
  62. package/src/keri/app/aiding.ts +493 -0
  63. package/src/keri/app/clienting.ts +492 -0
  64. package/src/keri/app/contacting.ts +188 -0
  65. package/src/keri/app/controller.ts +372 -0
  66. package/src/keri/app/coring.ts +225 -0
  67. package/src/keri/app/credentialing.ts +820 -0
  68. package/src/keri/app/escrowing.ts +34 -0
  69. package/src/keri/app/exchanging.ts +220 -0
  70. package/src/keri/app/grouping.ts +90 -0
  71. package/src/keri/app/habery.ts +185 -0
  72. package/src/keri/app/notifying.ts +69 -0
  73. package/src/keri/core/authing.ts +117 -0
  74. package/src/keri/core/bexter.ts +138 -0
  75. package/src/keri/core/cigar.ts +11 -12
  76. package/src/keri/core/cipher.ts +23 -14
  77. package/src/keri/core/core.ts +249 -97
  78. package/src/keri/core/counter.ts +273 -0
  79. package/src/keri/core/decrypter.ts +48 -34
  80. package/src/keri/core/diger.ts +25 -24
  81. package/src/keri/core/encrypter.ts +37 -27
  82. package/src/keri/core/eventing.ts +581 -0
  83. package/src/keri/core/httping.ts +209 -0
  84. package/src/keri/core/indexer.ts +314 -211
  85. package/src/keri/core/keeping.ts +679 -4
  86. package/src/keri/core/kering.ts +4 -6
  87. package/src/keri/core/manager.ts +759 -450
  88. package/src/keri/core/matter.ts +404 -135
  89. package/src/keri/core/number.ts +66 -0
  90. package/src/keri/core/pather.ts +98 -0
  91. package/src/keri/core/prefixer.ts +233 -0
  92. package/src/keri/core/saider.ts +186 -0
  93. package/src/keri/core/salter.ts +76 -41
  94. package/src/keri/core/seqner.ts +46 -0
  95. package/src/keri/core/serder.ts +163 -0
  96. package/src/keri/core/siger.ts +19 -18
  97. package/src/keri/core/signer.ts +74 -53
  98. package/src/keri/core/tholder.ts +218 -0
  99. package/src/keri/core/utils.ts +120 -45
  100. package/src/keri/core/vdring.ts +94 -0
  101. package/src/keri/core/verfer.ts +25 -11
  102. package/src/keri/end/ending.ts +170 -0
  103. package/src/math.ts +3 -0
  104. package/src/ready.ts +5 -0
  105. package/src/keri/core/tsconfig.json +0 -100
@@ -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
+ }
@@ -1,19 +1,18 @@
1
- import {Verfer} from "./verfer";
2
- import {Matter, MatterArgs} from "./matter";
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
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
- get verfer(): Verfer {
13
- return this._verfer
11
+ get verfer(): Verfer | undefined {
12
+ return this._verfer;
14
13
  }
15
14
 
16
- set verfer(verfer:Verfer) {
17
- this._verfer = verfer
15
+ set verfer(verfer: Verfer | undefined) {
16
+ this._verfer = verfer;
18
17
  }
19
- }
18
+ }
@@ -1,25 +1,34 @@
1
- import {Matter, MatterArgs, MtrDex} from "./matter";
2
- import {Decrypter} from "./decrypter";
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 (raw.length == Matter._rawSize(MtrDex.X25519_Cipher_Seed)) {
11
- code = MtrDex.X25519_Cipher_Salt
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 (!(Array.from([MtrDex.X25519_Cipher_Salt, MtrDex.X25519_Cipher_Seed]).includes(this.code))) {
17
- throw new Error(`Unsupported Cipher code == ${this.code}`)
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(prikey: Uint8Array | undefined = undefined, seed: Uint8Array | undefined = undefined) {
22
- let decrypter = new Decrypter({qb64b: prikey}, seed)
23
- return decrypter.decrypt(this.qb64b)
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
+ }
@@ -1,16 +1,24 @@
1
- const util = require('./utils');
2
- import {TextEncoder, TextDecoder} from 'util'
3
-
4
- export const VERRAWSIZE = 6;
5
- export const Versionage = {major: 1, minor: 0};
6
- export const Serialage = {json: '', mgpk: '', cbor: ''};
7
- export const Vstrings = Serialage;
8
- export const Serials = {json: 'JSON', mgpk: 'MGPK', cbor: 'CBOR'};
9
-
10
- // # element labels to exclude in digest or signature derivation from inception icp
11
- export const IcpExcludes = ['pre'];
12
- // # element labels to exclude in digest or signature derivation from delegated inception dip
13
- export const DipExcludes = ['pre'];
1
+ export enum Serials {
2
+ JSON = 'JSON',
3
+ }
4
+
5
+ export enum Ident {
6
+ KERI = 'KERI',
7
+ ACDC = 'ACDC',
8
+ }
9
+
10
+ export class Version {
11
+ public major: number;
12
+ public minor: number;
13
+
14
+ constructor(major: number = 1, minor: number = 0) {
15
+ this.major = major;
16
+ this.minor = minor;
17
+ }
18
+ }
19
+
20
+ export const Versionage = new Version();
21
+
14
22
  export const Ilks = {
15
23
  icp: 'icp',
16
24
  rot: 'rot',
@@ -19,75 +27,128 @@ export const Ilks = {
19
27
  drt: 'drt',
20
28
  rct: 'rct',
21
29
  vrc: 'vrc',
30
+ rpy: 'rpy',
31
+ exn: 'exn',
32
+ vcp: 'vcp',
33
+ iss: 'iss',
34
+ rev: 'rev',
22
35
  };
23
36
 
24
- export const IcpLabels = ["v", "i", "s", "t", "kt", "k", "n",
25
- "bt", "b", "c", "a"];
26
-
27
- export const DipLabels = ["v", "i", "s", "t", "kt", "k", "n",
28
- "bt", "b", "c", "a", "di"];
29
-
30
- export const RotLabels = ["v", "i", "s", "t", "p", "kt", "k", "n",
31
- "bt", "br", "ba", "a"]
32
- export const DrtLabels = ["v", "i", "s", "t", "p", "kt", "k", "n",
33
- "bt", "br", "ba", "a"]
34
- export const IxnLabels = ["v", "i", "s", "t", "p", "a"]
35
-
36
- export const KsnLabels = ["v", "i", "s", "t", "p", "d", "f", "dt", "et", "kt", "k", "n",
37
- "bt", "b", "c", "ee", "di", "r"]
38
-
39
- export const RpyLabels = ["v", "t", "d", "dt", "r", "a"]
40
-
41
- const encoder = new TextEncoder()
42
- const decoder = new TextDecoder()
37
+ export const IcpLabels = [
38
+ 'v',
39
+ 'i',
40
+ 's',
41
+ 't',
42
+ 'kt',
43
+ 'k',
44
+ 'n',
45
+ 'bt',
46
+ 'b',
47
+ 'c',
48
+ 'a',
49
+ ];
50
+
51
+ export const DipLabels = [
52
+ 'v',
53
+ 'i',
54
+ 's',
55
+ 't',
56
+ 'kt',
57
+ 'k',
58
+ 'n',
59
+ 'bt',
60
+ 'b',
61
+ 'c',
62
+ 'a',
63
+ 'di',
64
+ ];
65
+
66
+ export const RotLabels = [
67
+ 'v',
68
+ 'i',
69
+ 's',
70
+ 't',
71
+ 'p',
72
+ 'kt',
73
+ 'k',
74
+ 'n',
75
+ 'bt',
76
+ 'br',
77
+ 'ba',
78
+ 'a',
79
+ ];
80
+ export const DrtLabels = [
81
+ 'v',
82
+ 'i',
83
+ 's',
84
+ 't',
85
+ 'p',
86
+ 'kt',
87
+ 'k',
88
+ 'n',
89
+ 'bt',
90
+ 'br',
91
+ 'ba',
92
+ 'a',
93
+ ];
94
+ export const IxnLabels = ['v', 'i', 's', 't', 'p', 'a'];
95
+
96
+ export const KsnLabels = [
97
+ 'v',
98
+ 'i',
99
+ 's',
100
+ 't',
101
+ 'p',
102
+ 'd',
103
+ 'f',
104
+ 'dt',
105
+ 'et',
106
+ 'kt',
107
+ 'k',
108
+ 'n',
109
+ 'bt',
110
+ 'b',
111
+ 'c',
112
+ 'ee',
113
+ 'di',
114
+ 'r',
115
+ ];
116
+
117
+ export const RpyLabels = ['v', 't', 'd', 'dt', 'r', 'a'];
118
+
119
+ const encoder = new TextEncoder();
120
+ const decoder = new TextDecoder();
43
121
 
44
122
  export const VERFULLSIZE = 17;
45
123
  export const MINSNIFFSIZE = 12 + VERFULLSIZE;
46
124
  export const MINSIGSIZE = 4;
47
125
 
48
- /**
49
- * @description It will return version string
50
- */
51
- export function versify(version: { major: number, minor: number }, kind = Serials.json, size: number) {
52
- if (!(Object.values(Serials).indexOf(kind) > -1)) {
53
- throw new Error('Invalid serialization kind =' + kind);
54
- }
55
-
56
- if (!version) {
57
- version = Versionage;
58
- }
59
-
60
- const hex1 = version.major.toString(16);
61
- const hex2 = version.minor.toString(16);
62
- const kindHex = kind;
63
- const hex3 = util.pad(size.toString(16), VERRAWSIZE);
64
-
65
- return `KERI${hex1}${hex2}${kindHex}${hex3}_`;
66
- }
67
-
68
- Vstrings.json = versify(Versionage, Serials.json, 0);
69
- Vstrings.mgpk = versify(Versionage, Serials.mgpk, 0);
70
- Vstrings.cbor = versify(Versionage, Serials.cbor, 0);
71
-
72
126
  // const version_pattern = 'KERI(?P<major>[0-9a-f])(?P<minor>[0-9a-f])
73
127
  // (?P<kind>[A-Z]{4})(?P<size>[0-9a-f]{6})'
74
128
  // const version_pattern1 = `KERI\(\?P<major>\[0\-9a\-f\]\)\(\?P<minor>\[0\-9a\-f\]\)\
75
129
  // (\?P<kind>\[A\-Z\]\{4\}\)\(\?P<size>\[0\-9a\-f\]\{6\}\)_`
76
130
 
77
- export const VEREX = 'KERI([0-9a-f])([0-9a-f])([A-Z]{4})([0-9a-f]{6})';
131
+ export const VEREX = '(KERI|ACDC)([0-9a-f])([0-9a-f])([A-Z]{4})([0-9a-f]{6})_';
132
+
133
+ export interface Dict<TValue> {
134
+ [id: string]: TValue;
135
+ }
78
136
 
79
137
  // Regex pattern matching
80
138
 
81
139
  /**
82
140
  * @description This function is use to deversify the version
83
141
  * Here we will use regex to to validate and extract serialization kind,size and version
84
- * @param {string} vs version string
85
- * @return {Object} contaning kind of serialization like cbor,json,mgpk
142
+ * @param {string} versionString version string
143
+ * @return {Object} contaning prototol (KERI or ACDC), kind of serialization like cbor,json,mgpk
86
144
  * version = version of object ,size = raw size integer
87
145
  */
88
- export function deversify(versionString: string) {
146
+ export function deversify(
147
+ versionString: string
148
+ ): [Ident, Serials, Version, string] {
89
149
  let kind;
90
150
  let size;
151
+ let proto;
91
152
  const version = Versionage;
92
153
 
93
154
  // we need to identify how to match the buffers pattern ,like we do regex matching for strings
@@ -96,79 +157,170 @@ export function deversify(versionString: string) {
96
157
  const match = re.exec(versionString);
97
158
 
98
159
  if (match) {
99
- [version.major, version.minor, kind, size] = [
100
- +match[1],
160
+ [proto, version.major, version.minor, kind, size] = [
161
+ match[1],
101
162
  +match[2],
102
- match[3],
163
+ +match[3],
103
164
  match[4],
165
+ match[5],
104
166
  ];
105
- if (!Object.values(Serials).includes(kind)) {
167
+ if (!Object.values(Serials).includes(kind as Serials)) {
106
168
  throw new Error(`Invalid serialization kind = ${kind}`);
107
169
  }
108
- return [kind, version, size];
170
+ if (!Object.values(Ident).includes(proto as Ident)) {
171
+ throw new Error(`Invalid serialization kind = ${kind}`);
172
+ }
173
+
174
+ const ta = kind as keyof typeof Serials;
175
+ kind = Serials[ta];
176
+ const pa = proto as keyof typeof Ident;
177
+ proto = Ident[pa];
178
+
179
+ return [proto, kind, version, size];
109
180
  }
110
181
  throw new Error(`Invalid version string = ${versionString}`);
111
182
  }
112
183
 
113
- export const B64ChrByIdx = new Map<number, string>([[0, 'A'], [1, 'B'], [2, 'C'], [3, 'D'], [4, 'E'], [5, 'F'],
114
- [6, 'G'], [7, 'H'], [8, 'I'], [9, 'J'], [10, 'K'], [11, 'L'], [12, 'M'], [13, 'N'], [14, 'O'], [15, 'P'],
115
- [16, 'Q'], [17, 'R'], [18, 'S'], [19, 'T'], [20, 'U'], [21, 'V'], [22, 'W'], [23, 'X'], [24, 'Y'], [25, 'Z'],
116
- [26, 'a'], [27, 'b'], [28, 'c'], [29, 'd'], [30, 'e'], [31, 'f'], [32, 'g'], [33, 'h'], [34, 'i'], [35, 'j'],
117
- [36, 'k'], [37, 'l'], [38, 'm'], [39, 'n'], [40, 'o'], [41, 'p'], [42, 'q'], [43, 'r'], [44, 's'], [45, 't'],
118
- [46, 'u'], [47, 'v'], [48, 'w'], [49, 'x'], [50, 'y'], [51, 'z'],[ 52, '0'], [53, '1'], [54, '2'], [55, '3'],
119
- [56, '4'], [57, '5'], [58, '6'], [59, '7'], [60, '8'], [61, '9'], [62, '-'], [63, '_']]);
120
-
121
- export const B64IdxByChr = new Map<string, number>(Array.from(B64ChrByIdx, entry => [entry[1], entry[0]]))
122
-
123
- export function intToB64(i:number | undefined, l=1): string {
124
- let out = ""
125
- while(l != 0) {
126
- out = B64ChrByIdx.get(i! % 64) + out
127
- i = Math.floor(i! / 64)
184
+ export function versify(
185
+ ident: Ident = Ident.KERI,
186
+ version?: Version,
187
+ kind: Serials = Serials.JSON,
188
+ size: number = 0
189
+ ) {
190
+ version = version == undefined ? Versionage : version;
191
+
192
+ return `${ident}${version.major.toString(
193
+ 16
194
+ )}${version.minor.toString()}${kind}${size.toString(16).padStart(6, '0')}_`;
195
+ }
196
+
197
+ export const B64ChrByIdx = new Map<number, string>([
198
+ [0, 'A'],
199
+ [1, 'B'],
200
+ [2, 'C'],
201
+ [3, 'D'],
202
+ [4, 'E'],
203
+ [5, 'F'],
204
+ [6, 'G'],
205
+ [7, 'H'],
206
+ [8, 'I'],
207
+ [9, 'J'],
208
+ [10, 'K'],
209
+ [11, 'L'],
210
+ [12, 'M'],
211
+ [13, 'N'],
212
+ [14, 'O'],
213
+ [15, 'P'],
214
+ [16, 'Q'],
215
+ [17, 'R'],
216
+ [18, 'S'],
217
+ [19, 'T'],
218
+ [20, 'U'],
219
+ [21, 'V'],
220
+ [22, 'W'],
221
+ [23, 'X'],
222
+ [24, 'Y'],
223
+ [25, 'Z'],
224
+ [26, 'a'],
225
+ [27, 'b'],
226
+ [28, 'c'],
227
+ [29, 'd'],
228
+ [30, 'e'],
229
+ [31, 'f'],
230
+ [32, 'g'],
231
+ [33, 'h'],
232
+ [34, 'i'],
233
+ [35, 'j'],
234
+ [36, 'k'],
235
+ [37, 'l'],
236
+ [38, 'm'],
237
+ [39, 'n'],
238
+ [40, 'o'],
239
+ [41, 'p'],
240
+ [42, 'q'],
241
+ [43, 'r'],
242
+ [44, 's'],
243
+ [45, 't'],
244
+ [46, 'u'],
245
+ [47, 'v'],
246
+ [48, 'w'],
247
+ [49, 'x'],
248
+ [50, 'y'],
249
+ [51, 'z'],
250
+ [52, '0'],
251
+ [53, '1'],
252
+ [54, '2'],
253
+ [55, '3'],
254
+ [56, '4'],
255
+ [57, '5'],
256
+ [58, '6'],
257
+ [59, '7'],
258
+ [60, '8'],
259
+ [61, '9'],
260
+ [62, '-'],
261
+ [63, '_'],
262
+ ]);
263
+
264
+ export const B64IdxByChr = new Map<string, number>(
265
+ Array.from(B64ChrByIdx, (entry) => [entry[1], entry[0]])
266
+ );
267
+
268
+ export function intToB64(i: number, l = 1): string {
269
+ let out = '';
270
+ while (l != 0) {
271
+ out = B64ChrByIdx.get(i % 64) + out;
272
+ i = Math.floor(i / 64);
128
273
  if (i == 0) {
129
- break
274
+ break;
130
275
  }
131
276
  }
132
277
 
133
- for(let i = 0; i < (l - out.length); i++) {
134
- out = "A" + out
278
+ const x = l - out.length;
279
+ for (let i = 0; i < x; i++) {
280
+ out = 'A' + out;
135
281
  }
136
282
 
137
- return out
283
+ return out;
138
284
  }
139
285
 
140
286
  export function intToB64b(n: number, l: number = 1): Uint8Array {
141
- let s = intToB64(n, l)
142
- return b(s)
287
+ const s = intToB64(n, l);
288
+ return b(s);
143
289
  }
144
290
 
145
291
  export function b64ToInt(s: string): number {
146
292
  if (s.length == 0) {
147
- throw new Error("Empty string, conversion undefined.")
293
+ throw new Error('Empty string, conversion undefined.');
148
294
  }
149
295
 
150
- let i = 0
151
- let rev = [...s].reverse()
296
+ let i = 0;
297
+ const rev = s.split('').reverse();
152
298
  rev.forEach((c: string, e: number) => {
153
- i |= B64IdxByChr.get(c)! << (e * 6)
154
- })
299
+ i |= B64IdxByChr.get(c)! << (e * 6);
300
+ });
155
301
 
156
- return i
302
+ return i;
157
303
  }
158
304
 
159
305
  export function b(s?: string): Uint8Array {
160
- return encoder.encode(s)
306
+ return encoder.encode(s);
161
307
  }
162
308
 
163
- export function d(u? :Uint8Array): string {
164
- return decoder.decode(u)
309
+ export function d(u?: Uint8Array): string {
310
+ return decoder.decode(u);
165
311
  }
166
312
 
313
+ export function concat(one: Uint8Array, two: Uint8Array): Uint8Array {
314
+ const out = new Uint8Array(one.length + two.length);
315
+ out.set(one);
316
+ out.set(two, one.length);
317
+ return out;
318
+ }
167
319
 
168
320
  export function readInt(array: Uint8Array) {
169
321
  let value = 0;
170
322
  for (let i = 0; i < array.length; i++) {
171
- value = (value * 256) + array[i];
323
+ value = value * 256 + array[i];
172
324
  }
173
325
  return value;
174
- }
326
+ }