#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include "ntp_fp.h"
#include "ntp_string.h"
#include "ntp_stdlib.h"
#include "ntp.h"
#ifdef OPENSSL
#include "openssl/evp.h"
#else
#include "ntp_md5.h"
#endif
int
MD5authencrypt(
int type,
u_char *key,
u_int32 *pkt,
int length
)
{
u_char digest[EVP_MAX_MD_SIZE];
u_int len;
#ifdef OPENSSL
EVP_MD_CTX ctx;
#else
MD5_CTX md5;
#endif
#ifdef OPENSSL
INIT_SSL();
EVP_DigestInit(&ctx, EVP_get_digestbynid(type));
EVP_DigestUpdate(&ctx, key, (u_int)cache_keylen);
EVP_DigestUpdate(&ctx, (u_char *)pkt, (u_int)length);
EVP_DigestFinal(&ctx, digest, &len);
#else
MD5Init(&md5);
MD5Update(&md5, key, (u_int)cache_keylen);
MD5Update(&md5, (u_char *)pkt, (u_int)length);
MD5Final(digest, &md5);
len = 16;
#endif
memmove((u_char *)pkt + length + 4, digest, len);
return (len + 4);
}
int
MD5authdecrypt(
int type,
u_char *key,
u_int32 *pkt,
int length,
int size
)
{
u_char digest[EVP_MAX_MD_SIZE];
u_int len;
#ifdef OPENSSL
EVP_MD_CTX ctx;
#else
MD5_CTX md5;
#endif
#ifdef OPENSSL
INIT_SSL();
EVP_DigestInit(&ctx, EVP_get_digestbynid(type));
EVP_DigestUpdate(&ctx, key, (u_int)cache_keylen);
EVP_DigestUpdate(&ctx, (u_char *)pkt, (u_int)length);
EVP_DigestFinal(&ctx, digest, &len);
#else
MD5Init(&md5);
MD5Update(&md5, key, (u_int)cache_keylen);
MD5Update(&md5, (u_char *)pkt, (u_int)length);
MD5Final(digest, &md5);
len = 16;
#endif
if ((u_int)size != len + 4) {
msyslog(LOG_ERR,
"MAC decrypt: MAC length error");
return (0);
}
return (!memcmp(digest, (char *)pkt + length + 4, len));
}
u_int32
addr2refid(sockaddr_u *addr)
{
u_char digest[20];
u_int32 addr_refid;
#ifdef OPENSSL
EVP_MD_CTX ctx;
u_int len;
#else
MD5_CTX md5;
#endif
if (IS_IPV4(addr))
return (NSRCADR(addr));
#ifdef OPENSSL
INIT_SSL();
EVP_DigestInit(&ctx, EVP_get_digestbynid(NID_md5));
EVP_DigestUpdate(&ctx, (u_char *)PSOCK_ADDR6(addr),
sizeof(struct in6_addr));
EVP_DigestFinal(&ctx, digest, &len);
#else
MD5Init(&md5);
MD5Update(&md5, (u_char *)PSOCK_ADDR6(addr),
sizeof(struct in6_addr));
MD5Final(digest, &md5);
#endif
memcpy(&addr_refid, digest, 4);
return (addr_refid);
}