Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/mattrglobal/node-bbs-signatures
An implementation of BBS+ signatures using rust and typescript for node.js
https://github.com/mattrglobal/node-bbs-signatures
assurance cryptography digital-signature nucleus zero-knowledge-proofs
Last synced: 4 days ago
JSON representation
An implementation of BBS+ signatures using rust and typescript for node.js
- Host: GitHub
- URL: https://github.com/mattrglobal/node-bbs-signatures
- Owner: mattrglobal
- License: apache-2.0
- Created: 2020-04-01T20:08:28.000Z (over 4 years ago)
- Default Branch: master
- Last Pushed: 2024-09-16T20:58:24.000Z (about 2 months ago)
- Last Synced: 2024-09-17T02:51:44.093Z (about 2 months ago)
- Topics: assurance, cryptography, digital-signature, nucleus, zero-knowledge-proofs
- Language: TypeScript
- Homepage:
- Size: 1.24 MB
- Stars: 58
- Watchers: 16
- Forks: 26
- Open Issues: 4
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- Contributing: docs/CONTRIBUTING.md
- License: LICENSE
- Security: SECURITY.md
Awesome Lists containing this project
README
[![MATTR](./docs/assets/mattr-logo-square.svg)](https://github.com/mattrglobal)
# Node BBS Signatures
![npm-version](https://badgen.net/npm/v/@mattrglobal/node-bbs-signatures)
![npm-unstable-version](https://badgen.net/npm/v/@mattrglobal/node-bbs-signatures/unstable)
![Master](https://github.com/mattrglobal/node-bbs-signatures/workflows/push-master/badge.svg)
![Release](https://github.com/mattrglobal/node-bbs-signatures/workflows/push-release/badge.svg)
![codecov](https://codecov.io/gh/mattrglobal/node-bbs-signatures/branch/master/graph/badge.svg)This repository is the home to a performant multi-message digital signature algorithm implementation which supports
deriving zero knowledge proofs that enable selective disclosure from the originally signed message set.[BBS+ Signatures](https://github.com/mattrglobal/bbs-signatures) are a digital signature algorithm originally born from
the work on [Short group signatures](https://crypto.stanford.edu/~xb/crypto04a/groupsigs.pdf) by Boneh, Boyen, and
Shachum which was later improved on in
[Constant-Size Dynamic k-TAA](http://web.cs.iastate.edu/~wzhang/teach-552/ReadingList/552-14.pdf) as BBS+ and touched on
again in section 4.3 in
[Anonymous Attestation Using the Strong Diffie Hellman Assumption Revisited ](https://www.researchgate.net/publication/306347781_Anonymous_Attestation_Using_the_Strong_Diffie_Hellman_Assumption_Revisited).[BBS+ Signatures](https://github.com/mattrglobal/bbs-signatures) require a
[pairing-friendly curve](https://tools.ietf.org/html/draft-irtf-cfrg-pairing-friendly-curves-03), this library includes
support for [BLS12-381](https://tools.ietf.org/html/draft-irtf-cfrg-pairing-friendly-curves-03#section-2.4).[BBS+ Signatures](https://github.com/mattrglobal/bbs-signatures) allow for multi-message signing whilst producing a
single output signature. With a BBS signature, a [proof of knowledge](https://en.wikipedia.org/wiki/Proof_of_knowledge)
based proof can be produced where only some of the originally signed messages are revealed at the discretion of the
prover.## Getting started
To use this package within your project simply run
```
npm install @mattrglobal/node-bbs-signatures
```Or with [Yarn](https://yarnpkg.com/)
```
yarn add @mattrglobal/node-bbs-signatures
```## Usage
See the [sample](./sample) directory for a runnable demo.
The following is a short sample on how to use the API
```typescript
import {
generateBls12381G2KeyPair,
blsSign,
blsVerify,
blsCreateProof,
blsVerifyProof,
} from "@mattrglobal/node-bbs-signatures";//Generate a new key pair
const keyPair = await generateBls12381G2KeyPair();//Set of messages we wish to sign
const messages = [Uint8Array.from(Buffer.from("message1", "utf-8")), Uint8Array.from(Buffer.from("message2", "utf-8"))];//Create the signature
const signature = await blsSign({
keyPair,
messages: messages,
});//Verify the signature
const isVerified = await blsVerify({
publicKey: keyPair.publicKey,
messages: messages,
signature,
});//Derive a proof from the signature revealing the first message
const proof = await blsCreateProof({
signature,
publicKey: keyPair.publicKey,
messages,
nonce: Uint8Array.from(Buffer.from("nonce", "utf8")),
revealed: [0],
});//Verify the created proof
const isProofVerified = await blsVerifyProof({
proof,
publicKey: keyPair.publicKey,
messages: messages.slice(0, 1),
nonce: Uint8Array.from(Buffer.from("nonce", "utf8")),
});
```## Element Size
Within a digital signature there are several elements for which it is useful to know the size, the following table
outlines the general equation for calculating element sizes in relation to BBS+ signatures as it is dependent on the
pairing friendly curve used.| Element | Size Equation |
| ----------- | ------------------------------------ |
| Private Key | F |
| Public Key | G2 |
| Signature | G1 + 2\*F |
| Proof | 5*G1 + (4 + no_of_hidden_messages)*F |- `F` A field element
- `G1` A point in the field of G1
- `G2` A point in the field of G2
- `no_of_hidden_messages` The number of the hidden messagesThis library includes specific support for BLS12-381 keys with BBS+ signatures and hence gives rise to the following
concrete sizes| Element | Size with BLS12-381 |
| ----------- | --------------------------------------- |
| Private Key | 32 Bytes |
| Public Key | 96 Bytes |
| Signature | 112 Bytes |
| Proof | 368 + (no_of_hidden_messages)\*32 Bytes |## Getting started as a contributor
The following describes how to get started as a contributor to this project
### Prerequisites
The following is a list of dependencies you must install to build and contribute to this project
- [Yarn](https://yarnpkg.com/)
- [Rust](https://www.rust-lang.org/)For more details see our [contribution guidelines](./docs/CONTRIBUTING.md)
#### Install
To install the package dependencies run:
```
yarn install --frozen-lockfile
```#### Build
To build the project run:
```
yarn build
```#### Test
To run the test in the project run:
```
yarn test
```#### Benchmark
To benchmark the implementation locally run:
```
yarn benchmark
```## Dependencies
This library uses the [bbs](https://crates.io/crates/bbs) rust crate for the implementation of BBS+ signatures and
BLS12-381 which is then wrapped and exposed in javascript/typescript using
[neon-bindings](https://github.com/neon-bindings/neon).## Security Policy
Please see our [security policy](./SECURITY.md) for additional details about responsible disclosure of security related
issues.---
Copyright © MATTR Limited. Some rights reserved.
“MATTR” is a trademark of MATTR Limited, registered in New Zealand and other countries.