/* * MD5 interface for rsaref2.0 * * These routines implement an interface for the RSA Laboratories * implementation of the Message Digest 5 (MD5) algorithm. This * algorithm is included in the rsaref2.0 package available from RSA in * the US and foreign countries. Further information is available at * www.rsa.com. */ #include "ntp_machine.h" #ifdef HAVE_CONFIG_H #include #endif #include #include "ntp_types.h" #include "ntp_string.h" #include "global.h" #include "md5.h" #include "ntp_stdlib.h" #define BLOCK_OCTETS 16 /* message digest size */ /* * MD5authencrypt - generate MD5 message authenticator * * Returns length of authenticator field. */ int MD5authencrypt( u_char *key, /* key pointer */ u_int32 *pkt, /* packet pointer */ int length /* packet length */ ) { MD5_CTX ctx; u_char digest[BLOCK_OCTETS]; int i; /* * MD5 with key identifier concatenated with packet. */ MD5Init(&ctx); MD5Update(&ctx, key, (u_int)cache_keylen); MD5Update(&ctx, (u_char *)pkt, (u_int)length); MD5Final(digest, &ctx); i = length / 4; memmove((char *)&pkt[i + 1], (char *)digest, BLOCK_OCTETS); return (BLOCK_OCTETS + 4); } /* * MD5authdecrypt - verify MD5 message authenticator * * Returns one if authenticator valid, zero if invalid. */ int MD5authdecrypt( u_char *key, /* key pointer */ u_int32 *pkt, /* packet pointer */ int length, /* packet length */ int size /* MAC size */ ) { MD5_CTX ctx; u_char digest[BLOCK_OCTETS]; /* * MD5 with key identifier concatenated with packet. */ if (size != BLOCK_OCTETS + 4) return (0); MD5Init(&ctx); MD5Update(&ctx, key, (u_int)cache_keylen); MD5Update(&ctx, (u_char *)pkt, (u_int)length); MD5Final(digest, &ctx); return (!memcmp((char *)digest, (char *)pkt + length + 4, BLOCK_OCTETS)); }