# Module Rpc_key_service

    module Rpc_key_service: sig .. end

Contact the keyserv daemon to encrypt/decrypt data with the common key.

If the keyserv crashes, the current call will raise an exception (e.g. broken pipe), but the next call will try to reconnect.

This module works fully synchronous, i.e. waits until the keyserv responds. This is normally not a problem, because the keyserv daemon runs on the same system, and no network latencies can occur.

    exception Netname_unknown

The netname is invalid

    exception No_secret_key

The user does not have a secret key for the netname

    exception Key_service_problem of exn

All exceptions (except the exceptions defined above) are wrapped into `Key_service_problem`.

    type t

represents a client of the keyserv daemon

    type connector = [ `Direct of Rpc_client.connector * Rpc.protocol | `Keyenvoy of string ]

How to connect to keyserv:

- ``Direct(c,p)`: Create a direct RPC connection to the keyserv program listening at `c` using protocol `p`. This usually only works if `c` is a local transport like Unix Domain.
- ``Keyenvoy path`: Call the `keyenvoy` program installed at `path`

    val create : ?connector:connector -> unit -> t

Connects to the keyserv daemon. By default (no `connector`), the local keyserv daemon is contacted in an OS-specific way.

    val generate : t -> string

Generates a new conversation key (a 64 bit random number)

    val encrypt : t -> string -> string -> string

This function is used if this program is a client and wants to contact a server. The first passed string is the netname of the server. Furthermore, the keyserv daemon automatically determines the netname of this process. The daemon looks up the public key of the server and the secret key of the client, and computes the common key using the Diffie Hellman scheme. The second passed string (exactly 8 characters) is DES-encrypted with the common key in ECB mode, and returned (again 8 characters).

    val decrypt : t -> string -> string -> string

This function is used if this program is a server and wants to check the identity of a contacting client. The first passed string is the netname of the client. Furthermore, the keyserv daemon automatically determines the netname of this process. The daemon looks up the public key of the client and the secret key of the server, and computes the common key using the Diffie Hellman scheme. The second passed string (exactly 8 characters) is DES-decrypted with the common key in ECB mode, and returned (again 8 characters).

## Example

- The client is: "unix.100@domain"
- The server is: "unix.mercury@domain" (* i.e. root@mercury *)

The client encrypts with

     let enc_data = encrypt "unix.mercury@domain" data

This works because the keyserv daemon knows from the OS that the current process is run by "unix.100

    val net_get : t -> string * string * string

    val shut_down : t -> unit