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.
Files changed (115) hide show
  1. package/README.md +96 -47
  2. package/dist/buffer-polyfill.d.ts +1 -0
  3. package/dist/exports.d.ts +40 -0
  4. package/dist/index.d.ts +4 -3
  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 +245 -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 -47
  15. package/dist/keri/app/notifying.d.ts +34 -0
  16. package/dist/keri/core/authing.d.ts +10 -9
  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 -53
  21. package/dist/keri/core/counter.d.ts +43 -43
  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 -21
  26. package/dist/keri/core/httping.d.ts +44 -34
  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 -172
  31. package/dist/keri/core/matter.d.ts +116 -69
  32. package/dist/keri/core/number.d.ts +7 -6
  33. package/dist/keri/core/pather.d.ts +7 -0
  34. package/dist/keri/core/prefixer.d.ts +15 -15
  35. package/dist/keri/core/saider.d.ts +23 -23
  36. package/dist/keri/core/salter.d.ts +23 -23
  37. package/dist/keri/core/seqner.d.ts +15 -0
  38. package/dist/keri/core/serder.d.ts +31 -23
  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 -14
  42. package/dist/keri/core/utils.d.ts +20 -15
  43. package/dist/keri/core/vdring.d.ts +16 -0
  44. package/dist/keri/core/verfer.d.ts +13 -12
  45. package/dist/keri/end/ending.d.ts +13 -13
  46. package/dist/math.d.ts +1 -0
  47. package/dist/ready.d.ts +1 -0
  48. package/dist/signify-ts.cjs +7842 -0
  49. package/dist/signify-ts.cjs.development.js +6369 -256
  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 +6205 -229
  55. package/dist/signify-ts.esm.js.map +1 -1
  56. package/dist/signify-ts.mjs +7818 -0
  57. package/dist/signify-ts.mjs.map +7 -0
  58. package/package.json +49 -49
  59. package/src/buffer-polyfill.ts +5 -0
  60. package/src/exports.ts +44 -0
  61. package/src/index.ts +4 -5
  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 +841 -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 +118 -85
  72. package/src/keri/app/notifying.ts +69 -0
  73. package/src/keri/core/authing.ts +73 -85
  74. package/src/keri/core/bexter.ts +138 -0
  75. package/src/keri/core/cigar.ts +10 -11
  76. package/src/keri/core/cipher.ts +23 -14
  77. package/src/keri/core/core.ts +223 -81
  78. package/src/keri/core/counter.ts +182 -116
  79. package/src/keri/core/decrypter.ts +48 -34
  80. package/src/keri/core/diger.ts +23 -22
  81. package/src/keri/core/encrypter.ts +37 -27
  82. package/src/keri/core/eventing.ts +468 -106
  83. package/src/keri/core/httping.ts +151 -105
  84. package/src/keri/core/indexer.ts +313 -211
  85. package/src/keri/core/keeping.ts +679 -3
  86. package/src/keri/core/kering.ts +4 -6
  87. package/src/keri/core/manager.ts +660 -499
  88. package/src/keri/core/matter.ts +382 -148
  89. package/src/keri/core/number.ts +56 -11
  90. package/src/keri/core/pather.ts +98 -0
  91. package/src/keri/core/prefixer.ts +122 -101
  92. package/src/keri/core/saider.ts +104 -76
  93. package/src/keri/core/salter.ts +71 -40
  94. package/src/keri/core/seqner.ts +46 -0
  95. package/src/keri/core/serder.ts +102 -38
  96. package/src/keri/core/siger.ts +19 -18
  97. package/src/keri/core/signer.ts +73 -53
  98. package/src/keri/core/tholder.ts +196 -30
  99. package/src/keri/core/utils.ts +121 -50
  100. package/src/keri/core/vdring.ts +94 -0
  101. package/src/keri/core/verfer.ts +22 -9
  102. package/src/keri/end/ending.ts +111 -101
  103. package/src/math.ts +3 -0
  104. package/src/ready.ts +5 -0
  105. package/dist/keri/app/accountant.d.ts +0 -10
  106. package/dist/keri/app/apping.d.ts +0 -1
  107. package/dist/keri/app/client.d.ts +0 -7
  108. package/dist/keri/app/signify.d.ts +0 -6
  109. package/src/keri/app/accountant.ts +0 -35
  110. package/src/keri/app/apping.ts +0 -12
  111. package/src/keri/app/client.ts +0 -30
  112. package/src/keri/app/signify.ts +0 -12
  113. package/src/keri/app/tsconfig.json +0 -100
  114. package/src/keri/core/tsconfig.json +0 -100
  115. package/src/keri/end/tsconfig.json +0 -100
@@ -1,129 +1,117 @@
1
- import {Signer} from "./signer";
2
- import {Verfer} from "./verfer";
3
- import {desiginput, normalize, siginput} from "./httping";
4
- import {b} from "./core";
5
- import {parseDictionary} from "structured-headers";
6
- import {Signage, signature} from "../end/ending";
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
- "Signify-Resource",
16
- "@method",
17
- "@path",
18
- "Signify-Timestamp"
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, aaid: string) {
24
- this._csig = csig
25
- this._verfer = new Verfer({qb64: aaid})
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
- let siginput = headers.get("Signature-Input")
23
+ const siginput = headers.get('Signature-Input');
30
24
  if (siginput == null) {
31
- return false
25
+ return false;
32
26
  }
33
- let signature = headers.get("Signature")
27
+ const signature = headers.get('Signature');
34
28
  if (signature == null) {
35
- return false
29
+ return false;
36
30
  }
37
-
38
- let inputs = desiginput(siginput)
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
- let items = new Array<string>()
37
+ const items = new Array<string>();
47
38
  input.fields!.forEach((field: string) => {
48
- if (field.startsWith("@")) {
49
- if (field == "@method") {
50
- items.push(`"${field}": ${method}`)
51
- } else if (field == "@path") {
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
- let value = normalize(headers.get(field) as string)
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
- let values = new Array<string>()
63
- values.push(`(${input.fields!.join(" ")})`)
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
- let params = values.join(";")
83
-
84
- items.push(`"@signature-params: ${params}"`)
85
- let ser = b(items.join("\n"))
86
-
87
- let signage = parseDictionary(signature!)
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(headers: Headers, method: string, path: string, fields?: Array<string>): Headers {
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
- let [header, sig] = siginput(this._csig, {
109
- name: "signify", method, path, headers, fields, alg: "ed25519",
110
- keyid: this._csig.verfer.qb64
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
- let markers = new Map<string, Siger|Cigar>()
118
- markers.set("signify", sig)
119
- let signage = new Signage(markers, false)
120
- let signed = signature([signage])
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
+ }
@@ -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 | 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
+ }
@@ -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
+ }