Enhanced signature and key exchange functions for scintilla and crypto/blockchain use.
Provides classical cryptographic signatures with quantum-resistant alternatives.
- ๐ Classic Signatures
- secp256k1 (Bitcoin/Ethereum)
- ed25519 (EdDSA)
- BLS12-381 (Aggregatable signatures)
- ๐ก๏ธ Post-quantum Signatures
- ML-DSA/Dilithium (Fast lattice-based)
- SLH-DSA/SPHINCS+ (Hash-based, conservative)
- ๐ Key Exchange
- ECDH (Classic elliptic curve)
- ML-KEM/Kyber (Post-quantum lattice)
- ๐ฌ Security
- Audited implementations
- NIST-approved algorithms
- Zero dependencies beyond noble libraries
npm install @scintilla-network/signatures
import { secp256k1 } from '@scintilla-network/signatures/classic';
// Generate a key pair
const privateKey = secp256k1.generatePrivateKey();
const publicKey = secp256k1.getPublicKey(privateKey);
// Sign a message
const message = 'Hello, Scintilla!';
const signature = secp256k1.sign(message, privateKey);
// Verify the signature
const isValid = secp256k1.verify(signature, message, publicKey);
console.log('Signature valid:', isValid); // true
import { secp256k1 } from '@scintilla-network/signatures/classic';
// Generate keys
const privateKey = secp256k1.generatePrivateKey();
const publicKey = secp256k1.getPublicKey(privateKey);
// Sign and verify
const signature = secp256k1.sign(message, privateKey);
const isValid = secp256k1.verify(signature, message, publicKey);
import { ed25519 } from '@scintilla-network/signatures/classic';
// Generate key pair
const { privateKey, publicKey } = ed25519.generateKeyPair();
// Sign and verify
const signature = ed25519.sign(message, privateKey);
const isValid = ed25519.verify(signature, message, publicKey);
import { bls12_381 } from '@scintilla-network/signatures/classic';
// Generate multiple key pairs
const keys1 = bls12_381.generateKeyPair();
const keys2 = bls12_381.generateKeyPair();
// Sign same message with different keys
const sig1 = bls12_381.sign(message, keys1.privateKey);
const sig2 = bls12_381.sign(message, keys2.privateKey);
// Aggregate signatures and public keys
const aggSig = bls12_381.aggregateSignatures([sig1, sig2]);
const aggPub = bls12_381.aggregatePublicKeys([keys1.publicKey, keys2.publicKey]);
// Verify aggregated signature
const isValid = bls12_381.verify(aggSig, message, aggPub);
All signature functions accept messages in multiple formats:
Uint8Array
: Raw bytesstring
: UTF-8 encoded text or hex stringobject
: Automatically JSON stringified
// All these are valid
signature = secp256k1.sign(new Uint8Array([1,2,3]), privateKey);
signature = secp256k1.sign("Hello, World!", privateKey);
signature = secp256k1.sign("0123456789abcdef", privateKey); // hex
signature = secp256k1.sign({ foo: "bar" }, privateKey); // object
For advanced use cases:
import {
toHex,
fromHex,
toUtf8,
fromUtf8,
formatMessage
} from '@scintilla-network/signatures/utils';
// Convert between formats
const hex = toHex(bytes);
const bytes = fromHex(hex);
// UTF-8 encoding/decoding
const utf8Bytes = fromUtf8("Hello");
const text = toUtf8(utf8Bytes);
// Automatic message formatting
const formatted = formatMessage(message); // works with any format
- Never store private keys in plaintext
- Use secure key derivation for deterministic keys
- Consider hardware security modules for production
- Use consistent message formatting
- Be careful with hex string inputs
- Validate message lengths where required
- Classic signatures are not quantum-resistant
- Consider using PQ signatures for long-term security
- Follow NIST recommendations for algorithm selection
MIT License - see the LICENSE file for details
This library builds upon the excellent work of:
- noble-curves by Paul Miller
- noble-post-quantum by Paul Miller
Both libraries are audited and maintained with support from various blockchain foundations.