diff options
author | Damien Miller <djm@mindrot.org> | 2013-04-23 19:24:32 +1000 |
---|---|---|
committer | Damien Miller <djm@mindrot.org> | 2013-04-23 19:24:32 +1000 |
commit | ea11119eee3c5e2429b1f5f8688b25b028fa991a (patch) | |
tree | 5916295fcefb8665088f59a5431cb0c792fbf327 /mac.c | |
parent | a56086b9903b62c1c4fdedf01b68338fe4dc90e4 (diff) |
- djm@cvs.openbsd.org 2013/04/19 01:06:50
[authfile.c cipher.c cipher.h kex.c kex.h kexecdh.c kexecdhc.c kexecdhs.c]
[key.c key.h mac.c mac.h packet.c ssh.1 ssh.c]
add the ability to query supported ciphers, MACs, key type and KEX
algorithms to ssh. Includes some refactoring of KEX and key type handling
to be table-driven; ok markus@
Diffstat (limited to 'mac.c')
-rw-r--r-- | mac.c | 62 |
1 files changed, 42 insertions, 20 deletions
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: mac.c,v 1.21 2012/12/11 22:51:45 sthen Exp $ */ | 1 | /* $OpenBSD: mac.c,v 1.22 2013/04/19 01:06:50 djm Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2001 Markus Friedl. All rights reserved. | 3 | * Copyright (c) 2001 Markus Friedl. All rights reserved. |
4 | * | 4 | * |
@@ -50,7 +50,7 @@ | |||
50 | #define SSH_UMAC 2 /* UMAC (not integrated with OpenSSL) */ | 50 | #define SSH_UMAC 2 /* UMAC (not integrated with OpenSSL) */ |
51 | #define SSH_UMAC128 3 | 51 | #define SSH_UMAC128 3 |
52 | 52 | ||
53 | struct { | 53 | struct macalg { |
54 | char *name; | 54 | char *name; |
55 | int type; | 55 | int type; |
56 | const EVP_MD * (*mdfunc)(void); | 56 | const EVP_MD * (*mdfunc)(void); |
@@ -58,7 +58,9 @@ struct { | |||
58 | int key_len; /* just for UMAC */ | 58 | int key_len; /* just for UMAC */ |
59 | int len; /* just for UMAC */ | 59 | int len; /* just for UMAC */ |
60 | int etm; /* Encrypt-then-MAC */ | 60 | int etm; /* Encrypt-then-MAC */ |
61 | } macs[] = { | 61 | }; |
62 | |||
63 | static const struct macalg macs[] = { | ||
62 | /* Encrypt-and-MAC (encrypt-and-authenticate) variants */ | 64 | /* Encrypt-and-MAC (encrypt-and-authenticate) variants */ |
63 | { "hmac-sha1", SSH_EVP, EVP_sha1, 0, 0, 0, 0 }, | 65 | { "hmac-sha1", SSH_EVP, EVP_sha1, 0, 0, 0, 0 }, |
64 | { "hmac-sha1-96", SSH_EVP, EVP_sha1, 96, 0, 0, 0 }, | 66 | { "hmac-sha1-96", SSH_EVP, EVP_sha1, 96, 0, 0, 0 }, |
@@ -89,38 +91,58 @@ struct { | |||
89 | { NULL, 0, NULL, 0, 0, 0, 0 } | 91 | { NULL, 0, NULL, 0, 0, 0, 0 } |
90 | }; | 92 | }; |
91 | 93 | ||
94 | /* Returns a comma-separated list of supported MACs. */ | ||
95 | char * | ||
96 | mac_alg_list(void) | ||
97 | { | ||
98 | char *ret = NULL; | ||
99 | size_t nlen, rlen = 0; | ||
100 | const struct macalg *m; | ||
101 | |||
102 | for (m = macs; m->name != NULL; m++) { | ||
103 | if (ret != NULL) | ||
104 | ret[rlen++] = '\n'; | ||
105 | nlen = strlen(m->name); | ||
106 | ret = xrealloc(ret, 1, rlen + nlen + 2); | ||
107 | memcpy(ret + rlen, m->name, nlen + 1); | ||
108 | rlen += nlen; | ||
109 | } | ||
110 | return ret; | ||
111 | } | ||
112 | |||
92 | static void | 113 | static void |
93 | mac_setup_by_id(Mac *mac, int which) | 114 | mac_setup_by_alg(Mac *mac, const struct macalg *macalg) |
94 | { | 115 | { |
95 | int evp_len; | 116 | int evp_len; |
96 | mac->type = macs[which].type; | 117 | |
118 | mac->type = macalg->type; | ||
97 | if (mac->type == SSH_EVP) { | 119 | if (mac->type == SSH_EVP) { |
98 | mac->evp_md = (*macs[which].mdfunc)(); | 120 | mac->evp_md = macalg->mdfunc(); |
99 | if ((evp_len = EVP_MD_size(mac->evp_md)) <= 0) | 121 | if ((evp_len = EVP_MD_size(mac->evp_md)) <= 0) |
100 | fatal("mac %s len %d", mac->name, evp_len); | 122 | fatal("mac %s len %d", mac->name, evp_len); |
101 | mac->key_len = mac->mac_len = (u_int)evp_len; | 123 | mac->key_len = mac->mac_len = (u_int)evp_len; |
102 | } else { | 124 | } else { |
103 | mac->mac_len = macs[which].len / 8; | 125 | mac->mac_len = macalg->len / 8; |
104 | mac->key_len = macs[which].key_len / 8; | 126 | mac->key_len = macalg->key_len / 8; |
105 | mac->umac_ctx = NULL; | 127 | mac->umac_ctx = NULL; |
106 | } | 128 | } |
107 | if (macs[which].truncatebits != 0) | 129 | if (macalg->truncatebits != 0) |
108 | mac->mac_len = macs[which].truncatebits / 8; | 130 | mac->mac_len = macalg->truncatebits / 8; |
109 | mac->etm = macs[which].etm; | 131 | mac->etm = macalg->etm; |
110 | } | 132 | } |
111 | 133 | ||
112 | int | 134 | int |
113 | mac_setup(Mac *mac, char *name) | 135 | mac_setup(Mac *mac, char *name) |
114 | { | 136 | { |
115 | int i; | 137 | const struct macalg *m; |
116 | 138 | ||
117 | for (i = 0; macs[i].name; i++) { | 139 | for (m = macs; m->name != NULL; m++) { |
118 | if (strcmp(name, macs[i].name) == 0) { | 140 | if (strcmp(name, m->name) != 0) |
119 | if (mac != NULL) | 141 | continue; |
120 | mac_setup_by_id(mac, i); | 142 | if (mac != NULL) |
121 | debug2("mac_setup: found %s", name); | 143 | mac_setup_by_alg(mac, m); |
122 | return (0); | 144 | debug2("mac_setup: found %s", name); |
123 | } | 145 | return (0); |
124 | } | 146 | } |
125 | debug2("mac_setup: unknown %s", name); | 147 | debug2("mac_setup: unknown %s", name); |
126 | return (-1); | 148 | return (-1); |