]>
git.ipfire.org Git - thirdparty/hostap.git/blob - src/crypto/crypto_internal-modexp.c
2 * Crypto wrapper for internal crypto implementation - modexp
3 * Copyright (c) 2006-2009, Jouni Malinen <j@w1.fi>
5 * This software may be distributed under the terms of the BSD license.
6 * See README for more details.
12 #include "tls/bignum.h"
16 int crypto_dh_init(u8 generator
, const u8
*prime
, size_t prime_len
, u8
*privkey
,
19 size_t pubkey_len
, pad
;
21 if (os_get_random(privkey
, prime_len
) < 0)
23 if (os_memcmp(privkey
, prime
, prime_len
) > 0) {
24 /* Make sure private value is smaller than prime */
28 pubkey_len
= prime_len
;
29 if (crypto_mod_exp(&generator
, 1, privkey
, prime_len
, prime
, prime_len
,
30 pubkey
, &pubkey_len
) < 0)
32 if (pubkey_len
< prime_len
) {
33 pad
= prime_len
- pubkey_len
;
34 os_memmove(pubkey
+ pad
, pubkey
, pubkey_len
);
35 os_memset(pubkey
, 0, pad
);
42 int crypto_dh_derive_secret(u8 generator
, const u8
*prime
, size_t prime_len
,
43 const u8
*order
, size_t order_len
,
44 const u8
*privkey
, size_t privkey_len
,
45 const u8
*pubkey
, size_t pubkey_len
,
46 u8
*secret
, size_t *len
)
51 if (pubkey_len
> prime_len
||
52 (pubkey_len
== prime_len
&&
53 os_memcmp(pubkey
, prime
, prime_len
) >= 0))
57 if (!pub
|| bignum_set_unsigned_bin(pub
, pubkey
, pubkey_len
) < 0 ||
58 bignum_cmp_d(pub
, 1) <= 0)
62 struct bignum
*p
, *q
, *tmp
;
65 /* verify: pubkey^q == 1 mod p */
69 failed
= !p
|| !q
|| !tmp
||
70 bignum_set_unsigned_bin(p
, prime
, prime_len
) < 0 ||
71 bignum_set_unsigned_bin(q
, order
, order_len
) < 0 ||
72 bignum_exptmod(pub
, q
, p
, tmp
) < 0 ||
73 bignum_cmp_d(tmp
, 1) != 0;
81 res
= crypto_mod_exp(pubkey
, pubkey_len
, privkey
, privkey_len
,
82 prime
, prime_len
, secret
, len
);
89 int crypto_mod_exp(const u8
*base
, size_t base_len
,
90 const u8
*power
, size_t power_len
,
91 const u8
*modulus
, size_t modulus_len
,
92 u8
*result
, size_t *result_len
)
94 struct bignum
*bn_base
, *bn_exp
, *bn_modulus
, *bn_result
;
97 bn_base
= bignum_init();
98 bn_exp
= bignum_init();
99 bn_modulus
= bignum_init();
100 bn_result
= bignum_init();
102 if (bn_base
== NULL
|| bn_exp
== NULL
|| bn_modulus
== NULL
||
106 if (bignum_set_unsigned_bin(bn_base
, base
, base_len
) < 0 ||
107 bignum_set_unsigned_bin(bn_exp
, power
, power_len
) < 0 ||
108 bignum_set_unsigned_bin(bn_modulus
, modulus
, modulus_len
) < 0)
111 if (bignum_exptmod(bn_base
, bn_exp
, bn_modulus
, bn_result
) < 0)
114 ret
= bignum_get_unsigned_bin(bn_result
, result
, result_len
);
117 bignum_deinit(bn_base
);
118 bignum_deinit(bn_exp
);
119 bignum_deinit(bn_modulus
);
120 bignum_deinit(bn_result
);