summaryrefslogtreecommitdiff
path: root/kexc25519.c
diff options
context:
space:
mode:
authorDamien Miller <djm@mindrot.org>2014-01-12 19:21:22 +1100
committerDamien Miller <djm@mindrot.org>2014-01-12 19:21:22 +1100
commit91b580e4bec55118bf96ab3cdbe5a50839e75d0a (patch)
tree32e4083c5a8cd285e1b0b13f9b77992db535cba4 /kexc25519.c
parentaf5d4481f4c7c8c3c746e68b961bb85ef907800e (diff)
- djm@cvs.openbsd.org 2014/01/12 08:13:13
[bufaux.c buffer.h kex.c kex.h kexc25519.c kexc25519c.c kexc25519s.c] [kexdhc.c kexdhs.c kexecdhc.c kexecdhs.c kexgexc.c kexgexs.c] avoid use of OpenSSL BIGNUM type and functions for KEX with Curve25519 by adding a buffer_put_bignum2_from_string() that stores a string using the bignum encoding rules. Will make it easier to build a reduced-feature OpenSSH without OpenSSL in the future; ok markus@
Diffstat (limited to 'kexc25519.c')
-rw-r--r--kexc25519.c18
1 files changed, 7 insertions, 11 deletions
diff --git a/kexc25519.c b/kexc25519.c
index 8dd363991..48ca4aaa2 100644
--- a/kexc25519.c
+++ b/kexc25519.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: kexc25519.c,v 1.3 2014/01/09 23:20:00 djm Exp $ */ 1/* $OpenBSD: kexc25519.c,v 1.4 2014/01/12 08:13:13 djm Exp $ */
2/* 2/*
3 * Copyright (c) 2001, 2013 Markus Friedl. All rights reserved. 3 * Copyright (c) 2001, 2013 Markus Friedl. All rights reserved.
4 * Copyright (c) 2010 Damien Miller. All rights reserved. 4 * Copyright (c) 2010 Damien Miller. All rights reserved.
@@ -58,23 +58,19 @@ kexc25519_keygen(u_char key[CURVE25519_SIZE], u_char pub[CURVE25519_SIZE])
58 crypto_scalarmult_curve25519(pub, key, basepoint); 58 crypto_scalarmult_curve25519(pub, key, basepoint);
59} 59}
60 60
61BIGNUM * 61void
62kexc25519_shared_key(const u_char key[CURVE25519_SIZE], 62kexc25519_shared_key(const u_char key[CURVE25519_SIZE],
63 const u_char pub[CURVE25519_SIZE]) 63 const u_char pub[CURVE25519_SIZE], Buffer *out)
64{ 64{
65 u_char shared_key[CURVE25519_SIZE]; 65 u_char shared_key[CURVE25519_SIZE];
66 BIGNUM *shared_secret;
67 66
68 crypto_scalarmult_curve25519(shared_key, key, pub); 67 crypto_scalarmult_curve25519(shared_key, key, pub);
69#ifdef DEBUG_KEXECDH 68#ifdef DEBUG_KEXECDH
70 dump_digest("shared secret", shared_key, CURVE25519_SIZE); 69 dump_digest("shared secret", shared_key, CURVE25519_SIZE);
71#endif 70#endif
72 if ((shared_secret = BN_new()) == NULL) 71 buffer_clear(out);
73 fatal("%s: BN_new failed", __func__); 72 buffer_put_bignum2_from_string(out, shared_key, CURVE25519_SIZE);
74 if (BN_bin2bn(shared_key, sizeof(shared_key), shared_secret) == NULL)
75 fatal("%s: BN_bin2bn failed", __func__);
76 memset(shared_key, 0, CURVE25519_SIZE); /* XXX explicit_bzero() */ 73 memset(shared_key, 0, CURVE25519_SIZE); /* XXX explicit_bzero() */
77 return (shared_secret);
78} 74}
79 75
80void 76void
@@ -87,7 +83,7 @@ kex_c25519_hash(
87 u_char *serverhostkeyblob, int sbloblen, 83 u_char *serverhostkeyblob, int sbloblen,
88 const u_char client_dh_pub[CURVE25519_SIZE], 84 const u_char client_dh_pub[CURVE25519_SIZE],
89 const u_char server_dh_pub[CURVE25519_SIZE], 85 const u_char server_dh_pub[CURVE25519_SIZE],
90 const BIGNUM *shared_secret, 86 const u_char *shared_secret, u_int secretlen,
91 u_char **hash, u_int *hashlen) 87 u_char **hash, u_int *hashlen)
92{ 88{
93 Buffer b; 89 Buffer b;
@@ -108,7 +104,7 @@ kex_c25519_hash(
108 buffer_put_string(&b, serverhostkeyblob, sbloblen); 104 buffer_put_string(&b, serverhostkeyblob, sbloblen);
109 buffer_put_string(&b, client_dh_pub, CURVE25519_SIZE); 105 buffer_put_string(&b, client_dh_pub, CURVE25519_SIZE);
110 buffer_put_string(&b, server_dh_pub, CURVE25519_SIZE); 106 buffer_put_string(&b, server_dh_pub, CURVE25519_SIZE);
111 buffer_put_bignum2(&b, shared_secret); 107 buffer_append(&b, shared_secret, secretlen);
112 108
113#ifdef DEBUG_KEX 109#ifdef DEBUG_KEX
114 buffer_dump(&b); 110 buffer_dump(&b);