Annotation of embedaddon/ntp/libntp/ssl_init.c, revision 1.1.1.1
1.1 misho 1: /*
2: * ssl_init.c Common OpenSSL initialization code for the various
3: * programs which use it.
4: *
5: * Moved from ntpd/ntp_crypto.c crypto_setup()
6: */
7: #ifdef HAVE_CONFIG_H
8: #include <config.h>
9: #endif
10: #include <ctype.h>
11: #include <ntp.h>
12: #include <ntp_debug.h>
13: #include <lib_strbuf.h>
14:
15: #ifdef OPENSSL
16: #include "openssl/err.h"
17: #include "openssl/evp.h"
18:
19:
20: int ssl_init_done;
21:
22: void
23: ssl_init(void)
24: {
25: if (ssl_init_done)
26: return;
27:
28: ERR_load_crypto_strings();
29: OpenSSL_add_all_algorithms();
30:
31: ssl_init_done = 1;
32: }
33:
34:
35: void
36: ssl_check_version(void)
37: {
38: if ((SSLeay() ^ OPENSSL_VERSION_NUMBER) & ~0xff0L) {
39: msyslog(LOG_WARNING,
40: "OpenSSL version mismatch. Built against %lx, you have %lx",
41: OPENSSL_VERSION_NUMBER, SSLeay());
42: fprintf(stderr,
43: "OpenSSL version mismatch. Built against %lx, you have %lx\n",
44: OPENSSL_VERSION_NUMBER, SSLeay());
45: }
46:
47: INIT_SSL();
48: }
49: #endif /* OPENSSL */
50:
51:
52: /*
53: * keytype_from_text returns OpenSSL NID for digest by name, and
54: * optionally the associated digest length.
55: *
56: * Used by ntpd authreadkeys(), ntpq and ntpdc keytype()
57: */
58: int
59: keytype_from_text(
60: const char *text,
61: size_t *pdigest_len
62: )
63: {
64: const u_long max_digest_len = MAX_MAC_LEN - sizeof(keyid_t);
65: int key_type;
66: u_int digest_len;
67: #ifdef OPENSSL
68: u_char digest[EVP_MAX_MD_SIZE];
69: char * upcased;
70: char * pch;
71: EVP_MD_CTX ctx;
72:
73: /*
74: * OpenSSL digest short names are capitalized, so uppercase the
75: * digest name before passing to OBJ_sn2nid(). If it is not
76: * recognized but begins with 'M' use NID_md5 to be consistent
77: * with past behavior.
78: */
79: INIT_SSL();
80: LIB_GETBUF(upcased);
81: strncpy(upcased, text, LIB_BUFLENGTH);
82: for (pch = upcased; '\0' != *pch; pch++)
83: *pch = (char)toupper(*pch);
84: key_type = OBJ_sn2nid(upcased);
85: #else
86: key_type = 0;
87: #endif
88:
89: if (!key_type && 'm' == tolower(text[0]))
90: key_type = NID_md5;
91:
92: if (!key_type)
93: return 0;
94:
95: if (NULL != pdigest_len) {
96: #ifdef OPENSSL
97: EVP_DigestInit(&ctx, EVP_get_digestbynid(key_type));
98: EVP_DigestFinal(&ctx, digest, &digest_len);
99: if (digest_len + sizeof(keyid_t) > MAX_MAC_LEN) {
100: fprintf(stderr,
101: "key type %s %u octet digests are too big, max %lu\n",
102: keytype_name(key_type), digest_len,
103: max_digest_len);
104: msyslog(LOG_ERR,
105: "key type %s %u octet digests are too big, max %lu\n",
106: keytype_name(key_type), digest_len,
107: max_digest_len);
108: return 0;
109: }
110: #else
111: digest_len = 16;
112: #endif
113: *pdigest_len = digest_len;
114: }
115:
116: return key_type;
117: }
118:
119:
120: /*
121: * keytype_name returns OpenSSL short name for digest by NID.
122: *
123: * Used by ntpq and ntpdc keytype()
124: */
125: const char *
126: keytype_name(
127: int nid
128: )
129: {
130: static const char unknown_type[] = "(unknown key type)";
131: const char *name;
132:
133: #ifdef OPENSSL
134: INIT_SSL();
135: name = OBJ_nid2sn(nid);
136: if (NULL == name)
137: name = unknown_type;
138: #else /* !OPENSSL follows */
139: if (NID_md5 == nid)
140: name = "MD5";
141: else
142: name = unknown_type;
143: #endif
144: return name;
145: }
146:
147:
148: /*
149: * Use getpassphrase() if configure.ac detected it, as Suns that
150: * have it truncate the password in getpass() to 8 characters.
151: */
152: #ifdef HAVE_GETPASSPHRASE
153: # define getpass(str) getpassphrase(str)
154: #endif
155:
156: /*
157: * getpass_keytype() -- shared between ntpq and ntpdc, only vaguely
158: * related to the rest of ssl_init.c.
159: */
160: char *
161: getpass_keytype(
162: int keytype
163: )
164: {
165: char pass_prompt[64 + 11 + 1]; /* 11 for " Password: " */
166:
167: snprintf(pass_prompt, sizeof(pass_prompt),
168: "%.64s Password: ", keytype_name(keytype));
169:
170: return getpass(pass_prompt);
171: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>