@fireproof/core 0.7.0-alpha.9 → 0.7.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.
- package/dist/crypto.js +1 -1
- package/dist/encrypted-block.js +48 -0
- package/dist/src/fireproof.js +3 -0
- package/dist/src/fireproof.js.map +1 -1
- package/dist/src/fireproof.mjs +3 -0
- package/dist/src/fireproof.mjs.map +1 -1
- package/dist/storage/base.js +2 -1
- package/package.json +2 -2
- package/src/crypto.js +1 -1
- package/src/encrypted-block.js +57 -0
- package/src/storage/base.js +2 -1
package/dist/storage/base.js
CHANGED
@@ -14,7 +14,7 @@ import { nocache as cache } from 'prolly-trees/cache';
|
|
14
14
|
import { Buffer } from 'buffer';
|
15
15
|
import { rawSha1 as sha1sync } from '../sha1.js';
|
16
16
|
// @ts-ignore
|
17
|
-
import * as codec from 'encrypted-block';
|
17
|
+
import * as codec from '../encrypted-block.js';
|
18
18
|
import { blocksToCarBlock, blocksToEncryptedCarBlock, blocksFromEncryptedCarBlock } from '../valet.js';
|
19
19
|
const chunker = bf(30);
|
20
20
|
const blockOpts = { cache, chunker, codec: dagcbor, hasher: sha256, compare };
|
@@ -232,6 +232,7 @@ export class Base {
|
|
232
232
|
const got = await reader.get(cid);
|
233
233
|
let useCodec = codec;
|
234
234
|
if (cid.toString().indexOf('bafy') === 0) {
|
235
|
+
// @ts-ignore
|
235
236
|
useCodec = dagcbor; // todo this is a dirty check
|
236
237
|
}
|
237
238
|
const decoded = await Block.decode({
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@fireproof/core",
|
3
|
-
"version": "0.7.
|
3
|
+
"version": "0.7.1",
|
4
4
|
"description": "Live data for React, accelerated by proofs, powered by IPFS",
|
5
5
|
"main": "dist/src/fireproof.js",
|
6
6
|
"module": "dist/src/fireproof.mjs",
|
@@ -45,9 +45,9 @@
|
|
45
45
|
"charwise": "^3.0.1",
|
46
46
|
"cross-fetch": "^3.1.6",
|
47
47
|
"crypto-browserify": "^3.12.0",
|
48
|
-
"encrypted-block": "jchris/encrypted-block#102c55ac9354b3499c7c04ceecde10e055ecf89d",
|
49
48
|
"idb": "^7.1.1",
|
50
49
|
"ipld-hashmap": "^2.1.18",
|
50
|
+
"js-crypto-aes": "^1.0.4",
|
51
51
|
"multiformats": "^11.0.1",
|
52
52
|
"prolly-trees": "1.0.4",
|
53
53
|
"randombytes": "^2.1.0",
|
package/src/crypto.js
CHANGED
@@ -0,0 +1,57 @@
|
|
1
|
+
// from https://github.com/mikeal/encrypted-block
|
2
|
+
import randomBytes from 'randombytes'
|
3
|
+
import aes from 'js-crypto-aes'
|
4
|
+
import { CID } from 'multiformats'
|
5
|
+
|
6
|
+
const enc32 = value => {
|
7
|
+
value = +value
|
8
|
+
const buff = new Uint8Array(4)
|
9
|
+
buff[3] = (value >>> 24)
|
10
|
+
buff[2] = (value >>> 16)
|
11
|
+
buff[1] = (value >>> 8)
|
12
|
+
buff[0] = (value & 0xff)
|
13
|
+
return buff
|
14
|
+
}
|
15
|
+
|
16
|
+
const readUInt32LE = (buffer) => {
|
17
|
+
const offset = buffer.byteLength - 4
|
18
|
+
return ((buffer[offset]) |
|
19
|
+
(buffer[offset + 1] << 8) |
|
20
|
+
(buffer[offset + 2] << 16)) +
|
21
|
+
(buffer[offset + 3] * 0x1000000)
|
22
|
+
}
|
23
|
+
|
24
|
+
const encode = ({ iv, bytes }) => concat([iv, bytes])
|
25
|
+
const decode = bytes => {
|
26
|
+
const iv = bytes.subarray(0, 12)
|
27
|
+
bytes = bytes.slice(12)
|
28
|
+
return { iv, bytes }
|
29
|
+
}
|
30
|
+
|
31
|
+
const code = 0x300000 + 1337
|
32
|
+
|
33
|
+
const concat = buffers => Uint8Array.from(buffers.map(b => [...b]).flat())
|
34
|
+
|
35
|
+
const decrypt = async ({ key, value }) => {
|
36
|
+
let { bytes, iv } = value
|
37
|
+
bytes = await aes.decrypt(bytes, key, { name: 'AES-GCM', iv, tagLength: 16 })
|
38
|
+
const len = readUInt32LE(bytes.subarray(0, 4))
|
39
|
+
const cid = CID.decode(bytes.subarray(4, 4 + len))
|
40
|
+
bytes = bytes.subarray(4 + len)
|
41
|
+
return { cid, bytes }
|
42
|
+
}
|
43
|
+
const encrypt = async ({ key, cid, bytes }) => {
|
44
|
+
const len = enc32(cid.bytes.byteLength)
|
45
|
+
const iv = randomBytes(12)
|
46
|
+
const msg = concat([len, cid.bytes, bytes])
|
47
|
+
bytes = await aes.encrypt(msg, key, { name: 'AES-GCM', iv, tagLength: 16 })
|
48
|
+
return { value: { bytes, iv } }
|
49
|
+
}
|
50
|
+
|
51
|
+
const crypto = key => {
|
52
|
+
return { encrypt: opts => encrypt({ key, ...opts }), decrypt: opts => decrypt({ key, ...opts }) }
|
53
|
+
}
|
54
|
+
|
55
|
+
const name = 'mikeal@encrypted-block:aes-gcm'
|
56
|
+
|
57
|
+
export { encode, decode, code, name, encrypt, decrypt, crypto }
|
package/src/storage/base.js
CHANGED
@@ -14,7 +14,7 @@ import { nocache as cache } from 'prolly-trees/cache'
|
|
14
14
|
import { Buffer } from 'buffer'
|
15
15
|
import { rawSha1 as sha1sync } from '../sha1.js'
|
16
16
|
// @ts-ignore
|
17
|
-
import * as codec from 'encrypted-block'
|
17
|
+
import * as codec from '../encrypted-block.js'
|
18
18
|
import { blocksToCarBlock, blocksToEncryptedCarBlock, blocksFromEncryptedCarBlock } from '../valet.js'
|
19
19
|
|
20
20
|
const chunker = bf(30)
|
@@ -247,6 +247,7 @@ export class Base {
|
|
247
247
|
const got = await reader.get(cid)
|
248
248
|
let useCodec = codec
|
249
249
|
if (cid.toString().indexOf('bafy') === 0) {
|
250
|
+
// @ts-ignore
|
250
251
|
useCodec = dagcbor // todo this is a dirty check
|
251
252
|
}
|
252
253
|
const decoded = await Block.decode({
|