1 /*
   2  * Author: Tatu Ylonen <ylo@cs.hut.fi>
   3  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
   4  *                    All rights reserved
   5  * This file contains various auxiliary functions related to multiple
   6  * precision integers.
   7  *
   8  * As far as I am concerned, the code I have written for this software
   9  * can be used freely for any purpose.  Any derived versions of this
  10  * software must be clearly marked as such, and if the derived work is
  11  * incompatible with the protocol description in the RFC file, it must be
  12  * called by a name other than "ssh" or "Secure Shell".
  13  */
  14 
  15 #include "includes.h"
  16 RCSID("$OpenBSD: mpaux.c,v 1.16 2001/02/08 19:30:52 itojun Exp $");
  17 
  18 #pragma ident   "%Z%%M% %I%     %E% SMI"
  19 
  20 #include <openssl/bn.h>
  21 #include "getput.h"
  22 #include "xmalloc.h"
  23 
  24 #include <openssl/md5.h>
  25 
  26 #include "mpaux.h"
  27 
  28 void
  29 compute_session_id(u_char session_id[16],
  30     u_char cookie[8],
  31     BIGNUM* host_key_n,
  32     BIGNUM* session_key_n)
  33 {
  34         u_int host_key_bytes = BN_num_bytes(host_key_n);
  35         u_int session_key_bytes = BN_num_bytes(session_key_n);
  36         u_int bytes = host_key_bytes + session_key_bytes;
  37         u_char *buf = xmalloc(bytes);
  38         MD5_CTX md;
  39 
  40         BN_bn2bin(host_key_n, buf);
  41         BN_bn2bin(session_key_n, buf + host_key_bytes);
  42         MD5_Init(&md);
  43         MD5_Update(&md, buf, bytes);
  44         MD5_Update(&md, cookie, 8);
  45         MD5_Final(session_id, &md);
  46         memset(buf, 0, bytes);
  47         xfree(buf);
  48 }