mirror of
https://git.libssh.org/projects/libssh.git
synced 2026-02-09 09:54:25 +09:00
md: Implement one-shot md5
Which can be used for non-cryptographic purposes even in FIPS mode. Signed-off-by: Pavol Žáčik <pzacik@redhat.com> Reviewed-by: Jakub Jelen <jjelen@redhat.com> Reviewed-by: Andreas Schneider <asn@cryptomilk.org>
This commit is contained in:
@@ -75,6 +75,7 @@ MD5CTX md5_init(void);
|
|||||||
void md5_ctx_free(MD5CTX);
|
void md5_ctx_free(MD5CTX);
|
||||||
int md5_update(MD5CTX c, const void *data, size_t len);
|
int md5_update(MD5CTX c, const void *data, size_t len);
|
||||||
int md5_final(unsigned char *md, MD5CTX c);
|
int md5_final(unsigned char *md, MD5CTX c);
|
||||||
|
int md5(const unsigned char *digest, size_t len, unsigned char *hash);
|
||||||
|
|
||||||
SHACTX sha1_init(void);
|
SHACTX sha1_init(void);
|
||||||
void sha1_ctx_free(SHACTX);
|
void sha1_ctx_free(SHACTX);
|
||||||
|
|||||||
@@ -322,3 +322,52 @@ md5_final(unsigned char *md, MD5CTX c)
|
|||||||
}
|
}
|
||||||
return SSH_OK;
|
return SSH_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ brief One-shot MD5. Not intended for use in security-relevant contexts.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
md5(const unsigned char *digest, size_t len, unsigned char *hash)
|
||||||
|
{
|
||||||
|
int rc, ret = SSH_ERROR;
|
||||||
|
unsigned int mdlen = 0;
|
||||||
|
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
|
||||||
|
EVP_MD *md5 = NULL;
|
||||||
|
#endif
|
||||||
|
MD5CTX c = EVP_MD_CTX_new();
|
||||||
|
if (c == NULL) {
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
|
||||||
|
md5 = EVP_MD_fetch(NULL, "MD5", "provider=default,-fips");
|
||||||
|
if (md5 == NULL) {
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
rc = EVP_DigestInit(c, md5);
|
||||||
|
#else
|
||||||
|
rc = EVP_DigestInit_ex(c, EVP_md5(), NULL);
|
||||||
|
#endif
|
||||||
|
if (rc == 0) {
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = EVP_DigestUpdate(c, digest, len);
|
||||||
|
if (rc != 1) {
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = EVP_DigestFinal(c, hash, &mdlen);
|
||||||
|
if (rc != 1) {
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = SSH_OK;
|
||||||
|
|
||||||
|
out:
|
||||||
|
EVP_MD_CTX_free(c);
|
||||||
|
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
|
||||||
|
EVP_MD_free(md5);
|
||||||
|
#endif
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|||||||
@@ -244,3 +244,9 @@ md5_final(unsigned char *md, MD5CTX c)
|
|||||||
gcry_md_close(c);
|
gcry_md_close(c);
|
||||||
return SSH_OK;
|
return SSH_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int md5(const unsigned char *digest, size_t len, unsigned char *hash)
|
||||||
|
{
|
||||||
|
gcry_md_hash_buffer(GCRY_MD_MD5, hash, digest, len);
|
||||||
|
return SSH_OK;
|
||||||
|
}
|
||||||
|
|||||||
@@ -405,3 +405,51 @@ md5_final(unsigned char *md, MD5CTX c)
|
|||||||
}
|
}
|
||||||
return SSH_OK;
|
return SSH_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int md5(const unsigned char *digest, size_t len, unsigned char *hash)
|
||||||
|
{
|
||||||
|
MD5CTX ctx = NULL;
|
||||||
|
int rc;
|
||||||
|
const mbedtls_md_info_t *md_info =
|
||||||
|
mbedtls_md_info_from_type(MBEDTLS_MD_MD5);
|
||||||
|
if (md_info == NULL) {
|
||||||
|
return SSH_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx = malloc(sizeof(mbedtls_md_context_t));
|
||||||
|
if (ctx == NULL) {
|
||||||
|
return SSH_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
mbedtls_md_init(ctx);
|
||||||
|
|
||||||
|
rc = mbedtls_md_setup(ctx, md_info, 0);
|
||||||
|
if (rc != 0) {
|
||||||
|
mbedtls_md_free(ctx);
|
||||||
|
SAFE_FREE(ctx);
|
||||||
|
return SSH_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = mbedtls_md_starts(ctx);
|
||||||
|
if (rc != 0) {
|
||||||
|
mbedtls_md_free(ctx);
|
||||||
|
SAFE_FREE(ctx);
|
||||||
|
return SSH_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = mbedtls_md_update(ctx, digest, len);
|
||||||
|
if (rc != 0) {
|
||||||
|
mbedtls_md_free(ctx);
|
||||||
|
SAFE_FREE(ctx);
|
||||||
|
return SSH_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = mbedtls_md_finish(ctx, hash);
|
||||||
|
mbedtls_md_free(ctx);
|
||||||
|
SAFE_FREE(ctx);
|
||||||
|
if (rc != 0) {
|
||||||
|
return SSH_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
return SSH_OK;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user