Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 68 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,74 @@ Raven Core integration/staging tree

https://ravencoin.org

---

## RIP-25: Post-Quantum Signatures (This Fork)

This fork implements [RIP-25](doc/RIP-0025-PQ-Signatures.md) ([GitHub Issue #1280](https://github.com/RavenProject/Ravencoin/issues/1280)), a proposal to add **quantum-resistant transaction signing** to Ravencoin using ML-DSA-44 (FIPS 204).

### What it does

New **witness v2** addresses use ML-DSA-44 (a NIST-standardized post-quantum signature algorithm) exclusively. Existing ECDSA addresses (witness v0) continue working unchanged. Users gradually migrate funds from ECDSA to ML-DSA-44 addresses, making the system quantum-resistant before quantum computers can break ECDSA.

- **Old addresses (witness v0):** ECDSA/secp256k1, unchanged
- **New addresses (witness v2):** ML-DSA-44 only, quantum-resistant
- **Migration:** Users send funds from old to new addresses at their own pace

### Key changes

| Area | Change |
|------|--------|
| **Consensus** | BIP9 soft-fork deployment (bit 11, 85% threshold), phased block weight increase (8 → 12 → 16 MWU) |
| **Script** | Witness version 2 validation: 2-element witness stack [mldsa_sig, mldsa_pk], SHA256(pk) == program |
| **Policy** | `TX_WITNESS_V2_PQ_KEYHASH` standard type, PQ witness discount (8x), PQ-aware dust threshold |
| **Addresses** | Bech32m encoding for witness v2 (HRP: `rvn` mainnet, `trvn` testnet, `rcrt` regtest) |
| **Network** | `NODE_PQ_HYBRID` service flag (bit 5), 16 MB protocol message limit |
| **Crypto** | `src/crypto/mldsa.h/cpp` — ML-DSA-44 via [liboqs](https://github.com/open-quantum-safe/liboqs) (FIPS 204 compliant) |
| **Keys** | `src/pqkey.h/cpp` — `CPQKey` / `CPQPubKey` for ML-DSA-44 key management |
| **Wallet** | `getnewpqaddress` RPC, PQ keystore integration, `IsMine` for witness v2 |
| **Signing** | ML-DSA-44 signing in `sign.cpp` via `TransactionSignatureCreator` |
| **Build** | liboqs added as dependency (`depends/packages/liboqs.mk`, `configure.ac --with-liboqs`) |
| **Tests** | `src/test/pqkey_tests.cpp` — unit tests for ML-DSA-44 keygen, sign/verify, witness programs |

### Branch

All work is on [`feature/rip25-pq-hybrid`](https://github.com/ALENOC/Ravencoin/tree/feature/rip25-pq-hybrid).

### Building with liboqs

```bash
# Install liboqs (Ubuntu/Debian)
sudo apt install cmake ninja-build
git clone https://github.com/open-quantum-safe/liboqs.git
cd liboqs && mkdir build && cd build
cmake -DOQS_MINIMAL_BUILD="SIG_ml_dsa_44" -DBUILD_SHARED_LIBS=ON ..
make -j$(nproc) && sudo make install
sudo ldconfig

# Build Ravencoin with PQ support
cd /path/to/Ravencoin
./autogen.sh
./configure --with-liboqs
make -j$(nproc)
```

Or using the depends system:
```bash
cd depends && make
cd .. && ./autogen.sh
./configure --prefix=$(pwd)/depends/x86_64-pc-linux-gnu
make -j$(nproc)
```

### Status

**Complete implementation** — All consensus rules, script validation, policy, network, wallet, signing, address encoding, and ML-DSA-44 cryptographic integration via liboqs are implemented. The build system detects liboqs automatically via pkg-config or `--with-liboqs`.

For the full specification see [`doc/RIP-0025-PQ-Signatures.md`](doc/RIP-0025-PQ-Signatures.md).

---

To see how to run Ravencoin, please read the respective files in [the doc folder](doc)


Expand Down
33 changes: 33 additions & 0 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,12 @@ AC_ARG_ENABLE([zmq],
[use_zmq=$enableval],
[use_zmq=yes])

AC_ARG_WITH([liboqs],
[AS_HELP_STRING([--with-liboqs],
[enable post-quantum signatures via liboqs (default is yes)])],
[use_liboqs=$withval],
[use_liboqs=yes])

AC_ARG_WITH([protoc-bindir],[AS_HELP_STRING([--with-protoc-bindir=BIN_DIR],[specify protoc bin path])], [protoc_bin_path=$withval], [])

AC_ARG_ENABLE(man,
Expand Down Expand Up @@ -962,6 +968,22 @@ if test x$use_pkgconfig = xyes; then
else
AC_DEFINE_UNQUOTED([ENABLE_ZMQ],[0],[Define to 1 to enable ZMQ functions])
fi

dnl RIP-25: liboqs for ML-DSA-44 post-quantum signatures
if test "x$use_liboqs" = "xyes"; then
PKG_CHECK_MODULES([LIBOQS], [liboqs >= 0.9.0],
[AC_DEFINE([HAVE_LIBOQS], [1], [Define to 1 if liboqs is available])],
[
dnl Fallback: check for header and library directly
AC_CHECK_HEADER([oqs/oqs.h],
[AC_CHECK_LIB([oqs], [OQS_SIG_new],
[LIBOQS_LIBS=-loqs; AC_DEFINE([HAVE_LIBOQS], [1], [Define to 1 if liboqs is available])],
[AC_MSG_ERROR([liboqs library not found. Install liboqs or use --without-liboqs])])],
[AC_MSG_ERROR([liboqs headers not found. Install liboqs-dev or use --without-liboqs])])
])
AC_SUBST(LIBOQS_LIBS)
AC_SUBST(LIBOQS_CFLAGS)
fi
]
)
else
Expand Down Expand Up @@ -1002,6 +1024,17 @@ else
esac
fi

dnl RIP-25: liboqs fallback check (non-pkg-config path)
if test "x$use_liboqs" = "xyes"; then
AC_CHECK_HEADER([oqs/oqs.h],
[AC_CHECK_LIB([oqs], [OQS_SIG_new],
[LIBOQS_LIBS=-loqs; AC_DEFINE([HAVE_LIBOQS], [1], [Define to 1 if liboqs is available])],
[AC_MSG_ERROR([liboqs library not found. Install liboqs or use --without-liboqs])])],
[AC_MSG_ERROR([liboqs headers not found. Install liboqs-dev or use --without-liboqs])])
AC_SUBST(LIBOQS_LIBS)
AC_SUBST(LIBOQS_CFLAGS)
fi

RAVEN_QT_CHECK(AC_CHECK_LIB([protobuf] ,[main],[PROTOBUF_LIBS=-lprotobuf], RAVEN_QT_FAIL(libprotobuf not found)))
if test x$use_qr != xno; then
RAVEN_QT_CHECK([AC_CHECK_LIB([qrencode], [main],[QR_LIBS=-lqrencode], [have_qrencode=no])])
Expand Down
28 changes: 28 additions & 0 deletions depends/packages/liboqs.mk
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package=liboqs
$(package)_version=0.12.0
$(package)_download_path=https://github.com/open-quantum-safe/liboqs/archive/refs/tags/
$(package)_file_name=$($(package)_version).tar.gz
$(package)_sha256_hash=TODO_REPLACE_WITH_ACTUAL_HASH
$(package)_dependencies=
$(package)_patches=

define $(package)_set_vars
$(package)_config_opts=-DOQS_BUILD_ONLY_LIB=ON
$(package)_config_opts+=-DOQS_MINIMAL_BUILD="SIG_ml_dsa_44"
$(package)_config_opts+=-DOQS_USE_OPENSSL=OFF
$(package)_config_opts+=-DBUILD_SHARED_LIBS=OFF
$(package)_config_opts+=-DCMAKE_INSTALL_PREFIX=$(host_prefix)
$(package)_config_opts+=-DOQS_DIST_BUILD=ON
endef

define $(package)_config_cmds
cmake -S . -B build $($(package)_config_opts)
endef

define $(package)_build_cmds
cmake --build build --parallel
endef

define $(package)_stage_cmds
cmake --install build --prefix $($(package)_staging_prefix_dir)
endef
2 changes: 1 addition & 1 deletion depends/packages/packages.mk
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
packages:=boost openssl libevent zeromq
packages:=boost openssl libevent zeromq liboqs
native_packages := native_ccache native_b2

qt_native_packages = native_protobuf
Expand Down
Loading