mirror of
https://github.com/libssh2/libssh2.git
synced 2025-11-20 02:42:09 +03:00
openssl: initialise the digest context before calling EVP_DigestInit()
When using the OpenSSL libraries in FIPS mode, the function call EVP_DigestInit() is actually #defined to FIPS_digestinit(). Unfortunately wheres EVP_DigestInit() initialises the context and then calls EVP_DigestInit_ex(), this function assumes that the context has been pre-initialised and crashes when it isn't. Bug: https://trac.libssh2.org/ticket/279 Fixes #279
This commit is contained in:
committed by
Kamil Dudka
parent
d808080daf
commit
61df22c460
@@ -507,23 +507,39 @@ _libssh2_dsa_sha1_sign(libssh2_dsa_ctx * dsactx,
|
|||||||
}
|
}
|
||||||
#endif /* LIBSSH_DSA */
|
#endif /* LIBSSH_DSA */
|
||||||
|
|
||||||
|
int
|
||||||
|
libssh2_sha1_init(libssh2_sha1_ctx *ctx)
|
||||||
|
{
|
||||||
|
EVP_MD_CTX_init(ctx);
|
||||||
|
return EVP_DigestInit(ctx, EVP_get_digestbyname("sha1"));
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
libssh2_sha1(const unsigned char *message, unsigned long len,
|
libssh2_sha1(const unsigned char *message, unsigned long len,
|
||||||
unsigned char *out)
|
unsigned char *out)
|
||||||
{
|
{
|
||||||
EVP_MD_CTX ctx;
|
EVP_MD_CTX ctx;
|
||||||
|
|
||||||
|
EVP_MD_CTX_init(&ctx);
|
||||||
EVP_DigestInit(&ctx, EVP_get_digestbyname("sha1"));
|
EVP_DigestInit(&ctx, EVP_get_digestbyname("sha1"));
|
||||||
EVP_DigestUpdate(&ctx, message, len);
|
EVP_DigestUpdate(&ctx, message, len);
|
||||||
EVP_DigestFinal(&ctx, out, NULL);
|
EVP_DigestFinal(&ctx, out, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
libssh2_md5_init(libssh2_md5_ctx *ctx)
|
||||||
|
{
|
||||||
|
EVP_MD_CTX_init(ctx);
|
||||||
|
return EVP_DigestInit(ctx, EVP_get_digestbyname("md5"));
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
libssh2_md5(const unsigned char *message, unsigned long len,
|
libssh2_md5(const unsigned char *message, unsigned long len,
|
||||||
unsigned char *out)
|
unsigned char *out)
|
||||||
{
|
{
|
||||||
EVP_MD_CTX ctx;
|
EVP_MD_CTX ctx;
|
||||||
|
|
||||||
|
EVP_MD_CTX_init(&ctx);
|
||||||
EVP_DigestInit(&ctx, EVP_get_digestbyname("md5"));
|
EVP_DigestInit(&ctx, EVP_get_digestbyname("md5"));
|
||||||
EVP_DigestUpdate(&ctx, message, len);
|
EVP_DigestUpdate(&ctx, message, len);
|
||||||
EVP_DigestFinal(&ctx, out, NULL);
|
EVP_DigestFinal(&ctx, out, NULL);
|
||||||
|
|||||||
@@ -107,7 +107,7 @@
|
|||||||
#define _libssh2_random(buf, len) RAND_bytes ((buf), (len))
|
#define _libssh2_random(buf, len) RAND_bytes ((buf), (len))
|
||||||
|
|
||||||
#define libssh2_sha1_ctx EVP_MD_CTX
|
#define libssh2_sha1_ctx EVP_MD_CTX
|
||||||
#define libssh2_sha1_init(ctx) EVP_DigestInit(ctx, EVP_get_digestbyname("sha1"))
|
int libssh2_sha1_init(libssh2_sha1_ctx *ctx);
|
||||||
#define libssh2_sha1_update(ctx, data, len) EVP_DigestUpdate(&(ctx), data, len)
|
#define libssh2_sha1_update(ctx, data, len) EVP_DigestUpdate(&(ctx), data, len)
|
||||||
#define libssh2_sha1_final(ctx, out) EVP_DigestFinal(&(ctx), out, NULL)
|
#define libssh2_sha1_final(ctx, out) EVP_DigestFinal(&(ctx), out, NULL)
|
||||||
void libssh2_sha1(const unsigned char *message, unsigned long len, unsigned char *out);
|
void libssh2_sha1(const unsigned char *message, unsigned long len, unsigned char *out);
|
||||||
@@ -115,8 +115,7 @@ void libssh2_sha1(const unsigned char *message, unsigned long len, unsigned char
|
|||||||
#define libssh2_md5_ctx EVP_MD_CTX
|
#define libssh2_md5_ctx EVP_MD_CTX
|
||||||
|
|
||||||
/* returns 0 in case of failure */
|
/* returns 0 in case of failure */
|
||||||
#define libssh2_md5_init(ctx) EVP_DigestInit(ctx, EVP_get_digestbyname("md5"))
|
int libssh2_md5_init(libssh2_md5_ctx *);
|
||||||
|
|
||||||
#define libssh2_md5_update(ctx, data, len) EVP_DigestUpdate(&(ctx), data, len)
|
#define libssh2_md5_update(ctx, data, len) EVP_DigestUpdate(&(ctx), data, len)
|
||||||
#define libssh2_md5_final(ctx, out) EVP_DigestFinal(&(ctx), out, NULL)
|
#define libssh2_md5_final(ctx, out) EVP_DigestFinal(&(ctx), out, NULL)
|
||||||
void libssh2_md5(const unsigned char *message, unsigned long len, unsigned char *out);
|
void libssh2_md5(const unsigned char *message, unsigned long len, unsigned char *out);
|
||||||
|
|||||||
Reference in New Issue
Block a user