mirror of
https://github.com/luxfi/crypto.git
synced 2026-07-27 01:54:50 +00:00
NIST Standards Implementation: - Implement FIPS 203 (ML-KEM) for key encapsulation with 512/768/1024 variants - Implement FIPS 204 (ML-DSA) for signatures with 44/65/87 parameter sets - Implement FIPS 205 (SLH-DSA/SPHINCS+) for stateless hash-based signatures - Add Lamport one-time signatures with SHA256/SHA3-256 Build Infrastructure: - Support CGO optimizations with build tags (cgo/nocgo variants) - Add comprehensive test suite covering all implementations - Update CI/CD pipeline with matrix testing for CGO=0/1 - Add make targets for all crypto components EVM Precompiled Contracts (47 total): - ML-KEM: 9 contracts for key generation, encapsulation, decapsulation - ML-DSA: 9 contracts for key generation, signing, verification - SLH-DSA: 18 contracts for all parameter sets (128s/f, 192s/f, 256s/f) - Lamport: 6 contracts for SHA256/SHA3-256 operations - SHAKE: 2 contracts for SHAKE128/256 XOF - BLS: 3 contracts for BLS12-381 operations Integration: - Full coreth integration with all precompiles registered - Node integration with quantum-resistant primitives - Deterministic placeholder implementations for testing - Comprehensive documentation and status tracking Testing: - All tests passing with both CGO enabled and disabled - 23 packages tested with CGO_ENABLED=0 - 24 packages tested with CGO_ENABLED=1 - Performance benchmarks for all algorithms - Integration tests for precompiled contracts This establishes Lux as the first blockchain with complete NIST post-quantum cryptography support, ready for quantum-resistant operations.
81 lines
1.4 KiB
C
81 lines
1.4 KiB
C
#include <stddef.h>
|
|
#include <stdint.h>
|
|
#include <stdlib.h>
|
|
#include "randombytes.h"
|
|
|
|
#ifdef _WIN32
|
|
#include <windows.h>
|
|
#include <wincrypt.h>
|
|
#else
|
|
#include <fcntl.h>
|
|
#include <errno.h>
|
|
#ifdef __linux__
|
|
#define _GNU_SOURCE
|
|
#include <unistd.h>
|
|
#include <sys/syscall.h>
|
|
#else
|
|
#include <unistd.h>
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef _WIN32
|
|
void randombytes(uint8_t *out, size_t outlen) {
|
|
HCRYPTPROV ctx;
|
|
size_t len;
|
|
|
|
if(!CryptAcquireContext(&ctx, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))
|
|
abort();
|
|
|
|
while(outlen > 0) {
|
|
len = (outlen > 1048576) ? 1048576 : outlen;
|
|
if(!CryptGenRandom(ctx, len, (BYTE *)out))
|
|
abort();
|
|
|
|
out += len;
|
|
outlen -= len;
|
|
}
|
|
|
|
if(!CryptReleaseContext(ctx, 0))
|
|
abort();
|
|
}
|
|
#elif defined(__linux__) && defined(SYS_getrandom)
|
|
void randombytes(uint8_t *out, size_t outlen) {
|
|
ssize_t ret;
|
|
|
|
while(outlen > 0) {
|
|
ret = syscall(SYS_getrandom, out, outlen, 0);
|
|
if(ret == -1 && errno == EINTR)
|
|
continue;
|
|
else if(ret == -1)
|
|
abort();
|
|
|
|
out += ret;
|
|
outlen -= ret;
|
|
}
|
|
}
|
|
#else
|
|
void randombytes(uint8_t *out, size_t outlen) {
|
|
static int fd = -1;
|
|
ssize_t ret;
|
|
|
|
while(fd == -1) {
|
|
fd = open("/dev/urandom", O_RDONLY);
|
|
if(fd == -1 && errno == EINTR)
|
|
continue;
|
|
else if(fd == -1)
|
|
abort();
|
|
}
|
|
|
|
while(outlen > 0) {
|
|
ret = read(fd, out, outlen);
|
|
if(ret == -1 && errno == EINTR)
|
|
continue;
|
|
else if(ret == -1)
|
|
abort();
|
|
|
|
out += ret;
|
|
outlen -= ret;
|
|
}
|
|
}
|
|
#endif
|