diff options
author | 2006-06-10 20:10:02 +0000 | |
---|---|---|
committer | 2006-06-10 20:10:02 +0000 | |
commit | a008c50bbfd6d521c1f4ee4b217d88ed097dd76c (patch) | |
tree | 53f384f97115b8b9c934e475bd6c883b9de47a41 | |
parent | Better error message when a key file can not be opened or the provided key is (diff) | |
download | wireguard-openbsd-a008c50bbfd6d521c1f4ee4b217d88ed097dd76c.tar.xz wireguard-openbsd-a008c50bbfd6d521c1f4ee4b217d88ed097dd76c.zip |
support sha2 for main mode hmacs and aesctr for quick mode encryption.
ok markus@ ho@
-rw-r--r-- | sbin/isakmpd/conf.c | 29 | ||||
-rw-r--r-- | sbin/isakmpd/hash.c | 32 | ||||
-rw-r--r-- | sbin/isakmpd/hash.h | 12 | ||||
-rw-r--r-- | sbin/isakmpd/ipsec.c | 11 | ||||
-rw-r--r-- | sbin/isakmpd/pf_key_v2.c | 7 |
5 files changed, 72 insertions, 19 deletions
diff --git a/sbin/isakmpd/conf.c b/sbin/isakmpd/conf.c index 49363840d35..306ac2bc18a 100644 --- a/sbin/isakmpd/conf.c +++ b/sbin/isakmpd/conf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: conf.c,v 1.87 2006/05/27 17:01:46 hshoexer Exp $ */ +/* $OpenBSD: conf.c,v 1.88 2006/06/10 20:10:02 hshoexer Exp $ */ /* $EOM: conf.c,v 1.48 2000/12/04 02:04:29 angelos Exp $ */ /* @@ -297,13 +297,14 @@ conf_parse(int trans, char *buf, size_t sz) * * Resulting section names can be: * For main mode: - * {DES,BLF,3DES,CAST,AES}-{MD5,SHA}[-GRP{1,2,5,14,15}][-{DSS,RSA_SIG}] + * {DES,BLF,3DES,CAST,AES}-{MD5,SHA,SHA2-{256,384,512}}[-GRP{1,2,5,14,15}] \ + * [-{DSS,RSA_SIG}] * For quick mode: * QM-{proto}[-TRP]-{cipher}[-{hash}][-PFS[-{group}]]-SUITE * where * {proto} = ESP, AH - * {cipher} = DES, 3DES, CAST, BLF, AES - * {hash} = MD5, SHA, RIPEMD, SHA2-{-256,384,512} + * {cipher} = DES, 3DES, CAST, BLF, AES, AESCTR + * {hash} = MD5, SHA, RIPEMD, SHA2-{256,384,512} * {group} = GRP1, GRP2, GRP5, GRP14, GRP15 * * DH group defaults to MODP_1024. @@ -357,11 +358,11 @@ conf_find_trans_xf(int phase, char *xf) static void conf_load_defaults_mm(int tr, char *mme, char *mmh, char *mma, char *dhg, - char *mme_p, char *mma_p, char *dhg_p) + char *mme_p, char *mma_p, char *dhg_p, char *mmh_p) { char sect[CONF_SECT_MAX]; - snprintf(sect, sizeof sect, "%s-%s%s%s", mme_p, mmh, dhg_p, mma_p); + snprintf(sect, sizeof sect, "%s%s%s%s", mme_p, mmh_p, dhg_p, mma_p); LOG_DBG((LOG_MISC, 95, "conf_load_defaults_mm: main mode %s", sect)); @@ -441,7 +442,10 @@ conf_load_defaults(int tr) char *mm_auth[] = {"PRE_SHARED", "DSS", "RSA_SIG", 0}; char *mm_auth_p[] = {"", "-DSS", "-RSA_SIG", 0}; - char *mm_hash[] = {"MD5", "SHA", 0}; + char *mm_hash[] = {"MD5", "SHA", "SHA2_256", "SHA2_384", "SHA2_512", + 0}; + char *mm_hash_p[] = {"-MD5", "-SHA", "-SHA2-256", "-SHA2-384", + "-SHA2-512", "", 0 }; char *mm_enc[] = {"DES_CBC", "BLOWFISH_CBC", "3DES_CBC", "CAST_CBC", "AES_CBC", 0}; char *mm_enc_p[] = {"DES", "BLF", "3DES", "CAST", "AES", 0}; @@ -449,8 +453,10 @@ conf_load_defaults(int tr) "MODP_1536", "MODP_2048", "MODP_3072", 0}; char *dhgroup_p[] = {"", "-GRP1", "-GRP2", "-GRP5", "-GRP14", "-GRP15", 0}; - char *qm_enc[] = {"DES", "3DES", "CAST", "BLOWFISH", "AES", 0}; - char *qm_enc_p[] = {"-DES", "-3DES", "-CAST", "-BLF", "-AES", 0}; + char *qm_enc[] = {"DES", "3DES", "CAST", "BLOWFISH", "AES", + "AES_128_CTR", 0}; + char *qm_enc_p[] = {"-DES", "-3DES", "-CAST", "-BLF", "-AES", + "-AESCTR", 0}; char *qm_hash[] = {"HMAC_MD5", "HMAC_SHA", "HMAC_RIPEMD", "HMAC_SHA2_256", "HMAC_SHA2_384", "HMAC_SHA2_512", "NONE", 0}; @@ -478,6 +484,8 @@ conf_load_defaults(int tr) conf_set(tr, "KeyNote", "Credential-directory", CONF_DFLT_KEYNOTE_CRED_DIR, 0, 1); + conf_set(tr, "General", "Delete-SAs", CONF_DFLT_DELETE_SAS, 0, 1); + /* Lifetimes. XXX p1/p2 vs main/quick mode may be unclear. */ dflt = conf_get_trans_str(tr, "General", "Default-phase-1-lifetime"); conf_set(tr, CONF_DFLT_TAG_LIFE_MAIN_MODE, "LIFE_TYPE", @@ -505,7 +513,8 @@ conf_load_defaults(int tr) conf_load_defaults_mm (tr, mm_enc[enc], mm_hash[hash], mm_auth[auth], dhgroup[group], mm_enc_p[enc], - mm_auth_p[auth], dhgroup_p[group]); + mm_auth_p[auth], dhgroup_p[group], + mm_hash_p[hash]); /* Setup a default Phase 1 entry */ conf_set(tr, "Phase 1", "Default", "Default-phase-1", 0, 1); diff --git a/sbin/isakmpd/hash.c b/sbin/isakmpd/hash.c index f2e0f5cc014..6309a4a4d4a 100644 --- a/sbin/isakmpd/hash.c +++ b/sbin/isakmpd/hash.c @@ -1,4 +1,4 @@ -/* $OpenBSD: hash.c,v 1.20 2005/04/08 22:32:10 cloder Exp $ */ +/* $OpenBSD: hash.c,v 1.21 2006/06/10 20:10:02 hshoexer Exp $ */ /* $EOM: hash.c,v 1.10 1999/04/17 23:20:34 niklas Exp $ */ /* @@ -34,6 +34,7 @@ #include <string.h> #include <md5.h> #include <sha1.h> +#include <sha2.h> #include "hash.h" #include "log.h" @@ -45,6 +46,9 @@ void hmac_final(unsigned char *, struct hash *); static union { MD5_CTX md5ctx; SHA1_CTX sha1ctx; + SHA256_CTX sha256ctx; + SHA384_CTX sha384ctx; + SHA512_CTX sha512ctx; } Ctx, Ctx2; /* Temporary hash digest. */ @@ -69,7 +73,31 @@ static struct hash hashes[] = { (void (*)(unsigned char *, void *))SHA1Final, hmac_init, hmac_final - }, + }, { + HASH_SHA2_256, 7, SHA2_256_SIZE, (void *)&Ctx.sha256ctx, digest, + sizeof(SHA256_CTX), (void *)&Ctx2.sha256ctx, + (void (*)(void *))SHA256_Init, + (void (*)(void *, unsigned char *, unsigned int))SHA256_Update, + (void (*)(u_int8_t *, void *))SHA256_Final, + hmac_init, + hmac_final + }, { + HASH_SHA2_384, 8, SHA2_384_SIZE, (void *)&Ctx.sha384ctx, digest, + sizeof(SHA384_CTX), (void *)&Ctx2.sha384ctx, + (void (*)(void *))SHA384_Init, + (void (*)(void *, unsigned char *, unsigned int))SHA384_Update, + (void (*)(u_int8_t *, void *))SHA384_Final, + hmac_init, + hmac_final + }, { + HASH_SHA2_512, 9, SHA2_512_SIZE, (void *)&Ctx.sha512ctx, digest, + sizeof(SHA512_CTX), (void *)&Ctx2.sha512ctx, + (void (*)(void *))SHA512_Init, + (void (*)(void *, unsigned char *, unsigned int))SHA512_Update, + (void (*)(u_int8_t *, void *))SHA512_Final, + hmac_init, + hmac_final + } }; struct hash * diff --git a/sbin/isakmpd/hash.h b/sbin/isakmpd/hash.h index 3af23508138..426c899a4c5 100644 --- a/sbin/isakmpd/hash.h +++ b/sbin/isakmpd/hash.h @@ -1,4 +1,4 @@ -/* $OpenBSD: hash.h,v 1.7 2004/04/15 18:39:25 deraadt Exp $ */ +/* $OpenBSD: hash.h,v 1.8 2006/06/10 20:10:02 hshoexer Exp $ */ /* $EOM: hash.h,v 1.6 1998/07/25 22:04:36 niklas Exp $ */ /* @@ -36,11 +36,17 @@ #define MD5_SIZE 16 #define SHA1_SIZE 20 -#define HASH_MAX SHA1_SIZE +#define SHA2_256_SIZE 32 +#define SHA2_384_SIZE 48 +#define SHA2_512_SIZE 64 +#define HASH_MAX SHA2_512_SIZE enum hashes { HASH_MD5 = 0, - HASH_SHA1 + HASH_SHA1, + HASH_SHA2_256, + HASH_SHA2_384, + HASH_SHA2_512 }; struct hash { diff --git a/sbin/isakmpd/ipsec.c b/sbin/isakmpd/ipsec.c index 793be46c94f..ab8bbaba787 100644 --- a/sbin/isakmpd/ipsec.c +++ b/sbin/isakmpd/ipsec.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ipsec.c,v 1.125 2006/06/09 21:37:17 naddy Exp $ */ +/* $OpenBSD: ipsec.c,v 1.126 2006/06/10 20:10:02 hshoexer Exp $ */ /* $EOM: ipsec.c,v 1.143 2000/12/11 23:57:42 niklas Exp $ */ /* @@ -1068,6 +1068,12 @@ from_ike_hash(u_int16_t hash) return HASH_MD5; case IKE_HASH_SHA: return HASH_SHA1; + case IKE_HASH_SHA2_256: + return HASH_SHA2_256; + case IKE_HASH_SHA2_384: + return HASH_SHA2_384; + case IKE_HASH_SHA2_512: + return HASH_SHA2_512; } return -1; } @@ -1665,8 +1671,9 @@ ipsec_esp_enckeylength(struct proto *proto) if (!iproto->keylen) return 16; return iproto->keylen / 8; - case IPSEC_ESP_AES: case IPSEC_ESP_AES_128_CTR: + return 20; + case IPSEC_ESP_AES: if (!iproto->keylen) return 16; /* FALLTHROUGH */ diff --git a/sbin/isakmpd/pf_key_v2.c b/sbin/isakmpd/pf_key_v2.c index 91041061503..0a9e0217b39 100644 --- a/sbin/isakmpd/pf_key_v2.c +++ b/sbin/isakmpd/pf_key_v2.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pf_key_v2.c,v 1.171 2006/05/31 04:58:13 hshoexer Exp $ */ +/* $OpenBSD: pf_key_v2.c,v 1.172 2006/06/10 20:10:02 hshoexer Exp $ */ /* $EOM: pf_key_v2.c,v 1.79 2000/12/12 00:33:19 niklas Exp $ */ /* @@ -934,10 +934,13 @@ pf_key_v2_set_spi(struct sa *sa, struct proto *proto, int incoming, break; case IPSEC_ESP_AES: - /* case IPSEC_ESP_AES_128_CTR: */ ssa.sadb_sa_encrypt = SADB_X_EALG_AES; break; + case IPSEC_ESP_AES_128_CTR: + ssa.sadb_sa_encrypt = SADB_X_EALG_AESCTR; + break; + case IPSEC_ESP_CAST: ssa.sadb_sa_encrypt = SADB_X_EALG_CAST; break; |