@peerbit/crypto 3.1.3 → 3.1.5

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@peerbit/crypto",
3
- "version": "3.1.3",
3
+ "version": "3.1.5",
4
4
  "description": "Crypto fn",
5
5
  "sideEffects": false,
6
6
  "type": "module",
@@ -24,6 +24,7 @@
24
24
  "files": [
25
25
  "src",
26
26
  "dist",
27
+ "!dist/benchmark",
27
28
  "!dist/test",
28
29
  "!**/*.tsbuildinfo"
29
30
  ],
@@ -57,9 +58,7 @@
57
58
  "license": "MIT",
58
59
  "devDependencies": {
59
60
  "@types/libsodium-wrappers": "^0.7.14",
60
- "ethers": "^6.17.0",
61
- "multiformats": "^13.4.2",
62
- "uint8arrays": "^5.1.0"
61
+ "ethers": "^6.17.0"
63
62
  },
64
63
  "dependencies": {
65
64
  "@dao-xyz/borsh": "^6.0.0",
@@ -73,7 +72,8 @@
73
72
  "@stablelib/sha256": "^2.0.1",
74
73
  "js-sha3": "^0.9.3",
75
74
  "libsodium-wrappers": "0.7.15",
76
- "@peerbit/cache": "3.1.0"
75
+ "multiformats": "^13.4.2",
76
+ "uint8arrays": "^5.1.0"
77
77
  },
