Code Monkey home page Code Monkey logo

b-privacy-js's Introduction

Summary

B Privacy js library, supported runtimes: nodejs, react-native and browser.

Supports:

  • generating new accounts new B({ mnemonic: B.generateMnemonicPhrase() })
  • restoring accounts from mnemonic new B({ mnemonic })
  • access to mnemonic, private key, public key and ethereum address [a.mnemonic, a.privateKey, a.publicKey, a.address]
  • asymmetric encryption a.encrypt(msg, b.publicKey)
  • asymmetric decryption b.decrypt(msg, a.publicKey)
  • signing a.ecsign(B.keccak256(msg))
  • deriving address from public key B.publicKeyToAddress(publicKey)
  • See usage for examples

Conventions

We call bytes any byte representation: buffer, hex0x or hex.

bytesTo* family functions convert from one of known byte representations to specified one.

to* family functions will try to convert from any input into desired byte representation, when possible making the same conversions as seen in solidity, ie.:

toBuffer('hello') // returns buffer with utf8 representation of the input string
toBuffer(true) // returns 32 byte, big-endian number 1
toBuffer(false) // returns 32 byte number 0
toBuffer(null) // throws
toBuffer('0x01') // returns one byte buffer
toBuffer('ffff') // returns two byte buffer

Installation

npm i --save @appliedblockchain/b-privacy

Usage

const assert = require('assert')
const B = require('@appliedblockchain/b-privacy')

const simon = new B({ mnemonic: B.generateMnemonicPhrase() })

// sign a message from an account
const helloHash = B.keccak256('hello')
const helloSig = simon.ecsign(helloHash)

// verify that i said hello
const didISayHello = simon.ecverify(helloHash, helloSig)
assert.equal(didISayHello, true)

// anyone can verify i said hello if they have my publicKey or address
const recoveredPublicKey = B.ecrecover(helloHash, helloSig)
assert.equal(recoveredPublicKey, simon.getPublicKey())
const recoveredAddress = B.ecrecoverAddress(helloHash, helloSig)
assert.equal(recoveredAddress, simon.address)

const mike = new B({ mnemonic: B.generateMnemonicPhrase() })
const hiMike = simon.encrypt({
  message: 'hello',
  another: 'key'
}, mike.publicKey)

const mikesMessage = mike.decrypt(hiMike, simon.publicKey)
assert.deepEqual(mikesMessage, { message: 'hello', another: 'key' })

const helloEveryone = { hello: 'everyone!' }
const [ sharedBlob, readerBlob ] = simon.encryptShared(helloEveryone)

// i can decrypt my own shared message, other people can't without calling shareSecret
assert.deepEqual(simon.decryptShared(sharedBlob, readerBlob), helloEveryone)

// providing a mnemonic is optional, if nothing provided then one will be generated
const bob = new B()
const bobReaderBlob = simon.shareSecret(readerBlob, bob.publicKey)

// bob can now decrypt the shared message
const bobsMessage = bob.decryptShared(sharedBlob, bobReaderBlob)
assert.deepEqual(bobsMessage, helloEveryone)

// bob can now pass the message on securely
const alice = new B()
const aliceReaderBlob = bob.shareSecret(bobReaderBlob, alice.publicKey)

const alicesMessage = alice.decryptShared(sharedBlob, aliceReaderBlob)
assert.deepEqual(alicesMessage, helloEveryone)

For more usage examples please refer to tests in test directory.


We'll need to clean-up below docs

Blockchain Privacy JS library

Provides an easy way to interact with keys and sign messages (note: storage of keys should be handled outside this library)

Development

npm run dev

Build

Package the library for release (browser/node)

npm run build

Testing

npm test

or:

npm i -g jest

jest

Browser Usage

Please require dist/b-privacy.js, that's the browser-ready version.

You also need to include bitcore-lib manually before that. See test/browser.index.html for a working example.

To make the example work you need to build bitcore-lib for the browser, run:

cd node_modules/bitcore-lib
npm i
gulp browser

b-privacy-js's People

Contributors

campbell-codes avatar makevoid avatar mariogemoll avatar mirek avatar simontabor avatar

Watchers

 avatar  avatar  avatar

b-privacy-js's Issues

b.callSignature not compatible with trufflib/Sig.col:recover when using addresses

If an address is used as part of the signature like so( invoice.buyer is an address):

let sig = b.callSignature('createInvoice', invoice.buyer ,invoice.ref, invoice.amount, invoice.infos)

It won't recover the correct address on the contract side(using trufflib):

    Sig.t memory sig;
    sig.param("createInvoice");
    sig.param(_buyer);
    sig.param_string(_ref);
    sig.param(_amount);
    sig.param_string(_info);

    bool success;
    address supplier_address;
    (success, supplier_address) = sig.recover(_remote_sig);

To fix it you need to slice the 0x part of the address like so:

let sig = b.callSignature('createInvoice', invoice.buyer.slice(2) ,invoice.ref, invoice.amount, invoice.infos)

Is it the normal behavior or should b-privacy detect that the param is an address and strip the "0x" part?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.