Annotation of embedaddon/ntp/libntp/a_md5encrypt.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  *     digest support for NTP, MD5 and with OpenSSL more
                      3:  */
                      4: #ifdef HAVE_CONFIG_H
                      5: #include <config.h>
                      6: #endif
                      7: 
                      8: #include "ntp_fp.h"
                      9: #include "ntp_string.h"
                     10: #include "ntp_stdlib.h"
                     11: #include "ntp.h"
                     12: #ifdef OPENSSL
                     13: # include "openssl/evp.h"
                     14: #else
                     15: # include "ntp_md5.h"  /* provides clone of OpenSSL MD5 API */
                     16: #endif
                     17: 
                     18: /*
                     19:  * MD5authencrypt - generate message digest
                     20:  *
                     21:  * Returns length of MAC including key ID and digest.
                     22:  */
                     23: int
                     24: MD5authencrypt(
                     25:        int     type,           /* hash algorithm */
                     26:        u_char  *key,           /* key pointer */
                     27:        u_int32 *pkt,           /* packet pointer */
                     28:        int     length          /* packet length */
                     29:        )
                     30: {
                     31:        u_char  digest[EVP_MAX_MD_SIZE];
                     32:        u_int   len;
                     33:        EVP_MD_CTX ctx;
                     34: 
                     35:        /*
                     36:         * Compute digest of key concatenated with packet. Note: the
                     37:         * key type and digest type have been verified when the key
                     38:         * was creaded.
                     39:         */
                     40:        INIT_SSL();
                     41:        EVP_DigestInit(&ctx, EVP_get_digestbynid(type));
                     42:        EVP_DigestUpdate(&ctx, key, (u_int)cache_keylen);
                     43:        EVP_DigestUpdate(&ctx, (u_char *)pkt, (u_int)length);
                     44:        EVP_DigestFinal(&ctx, digest, &len);
                     45:        memmove((u_char *)pkt + length + 4, digest, len);
                     46:        return (len + 4);
                     47: }
                     48: 
                     49: 
                     50: /*
                     51:  * MD5authdecrypt - verify MD5 message authenticator
                     52:  *
                     53:  * Returns one if digest valid, zero if invalid.
                     54:  */
                     55: int
                     56: MD5authdecrypt(
                     57:        int     type,           /* hash algorithm */
                     58:        u_char  *key,           /* key pointer */
                     59:        u_int32 *pkt,           /* packet pointer */
                     60:        int     length,         /* packet length */
                     61:        int     size            /* MAC size */
                     62:        )
                     63: {
                     64:        u_char  digest[EVP_MAX_MD_SIZE];
                     65:        u_int   len;
                     66:        EVP_MD_CTX ctx;
                     67: 
                     68:        /*
                     69:         * Compute digest of key concatenated with packet. Note: the
                     70:         * key type and digest type have been verified when the key
                     71:         * was created.
                     72:         */
                     73:        INIT_SSL();
                     74:        EVP_DigestInit(&ctx, EVP_get_digestbynid(type));
                     75:        EVP_DigestUpdate(&ctx, key, (u_int)cache_keylen);
                     76:        EVP_DigestUpdate(&ctx, (u_char *)pkt, (u_int)length);
                     77:        EVP_DigestFinal(&ctx, digest, &len);
                     78:        if ((u_int)size != len + 4) {
                     79:                msyslog(LOG_ERR,
                     80:                    "MAC decrypt: MAC length error");
                     81:                return (0);
                     82:        }
                     83:        return (!memcmp(digest, (char *)pkt + length + 4, len));
                     84: }
                     85: 
                     86: /*
                     87:  * Calculate the reference id from the address. If it is an IPv4
                     88:  * address, use it as is. If it is an IPv6 address, do a md5 on
                     89:  * it and use the bottom 4 bytes.
                     90:  * The result is in network byte order.
                     91:  */
                     92: u_int32
                     93: addr2refid(sockaddr_u *addr)
                     94: {
                     95:        u_char          digest[20];
                     96:        u_int32         addr_refid;
                     97:        EVP_MD_CTX      ctx;
                     98:        u_int           len;
                     99: 
                    100:        if (IS_IPV4(addr))
                    101:                return (NSRCADR(addr));
                    102: 
                    103:        INIT_SSL();
                    104:        EVP_DigestInit(&ctx, EVP_get_digestbynid(NID_md5));
                    105:        EVP_DigestUpdate(&ctx, (u_char *)PSOCK_ADDR6(addr),
                    106:            sizeof(struct in6_addr));
                    107:        EVP_DigestFinal(&ctx, digest, &len);
                    108:        memcpy(&addr_refid, digest, 4);
                    109:        return (addr_refid);
                    110: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>