added example usage to README

This commit is contained in:
viraladmin 2026-07-25 14:05:20 -06:00
parent de187b7f8f
commit 2b57a73b5c
1 changed files with 86 additions and 3 deletions

View File

@ -308,6 +308,89 @@ Direct Skein hashing:
$digest = skein_hash($data, 256);
```
Direct Contractless Falcon handling requires the public-key SHAKE256 prefix and
raw-message marker. `php-contractless-rpc` applies that format automatically,
so application developers should use its `NativeCrypto` class.
## Direct Falcon Signing And Verification
Contractless uses `Falcon-padded-512`. Do not substitute the variable-length
`Falcon-512` algorithm.
Falcon keys and signatures are binary data. Load and store them without text,
hexadecimal, Base64, or character-encoding conversions unless the application
explicitly performs and reverses that conversion.
Contractless Falcon signatures use a SHAKE256 prefix derived from the public
key, followed by the raw-message marker and the original message:
```text
SHAKE256(public_key, 64 bytes) || 0x00 || 0x00 || original_message
```
### Sign A Message
```php
<?php
declare(strict_types=1);
$message = 'Message to sign';
$publicKey = file_get_contents('public-key.bin');
$privateKey = file_get_contents('private-key.bin');
if ($publicKey === false || $privateKey === false) {
throw new RuntimeException('Unable to load the Falcon keys.');
}
$falcon = new OQS_SIGNATURE('Falcon-padded-512');
$adaptedMessage =
contractless_shake256($publicKey, 64)
. "\0\0"
. $message;
$signature = '';
if ($falcon->sign($signature, $adaptedMessage, $privateKey) !== 0) {
throw new RuntimeException('Falcon signing failed.');
}
if (strlen($signature) !== 666) {
throw new RuntimeException('Invalid Contractless signature length.');
}
file_put_contents('signature.bin', $signature);
```
### Verify A Signature
```php
<?php
declare(strict_types=1);
$message = 'Message to sign';
$publicKey = file_get_contents('public-key.bin');
$signature = file_get_contents('signature.bin');
if ($publicKey === false || $signature === false) {
throw new RuntimeException('Unable to load the public key or signature.');
}
if (strlen($signature) !== 666) {
throw new RuntimeException('Invalid Contractless signature length.');
}
$falcon = new OQS_SIGNATURE('Falcon-padded-512');
$adaptedMessage =
contractless_shake256($publicKey, 64)
. "\0\0"
. $message;
if ($falcon->verify($adaptedMessage, $signature, $publicKey) !== 0) {
throw new RuntimeException('Falcon signature verification failed.');
}
echo "Signature verified.\n";
```
These examples expose the low-level module behavior for testing and debugging.
Applications should normally use the `NativeCrypto` class provided by
`php-contractless-rpc`, which applies the Contractless message framing
automatically.