@holochain/client 0.11.3 → 0.11.4
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/lib/api/app/index.js +0 -1
- package/lib/api/app/index.js.map +1 -1
- package/lib/api/app/websocket.js +8 -64
- package/lib/api/app/websocket.js.map +1 -1
- package/lib/api/app-agent/websocket.d.ts +0 -21
- package/lib/api/app-agent/websocket.js +0 -21
- package/lib/api/app-agent/websocket.js.map +1 -1
- package/lib/api/index.d.ts +1 -1
- package/lib/api/index.js +1 -1
- package/lib/api/index.js.map +1 -1
- package/lib/api/zome-call-signing.d.ts +23 -10
- package/lib/api/zome-call-signing.js +73 -8
- package/lib/api/zome-call-signing.js.map +1 -1
- package/lib/environments/launcher.d.ts +2 -0
- package/lib/environments/launcher.js +31 -1
- package/lib/environments/launcher.js.map +1 -1
- package/lib/utils/fake-hash.js +1 -1
- package/lib/utils/fake-hash.js.map +1 -1
- package/package.json +1 -1
- package/lib/api/app/util.d.ts +0 -19
- package/lib/api/app/util.js +0 -74
- package/lib/api/app/util.js.map +0 -1
package/lib/api/app/index.js
CHANGED
package/lib/api/app/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/app/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/app/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC"}
|
package/lib/api/app/websocket.js
CHANGED
|
@@ -1,27 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
* Defines AppWebsocket, an easy-to-use websocket implementation of the
|
|
3
|
-
* Conductor API for apps
|
|
4
|
-
*
|
|
5
|
-
* const client = AppWebsocket.connect('ws://127.0.0.1:9000');
|
|
6
|
-
*
|
|
7
|
-
* client.callZome({...})
|
|
8
|
-
* .then(() => {
|
|
9
|
-
* console.log('DNA successfully installed')
|
|
10
|
-
* })
|
|
11
|
-
* .catch(err => {
|
|
12
|
-
* console.error('problem installing DNA:', err)
|
|
13
|
-
* });
|
|
14
|
-
*/
|
|
15
|
-
import { hashZomeCall } from "@holochain/serialization";
|
|
16
|
-
import { decode, encode } from "@msgpack/msgpack";
|
|
17
|
-
import { invoke } from "@tauri-apps/api/tauri";
|
|
1
|
+
import { decode } from "@msgpack/msgpack";
|
|
18
2
|
import Emittery from "emittery";
|
|
19
|
-
import
|
|
20
|
-
import { getLauncherEnvironment, isLauncher, } from "../../environments/launcher.js";
|
|
3
|
+
import { getLauncherEnvironment, isLauncher, signZomeCallTauri, } from "../../environments/launcher.js";
|
|
21
4
|
import { WsClient } from "../client.js";
|
|
22
5
|
import { catchError, DEFAULT_TIMEOUT, promiseTimeout, requesterTransformer, } from "../common.js";
|
|
23
|
-
import {
|
|
24
|
-
import { getNonceExpiration, randomNonce } from "./util.js";
|
|
6
|
+
import { getSigningCredentials, signZomeCall } from "../zome-call-signing.js";
|
|
25
7
|
export class AppWebsocket extends Emittery {
|
|
26
8
|
client;
|
|
27
9
|
defaultTimeout;
|
|
@@ -61,53 +43,15 @@ const callZomeTransform = {
|
|
|
61
43
|
return req;
|
|
62
44
|
}
|
|
63
45
|
if (isLauncher) {
|
|
64
|
-
const
|
|
65
|
-
provenance: Array.from(req.provenance),
|
|
66
|
-
cell_id: [Array.from(req.cell_id[0]), Array.from(req.cell_id[1])],
|
|
67
|
-
zome_name: req.zome_name,
|
|
68
|
-
fn_name: req.fn_name,
|
|
69
|
-
payload: Array.from(encode(req.payload)),
|
|
70
|
-
nonce: Array.from(randomNonce()),
|
|
71
|
-
expires_at: getNonceExpiration(),
|
|
72
|
-
};
|
|
73
|
-
const signedZomeCallTauri = await invoke("sign_zome_call", { zomeCallUnsigned });
|
|
74
|
-
const signedZomeCall = {
|
|
75
|
-
provenance: Uint8Array.from(signedZomeCallTauri.provenance),
|
|
76
|
-
cap_secret: null,
|
|
77
|
-
cell_id: [
|
|
78
|
-
Uint8Array.from(signedZomeCallTauri.cell_id[0]),
|
|
79
|
-
Uint8Array.from(signedZomeCallTauri.cell_id[1]),
|
|
80
|
-
],
|
|
81
|
-
zome_name: signedZomeCallTauri.zome_name,
|
|
82
|
-
fn_name: signedZomeCallTauri.fn_name,
|
|
83
|
-
payload: Uint8Array.from(signedZomeCallTauri.payload),
|
|
84
|
-
signature: Uint8Array.from(signedZomeCallTauri.signature),
|
|
85
|
-
expires_at: signedZomeCallTauri.expires_at,
|
|
86
|
-
nonce: Uint8Array.from(signedZomeCallTauri.nonce),
|
|
87
|
-
};
|
|
46
|
+
const signedZomeCall = await signZomeCallTauri(req);
|
|
88
47
|
return signedZomeCall;
|
|
89
48
|
}
|
|
90
49
|
else {
|
|
91
|
-
const
|
|
92
|
-
if (!
|
|
93
|
-
throw new Error("cannot sign zome call: signing
|
|
50
|
+
const signingCredentials = getSigningCredentials(req.cell_id);
|
|
51
|
+
if (!signingCredentials) {
|
|
52
|
+
throw new Error("cannot sign zome call: no signing credentials have been authorized");
|
|
94
53
|
}
|
|
95
|
-
const
|
|
96
|
-
...req,
|
|
97
|
-
cap_secret: signingPropsForCell.capSecret,
|
|
98
|
-
provenance: signingPropsForCell.signingKey,
|
|
99
|
-
payload: encode(req.payload),
|
|
100
|
-
nonce: randomNonce(),
|
|
101
|
-
expires_at: getNonceExpiration(),
|
|
102
|
-
};
|
|
103
|
-
const hashedZomeCall = await hashZomeCall(unsignedZomeCall);
|
|
104
|
-
const signature = nacl
|
|
105
|
-
.sign(hashedZomeCall, signingPropsForCell.keyPair.secretKey)
|
|
106
|
-
.subarray(0, nacl.sign.signatureLength);
|
|
107
|
-
const signedZomeCall = {
|
|
108
|
-
...unsignedZomeCall,
|
|
109
|
-
signature,
|
|
110
|
-
};
|
|
54
|
+
const signedZomeCall = await signZomeCall(signingCredentials, req.payload);
|
|
111
55
|
return signedZomeCall;
|
|
112
56
|
}
|
|
113
57
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../../src/api/app/websocket.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../../src/api/app/websocket.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,24 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Defines AppAgentWebsocket, an easy-to-use websocket implementation of the
|
|
3
|
-
* Conductor API for apps, restricted to a single app provided on initialization
|
|
4
|
-
*
|
|
5
|
-
* const appWs = AppWebsocket.connect('ws://127.0.0.1:9000')
|
|
6
|
-
*
|
|
7
|
-
* const client = new AppAgentWebsocket(appWs, 'my_installed_app_id')
|
|
8
|
-
*
|
|
9
|
-
* client.callZome({
|
|
10
|
-
* role_name: 'my_role_name' // role_name is unique per app, so you can unambiguously identify your dna with role_name in this client,
|
|
11
|
-
* zome_name: 'zome',
|
|
12
|
-
* fn_name: 'fn',
|
|
13
|
-
* payload: { value: 'v' }
|
|
14
|
-
* })
|
|
15
|
-
* .then(result => {
|
|
16
|
-
* console.log('callZome returned with:', result)
|
|
17
|
-
* })
|
|
18
|
-
* .catch(err => {
|
|
19
|
-
* console.error('callZome errored with:', err)
|
|
20
|
-
* })
|
|
21
|
-
*/
|
|
22
1
|
import Emittery, { UnsubscribeFunction } from "emittery";
|
|
23
2
|
import { AgentPubKey, InstalledAppId, RoleName } from "../../types.js";
|
|
24
3
|
import { AppInfo, AppInfoResponse, AppWebsocket, CallZomeResponse, CreateCloneCellResponse, DisableCloneCellResponse, EnableCloneCellResponse } from "../index.js";
|
|
@@ -1,24 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Defines AppAgentWebsocket, an easy-to-use websocket implementation of the
|
|
3
|
-
* Conductor API for apps, restricted to a single app provided on initialization
|
|
4
|
-
*
|
|
5
|
-
* const appWs = AppWebsocket.connect('ws://127.0.0.1:9000')
|
|
6
|
-
*
|
|
7
|
-
* const client = new AppAgentWebsocket(appWs, 'my_installed_app_id')
|
|
8
|
-
*
|
|
9
|
-
* client.callZome({
|
|
10
|
-
* role_name: 'my_role_name' // role_name is unique per app, so you can unambiguously identify your dna with role_name in this client,
|
|
11
|
-
* zome_name: 'zome',
|
|
12
|
-
* fn_name: 'fn',
|
|
13
|
-
* payload: { value: 'v' }
|
|
14
|
-
* })
|
|
15
|
-
* .then(result => {
|
|
16
|
-
* console.log('callZome returned with:', result)
|
|
17
|
-
* })
|
|
18
|
-
* .catch(err => {
|
|
19
|
-
* console.error('callZome errored with:', err)
|
|
20
|
-
* })
|
|
21
|
-
*/
|
|
22
1
|
import Emittery from "emittery";
|
|
23
2
|
import { omit } from "lodash-es";
|
|
24
3
|
import { getLauncherEnvironment } from "../../environments/launcher.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../../src/api/app-agent/websocket.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../../src/api/app-agent/websocket.ts"],"names":[],"mappings":"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"}
|
package/lib/api/index.d.ts
CHANGED
package/lib/api/index.js
CHANGED
|
@@ -2,5 +2,5 @@ export * from "./admin/index.js";
|
|
|
2
2
|
export * from "./app-agent/index.js";
|
|
3
3
|
export * from "./app/index.js";
|
|
4
4
|
export { CloneId } from "./common.js";
|
|
5
|
-
export
|
|
5
|
+
export * from "./zome-call-signing.js";
|
|
6
6
|
//# sourceMappingURL=index.js.map
|
package/lib/api/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,cAAc,wBAAwB,CAAC"}
|
|
@@ -1,25 +1,38 @@
|
|
|
1
1
|
import nacl from "tweetnacl";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
2
|
+
import { CallZomeRequest, CallZomeRequestSigned, Nonce256Bit } from "../api/app/index.js";
|
|
3
|
+
import type { CapSecret } from "../hdk/capabilities.js";
|
|
4
|
+
import type { AgentPubKey, CellId } from "../types.js";
|
|
5
|
+
import type { FunctionName, ZomeName } from "./admin/types.js";
|
|
5
6
|
import { AdminWebsocket } from "./admin/websocket.js";
|
|
7
|
+
export interface SigningCredentials {
|
|
8
|
+
capSecret: CapSecret;
|
|
9
|
+
keyPair: nacl.SignKeyPair;
|
|
10
|
+
signingKey: AgentPubKey;
|
|
11
|
+
}
|
|
6
12
|
/**
|
|
7
|
-
* Generate
|
|
13
|
+
* Generate signing credentials for signing zome calls.
|
|
8
14
|
*
|
|
9
15
|
* @param adminWs - An admin websocket connection to use for granting a
|
|
10
16
|
* capability for signing.
|
|
11
17
|
* @param cellId - The cell id to create the capability grant for.
|
|
12
18
|
* @param functions - Zomes and functions to authorize the signing key for.
|
|
13
19
|
*/
|
|
14
|
-
export declare const
|
|
20
|
+
export declare const authorizeSigningCredentials: (adminWs: AdminWebsocket, cellId: CellId, functions: [ZomeName, FunctionName][]) => Promise<void>;
|
|
15
21
|
/**
|
|
16
22
|
* Get properties for signing a zome call to a cell.
|
|
17
23
|
*
|
|
18
24
|
* @param cellId - Cell id to be called.
|
|
19
25
|
* @returns The keys and cap secret required for signing a zome call.
|
|
20
26
|
*/
|
|
21
|
-
export declare const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
27
|
+
export declare const getSigningCredentials: (cellId: CellId) => SigningCredentials | undefined;
|
|
28
|
+
/**
|
|
29
|
+
* Generates a key pair for signing zome calls.
|
|
30
|
+
*
|
|
31
|
+
* @returns The signing key pair and an agent pub key based on the public key.
|
|
32
|
+
*/
|
|
33
|
+
export declare const generateSigningKeyPair: () => [nacl.SignKeyPair, Uint8Array];
|
|
34
|
+
export declare const randomCapSecret: () => CapSecret;
|
|
35
|
+
export declare const randomNonce: () => Nonce256Bit;
|
|
36
|
+
export declare const randomByteArray: (length: number) => Uint8Array;
|
|
37
|
+
export declare const getNonceExpiration: () => number;
|
|
38
|
+
export declare const signZomeCall: (signingCredentials: SigningCredentials, request: CallZomeRequest) => Promise<CallZomeRequestSigned>;
|
|
@@ -1,19 +1,22 @@
|
|
|
1
|
+
import { hashZomeCall } from "@holochain/serialization";
|
|
2
|
+
import { encode } from "@msgpack/msgpack";
|
|
3
|
+
import crypto from "crypto";
|
|
4
|
+
import nacl from "tweetnacl";
|
|
1
5
|
import { encodeHashToBase64 } from "../utils/base64.js";
|
|
2
|
-
|
|
3
|
-
const signingProps = new Map();
|
|
6
|
+
const signingCredentials = new Map();
|
|
4
7
|
/**
|
|
5
|
-
* Generate
|
|
8
|
+
* Generate signing credentials for signing zome calls.
|
|
6
9
|
*
|
|
7
10
|
* @param adminWs - An admin websocket connection to use for granting a
|
|
8
11
|
* capability for signing.
|
|
9
12
|
* @param cellId - The cell id to create the capability grant for.
|
|
10
13
|
* @param functions - Zomes and functions to authorize the signing key for.
|
|
11
14
|
*/
|
|
12
|
-
export const
|
|
15
|
+
export const authorizeSigningCredentials = async (adminWs, cellId, functions) => {
|
|
16
|
+
const cellIdBase64 = encodeHashToBase64(cellId[0]).concat(encodeHashToBase64(cellId[1]));
|
|
13
17
|
const [keyPair, signingKey] = generateSigningKeyPair();
|
|
14
18
|
const capSecret = await grantSigningKey(adminWs, cellId, functions, signingKey);
|
|
15
|
-
|
|
16
|
-
signingProps.set(cellIdBase64, { capSecret, keyPair, signingKey });
|
|
19
|
+
signingCredentials.set(cellIdBase64, { capSecret, keyPair, signingKey });
|
|
17
20
|
};
|
|
18
21
|
/**
|
|
19
22
|
* Get properties for signing a zome call to a cell.
|
|
@@ -21,8 +24,70 @@ export const authorizeNewSigningKeyPair = async (adminWs, cellId, functions) =>
|
|
|
21
24
|
* @param cellId - Cell id to be called.
|
|
22
25
|
* @returns The keys and cap secret required for signing a zome call.
|
|
23
26
|
*/
|
|
24
|
-
export const
|
|
27
|
+
export const getSigningCredentials = (cellId) => {
|
|
25
28
|
const cellIdB64 = encodeHashToBase64(cellId[0]).concat(encodeHashToBase64(cellId[1]));
|
|
26
|
-
return
|
|
29
|
+
return signingCredentials.get(cellIdB64);
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Generates a key pair for signing zome calls.
|
|
33
|
+
*
|
|
34
|
+
* @returns The signing key pair and an agent pub key based on the public key.
|
|
35
|
+
*/
|
|
36
|
+
export const generateSigningKeyPair = () => {
|
|
37
|
+
const keyPair = nacl.sign.keyPair();
|
|
38
|
+
const signingKey = new Uint8Array([132, 32, 36].concat(...keyPair.publicKey).concat(...[0, 0, 0, 0]));
|
|
39
|
+
const keys = [keyPair, signingKey];
|
|
40
|
+
return keys;
|
|
41
|
+
};
|
|
42
|
+
export const randomCapSecret = () => randomByteArray(64);
|
|
43
|
+
export const randomNonce = () => randomByteArray(32);
|
|
44
|
+
export const randomByteArray = (length) => {
|
|
45
|
+
if (typeof window === "object" &&
|
|
46
|
+
"crypto" in window &&
|
|
47
|
+
"getRandomValues" in window.crypto) {
|
|
48
|
+
return window.crypto.getRandomValues(new Uint8Array(length));
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
return new Uint8Array(crypto.randomBytes(length));
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
export const getNonceExpiration = () => (Date.now() + 5 * 60 * 1000) * 1000; // 5 mins from now in microseconds
|
|
55
|
+
export const signZomeCall = async (signingCredentials, request) => {
|
|
56
|
+
const unsignedZomeCallPayload = {
|
|
57
|
+
cap_secret: signingCredentials.capSecret,
|
|
58
|
+
cell_id: request.cell_id,
|
|
59
|
+
zome_name: request.zome_name,
|
|
60
|
+
fn_name: request.fn_name,
|
|
61
|
+
provenance: signingCredentials.signingKey,
|
|
62
|
+
payload: encode(request.payload),
|
|
63
|
+
nonce: randomNonce(),
|
|
64
|
+
expires_at: getNonceExpiration(),
|
|
65
|
+
};
|
|
66
|
+
const hashedZomeCall = await hashZomeCall(unsignedZomeCallPayload);
|
|
67
|
+
const signature = nacl
|
|
68
|
+
.sign(hashedZomeCall, signingCredentials.keyPair.secretKey)
|
|
69
|
+
.subarray(0, nacl.sign.signatureLength);
|
|
70
|
+
const signedZomeCall = {
|
|
71
|
+
...unsignedZomeCallPayload,
|
|
72
|
+
signature,
|
|
73
|
+
};
|
|
74
|
+
return signedZomeCall;
|
|
75
|
+
};
|
|
76
|
+
const grantSigningKey = async (admin, cellId, functions, signingKey) => {
|
|
77
|
+
const capSecret = randomCapSecret();
|
|
78
|
+
await admin.grantZomeCallCapability({
|
|
79
|
+
cell_id: cellId,
|
|
80
|
+
cap_grant: {
|
|
81
|
+
tag: `signing-key-${encodeHashToBase64(cellId[0])}-${encodeHashToBase64(cellId[1])}`,
|
|
82
|
+
functions,
|
|
83
|
+
access: {
|
|
84
|
+
Assigned: {
|
|
85
|
+
secret: capSecret,
|
|
86
|
+
assignees: [signingKey],
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
return capSecret;
|
|
27
92
|
};
|
|
28
93
|
//# sourceMappingURL=zome-call-signing.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zome-call-signing.js","sourceRoot":"","sources":["../../src/api/zome-call-signing.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"zome-call-signing.js","sourceRoot":"","sources":["../../src/api/zome-call-signing.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { CallZomeRequest, CallZomeRequestSigned } from "../api/index.js";
|
|
1
2
|
import { InstalledAppId } from "../types.js";
|
|
2
3
|
export interface LauncherEnvironment {
|
|
3
4
|
APP_INTERFACE_PORT: number;
|
|
@@ -12,4 +13,5 @@ declare global {
|
|
|
12
13
|
[__HC_LAUNCHER_ENV__]: LauncherEnvironment | undefined;
|
|
13
14
|
}
|
|
14
15
|
}
|
|
16
|
+
export declare const signZomeCallTauri: (req: CallZomeRequest) => Promise<CallZomeRequestSigned>;
|
|
15
17
|
export {};
|
|
@@ -1,4 +1,34 @@
|
|
|
1
|
+
import { encode } from "@msgpack/msgpack";
|
|
2
|
+
import { invoke } from "@tauri-apps/api";
|
|
3
|
+
import { getNonceExpiration, randomNonce, } from "../api/index.js";
|
|
1
4
|
const __HC_LAUNCHER_ENV__ = "__HC_LAUNCHER_ENV__";
|
|
2
|
-
export const isLauncher = typeof window
|
|
5
|
+
export const isLauncher = typeof window !== undefined && __HC_LAUNCHER_ENV__ in window;
|
|
3
6
|
export const getLauncherEnvironment = () => isLauncher ? window[__HC_LAUNCHER_ENV__] : undefined;
|
|
7
|
+
export const signZomeCallTauri = async (req) => {
|
|
8
|
+
const zomeCallUnsigned = {
|
|
9
|
+
provenance: Array.from(req.provenance),
|
|
10
|
+
cell_id: [Array.from(req.cell_id[0]), Array.from(req.cell_id[1])],
|
|
11
|
+
zome_name: req.zome_name,
|
|
12
|
+
fn_name: req.fn_name,
|
|
13
|
+
payload: Array.from(encode(req.payload)),
|
|
14
|
+
nonce: Array.from(randomNonce()),
|
|
15
|
+
expires_at: getNonceExpiration(),
|
|
16
|
+
};
|
|
17
|
+
const signedZomeCallTauri = await invoke("sign_zome_call", { zomeCallUnsigned });
|
|
18
|
+
const signedZomeCall = {
|
|
19
|
+
provenance: Uint8Array.from(signedZomeCallTauri.provenance),
|
|
20
|
+
cap_secret: null,
|
|
21
|
+
cell_id: [
|
|
22
|
+
Uint8Array.from(signedZomeCallTauri.cell_id[0]),
|
|
23
|
+
Uint8Array.from(signedZomeCallTauri.cell_id[1]),
|
|
24
|
+
],
|
|
25
|
+
zome_name: signedZomeCallTauri.zome_name,
|
|
26
|
+
fn_name: signedZomeCallTauri.fn_name,
|
|
27
|
+
payload: Uint8Array.from(signedZomeCallTauri.payload),
|
|
28
|
+
signature: Uint8Array.from(signedZomeCallTauri.signature),
|
|
29
|
+
expires_at: signedZomeCallTauri.expires_at,
|
|
30
|
+
nonce: Uint8Array.from(signedZomeCallTauri.nonce),
|
|
31
|
+
};
|
|
32
|
+
return signedZomeCall;
|
|
33
|
+
};
|
|
4
34
|
//# sourceMappingURL=launcher.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launcher.js","sourceRoot":"","sources":["../../src/environments/launcher.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"launcher.js","sourceRoot":"","sources":["../../src/environments/launcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAIL,kBAAkB,EAClB,WAAW,GACZ,MAAM,iBAAiB,CAAC;AASzB,MAAM,mBAAmB,GAAG,qBAAqB,CAAC;AAElD,MAAM,CAAC,MAAM,UAAU,GACrB,OAAO,MAAM,KAAK,SAAS,IAAI,mBAAmB,IAAI,MAAM,CAAC;AAE/D,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAoC,EAAE,CAC1E,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AA+BvD,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EAAE,GAAoB,EAAE,EAAE;IAC9D,MAAM,gBAAgB,GAAiC;QACrD,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;QACtC,OAAO,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACjE,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACxC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QAChC,UAAU,EAAE,kBAAkB,EAAE;KACjC,CAAC;IAEF,MAAM,mBAAmB,GAA+B,MAAM,MAAM,CAClE,gBAAgB,EAChB,EAAE,gBAAgB,EAAE,CACrB,CAAC;IAEF,MAAM,cAAc,GAA0B;QAC5C,UAAU,EAAE,UAAU,CAAC,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC;QAC3D,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE;YACP,UAAU,CAAC,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC/C,UAAU,CAAC,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;SAChD;QACD,SAAS,EAAE,mBAAmB,CAAC,SAAS;QACxC,OAAO,EAAE,mBAAmB,CAAC,OAAO;QACpC,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC;QACrD,SAAS,EAAE,UAAU,CAAC,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC;QACzD,UAAU,EAAE,mBAAmB,CAAC,UAAU;QAC1C,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC;KAClD,CAAC;IACF,OAAO,cAAc,CAAC;AACxB,CAAC,CAAC"}
|
package/lib/utils/fake-hash.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { randomByteArray } from "../api/
|
|
1
|
+
import { randomByteArray } from "../api/zome-call-signing.js";
|
|
2
2
|
/** From https://github.com/holochain/holochain/blob/develop/crates/holo_hash/src/hash_type/primitive.rs */
|
|
3
3
|
export function fakeEntryHash() {
|
|
4
4
|
return new Uint8Array([0x84, 0x21, 0x24, ...randomByteArray(36)]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fake-hash.js","sourceRoot":"","sources":["../../src/utils/fake-hash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"fake-hash.js","sourceRoot":"","sources":["../../src/utils/fake-hash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAG9D,2GAA2G;AAC3G,MAAM,UAAU,aAAa;IAC3B,OAAO,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACpE,CAAC"}
|
package/package.json
CHANGED
package/lib/api/app/util.d.ts
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import nacl from "tweetnacl";
|
|
2
|
-
import { CapSecret } from "../../hdk/capabilities.js";
|
|
3
|
-
import { AgentPubKey, CellId } from "../../types.js";
|
|
4
|
-
import { FunctionName, ZomeName } from "../admin/types.js";
|
|
5
|
-
import { AdminWebsocket } from "../admin/websocket.js";
|
|
6
|
-
import { CallZomeRequestSigned, Nonce256Bit } from "./websocket.js";
|
|
7
|
-
/**
|
|
8
|
-
* Generates a key pair for signing zome calls.
|
|
9
|
-
*
|
|
10
|
-
* @returns The signing key pair and an agent pub key based on the public key.
|
|
11
|
-
*/
|
|
12
|
-
export declare const generateSigningKeyPair: () => [nacl.SignKeyPair, Uint8Array];
|
|
13
|
-
export declare const randomCapSecret: () => CapSecret;
|
|
14
|
-
export declare const randomNonce: () => Nonce256Bit;
|
|
15
|
-
export declare const randomByteArray: (length: number) => Uint8Array;
|
|
16
|
-
export declare const getNonceExpiration: () => number;
|
|
17
|
-
export declare const grantSigningKey: (admin: AdminWebsocket, cellId: CellId, functions: Array<[ZomeName, FunctionName]>, signingKey: AgentPubKey) => Promise<CapSecret>;
|
|
18
|
-
export declare const signZomeCall: (capSecret: CapSecret, signingKey: AgentPubKey, keyPair: nacl.SignKeyPair, payload: any) => Promise<CallZomeRequestSigned>;
|
|
19
|
-
export declare const grantSigningKeyAndSignZomeCall: (admin: AdminWebsocket, payload: any) => Promise<CallZomeRequestSigned>;
|
package/lib/api/app/util.js
DELETED
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import { hashZomeCall } from "@holochain/serialization";
|
|
2
|
-
import { encode } from "@msgpack/msgpack";
|
|
3
|
-
import crypto from "crypto";
|
|
4
|
-
import nacl from "tweetnacl";
|
|
5
|
-
/**
|
|
6
|
-
* Generates a key pair for signing zome calls.
|
|
7
|
-
*
|
|
8
|
-
* @returns The signing key pair and an agent pub key based on the public key.
|
|
9
|
-
*/
|
|
10
|
-
export const generateSigningKeyPair = () => {
|
|
11
|
-
const keyPair = nacl.sign.keyPair();
|
|
12
|
-
const signingKey = new Uint8Array([132, 32, 36].concat(...keyPair.publicKey).concat(...[0, 0, 0, 0]));
|
|
13
|
-
const keys = [keyPair, signingKey];
|
|
14
|
-
return keys;
|
|
15
|
-
};
|
|
16
|
-
export const randomCapSecret = () => randomByteArray(64);
|
|
17
|
-
export const randomNonce = () => randomByteArray(32);
|
|
18
|
-
export const randomByteArray = (length) => {
|
|
19
|
-
if (typeof window !== "undefined" &&
|
|
20
|
-
"crypto" in window &&
|
|
21
|
-
"getRandomValues" in window.crypto) {
|
|
22
|
-
return window.crypto.getRandomValues(new Uint8Array(length));
|
|
23
|
-
}
|
|
24
|
-
else {
|
|
25
|
-
return new Uint8Array(crypto.randomBytes(length));
|
|
26
|
-
}
|
|
27
|
-
};
|
|
28
|
-
export const getNonceExpiration = () => (Date.now() + 5 * 60 * 1000) * 1000; // 5 mins from now in microseconds
|
|
29
|
-
export const grantSigningKey = async (admin, cellId, functions, signingKey) => {
|
|
30
|
-
const capSecret = randomCapSecret();
|
|
31
|
-
await admin.grantZomeCallCapability({
|
|
32
|
-
cell_id: cellId,
|
|
33
|
-
cap_grant: {
|
|
34
|
-
tag: "zome-call-signing-key",
|
|
35
|
-
functions,
|
|
36
|
-
access: {
|
|
37
|
-
Assigned: {
|
|
38
|
-
secret: capSecret,
|
|
39
|
-
assignees: [signingKey],
|
|
40
|
-
},
|
|
41
|
-
},
|
|
42
|
-
},
|
|
43
|
-
});
|
|
44
|
-
return capSecret;
|
|
45
|
-
};
|
|
46
|
-
export const signZomeCall = async (capSecret, signingKey, keyPair, payload) => {
|
|
47
|
-
const unsignedZomeCallPayload = {
|
|
48
|
-
cap_secret: capSecret,
|
|
49
|
-
cell_id: payload.cell_id,
|
|
50
|
-
zome_name: payload.zome_name,
|
|
51
|
-
fn_name: payload.fn_name,
|
|
52
|
-
provenance: signingKey,
|
|
53
|
-
payload: encode(payload.payload),
|
|
54
|
-
nonce: randomNonce(),
|
|
55
|
-
expires_at: getNonceExpiration(),
|
|
56
|
-
};
|
|
57
|
-
const hashedZomeCall = await hashZomeCall(unsignedZomeCallPayload);
|
|
58
|
-
const signature = nacl
|
|
59
|
-
.sign(hashedZomeCall, keyPair.secretKey)
|
|
60
|
-
.subarray(0, nacl.sign.signatureLength);
|
|
61
|
-
const signedZomeCall = {
|
|
62
|
-
...unsignedZomeCallPayload,
|
|
63
|
-
signature,
|
|
64
|
-
};
|
|
65
|
-
return signedZomeCall;
|
|
66
|
-
};
|
|
67
|
-
export const grantSigningKeyAndSignZomeCall = async (admin, payload) => {
|
|
68
|
-
const [keyPair, signingKey] = generateSigningKeyPair();
|
|
69
|
-
const capSecret = await grantSigningKey(admin, payload.cell_id, [[payload.zome_name, payload.fn_name]], signingKey);
|
|
70
|
-
payload = { ...payload, cap_secret: capSecret };
|
|
71
|
-
const signedZomeCall = signZomeCall(capSecret, signingKey, keyPair, payload);
|
|
72
|
-
return signedZomeCall;
|
|
73
|
-
};
|
|
74
|
-
//# sourceMappingURL=util.js.map
|
package/lib/api/app/util.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../../src/api/app/util.ts"],"names":[],"mappings":"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"}
|