@ibgib/ts-gib 0.5.17 → 0.5.18
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/dist/V1/sha256v1.d.mts +2 -0
- package/dist/V1/sha256v1.d.mts.map +1 -1
- package/dist/V1/sha256v1.mjs +71 -4
- package/dist/V1/sha256v1.mjs.map +1 -1
- package/package.json +1 -1
- package/src/V1/sha256v1.mts +64 -4
package/dist/V1/sha256v1.d.mts
CHANGED
|
@@ -5,6 +5,8 @@ import { IbGib_V1 } from "./types.mjs";
|
|
|
5
5
|
* I have it all in one function for smallest, most independent version possible.
|
|
6
6
|
*
|
|
7
7
|
* #thanks https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest
|
|
8
|
+
* #thanks https://stackoverflow.com/questions/49129643/how-do-i-merge-an-array-of-uint8arrays
|
|
9
|
+
* #thanks https://stackoverflow.com/a/49129872/3897838 (answer to above)
|
|
8
10
|
*
|
|
9
11
|
* @param ibGib ibGib for which to calculate the gib
|
|
10
12
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sha256v1.d.mts","sourceRoot":"","sources":["../../src/V1/sha256v1.mts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAgC,MAAM,aAAa,CAAC;AAMrE
|
|
1
|
+
{"version":3,"file":"sha256v1.d.mts","sourceRoot":"","sources":["../../src/V1/sha256v1.mts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAgC,MAAM,aAAa,CAAC;AAMrE;;;;;;;;;;GAUG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,GAAE,MAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAyG5E;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAC/B,OAAO,EAAE,MAAM,GAAG,SAAS,GAC5B,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAW7B"}
|
package/dist/V1/sha256v1.mjs
CHANGED
|
@@ -7,6 +7,8 @@ let { subtle } = crypto;
|
|
|
7
7
|
* I have it all in one function for smallest, most independent version possible.
|
|
8
8
|
*
|
|
9
9
|
* #thanks https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest
|
|
10
|
+
* #thanks https://stackoverflow.com/questions/49129643/how-do-i-merge-an-array-of-uint8arrays
|
|
11
|
+
* #thanks https://stackoverflow.com/a/49129872/3897838 (answer to above)
|
|
10
12
|
*
|
|
11
13
|
* @param ibGib ibGib for which to calculate the gib
|
|
12
14
|
*/
|
|
@@ -22,19 +24,60 @@ export function sha256v1(ibGib, salt = "") {
|
|
|
22
24
|
const msgUint8 = new TextEncoder().encode(message);
|
|
23
25
|
const buffer = await subtle.digest('SHA-256', msgUint8);
|
|
24
26
|
const asArray = Array.from(new Uint8Array(buffer));
|
|
27
|
+
// return hashAsHex
|
|
25
28
|
return asArray.map(b => b.toString(16).padStart(2, '0')).join('');
|
|
26
29
|
};
|
|
30
|
+
let hashToHex_Uint8Array = async (salt, msgUint8) => {
|
|
31
|
+
let tohashUint8Array;
|
|
32
|
+
if (salt) {
|
|
33
|
+
const msgUint8_salt = new TextEncoder().encode(salt);
|
|
34
|
+
tohashUint8Array = new Uint8Array(msgUint8_salt.length + msgUint8.length);
|
|
35
|
+
tohashUint8Array.set(msgUint8_salt);
|
|
36
|
+
tohashUint8Array.set(msgUint8, msgUint8_salt.length);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
tohashUint8Array = msgUint8;
|
|
40
|
+
}
|
|
41
|
+
const hashAsBuffer = await subtle.digest('SHA-256', tohashUint8Array);
|
|
42
|
+
const hashAsArray = Array.from(new Uint8Array(hashAsBuffer));
|
|
43
|
+
// return hashAsHex
|
|
44
|
+
return hashAsArray.map(b => b.toString(16).padStart(2, '0')).join('');
|
|
45
|
+
};
|
|
27
46
|
let hashFields;
|
|
28
47
|
if (salt) {
|
|
29
48
|
hashFields = async (ib, data, rel8ns) => {
|
|
30
49
|
const hasRel8ns = Object.keys(rel8ns || {}).length > 0 &&
|
|
31
50
|
Object.keys(rel8ns || {}).some(k => rel8ns[k] && rel8ns[k].length > 0);
|
|
32
|
-
|
|
51
|
+
let hasData = !!data;
|
|
52
|
+
if (hasData) {
|
|
53
|
+
if (typeof data === 'string') {
|
|
54
|
+
hasData = data.length > 0;
|
|
55
|
+
}
|
|
56
|
+
else if (data instanceof Uint8Array) {
|
|
57
|
+
hasData = true;
|
|
58
|
+
}
|
|
59
|
+
else if (typeof data === 'object') {
|
|
60
|
+
hasData = Object.keys((data) || {}).length > 0;
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
hasData = true;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
33
66
|
const ibHash = (await hashToHex(salt + ib)).toUpperCase();
|
|
34
67
|
// empty, null, undefined all treated the same at this level.
|
|
35
68
|
const rel8nsHash = hasRel8ns ? (await hashToHex(salt + JSON.stringify(rel8ns))).toUpperCase() : "";
|
|
36
69
|
// empty, null, undefined all treated the same at this level (though not farther down in data)
|
|
37
|
-
|
|
70
|
+
// change this for binaries (Uint8Array data)
|
|
71
|
+
// const dataHash: string = hasData ? (await hashToHex(salt + JSON.stringify(data))).toUpperCase() : "";
|
|
72
|
+
let dataHash = "";
|
|
73
|
+
if (hasData) {
|
|
74
|
+
if (data instanceof Uint8Array) {
|
|
75
|
+
dataHash = (await hashToHex_Uint8Array(salt, data)).toUpperCase();
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
dataHash = (await hashToHex(salt + JSON.stringify(data))).toUpperCase();
|
|
79
|
+
}
|
|
80
|
+
}
|
|
38
81
|
// if the ibgib has no rel8ns or data, the hash should be just of the ib itself.
|
|
39
82
|
const allHash = hasRel8ns || hasData ?
|
|
40
83
|
(await hashToHex(salt + ibHash + rel8nsHash + dataHash)).toUpperCase() :
|
|
@@ -46,12 +89,36 @@ export function sha256v1(ibGib, salt = "") {
|
|
|
46
89
|
hashFields = async (ib, data, rel8ns) => {
|
|
47
90
|
const hasRel8ns = Object.keys(rel8ns || {}).length > 0 &&
|
|
48
91
|
Object.keys(rel8ns || {}).some(k => rel8ns[k] && rel8ns[k].length > 0);
|
|
49
|
-
const hasData = Object.keys((data) || {}).length > 0;
|
|
92
|
+
// const hasData = Object.keys((data) || {}).length > 0;
|
|
93
|
+
let hasData = !!data;
|
|
94
|
+
if (hasData) {
|
|
95
|
+
if (typeof data === 'string') {
|
|
96
|
+
hasData = data.length > 0;
|
|
97
|
+
}
|
|
98
|
+
else if (data instanceof Uint8Array) {
|
|
99
|
+
hasData = true;
|
|
100
|
+
}
|
|
101
|
+
else if (typeof data === 'object') {
|
|
102
|
+
hasData = Object.keys((data) || {}).length > 0;
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
hasData = true;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
50
108
|
const ibHash = (await hashToHex(ib)).toUpperCase();
|
|
51
109
|
// empty, null, undefined all treated the same at this level.
|
|
52
110
|
const rel8nsHash = hasRel8ns ? (await hashToHex(JSON.stringify(rel8ns))).toUpperCase() : "";
|
|
53
111
|
// empty, null, undefined all treated the same at this level (though not farther down in data)
|
|
54
|
-
const dataHash = hasData ? (await hashToHex(JSON.stringify(data))).toUpperCase() : "";
|
|
112
|
+
// const dataHash: string = hasData ? (await hashToHex(JSON.stringify(data))).toUpperCase() : "";
|
|
113
|
+
let dataHash = "";
|
|
114
|
+
if (hasData) {
|
|
115
|
+
if (data instanceof Uint8Array) {
|
|
116
|
+
dataHash = (await hashToHex_Uint8Array('', data)).toUpperCase();
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
dataHash = (await hashToHex(JSON.stringify(data))).toUpperCase();
|
|
120
|
+
}
|
|
121
|
+
}
|
|
55
122
|
// if the ibgib has no rel8ns or data, the hash should be just of the ib itself.
|
|
56
123
|
const allHash = hasRel8ns || hasData ?
|
|
57
124
|
(await hashToHex(ibHash + rel8nsHash + dataHash)).toUpperCase() :
|
package/dist/V1/sha256v1.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sha256v1.mjs","sourceRoot":"","sources":["../../src/V1/sha256v1.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAIpD,IAAI,MAAM,GAAQ,UAAU,CAAC,MAAM,CAAC;AACpC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;AAExB
|
|
1
|
+
{"version":3,"file":"sha256v1.mjs","sourceRoot":"","sources":["../../src/V1/sha256v1.mts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ibgib/ts-gib",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.18",
|
|
4
4
|
"description": "ibgib library with low-level graphing-related substrate functionality, e.g. creating raw ibgibs and transformations. node19+ needed for heavily-used webcrypto hashing isomorphically consumed in node and browsers (apps).",
|
|
5
5
|
"repository": {
|
|
6
6
|
"url": "https://gitlab.com/ibgib/ts-gib",
|
package/src/V1/sha256v1.mts
CHANGED
|
@@ -11,6 +11,8 @@ let { subtle } = crypto;
|
|
|
11
11
|
* I have it all in one function for smallest, most independent version possible.
|
|
12
12
|
*
|
|
13
13
|
* #thanks https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest
|
|
14
|
+
* #thanks https://stackoverflow.com/questions/49129643/how-do-i-merge-an-array-of-uint8arrays
|
|
15
|
+
* #thanks https://stackoverflow.com/a/49129872/3897838 (answer to above)
|
|
14
16
|
*
|
|
15
17
|
* @param ibGib ibGib for which to calculate the gib
|
|
16
18
|
*/
|
|
@@ -22,20 +24,58 @@ export function sha256v1(ibGib: IbGib_V1, salt: string = ""): Promise<string> {
|
|
|
22
24
|
const msgUint8 = new TextEncoder().encode(message);
|
|
23
25
|
const buffer = await subtle.digest('SHA-256', msgUint8);
|
|
24
26
|
const asArray = Array.from(new Uint8Array(buffer));
|
|
27
|
+
// return hashAsHex
|
|
25
28
|
return asArray.map(b => b.toString(16).padStart(2, '0')).join('');
|
|
26
29
|
};
|
|
30
|
+
let hashToHex_Uint8Array = async (salt: string, msgUint8: Uint8Array) => {
|
|
31
|
+
let tohashUint8Array: Uint8Array;
|
|
32
|
+
if (salt) {
|
|
33
|
+
const msgUint8_salt = new TextEncoder().encode(salt);
|
|
34
|
+
tohashUint8Array = new Uint8Array(msgUint8_salt.length + msgUint8.length);
|
|
35
|
+
tohashUint8Array.set(msgUint8_salt);
|
|
36
|
+
tohashUint8Array.set(msgUint8, msgUint8_salt.length);
|
|
37
|
+
} else {
|
|
38
|
+
tohashUint8Array = msgUint8;
|
|
39
|
+
}
|
|
40
|
+
const hashAsBuffer = await subtle.digest('SHA-256', tohashUint8Array);
|
|
41
|
+
const hashAsArray = Array.from(new Uint8Array(hashAsBuffer));
|
|
42
|
+
// return hashAsHex
|
|
43
|
+
return hashAsArray.map(b => b.toString(16).padStart(2, '0')).join('');
|
|
44
|
+
};
|
|
27
45
|
let hashFields;
|
|
28
46
|
if (salt) {
|
|
29
47
|
hashFields = async (ib: Ib, data: IbGibData_V1 | undefined, rel8ns: IbGibRel8ns_V1 | undefined) => {
|
|
30
48
|
const hasRel8ns =
|
|
31
49
|
Object.keys(rel8ns || {}).length > 0 &&
|
|
32
50
|
Object.keys(rel8ns || {}).some(k => rel8ns![k] && rel8ns![k]!.length > 0);
|
|
33
|
-
|
|
51
|
+
let hasData = !!data;
|
|
52
|
+
if (hasData) {
|
|
53
|
+
if (typeof data === 'string') {
|
|
54
|
+
hasData = (data as string).length > 0;
|
|
55
|
+
} else if (data instanceof Uint8Array) {
|
|
56
|
+
hasData = true;
|
|
57
|
+
} else if (typeof data === 'object') {
|
|
58
|
+
hasData = Object.keys((data) || {}).length > 0;
|
|
59
|
+
} else {
|
|
60
|
+
hasData = true;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
34
63
|
const ibHash = (await hashToHex(salt + ib)).toUpperCase();
|
|
35
64
|
// empty, null, undefined all treated the same at this level.
|
|
36
65
|
const rel8nsHash: string = hasRel8ns ? (await hashToHex(salt + JSON.stringify(rel8ns))).toUpperCase() : "";
|
|
37
66
|
// empty, null, undefined all treated the same at this level (though not farther down in data)
|
|
38
|
-
|
|
67
|
+
|
|
68
|
+
// change this for binaries (Uint8Array data)
|
|
69
|
+
// const dataHash: string = hasData ? (await hashToHex(salt + JSON.stringify(data))).toUpperCase() : "";
|
|
70
|
+
let dataHash: string = "";
|
|
71
|
+
if (hasData) {
|
|
72
|
+
if (data instanceof Uint8Array) {
|
|
73
|
+
dataHash = (await hashToHex_Uint8Array(salt, data)).toUpperCase();
|
|
74
|
+
} else {
|
|
75
|
+
dataHash = (await hashToHex(salt + JSON.stringify(data))).toUpperCase();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
39
79
|
// if the ibgib has no rel8ns or data, the hash should be just of the ib itself.
|
|
40
80
|
const allHash = hasRel8ns || hasData ?
|
|
41
81
|
(await hashToHex(salt + ibHash + rel8nsHash + dataHash)).toUpperCase() :
|
|
@@ -47,12 +87,32 @@ export function sha256v1(ibGib: IbGib_V1, salt: string = ""): Promise<string> {
|
|
|
47
87
|
const hasRel8ns =
|
|
48
88
|
Object.keys(rel8ns || {}).length > 0 &&
|
|
49
89
|
Object.keys(rel8ns || {}).some(k => rel8ns![k] && rel8ns![k]!.length > 0);
|
|
50
|
-
const hasData = Object.keys((data) || {}).length > 0;
|
|
90
|
+
// const hasData = Object.keys((data) || {}).length > 0;
|
|
91
|
+
let hasData = !!data;
|
|
92
|
+
if (hasData) {
|
|
93
|
+
if (typeof data === 'string') {
|
|
94
|
+
hasData = (data as string).length > 0;
|
|
95
|
+
} else if (data instanceof Uint8Array) {
|
|
96
|
+
hasData = true;
|
|
97
|
+
} else if (typeof data === 'object') {
|
|
98
|
+
hasData = Object.keys((data) || {}).length > 0;
|
|
99
|
+
} else {
|
|
100
|
+
hasData = true;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
51
103
|
const ibHash = (await hashToHex(ib)).toUpperCase();
|
|
52
104
|
// empty, null, undefined all treated the same at this level.
|
|
53
105
|
const rel8nsHash: string = hasRel8ns ? (await hashToHex(JSON.stringify(rel8ns))).toUpperCase() : "";
|
|
54
106
|
// empty, null, undefined all treated the same at this level (though not farther down in data)
|
|
55
|
-
const dataHash: string = hasData ? (await hashToHex(JSON.stringify(data))).toUpperCase() : "";
|
|
107
|
+
// const dataHash: string = hasData ? (await hashToHex(JSON.stringify(data))).toUpperCase() : "";
|
|
108
|
+
let dataHash: string = "";
|
|
109
|
+
if (hasData) {
|
|
110
|
+
if (data instanceof Uint8Array) {
|
|
111
|
+
dataHash = (await hashToHex_Uint8Array('', data)).toUpperCase();
|
|
112
|
+
} else {
|
|
113
|
+
dataHash = (await hashToHex(JSON.stringify(data))).toUpperCase();
|
|
114
|
+
}
|
|
115
|
+
}
|
|
56
116
|
// if the ibgib has no rel8ns or data, the hash should be just of the ib itself.
|
|
57
117
|
const allHash = hasRel8ns || hasData ?
|
|
58
118
|
(await hashToHex(ibHash + rel8nsHash + dataHash)).toUpperCase() :
|