A typescript library for encrypting messages to a specific identity in a threshold setting.
Install the javascript and the types like so:
npm install identity-based-encryption-bn254
Create an instance of the IBE class, optionally configuring your options (which is only necessary when using custom DSTs).
// import
import { IBE } from "identity-based-encryption-bn254"
const ibe = new IBE()// get the public key for your signer (the lib also provides some convenience functions for creating from a secret key)
const publicKey = IBE.parsePublicKey(<some-bytes-here>)
// define the message your signer should sign in order to create an encryption key
const identity = ibe.createIdentity("alice@example.com")
// encode your plaintext message
const message = new TextEncoder().encode("hello world") // or you can use a Buffer in node
// huzzah - you have a ciphertext!
const ciphertext = ibe.encrypt(message, identity, publicKey)// get a signature over the identity from somewhere - this will act as the decryption key
const signature = ..
// you should now have a plaintext! if the signature wasn't valid or for the correct identity, this will throw an error
const plaintext = ibe.decrypt(ciphertext, signature)You can also serialize ciphertexts to bytes by using the functions in serde.ts
For usage with blocklock set the IBE opts depending on the chain you're using, e.g. for chainId of 1:
const IBE_OPTS = {
hash: keccak_256,
k: 128,
expand_fn: "xmd",
dsts: {
H1_G1: Buffer.from(`BLOCKLOCK_BN254G1_XMD:KECCAK-256_SVDW_RO_H1_0x0000000000000000000000000000000000000000000000000000000000000001_`),
H2: Buffer.from(`BLOCKLOCK_BN254_XMD:KECCAK-256_H2_0x0000000000000000000000000000000000000000000000000000000000000001_`),
H3: Buffer.from(`BLOCKLOCK_BN254_XMD:KECCAK-256_H3_0x0000000000000000000000000000000000000000000000000000000000000001_`),
H4: Buffer.from(`BLOCKLOCK_BN254_XMD:KECCAK-256_H4_0x0000000000000000000000000000000000000000000000000000000000000001_`),
},
}Thanks to @azixus, @kevincharm and @paulmillr for building the libs this was built on top of. Thanks to the Filecoin Foundation and Scroll for funding this work in part.