39 lines
1.3 KiB
Markdown
39 lines
1.3 KiB
Markdown
|
|
# Contractless PHP Crypto Interoperability
|
||
|
|
|
||
|
|
This harness verifies that the native libraries packaged by
|
||
|
|
`contractless-php-crypto` produce data compatible with Contractless.
|
||
|
|
|
||
|
|
## Results
|
||
|
|
|
||
|
|
- The C implementation wrapped by `jedisct1/PHP-Skein-Hash` produces the
|
||
|
|
same 32-byte Skein-256 output as the Rust `skein` crate used by
|
||
|
|
Contractless.
|
||
|
|
- Unmodified `Falcon-padded-512` message handling is not compatible with
|
||
|
|
Contractless `fn-dsa 0.3.0`.
|
||
|
|
- `Falcon-padded-512` keys and fixed signatures use the same Contractless
|
||
|
|
sizes: 897-byte public keys, 1,281-byte private keys, and 666-byte
|
||
|
|
signatures.
|
||
|
|
- Both signing implementations are compatible when liboqs receives the
|
||
|
|
message framing used by Contractless:
|
||
|
|
|
||
|
|
```text
|
||
|
|
SHAKE256(public_key, 64 bytes) || 0x00 || 0x00 || original_message
|
||
|
|
```
|
||
|
|
|
||
|
|
The two zero bytes represent raw-message mode and an empty domain context.
|
||
|
|
|
||
|
|
With that adapter:
|
||
|
|
|
||
|
|
- Contractless Rust signatures verify through liboqs.
|
||
|
|
- Liboqs signatures verify through Contractless Rust.
|
||
|
|
|
||
|
|
## Required liboqs algorithm
|
||
|
|
|
||
|
|
Use `Falcon-padded-512`. Do not use variable-length `Falcon-512`.
|
||
|
|
|
||
|
|
## Regression requirement
|
||
|
|
|
||
|
|
Run these tests whenever Contractless changes its `fn-dsa`, `skein`, or
|
||
|
|
signature-framing dependencies. Matching key and signature lengths alone
|
||
|
|
does not establish compatibility.
|