提交 965a1cb9 编写于 作者: N Nils Larsch

change prototype of the ecdh KDF: make input parameter const and the outlen argument more flexible

上级 e9ad6665
...@@ -449,11 +449,13 @@ static double Time_F(int s) ...@@ -449,11 +449,13 @@ static double Time_F(int s)
static const int KDF1_SHA1_len = 20; static const int KDF1_SHA1_len = 20;
static void *KDF1_SHA1(void *in, size_t inlen, void *out, size_t outlen) static void *KDF1_SHA1(const void *in, size_t inlen, void *out, size_t *outlen)
{ {
#ifndef OPENSSL_NO_SHA #ifndef OPENSSL_NO_SHA
if (outlen != SHA_DIGEST_LENGTH) if (*outlen < SHA_DIGEST_LENGTH)
return NULL; return NULL;
else
*outlen = SHA_DIGEST_LENGTH;
return SHA1(in, inlen, out); return SHA1(in, inlen, out);
#else #else
return NULL; return NULL;
...@@ -2189,7 +2191,7 @@ int MAIN(int argc, char **argv) ...@@ -2189,7 +2191,7 @@ int MAIN(int argc, char **argv)
* otherwise, use result (see section 4.8 of draft-ietf-tls-ecc-03.txt). * otherwise, use result (see section 4.8 of draft-ietf-tls-ecc-03.txt).
*/ */
int field_size, outlen; int field_size, outlen;
void *(*kdf)(void *in, size_t inlen, void *out, size_t xoutlen); void *(*kdf)(const void *in, size_t inlen, void *out, size_t *xoutlen);
field_size = EC_GROUP_get_degree(ecdh_a[j]->group); field_size = EC_GROUP_get_degree(ecdh_a[j]->group);
if (field_size <= 24 * 8) if (field_size <= 24 * 8)
{ {
......
...@@ -92,7 +92,7 @@ struct ecdh_method ...@@ -92,7 +92,7 @@ struct ecdh_method
{ {
const char *name; const char *name;
int (*compute_key)(void *key, size_t outlen, const EC_POINT *pub_key, EC_KEY *ecdh, int (*compute_key)(void *key, size_t outlen, const EC_POINT *pub_key, EC_KEY *ecdh,
void *(*KDF)(void *in, size_t inlen, void *out, size_t outlen)); void *(*KDF)(const void *in, size_t inlen, void *out, size_t *outlen));
#if 0 #if 0
int (*init)(EC_KEY *eckey); int (*init)(EC_KEY *eckey);
int (*finish)(EC_KEY *eckey); int (*finish)(EC_KEY *eckey);
...@@ -127,7 +127,7 @@ const ECDH_METHOD *ECDH_get_default_method(void); ...@@ -127,7 +127,7 @@ const ECDH_METHOD *ECDH_get_default_method(void);
int ECDH_set_method(EC_KEY *, const ECDH_METHOD *); int ECDH_set_method(EC_KEY *, const ECDH_METHOD *);
int ECDH_compute_key(void *out, size_t outlen, const EC_POINT *pub_key, EC_KEY *ecdh, int ECDH_compute_key(void *out, size_t outlen, const EC_POINT *pub_key, EC_KEY *ecdh,
void *(*KDF)(void *in, size_t inlen, void *out, size_t outlen)); void *(*KDF)(const void *in, size_t inlen, void *out, size_t *outlen));
int ECDH_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new int ECDH_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new
*new_func, CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); *new_func, CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func);
......
...@@ -105,11 +105,13 @@ static const char rnd_seed[] = "string to make the random number generator think ...@@ -105,11 +105,13 @@ static const char rnd_seed[] = "string to make the random number generator think
static const int KDF1_SHA1_len = 20; static const int KDF1_SHA1_len = 20;
static void *KDF1_SHA1(void *in, size_t inlen, void *out, size_t outlen) static void *KDF1_SHA1(const void *in, size_t inlen, void *out, size_t *outlen)
{ {
#ifndef OPENSSL_NO_SHA #ifndef OPENSSL_NO_SHA
if (outlen != SHA_DIGEST_LENGTH) if (*outlen < SHA_DIGEST_LENGTH)
return NULL; return NULL;
else
*outlen = SHA_DIGEST_LENGTH;
return SHA1(in, inlen, out); return SHA1(in, inlen, out);
#else #else
return NULL; return NULL;
......
...@@ -72,8 +72,9 @@ ...@@ -72,8 +72,9 @@
#include <openssl/engine.h> #include <openssl/engine.h>
#endif #endif
int ECDH_compute_key(void *out, size_t outlen, const EC_POINT *pub_key, EC_KEY *eckey, int ECDH_compute_key(void *out, size_t outlen, const EC_POINT *pub_key,
void *(*KDF)(void *in, size_t inlen, void *out, size_t outlen)) EC_KEY *eckey,
void *(*KDF)(const void *in, size_t inlen, void *out, size_t *outlen))
{ {
ECDH_DATA *ecdh = ecdh_check(eckey); ECDH_DATA *ecdh = ecdh_check(eckey);
if (ecdh == NULL) if (ecdh == NULL)
......
...@@ -79,8 +79,9 @@ ...@@ -79,8 +79,9 @@
#include <openssl/obj_mac.h> #include <openssl/obj_mac.h>
#include <openssl/bn.h> #include <openssl/bn.h>
static int ecdh_compute_key(void *out, size_t len, const EC_POINT *pub_key, EC_KEY *ecdh, static int ecdh_compute_key(void *out, size_t len, const EC_POINT *pub_key,
void *(*KDF)(void *in, size_t inlen, void *out, size_t outlen)); EC_KEY *ecdh,
void *(*KDF)(const void *in, size_t inlen, void *out, size_t *outlen));
static ECDH_METHOD openssl_ecdh_meth = { static ECDH_METHOD openssl_ecdh_meth = {
"OpenSSL ECDH method", "OpenSSL ECDH method",
...@@ -104,8 +105,9 @@ const ECDH_METHOD *ECDH_OpenSSL(void) ...@@ -104,8 +105,9 @@ const ECDH_METHOD *ECDH_OpenSSL(void)
* - ECSVDP-DH * - ECSVDP-DH
* Finally an optional KDF is applied. * Finally an optional KDF is applied.
*/ */
static int ecdh_compute_key(void *out, size_t outlen, const EC_POINT *pub_key, EC_KEY *ecdh, static int ecdh_compute_key(void *out, size_t outlen, const EC_POINT *pub_key,
void *(*KDF)(void *in, size_t inlen, void *out, size_t outlen)) EC_KEY *ecdh,
void *(*KDF)(const void *in, size_t inlen, void *out, size_t *outlen))
{ {
BN_CTX *ctx; BN_CTX *ctx;
EC_POINT *tmp=NULL; EC_POINT *tmp=NULL;
...@@ -182,7 +184,7 @@ static int ecdh_compute_key(void *out, size_t outlen, const EC_POINT *pub_key, E ...@@ -182,7 +184,7 @@ static int ecdh_compute_key(void *out, size_t outlen, const EC_POINT *pub_key, E
if (KDF != 0) if (KDF != 0)
{ {
if (KDF(buf, buflen, out, outlen) == NULL) if (KDF(buf, buflen, out, &outlen) == NULL)
{ {
ECDHerr(ECDH_F_ECDH_COMPUTE_KEY,ECDH_R_KDF_FAILED); ECDHerr(ECDH_F_ECDH_COMPUTE_KEY,ECDH_R_KDF_FAILED);
goto err; goto err;
......
...@@ -1579,11 +1579,13 @@ static int ssl3_get_server_done(SSL *s) ...@@ -1579,11 +1579,13 @@ static int ssl3_get_server_done(SSL *s)
static const int KDF1_SHA1_len = 20; static const int KDF1_SHA1_len = 20;
static void *KDF1_SHA1(void *in, size_t inlen, void *out, size_t outlen) static void *KDF1_SHA1(const void *in, size_t inlen, void *out, size_t *outlen)
{ {
#ifndef OPENSSL_NO_SHA #ifndef OPENSSL_NO_SHA
if (outlen != SHA_DIGEST_LENGTH) if (*outlen < SHA_DIGEST_LENGTH)
return NULL; return NULL;
else
*outlen = SHA_DIGEST_LENGTH;
return SHA1(in, inlen, out); return SHA1(in, inlen, out);
#else #else
return NULL; return NULL;
......
...@@ -1588,11 +1588,13 @@ err: ...@@ -1588,11 +1588,13 @@ err:
static const int KDF1_SHA1_len = 20; static const int KDF1_SHA1_len = 20;
static void *KDF1_SHA1(void *in, size_t inlen, void *out, size_t outlen) static void *KDF1_SHA1(const void *in, size_t inlen, void *out, size_t *outlen)
{ {
#ifndef OPENSSL_NO_SHA #ifndef OPENSSL_NO_SHA
if (outlen != SHA_DIGEST_LENGTH) if (*outlen < SHA_DIGEST_LENGTH)
return NULL; return NULL;
else
*outlen = SHA_DIGEST_LENGTH;
return SHA1(in, inlen, out); return SHA1(in, inlen, out);
#else #else
return NULL; return NULL;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册