mirror of
https://github.com/PowerShell/openssh-portable.git
synced 2025-07-31 01:35:11 +02:00
- djm@cvs.openbsd.org 2013/06/21 05:42:32
[dh.c] sprinkle in some error() to explain moduli(5) parse failures
This commit is contained in:
parent
7f2b438ca0
commit
bbeb1dac55
@ -20,6 +20,9 @@
|
|||||||
[ssh_config.5]
|
[ssh_config.5]
|
||||||
explicitly mention that IdentitiesOnly can be used with IdentityFile
|
explicitly mention that IdentitiesOnly can be used with IdentityFile
|
||||||
to control which keys are offered from an agent.
|
to control which keys are offered from an agent.
|
||||||
|
- djm@cvs.openbsd.org 2013/06/21 05:42:32
|
||||||
|
[dh.c]
|
||||||
|
sprinkle in some error() to explain moduli(5) parse failures
|
||||||
|
|
||||||
20130702
|
20130702
|
||||||
- (dtucker) [contrib/cygwin/README contrib/cygwin/ssh-host-config
|
- (dtucker) [contrib/cygwin/README contrib/cygwin/ssh-host-config
|
||||||
|
74
dh.c
74
dh.c
@ -1,4 +1,4 @@
|
|||||||
/* $OpenBSD: dh.c,v 1.49 2011/12/07 05:44:38 djm Exp $ */
|
/* $OpenBSD: dh.c,v 1.50 2013/06/21 05:42:32 djm Exp $ */
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2000 Niels Provos. All rights reserved.
|
* Copyright (c) 2000 Niels Provos. All rights reserved.
|
||||||
*
|
*
|
||||||
@ -48,6 +48,7 @@ parse_prime(int linenum, char *line, struct dhgroup *dhg)
|
|||||||
const char *errstr = NULL;
|
const char *errstr = NULL;
|
||||||
long long n;
|
long long n;
|
||||||
|
|
||||||
|
dhg->p = dhg-> g = NULL;
|
||||||
cp = line;
|
cp = line;
|
||||||
if ((arg = strdelim(&cp)) == NULL)
|
if ((arg = strdelim(&cp)) == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
@ -59,66 +60,85 @@ parse_prime(int linenum, char *line, struct dhgroup *dhg)
|
|||||||
|
|
||||||
/* time */
|
/* time */
|
||||||
if (cp == NULL || *arg == '\0')
|
if (cp == NULL || *arg == '\0')
|
||||||
goto fail;
|
goto truncated;
|
||||||
arg = strsep(&cp, " "); /* type */
|
arg = strsep(&cp, " "); /* type */
|
||||||
if (cp == NULL || *arg == '\0')
|
if (cp == NULL || *arg == '\0')
|
||||||
goto fail;
|
goto truncated;
|
||||||
/* Ensure this is a safe prime */
|
/* Ensure this is a safe prime */
|
||||||
n = strtonum(arg, 0, 5, &errstr);
|
n = strtonum(arg, 0, 5, &errstr);
|
||||||
if (errstr != NULL || n != MODULI_TYPE_SAFE)
|
if (errstr != NULL || n != MODULI_TYPE_SAFE) {
|
||||||
|
error("moduli:%d: type is not %d", linenum, MODULI_TYPE_SAFE);
|
||||||
goto fail;
|
goto fail;
|
||||||
|
}
|
||||||
arg = strsep(&cp, " "); /* tests */
|
arg = strsep(&cp, " "); /* tests */
|
||||||
if (cp == NULL || *arg == '\0')
|
if (cp == NULL || *arg == '\0')
|
||||||
goto fail;
|
goto truncated;
|
||||||
/* Ensure prime has been tested and is not composite */
|
/* Ensure prime has been tested and is not composite */
|
||||||
n = strtonum(arg, 0, 0x1f, &errstr);
|
n = strtonum(arg, 0, 0x1f, &errstr);
|
||||||
if (errstr != NULL ||
|
if (errstr != NULL ||
|
||||||
(n & MODULI_TESTS_COMPOSITE) || !(n & ~MODULI_TESTS_COMPOSITE))
|
(n & MODULI_TESTS_COMPOSITE) || !(n & ~MODULI_TESTS_COMPOSITE)) {
|
||||||
|
error("moduli:%d: invalid moduli tests flag", linenum);
|
||||||
goto fail;
|
goto fail;
|
||||||
|
}
|
||||||
arg = strsep(&cp, " "); /* tries */
|
arg = strsep(&cp, " "); /* tries */
|
||||||
if (cp == NULL || *arg == '\0')
|
if (cp == NULL || *arg == '\0')
|
||||||
goto fail;
|
goto truncated;
|
||||||
n = strtonum(arg, 0, 1<<30, &errstr);
|
n = strtonum(arg, 0, 1<<30, &errstr);
|
||||||
if (errstr != NULL || n == 0)
|
if (errstr != NULL || n == 0) {
|
||||||
|
error("moduli:%d: invalid primality trial count", linenum);
|
||||||
goto fail;
|
goto fail;
|
||||||
|
}
|
||||||
strsize = strsep(&cp, " "); /* size */
|
strsize = strsep(&cp, " "); /* size */
|
||||||
if (cp == NULL || *strsize == '\0' ||
|
if (cp == NULL || *strsize == '\0' ||
|
||||||
(dhg->size = (int)strtonum(strsize, 0, 64*1024, &errstr)) == 0 ||
|
(dhg->size = (int)strtonum(strsize, 0, 64*1024, &errstr)) == 0 ||
|
||||||
errstr)
|
errstr) {
|
||||||
|
error("moduli:%d: invalid prime length", linenum);
|
||||||
goto fail;
|
goto fail;
|
||||||
|
}
|
||||||
/* The whole group is one bit larger */
|
/* The whole group is one bit larger */
|
||||||
dhg->size++;
|
dhg->size++;
|
||||||
gen = strsep(&cp, " "); /* gen */
|
gen = strsep(&cp, " "); /* gen */
|
||||||
if (cp == NULL || *gen == '\0')
|
if (cp == NULL || *gen == '\0')
|
||||||
goto fail;
|
goto truncated;
|
||||||
prime = strsep(&cp, " "); /* prime */
|
prime = strsep(&cp, " "); /* prime */
|
||||||
if (cp != NULL || *prime == '\0')
|
if (cp != NULL || *prime == '\0') {
|
||||||
|
truncated:
|
||||||
|
error("moduli:%d: truncated", linenum);
|
||||||
goto fail;
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
if ((dhg->g = BN_new()) == NULL)
|
if ((dhg->g = BN_new()) == NULL)
|
||||||
fatal("parse_prime: BN_new failed");
|
fatal("parse_prime: BN_new failed");
|
||||||
if ((dhg->p = BN_new()) == NULL)
|
if ((dhg->p = BN_new()) == NULL)
|
||||||
fatal("parse_prime: BN_new failed");
|
fatal("parse_prime: BN_new failed");
|
||||||
if (BN_hex2bn(&dhg->g, gen) == 0)
|
if (BN_hex2bn(&dhg->g, gen) == 0) {
|
||||||
goto failclean;
|
error("moduli:%d: could not parse generator value", linenum);
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
if (BN_hex2bn(&dhg->p, prime) == 0) {
|
||||||
|
error("moduli:%d: could not parse prime value", linenum);
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
if (BN_num_bits(dhg->p) != dhg->size) {
|
||||||
|
error("moduli:%d: prime has wrong size: actual %d listed %d",
|
||||||
|
linenum, BN_num_bits(dhg->p), dhg->size - 1);
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
if (BN_cmp(dhg->g, BN_value_one()) <= 0) {
|
||||||
|
error("moduli:%d: generator is invalid", linenum);
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
if (BN_hex2bn(&dhg->p, prime) == 0)
|
return 1;
|
||||||
goto failclean;
|
|
||||||
|
|
||||||
if (BN_num_bits(dhg->p) != dhg->size)
|
|
||||||
goto failclean;
|
|
||||||
|
|
||||||
if (BN_is_zero(dhg->g) || BN_is_one(dhg->g))
|
|
||||||
goto failclean;
|
|
||||||
|
|
||||||
return (1);
|
|
||||||
|
|
||||||
failclean:
|
|
||||||
BN_clear_free(dhg->g);
|
|
||||||
BN_clear_free(dhg->p);
|
|
||||||
fail:
|
fail:
|
||||||
|
if (dhg->g != NULL)
|
||||||
|
BN_clear_free(dhg->g);
|
||||||
|
if (dhg->p != NULL)
|
||||||
|
BN_clear_free(dhg->p);
|
||||||
|
dhg->g = dhg->p = NULL;
|
||||||
error("Bad prime description in line %d", linenum);
|
error("Bad prime description in line %d", linenum);
|
||||||
return (0);
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
DH *
|
DH *
|
||||||
|
Loading…
x
Reference in New Issue
Block a user