df-share 0.1.1

secret sharing
Documentation
# df-share

**df-share** is a lightweight helper library for one-off (ephemeral) Diffie-Hellman exchanges that let a server encrypt a secret so **only** the requesting client can decrypt it. The server uses a freshly generated key pair for **each** request, returning `(encrypted_secret, server_pubk, nonce, salt)`. The client then uses the corresponding ephemeral keys on its side to derive the shared secret and decrypt.

## Trade-offs

- This implementation **does not** authenticate the server’s identity. Any party could impersonate the server. If you need to verify you’re talking to the _real_ server, you should:
  - Maintain a long-lived key pair on the server side.
  - Pin the server’s public key on the clients (or otherwise authenticate it).
- In this ephemeral approach, there’s no persistent server key material. That means:
  - **Pro**: Each exchange uses new keys, enhancing forward secrecy.
  - **Con**: You lose server identity guarantees out of the box.

## Example Usage

```rust
// Client side
let client = EphemeralClient::new().unwrap();
let (req, decryptor) = client.sendable();

// The client sends `req` (which includes its ephemeral public key)
// to the server. Then the server encrypts the secret:

let res;
let secret = "MyVerySecretPrivateKey";
{
    // Server side
    let server = EphemeralServer::new().unwrap();
    res = server.encrypt_secret(&req, secret.as_bytes()).unwrap();
}

// Back on the client side, we decrypt using the matching ephemeral keys:
let decrypted_secret = decryptor.decrypt(&res).unwrap();

assert_eq!(secret.as_bytes(), &decrypted_secret);
// Confirm the ciphertext differs from the secret:
assert!(decrypted_secret != res.ciphertext);
```

In this snippet:

1. The **client** creates an ephemeral key pair and prepares a `req` message.
2. The **server** generates its own ephemeral key pair, derives the shared secret with the client’s `req`, and encrypts the actual `secret`.
3. The **client** applies its matching ephemeral private key to derive the same shared secret and decrypt the server’s response.

Use **df-share** to keep your secret data private between two parties, as long as you’re operating over a trusted channel (e.g., HTTPS) or have other means to ensure the server is who you expect.