text: /*
   * Copyright (c) 2001-2007, Tom St Denis
   * All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions are met:
   *
   * 1. Redistributions of source code must retain the above copyright notice,
   * this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright notice,
   * this list of conditions and the following disclaimer in the documentation
   * and/or other materials provided with the distribution.
   *
   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   * POSSIBILITY OF SUCH DAMAGE.
   */
  
  /* LibTomCrypt, modular cryptographic library -- Tom St Denis
   *
   * LibTomCrypt is a library that provides various cryptographic
   * algorithms in a highly modular and flexible manner.
   *
   * The library is free for all purposes without any express
   * guarantee it works.
   *
   * Tom St Denis, tomstdenis@gmail.com, http://libtom.org
   */
  #include "tomcrypt.h"
  
  /**
    @file dsa_shared_secret.c
    DSA Crypto, Tom St Denis
  */  
  
  #ifdef LTC_MDSA
  
  /**
    Create a DSA shared secret between two keys
    @param private_key      The private DSA key (the exponent)
    @param base             The base of the exponentiation (allows this to be used for both encrypt and decrypt) 
    @param public_key       The public key
    @param out              [out] Destination of the shared secret
    @param outlen           [in/out] The max size and resulting size of the shared secret
    @return CRYPT_OK if successful
  */
  int dsa_shared_secret(void          *private_key, void *base,
                        dsa_key       *public_key,
                        unsigned char *out,         unsigned long *outlen)
  {
     unsigned long  x;
     void          *res;
     int            err;
  
     LTC_ARGCHK(private_key != NULL);
     LTC_ARGCHK(public_key  != NULL);
     LTC_ARGCHK(out         != NULL);
     LTC_ARGCHK(outlen      != NULL);
  
     /* make new point */
     if ((err = mp_init(&res)) != CRYPT_OK) {
        return err;
     }
  
     if ((err = mp_exptmod(base, private_key, public_key->p, res)) != CRYPT_OK) {
        mp_clear(res);
        return err;
     }
     
     x = (unsigned long)mp_unsigned_bin_size(res);
     if (*outlen < x) {
        *outlen = x;
        err = CRYPT_BUFFER_OVERFLOW;
        goto done;
     }
     zeromem(out, x);
     if ((err = mp_to_unsigned_bin(res, out + (x - mp_unsigned_bin_size(res))))   != CRYPT_OK)          { goto done; }
  
     err     = CRYPT_OK;
     *outlen = x;
  done:
     mp_clear(res);
     return err;
  }
  
  #endif
  /* $Source: /cvs/libtom/libtomcrypt/src/pk/dsa/dsa_shared_secret.c,v $ */
  /* $Revision: 1.9 $ */
  /* $Date: 2007/05/12 14:32:35 $ */
  