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 (at) 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 */ 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