• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
2  *
3  * LibTomCrypt is a library that provides various cryptographic
4  * algorithms in a highly modular and flexible manner.
5  *
6  * The library is free for all purposes without any express
7  * guarantee it works.
8  *
9  * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com
10  */
11 #include "tomcrypt.h"
12 
13 /**
14   @file dsa_shared_secret.c
15   DSA Crypto, Tom St Denis
16 */
17 
18 #ifdef MDSA
19 
20 /**
21   Create a DSA shared secret between two keys
22   @param private_key      The private DSA key (the exponent)
23   @param base             The base of the exponentiation (allows this to be used for both encrypt and decrypt)
24   @param public_key       The public key
25   @param out              [out] Destination of the shared secret
26   @param outlen           [in/out] The max size and resulting size of the shared secret
27   @return CRYPT_OK if successful
28 */
dsa_shared_secret(void * private_key,void * base,dsa_key * public_key,unsigned char * out,unsigned long * outlen)29 int dsa_shared_secret(void          *private_key, void *base,
30                       dsa_key       *public_key,
31                       unsigned char *out,         unsigned long *outlen)
32 {
33    unsigned long  x;
34    void          *res;
35    int            err;
36 
37    LTC_ARGCHK(private_key != NULL);
38    LTC_ARGCHK(public_key  != NULL);
39    LTC_ARGCHK(out         != NULL);
40    LTC_ARGCHK(outlen      != NULL);
41 
42    /* make new point */
43    if ((err = mp_init(&res)) != CRYPT_OK) {
44       return err;
45    }
46 
47    if ((err = mp_exptmod(base, private_key, public_key->p, res)) != CRYPT_OK) {
48       mp_clear(res);
49       return err;
50    }
51 
52    x = (unsigned long)mp_unsigned_bin_size(res);
53    if (*outlen < x) {
54       *outlen = x;
55       err = CRYPT_BUFFER_OVERFLOW;
56       goto done;
57    }
58    zeromem(out, x);
59    if ((err = mp_to_unsigned_bin(res, out + (x - mp_unsigned_bin_size(res))))   != CRYPT_OK)          { goto done; }
60 
61    err     = CRYPT_OK;
62    *outlen = x;
63 done:
64    mp_clear(res);
65    return err;
66 }
67 
68 #endif
69 /* $Source: /cvs/libtom/libtomcrypt/src/pk/dsa/dsa_shared_secret.c,v $ */
70 /* $Revision: 1.7 $ */
71 /* $Date: 2006/12/04 03:18:43 $ */
72 
73