updates. New data types.
[silc.git] / lib / silccrypt / silcdh.h
index b0f20998f604b5b22b1a4a30f5209adc5e02053e..13c76a34b7dd7aaac4eb7b6bc05a1ba9679103f8 100644 (file)
@@ -34,7 +34,8 @@ typedef struct SilcDHStruct *SilcDH;
    negotiated key material. */
 struct SilcDHStruct {
   SilcInt *g;             /* Global base (generator) */
-  SilcInt *p;            /* Global prime (modulus) */
+  SilcInt *p;            /* Global prime (modulus, prime) */
+  SilcInt *lpf;                  /* Largest prime factor (prime) */
   SilcInt *my_x;                 /* x, My private value (random) */
   SilcInt *my_y;                 /* y, My public value (y = g ^ x mod p) */
   SilcInt *your_y;       /* y', Your public value (y' = g ^ x' mod p) */
@@ -44,20 +45,22 @@ struct SilcDHStruct {
 };
 
 /* Allocate DH context. The `rng' must be initialized random number generator
-   context, the `g' is the public base generator used in the negotiation and
-   the `p' is the public prime used in the negotiation. Returns NULL on error
-   or allocated DH context on success. */
-SilcDH silc_dh_alloc(SilcRng rng, SilcInt *g, SilcInt *p);
+   context, the `g' is the public base generator used in the negotiation,
+   the `p' is the public prime used in the negotiation and the `lpf' is
+   largest prime factor of p defined publicly as well. The `lpf' is optional
+   and if it is not supplied then the private values generated satifies
+   0 < x < p - 1 instead of 0 < x < lpf. Returns NULL on error or allocated
+   DH context on success. */
+SilcDH silc_dh_alloc(SilcRng rng, SilcInt *g, SilcInt *p, SilcInt *lpf);
 
 /* Frees the DH context. Does not free the RNG context given in the 
    allocation. Frees all the allocated data inside the DH context. */
 void silc_dh_free(SilcDH dh);
 
-/* Generates random private value `x' such that 1 < x < n. The rnd sent
-   as argument must be initialized. Returns FALSE if the random number
-   could not be generated. Returns the generated value into `x' pointer
-   sent as argument, unless the `x' is NULL. The returned `x' must no be
-   freed by the caller. */
+/* Generates random private value `x' such that 0 < x < lpf at most of
+   length of lpf. Returns FALSE if the random number could not be generated.
+   Returns the generated value into `x' pointer sent as argument, unless
+   the `x' is NULL. The returned `x' must no be freed by the caller. */
 int silc_dh_generate_private(SilcDH dh, SilcInt **x);
 
 /* Computes the public key y = g ^ x mod p, and returns it to the `y'
@@ -68,7 +71,7 @@ int silc_dh_compute_public(SilcDH dh, SilcInt **y);
 
 /* Sets the remote end's public value y' into the DH context. This must be
    done before computing the secret key. Returns FALSE on error. */
-int silc_dh_set_remote_public(SilcDH dh, SilcInt **y);
+int silc_dh_set_remote_public(SilcDH dh, SilcInt *y);
 
 /* Computes the secret key z = y' ^ x mod p, and returns the key to the
    `z' pointer sent as argument, unless the `z' is NULL. Returns FALSE if
@@ -79,6 +82,6 @@ int silc_dh_compute_key(SilcDH dh, SilcInt **z);
 /* Same as above but returns the computed secret key as octet binary
    string. */
 int silc_dh_compute_key_data(SilcDH dh, unsigned char **z, 
-                            unsigned int *z_len);
+                            uint32 *z_len);
 
 #endif