78
78
  "repository": {
79
79
  "type": "git",
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=hash.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../benchmark/hash.ts"],"names":[],"mappings":""}
@@ -1,110 +0,0 @@
1
- var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
2
- function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
3
- var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
4
- var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
5
- var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
6
- var _, done = false;
7
- for (var i = decorators.length - 1; i >= 0; i--) {
8
- var context = {};
9
- for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
10
- for (var p in contextIn.access) context.access[p] = contextIn.access[p];
11
- context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
12
- var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
13
- if (kind === "accessor") {
14
- if (result === void 0) continue;
15
- if (result === null || typeof result !== "object") throw new TypeError("Object expected");
16
- if (_ = accept(result.get)) descriptor.get = _;
17
- if (_ = accept(result.set)) descriptor.set = _;
18
- if (_ = accept(result.init)) initializers.unshift(_);
19
- }
20
- else if (_ = accept(result)) {
21
- if (kind === "field") initializers.unshift(_);
22
- else descriptor[key] = _;
23
- }
24
- }
25
- if (target) Object.defineProperty(target, contextIn.name, descriptor);
26
- done = true;
27
- };
28
- var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
29
- var useValue = arguments.length > 2;
30
- for (var i = 0; i < initializers.length; i++) {
31
- value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
32
- }
33
- return useValue ? value : void 0;
34
- };
35
- import { deserialize, field, serialize } from "@dao-xyz/borsh";
36
- import B from "benchmark";
37
- import crypto from "crypto";
38
- import { sha256, sha256Base64 } from "../src/hash.js";
39
- //node --loader ts-node/esm ./benchmark/hash.ts
40
- /**
41
- * Benchmark for hashing + serializing
42
- */
43
- const size = 1e3;
44
- const data = [];
45
- for (let i = 0; i < 100; i++) {
46
- data.push(crypto.randomBytes(size));
47
- }
48
- let MSstring = (() => {
49
- let _string_decorators;
50
- let _string_initializers = [];
51
- let _string_extraInitializers = [];
52
- return class MSstring {
53
- static {
54
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
55
- _string_decorators = [field({ type: "string" })];
56
- __esDecorate(null, null, _string_decorators, { kind: "field", name: "string", static: false, private: false, access: { has: obj => "string" in obj, get: obj => obj.string, set: (obj, value) => { obj.string = value; } }, metadata: _metadata }, _string_initializers, _string_extraInitializers);
57
- if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
58
- }
59
- string = __runInitializers(this, _string_initializers, void 0);
60
- constructor(string) {
61
- __runInitializers(this, _string_extraInitializers);
62
- this.string = string;
63
- }
64
- };
65
- })();
66
- let MBytes = (() => {
67
- let _bytes_decorators;
68
- let _bytes_initializers = [];
69
- let _bytes_extraInitializers = [];
70
- return class MBytes {
71
- static {
72
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
73
- _bytes_decorators = [field({ type: Uint8Array })];
74
- __esDecorate(null, null, _bytes_decorators, { kind: "field", name: "bytes", static: false, private: false, access: { has: obj => "bytes" in obj, get: obj => obj.bytes, set: (obj, value) => { obj.bytes = value; } }, metadata: _metadata }, _bytes_initializers, _bytes_extraInitializers);
75
- if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
76
- }
77
- bytes = __runInitializers(this, _bytes_initializers, void 0);
78
- constructor(bytes) {
79
- __runInitializers(this, _bytes_extraInitializers);
80
- this.bytes = bytes;
81
- }
82
- };
83
- })();
84
- const getSample = () => {
85
- return data[Math.floor(Math.round(Math.random() * (data.length - 1)))];
86
- };
87
- const suite = new B.Suite("ed25519");
88
- suite
89
- .add("hash-to-bytes", {
90
- fn: async (deferred) => {
91
- deserialize(serialize(new MBytes(await sha256(getSample()))), MBytes);
92
- deferred.resolve();
93
- },
94
- defer: true,
95
- })
96
- .add("hash-to-string", {
97
- fn: async (deferred) => {
98
- deserialize(serialize(new MSstring(await sha256Base64(getSample()))), MSstring);
99
- deferred.resolve();
100
- },
101
- defer: true,
102
- })
103
- .on("error", (error) => {
104
- throw error;
105
- })
106
- .on("cycle", (event) => {
107
- console.log(String(event.target));
108
- })
109
- .run({ async: true });
110
- //# sourceMappingURL=hash.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hash.js","sourceRoot":"","sources":["../../benchmark/hash.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,CAAC,MAAM,WAAW,CAAC;AAC1B,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEtD,+CAA+C;AAE/C;;GAEG;AAEH,MAAM,IAAI,GAAG,GAAG,CAAC;AACjB,MAAM,IAAI,GAAiB,EAAE,CAAC;AAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IAC9B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;AACrC,CAAC;IAEK,QAAQ;;;;iBAAR,QAAQ;;;kCACZ,KAAK,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;YAC1B,oKAAA,MAAM,6BAAN,MAAM,uFAAS;;;QAAf,MAAM,yDAAS;QAEf,YAAY,MAAc;;YACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;SACrB;;;IAGI,MAAM;;;;iBAAN,MAAM;;;iCACV,KAAK,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;YAC5B,iKAAA,KAAK,6BAAL,KAAK,qFAAa;;;QAAlB,KAAK,wDAAa;QAElB,YAAY,KAAiB;;YAC5B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;SACnB;;;AAGF,MAAM,SAAS,GAAG,GAAG,EAAE;IACtB,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACxE,CAAC,CAAC;AACF,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;AACrC,KAAK;KACH,GAAG,CAAC,eAAe,EAAE;IACrB,EAAE,EAAE,KAAK,EAAE,QAAa,EAAE,EAAE;QAC3B,WAAW,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACtE,QAAQ,CAAC,OAAO,EAAE,CAAC;IACpB,CAAC;IACD,KAAK,EAAE,IAAI;CACX,CAAC;KACD,GAAG,CAAC,gBAAgB,EAAE;IACtB,EAAE,EAAE,KAAK,EAAE,QAAa,EAAE,EAAE;QAC3B,WAAW,CACV,SAAS,CAAC,IAAI,QAAQ,CAAC,MAAM,YAAY,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EACxD,QAAQ,CACR,CAAC;QACF,QAAQ,CAAC,OAAO,EAAE,CAAC;IACpB,CAAC;IACD,KAAK,EAAE,IAAI;CACX,CAAC;KACD,EAAE,CAAC,OAAO,EAAE,CAAC,KAAU,EAAE,EAAE;IAC3B,MAAM,KAAK,CAAC;AACb,CAAC,CAAC;KACD,EAAE,CAAC,OAAO,EAAE,CAAC,KAAU,EAAE,EAAE;IAC3B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;AACnC,CAAC,CAAC;KACD,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../benchmark/index.ts"],"names":[],"mappings":""}
@@ -1,64 +0,0 @@
1
- import B from "benchmark";
2
- import crypto from "crypto";
3
- import { Ed25519Keypair } from "../src/ed25519.js";
4
- import { PreHash } from "../src/prehash.js";
5
- import { SignatureWithKey, verify } from "../src/signature.js";
6
- //node --loader ts-node/esm ./benchmark/index.ts
7
- const keypair = await Ed25519Keypair.create();
8
- const signatures = [];
9
- const size = 1e5;
10
- for (let i = 0; i < 10000; i++) {
11
- const data = crypto.randomBytes(size);
12
- signatures.push([data, await keypair.sign(data, PreHash.NONE)]);
13
- }
14
- const signaturesHash = [];
15
- for (let i = 0; i < 10000; i++) {
16
- const data = crypto.randomBytes(size);
17
- signaturesHash.push([data, await keypair.sign(data, PreHash.SHA_256)]);
18
- }
19
- const suite = new B.Suite("ed25519");
20
- suite
21
- .add("sign", {
22
- fn: async (deferred) => {
23
- const data = crypto.randomBytes(size); // 1kb
24
- await keypair.sign(data, PreHash.NONE);
25
- deferred.resolve();
26
- },
27
- defer: true,
28
- })
29
- .add("hash+sign", {
30
- fn: async (deferred) => {
31
- const data = crypto.randomBytes(size); // 1kb
32
- await keypair.sign(data, PreHash.SHA_256);
33
- deferred.resolve();
34
- },
35
- defer: true,
36
- })
37
- .add("verify", {
38
- fn: async (deferred) => {
39
- const [data, signature] = signatures[Math.floor(Math.random() * signatures.length)];
40
- if (!(await verify(signature, data))) {
41
- throw new Error("Unverified");
42
- }
43
- deferred.resolve();
44
- },
45
- defer: true,
46
- })
47
- .add("hash+verify", {
48
- fn: async (deferred) => {
49
- const [data, signature] = signaturesHash[Math.floor(Math.random() * signatures.length)];
50
- if (!(await verify(signature, data))) {
51
- throw new Error("Unexpected");
52
- }
53
- deferred.resolve();
54
- },
55
- defer: true,
56
- })
57
- .on("error", (error) => {
58
- throw error;
59
- })
60
- .on("cycle", (event) => {
61
- console.log(String(event.target));
62
- })
63
- .run({ async: true });
64
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../benchmark/index.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=peer-ids.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"peer-ids.d.ts","sourceRoot":"","sources":["../../benchmark/peer-ids.ts"],"names":[],"mappings":""}
@@ -1,30 +0,0 @@
1
- import { deserialize, serialize } from "@dao-xyz/borsh";
2
- import { keys } from "@libp2p/crypto";
3
- import { peerIdFromPublicKey } from "@libp2p/peer-id";
4
- import B from "benchmark";
5
- import { Ed25519Keypair, Ed25519PublicKey } from "../src/ed25519.js";
6
- //node --loader ts-node/esm ./benchmark/peer-ids.ts
7
- const keypair = await Ed25519Keypair.create();
8
- const peerId = await keys.generateKeyPair("Ed25519");
9
- const peerIdPublicKey = peerIdFromPublicKey(peerId.publicKey);
10
- const suite = new B.Suite("ed25519");
11
- // TODO this benchmark makes no sense to do anymore since libp2p 2.0.0. What we want to compare is the ser/der perform of libp2p peerid vs peerbit peerid
12
- suite
13
- .add("PublicSignKey", {
14
- fn: async () => {
15
- deserialize(serialize(keypair.publicKey), Ed25519PublicKey);
16
- },
17
- })
18
- .add("PeerId ", {
19
- fn: () => {
20
- peerIdFromPublicKey(peerIdPublicKey.publicKey);
21
- },
22
- })
23
- .on("error", (error) => {
24
- throw error;
25
- })
26
- .on("cycle", (event) => {
27
- console.log(String(event.target));
28
- })
29
- .run();
30
- //# sourceMappingURL=peer-ids.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"peer-ids.js","sourceRoot":"","sources":["../../benchmark/peer-ids.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,CAAC,MAAM,WAAW,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErE,mDAAmD;AAEnD,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,CAAC;AAC9C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;AACrD,MAAM,eAAe,GAAG,mBAAmB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;AAErC,0JAA0J;AAC1J,KAAK;KACH,GAAG,CAAC,eAAe,EAAE;IACrB,EAAE,EAAE,KAAK,IAAI,EAAE;QACd,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,gBAAgB,CAAC,CAAC;IAC7D,CAAC;CACD,CAAC;KACD,GAAG,CAAC,SAAS,EAAE;IACf,EAAE,EAAE,GAAG,EAAE;QACR,mBAAmB,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;IAChD,CAAC;CACD,CAAC;KACD,EAAE,CAAC,OAAO,EAAE,CAAC,KAAU,EAAE,EAAE;IAC3B,MAAM,KAAK,CAAC;AACb,CAAC,CAAC;KACD,EAAE,CAAC,OAAO,EAAE,CAAC,KAAU,EAAE,EAAE;IAC3B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;AACnC,CAAC,CAAC;KACD,GAAG,EAAE,CAAC"}