diff --git a/lib/otp/otp_md.c b/lib/otp/otp_md.c index 99ab2b421..d07366675 100644 --- a/lib/otp/otp_md.c +++ b/lib/otp/otp_md.c @@ -31,10 +31,8 @@ * SUCH DAMAGE. */ -#ifdef HAVE_CONFIG_H #include "config.h" -RCSID("$Id$"); -#endif + #include "otp_locl.h" #include "otp_md.h" @@ -47,110 +45,118 @@ RCSID("$Id$"); static void compressmd (OtpKey key, unsigned char *md, size_t len) { - u_char *p = key; + u_char *p = key; - memset (p, 0, OTPKEYSIZE); - while(len) { - *p++ ^= *md++; - *p++ ^= *md++; - *p++ ^= *md++; - *p++ ^= *md++; - len -= 4; - if (p == key + OTPKEYSIZE) - p = key; - } + memset (p, 0, OTPKEYSIZE); + while(len) { + *p++ ^= *md++; + *p++ ^= *md++; + *p++ ^= *md++; + *p++ ^= *md++; + len -= 4; + if (p == key + OTPKEYSIZE) + p = key; + } } -#ifdef HAVE_OLD_HASH_NAMES -static void -otp_md4_final (void *res, struct md4 *m) -{ - MD4_Final(res, m); -} -#undef MD4_Final -#define MD4_Final otp_md4_final +/* + * For histerical reasons, in the OTP definition it's said that + * the result from SHA must be stored in little-endian order. See + * draft-ietf-otp-01.txt. + */ static void -otp_md5_final (void *res, struct md5 *m) +little_endian(unsigned char *res, size_t len) { - MD5_Final(res, m); + unsigned char t; + size_t i; + + for (i = 0; i < len; i += 4) { + t = res[i + 0]; res[i + 0] = res[i + 3]; res[i + 3] = t; + t = res[i + 1]; res[i + 1] = res[i + 2]; res[i + 2] = t; + } } -#undef MD5_Final -#define MD5_Final otp_md5_final -#endif static int otp_md_init (OtpKey key, const char *pwd, const char *seed, - void (*init)(void *), - void (*update)(void *, const void *, size_t), - void (*final)(void *, void *), - void *arg, + const EVP_MD *md, + int le, + EVP_MD_CTX *arg, unsigned char *res, size_t ressz) { - char *p; - int len; + char *p; + int len; + + len = strlen(pwd) + strlen(seed); + p = malloc (len + 1); + if (p == NULL) + return -1; + strlcpy (p, seed, len + 1); + strlwr (p); + strlcat (p, pwd, len + 1); - len = strlen(pwd) + strlen(seed); - p = malloc (len + 1); - if (p == NULL) - return -1; - strlcpy (p, seed, len + 1); - strlwr (p); - strlcat (p, pwd, len + 1); - (*init)(arg); - (*update)(arg, p, len); - (*final)(res, arg); - free (p); - compressmd (key, res, ressz); - return 0; + EVP_DigestInit_ex(arg, md, NULL); + EVP_DigestUpdate(arg, p, len); + EVP_DigestFinal_ex(arg, res, NULL); + + if (le) + little_endian(res, ressz); + + free (p); + compressmd (key, res, ressz); + return 0; } static int otp_md_next (OtpKey key, - void (*init)(void *), - void (*update)(void *, const void *, size_t), - void (*final)(void *, void *), - void *arg, + const EVP_MD *md, + int le, + EVP_MD_CTX *arg, unsigned char *res, size_t ressz) { - (*init)(arg); - (*update)(arg, key, OTPKEYSIZE); - (*final)(res, arg); - compressmd (key, res, ressz); - return 0; + EVP_DigestInit_ex(arg, md, NULL); + EVP_DigestUpdate(arg, key, OTPKEYSIZE); + EVP_DigestFinal_ex(arg, res, NULL); + + if (le) + little_endian(res, ressz); + + compressmd (key, res, ressz); + return 0; } static int otp_md_hash (const char *data, size_t len, - void (*init)(void *), - void (*update)(void *, const void *, size_t), - void (*final)(void *, void *), - void *arg, + const EVP_MD *md, + int le, + EVP_MD_CTX *arg, unsigned char *res, size_t ressz) { - (*init)(arg); - (*update)(arg, data, len); - (*final)(res, arg); - return 0; + EVP_DigestInit_ex(arg, md, NULL); + EVP_DigestUpdate(arg, data, len); + EVP_DigestFinal_ex(arg, res, NULL); + + if (le) + little_endian(res, ressz); + + return 0; } int otp_md4_init (OtpKey key, const char *pwd, const char *seed) { unsigned char res[16]; - MD4_CTX md4; + EVP_MD_CTX ctx; - return otp_md_init (key, pwd, seed, - (void (*)(void *))MD4_Init, - (void (*)(void *, const void *, size_t))MD4_Update, - (void (*)(void *, void *))MD4_Final, - &md4, res, sizeof(res)); + EVP_MD_CTX_init(&ctx); + + return otp_md_init (key, pwd, seed, EVP_md4(), 0, &ctx, res, sizeof(res)); } int @@ -158,26 +164,22 @@ otp_md4_hash (const char *data, size_t len, unsigned char *res) { - MD4_CTX md4; + EVP_MD_CTX ctx; - return otp_md_hash (data, len, - (void (*)(void *))MD4_Init, - (void (*)(void *, const void *, size_t))MD4_Update, - (void (*)(void *, void *))MD4_Final, - &md4, res, 16); + EVP_MD_CTX_init(&ctx); + + return otp_md_hash (data, len, EVP_md4(), 0, &ctx, res, 16); } int otp_md4_next (OtpKey key) { unsigned char res[16]; - MD4_CTX md4; + EVP_MD_CTX ctx; - return otp_md_next (key, - (void (*)(void *))MD4_Init, - (void (*)(void *, const void *, size_t))MD4_Update, - (void (*)(void *, void *))MD4_Final, - &md4, res, sizeof(res)); + EVP_MD_CTX_init(&ctx); + + return otp_md_next (key, EVP_md4(), 0, &ctx, res, sizeof(res)); } @@ -185,13 +187,11 @@ int otp_md5_init (OtpKey key, const char *pwd, const char *seed) { unsigned char res[16]; - MD5_CTX md5; + EVP_MD_CTX ctx; - return otp_md_init (key, pwd, seed, - (void (*)(void *))MD5_Init, - (void (*)(void *, const void *, size_t))MD5_Update, - (void (*)(void *, void *))MD5_Final, - &md5, res, sizeof(res)); + EVP_MD_CTX_init(&ctx); + + return otp_md_init (key, pwd, seed, EVP_md5(), 0, &ctx, res, sizeof(res)); } int @@ -199,61 +199,33 @@ otp_md5_hash (const char *data, size_t len, unsigned char *res) { - MD5_CTX md5; + EVP_MD_CTX ctx; - return otp_md_hash (data, len, - (void (*)(void *))MD5_Init, - (void (*)(void *, const void *, size_t))MD5_Update, - (void (*)(void *, void *))MD5_Final, - &md5, res, 16); + EVP_MD_CTX_init(&ctx); + + return otp_md_hash (data, len, EVP_md5(), 0, &ctx, res, 16); } int otp_md5_next (OtpKey key) { unsigned char res[16]; - MD5_CTX md5; + EVP_MD_CTX ctx; - return otp_md_next (key, - (void (*)(void *))MD5_Init, - (void (*)(void *, const void *, size_t))MD5_Update, - (void (*)(void *, void *))MD5_Final, - &md5, res, sizeof(res)); -} + EVP_MD_CTX_init(&ctx); -/* - * For histerical reasons, in the OTP definition it's said that the - * result from SHA must be stored in little-endian order. See - * draft-ietf-otp-01.txt. - */ - -static void -SHA1_Final_little_endian (void *res, SHA_CTX *m) -{ - unsigned char tmp[20]; - unsigned char *p = res; - int j; - - SHA1_Final (tmp, m); - for (j = 0; j < 20; j += 4) { - p[j] = tmp[j+3]; - p[j+1] = tmp[j+2]; - p[j+2] = tmp[j+1]; - p[j+3] = tmp[j]; - } + return otp_md_next (key, EVP_md5(), 0, &ctx, res, sizeof(res)); } int otp_sha_init (OtpKey key, const char *pwd, const char *seed) { unsigned char res[20]; - SHA_CTX sha1; + EVP_MD_CTX ctx; - return otp_md_init (key, pwd, seed, - (void (*)(void *))SHA1_Init, - (void (*)(void *, const void *, size_t))SHA1_Update, - (void (*)(void *, void *))SHA1_Final_little_endian, - &sha1, res, sizeof(res)); + EVP_MD_CTX_init(&ctx); + + return otp_md_init (key, pwd, seed, EVP_sha1(), 1, &ctx, res, sizeof(res)); } int @@ -261,24 +233,20 @@ otp_sha_hash (const char *data, size_t len, unsigned char *res) { - SHA_CTX sha1; + EVP_MD_CTX ctx; - return otp_md_hash (data, len, - (void (*)(void *))SHA1_Init, - (void (*)(void *, const void *, size_t))SHA1_Update, - (void (*)(void *, void *))SHA1_Final_little_endian, - &sha1, res, 20); + EVP_MD_CTX_init(&ctx); + + return otp_md_hash (data, len, EVP_sha1(), 1, &ctx, res, 20); } int otp_sha_next (OtpKey key) { unsigned char res[20]; - SHA_CTX sha1; + EVP_MD_CTX ctx; - return otp_md_next (key, - (void (*)(void *))SHA1_Init, - (void (*)(void *, const void *, size_t))SHA1_Update, - (void (*)(void *, void *))SHA1_Final_little_endian, - &sha1, res, sizeof(res)); + EVP_MD_CTX_init(&ctx); + + return otp_md_next (key, EVP_sha1(), 1, &ctx, res, sizeof(res)); }