@zerochain/sdk
Version:
The Züs JS SDK is a JavaScript client library that provides a convenient interface for interacting with the Züs Network. It allows developers to perform various operations such as creating and managing allocations, uploading and downloading files, executi
142 lines (124 loc) • 3.87 kB
text/typescript
import { hexStringToByte, sleep } from '@/utils'
import { getBridge } from '../bridge'
/**
* Signs a hash using BLS signature scheme.
*
* @param hash The hash to be signed.
* @returns The serialized signature in hexadecimal format.
*/
async function blsSign(hash: string, secretKey: string): Promise<string> {
const bridge = getBridge()
if (!bridge.jsProxy || !bridge.jsProxy.secretKey) {
const errMsg = 'Error: bls.secretKey is not initialized'
console.warn(errMsg)
throw new Error(errMsg)
}
const bytes = hexStringToByte(hash)
const privateKey = bridge.jsProxy.bls.deserializeHexStrToSecretKey(secretKey)
const sig = privateKey.sign(bytes)
if (!sig) {
const errMsg = 'Error: WASM blsSign function failed to sign transaction'
console.warn(errMsg)
throw new Error(errMsg)
}
return sig.serializeToHexStr()
}
/**
* Verifies a BLS signature against a given hash.
*
* @param signature The serialized BLS signature.
* @param hash The hash to verify the signature against.
* @returns A boolean indicating whether the signature is valid or not.
*/
async function blsVerify(signature: string, hash: string): Promise<boolean> {
const bridge = getBridge()
if (!bridge.jsProxy || !bridge.jsProxy.publicKey) {
const errMsg = 'Error: bls.publicKey is not initialized'
console.warn(errMsg)
throw new Error(errMsg)
}
const bytes = hexStringToByte(hash)
const sig = bridge.jsProxy.bls.deserializeHexStrToSignature(signature)
return bridge.jsProxy.publicKey.verify(sig, bytes)
}
/**
* Verifies a BLS signature against a given hash and public key.
*
* @param pk The public key.
* @param signature The serialized BLS signature.
* @param hash The hash to verify the signature against.
* @returns A boolean indicating whether the signature is valid or not.
*/
async function blsVerifyWith(
pk: string,
signature: string,
hash: string
): Promise<boolean> {
const bridge = getBridge()
const publicKey = bridge.jsProxy.bls.deserializeHexStrToPublicKey(pk)
const bytes = hexStringToByte(hash)
const sig = bridge.jsProxy.bls.deserializeHexStrToSignature(signature)
return publicKey.verify(sig, bytes)
}
/**
* Adds a signature to an existing signature.
*
* @param secretKey The secret key.
* @param signature The serialized BLS signature.
* @param hash The hash to verify the signature against.
*
* @returns The serialized signature in hexadecimal format.
*/
async function blsAddSignature(
secretKey: string,
signature: string,
hash: string
): Promise<string> {
const bridge = getBridge()
if (!bridge.jsProxy) {
const errMsg = 'Error: bls.secretKey is not initialized'
console.warn(errMsg)
throw new Error(errMsg)
}
const privateKey = bridge.jsProxy.bls.deserializeHexStrToSecretKey(secretKey)
const sig = bridge.jsProxy.bls.deserializeHexStrToSignature(signature)
var sig2 = privateKey.sign(hexStringToByte(hash))
if (!sig2) {
const errMsg =
'Error: WASM blsAddSignature function failed to sign transaction'
console.warn(errMsg)
throw new Error(errMsg)
}
sig.add(sig2)
return sig.serializeToHexStr()
}
export async function createObjectURL(
buf: ArrayBuffer,
mimeType: string
): Promise<string> {
var blob = new Blob([buf], { type: mimeType })
return URL.createObjectURL(blob)
}
export const getJsProxy = (): {
secretKey: string | null
publicKey: string | null
} & JsProxyMethods => {
return {
secretKey: null,
publicKey: null,
sign: blsSign,
verify: blsVerify,
verifyWith: blsVerifyWith,
addSignature: blsAddSignature,
createObjectURL,
sleep,
}
}
export type JsProxyMethods = {
sign: typeof blsSign
verify: typeof blsVerify
verifyWith: typeof blsVerifyWith
addSignature: typeof blsAddSignature
createObjectURL: typeof createObjectURL
sleep: typeof sleep
}