High level BLS12-381 functions for Aiken
Introduction
Welcome to the BLS12-381 library for the Aiken smart-contract language! This library provides a comprehensive implementation of BLS12-381 signatures, enabling advanced cryptographic operations on the Cardano blockchain.
The library implements the three core BLS signature schemes as defined in the IETF BLS Signature draft:
- Basic (
g1/basic): Standard BLS signatures - Message Augmentation (
g1/aug): Signatures with message augmentation for domain separation - Proof of Possession (
g1/pop): Signatures with PoP for rogue key attack resistance
Implementation Status
Currently, this library implements the Minimal-pubkey-size variant as defined in the IETF draft:
- Public keys: Points in G1 (48 bytes)
- Signatures: Points in G2 (96 bytes)
This approach is RECOMMENDED for implementations using signature aggregation, since the size of (PK_1, ..., PK_n, signature) is dominated by the public keys even for small n. By keeping public keys in G1 (the smaller group), we minimize the overall size of aggregated verification data.
API Note: The core cryptographic primitives are implemented in the g1/core module, while the public interfaces are exposed through the scheme-specific modules.
Implemented Functions
Core Module (g1/core)
Low-level cryptographic primitives used by all schemes:
| Function | Description |
|---|---|
key_gen | Generate secret key from random |
sk_to_pk | Convert secret key to public key |
key_validate | Validate a public key |
core_sign | Core signing primitive |
vore_verify | Core verification primitive |
aggregate | Aggregate multiple signatures |
core_aggregate_verify | Core aggregate verification |
Basic Scheme (g1/basic)
Standard BLS signatures as specified in the IETF draft:
| Function | Description |
|---|---|
sk_to_pk | Convert secret key to public key |
sign | Sign a message with private key |
verify | Verify a signature with public key |
aggregate | Combine multiple signatures |
aggregate_verify | Verify aggregated signatures for distinct messages |
Message Augmentation Scheme (g1/aug)
Signatures with message augmentation for domain separation:
| Function | Description |
|---|---|
sk_to_pk | Convert secret key to public key |
sign | Sign a message with private key (augmented) |
verify | Verify a signature with public key |
aggregate | Combine multiple signatures |
aggregate_verify | Verify aggregated signatures |
Proof of Possession Scheme (g1/pop)
Signatures with PoP for rogue key attack resistance:
| Function | Description |
|---|---|
sk_to_pk | Convert secret key to public key |
sign | Sign a message with private key |
verify | Verify a signature with public key |
pop_prove | Generate Proof-of-Possession signature for a public key |
pop_verify | Verify a Proof-of-Possession signature |
aggregate | Combine multiple signatures |
aggregate_verify | Verify aggregated signatures |
Getting Started
To get started with this library, make sure you have the Aiken environment set up and add this library to your aiken.toml:
[dependencies]
ilap/bls = { version = "x.y.z" }
Usage
Detailed usage examples and API documentation can be found in the lib/bls/tests and docs directory (generated with aiken docs). Here is a quick example to get you started:
use ilap/bls/g1/basic.{ sk_to_pk, sign, verify}
test test_bls () {
let sk = #"ed69a93f0cf8c9836be3b67c7eeff416612d45ba39a5c099d48fa668bf558c9c"
let pk = sk_to_pk(sk)
let message = "Hello, Aiken!"
let signature = sign(sk, message)
verify(pk, message, signature)
}
BLS12-381 Technical Brief
-
Embedding degree: 12 i.e. the complexity of the pairing operation.
-
Field Size (π): A large prime number defining the finite field i.e. π½π. The prime in the finite field is 381-bit.
-
Prime Order (r): The number of points on the curve e.g.
π¦^2=π₯^3+4forπ₯β{0,π½πβ1}. The number of points on the elliptic curve (excluding the point at infinity) is a prime number. -
Security level: BLS12-381 provides an approximate 128-bit security level, given that its complexity is around
ββπi.e.πβ2^256. -
Private key: A scalar in
π½πwhich meansβ{0,πβ1}. The size is 381 bits ~48 bytes. -
Identity Element: The multiplicative identity (1).
-
Bilinear pairing : A function
π:πΊ1ΓπΊ2βπΊπwith the following properties:- Non-degeneracy:
π(π1,π2)β 1for someπ1βπΊ1andπ2βπΊ2. - Bilinearity:
π(ππ1,ππ2)=π(π1,π2)ππfor allπ,πβπ½πandπ1βπΊ1andπ2βπΊ2. - Computability: There exists an efficient algorithm to compute
π(π1,π2)for allπ1βπΊ1andπ2βπΊ2.
- Non-degeneracy:
-
Group Definitions:
- G1: This group consists of points on the elliptic curve over the base field
πΉπ(π¦^2=π₯^3+4). - G2:: This group consists of points on the twisted curve over an extension field
πΉπ^2(π¦^2=π₯^3+4(1+i)). - GT: This is the multiplicative group of a larger field
πΉπ12, used as the result of the pairing operation.
- G1: This group consists of points on the elliptic curve over the base field
Resources
Contributing
We welcome contributions to enhance the functionality and usabilioty of this library. Please refer to the CONTRIBUTING.md file for guidelines on how to contribute.
License
This project is licensed under the Apache 2.0 License - see the LICENSE file for details.