diff options
author | Damien Miller <djm@mindrot.org> | 2008-06-29 22:47:04 +1000 |
---|---|---|
committer | Damien Miller <djm@mindrot.org> | 2008-06-29 22:47:04 +1000 |
commit | 2e9cf4906926fba123d415fdac8465b94bcd38b3 (patch) | |
tree | d0c86565f3f340c972ad1479251b9ee31add20ae /dh.c | |
parent | 9e720284fe63aa8e59983b880447ed4ae768387c (diff) |
- djm@cvs.openbsd.org 2008/06/26 09:19:40
[dh.c dh.h moduli.c]
when loading moduli from /etc/moduli in sshd(8), check that they
are of the expected "safe prime" structure and have had
appropriate primality tests performed;
feedback and ok dtucker@
Diffstat (limited to 'dh.c')
-rw-r--r-- | dh.c | 15 |
1 files changed, 14 insertions, 1 deletions
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: dh.c,v 1.46 2008/04/13 00:22:17 djm Exp $ */ | 1 | /* $OpenBSD: dh.c,v 1.47 2008/06/26 09:19:39 djm Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2000 Niels Provos. All rights reserved. | 3 | * Copyright (c) 2000 Niels Provos. All rights reserved. |
4 | * | 4 | * |
@@ -46,6 +46,7 @@ parse_prime(int linenum, char *line, struct dhgroup *dhg) | |||
46 | char *cp, *arg; | 46 | char *cp, *arg; |
47 | char *strsize, *gen, *prime; | 47 | char *strsize, *gen, *prime; |
48 | const char *errstr = NULL; | 48 | const char *errstr = NULL; |
49 | long long n; | ||
49 | 50 | ||
50 | cp = line; | 51 | cp = line; |
51 | if ((arg = strdelim(&cp)) == NULL) | 52 | if ((arg = strdelim(&cp)) == NULL) |
@@ -62,12 +63,24 @@ parse_prime(int linenum, char *line, struct dhgroup *dhg) | |||
62 | arg = strsep(&cp, " "); /* type */ | 63 | arg = strsep(&cp, " "); /* type */ |
63 | if (cp == NULL || *arg == '\0') | 64 | if (cp == NULL || *arg == '\0') |
64 | goto fail; | 65 | goto fail; |
66 | /* Ensure this is a safe prime */ | ||
67 | n = strtonum(arg, 0, 5, &errstr); | ||
68 | if (errstr != NULL || n != MODULI_TYPE_SAFE) | ||
69 | goto fail; | ||
65 | arg = strsep(&cp, " "); /* tests */ | 70 | arg = strsep(&cp, " "); /* tests */ |
66 | if (cp == NULL || *arg == '\0') | 71 | if (cp == NULL || *arg == '\0') |
67 | goto fail; | 72 | goto fail; |
73 | /* Ensure prime has been tested and is not composite */ | ||
74 | n = strtonum(arg, 0, 0x1f, &errstr); | ||
75 | if (errstr != NULL || | ||
76 | (n & MODULI_TESTS_COMPOSITE) || !(n & ~MODULI_TESTS_COMPOSITE)) | ||
77 | goto fail; | ||
68 | arg = strsep(&cp, " "); /* tries */ | 78 | arg = strsep(&cp, " "); /* tries */ |
69 | if (cp == NULL || *arg == '\0') | 79 | if (cp == NULL || *arg == '\0') |
70 | goto fail; | 80 | goto fail; |
81 | n = strtonum(arg, 0, 1<<30, &errstr); | ||
82 | if (errstr != NULL || n == 0) | ||
83 | goto fail; | ||
71 | strsize = strsep(&cp, " "); /* size */ | 84 | strsize = strsep(&cp, " "); /* size */ |
72 | if (cp == NULL || *strsize == '\0' || | 85 | if (cp == NULL || *strsize == '\0' || |
73 | (dhg->size = (u_int)strtonum(strsize, 0, 64*1024, &errstr)) == 0 || | 86 | (dhg->size = (u_int)strtonum(strsize, 0, 64*1024, &errstr)) == 0 || |