upstream: factor SSH_AGENT_CONSTRAIN_EXTENSION parsing into its own
function and remove an unused variable; ok dtucker@ OpenBSD-Commit-ID: e1a938657fbf7ef0ba5e73b30365734a0cc96559
This commit is contained in:
parent
1bb130ed34
commit
e04fd6dde1
100
ssh-agent.c
100
ssh-agent.c
|
@ -1,4 +1,4 @@
|
||||||
/* $OpenBSD: ssh-agent.c,v 1.276 2021/02/02 22:35:14 djm Exp $ */
|
/* $OpenBSD: ssh-agent.c,v 1.277 2021/02/12 03:14:18 djm Exp $ */
|
||||||
/*
|
/*
|
||||||
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
||||||
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
||||||
|
@ -574,6 +574,44 @@ reaper(void)
|
||||||
return (deadline - now);
|
return (deadline - now);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
parse_key_constraint_extension(struct sshbuf *m, char **sk_providerp)
|
||||||
|
{
|
||||||
|
char *ext_name = NULL;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
if ((r = sshbuf_get_cstring(m, &ext_name, NULL)) != 0) {
|
||||||
|
error_fr(r, "parse constraint extension");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
debug_f("constraint ext %s", ext_name);
|
||||||
|
if (strcmp(ext_name, "sk-provider@openssh.com") == 0) {
|
||||||
|
if (sk_providerp == NULL) {
|
||||||
|
error_f("%s not valid here", ext_name);
|
||||||
|
r = SSH_ERR_INVALID_FORMAT;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
if (*sk_providerp != NULL) {
|
||||||
|
error_f("%s already set", ext_name);
|
||||||
|
r = SSH_ERR_INVALID_FORMAT;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
if ((r = sshbuf_get_cstring(m, sk_providerp, NULL)) != 0) {
|
||||||
|
error_fr(r, "parse %s", ext_name);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
error_f("unsupported constraint \"%s\"", ext_name);
|
||||||
|
r = SSH_ERR_FEATURE_UNSUPPORTED;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
/* success */
|
||||||
|
r = 0;
|
||||||
|
out:
|
||||||
|
free(ext_name);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
parse_key_constraints(struct sshbuf *m, struct sshkey *k, time_t *deathp,
|
parse_key_constraints(struct sshbuf *m, struct sshkey *k, time_t *deathp,
|
||||||
u_int *secondsp, int *confirmp, char **sk_providerp)
|
u_int *secondsp, int *confirmp, char **sk_providerp)
|
||||||
|
@ -581,23 +619,22 @@ parse_key_constraints(struct sshbuf *m, struct sshkey *k, time_t *deathp,
|
||||||
u_char ctype;
|
u_char ctype;
|
||||||
int r;
|
int r;
|
||||||
u_int seconds, maxsign = 0;
|
u_int seconds, maxsign = 0;
|
||||||
char *ext_name = NULL;
|
|
||||||
struct sshbuf *b = NULL;
|
|
||||||
|
|
||||||
while (sshbuf_len(m)) {
|
while (sshbuf_len(m)) {
|
||||||
if ((r = sshbuf_get_u8(m, &ctype)) != 0) {
|
if ((r = sshbuf_get_u8(m, &ctype)) != 0) {
|
||||||
error_fr(r, "parse constraint type");
|
error_fr(r, "parse constraint type");
|
||||||
goto err;
|
goto out;
|
||||||
}
|
}
|
||||||
switch (ctype) {
|
switch (ctype) {
|
||||||
case SSH_AGENT_CONSTRAIN_LIFETIME:
|
case SSH_AGENT_CONSTRAIN_LIFETIME:
|
||||||
if (*deathp != 0) {
|
if (*deathp != 0) {
|
||||||
error_f("lifetime already set");
|
error_f("lifetime already set");
|
||||||
goto err;
|
r = SSH_ERR_INVALID_FORMAT;
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
if ((r = sshbuf_get_u32(m, &seconds)) != 0) {
|
if ((r = sshbuf_get_u32(m, &seconds)) != 0) {
|
||||||
error_fr(r, "parse lifetime constraint");
|
error_fr(r, "parse lifetime constraint");
|
||||||
goto err;
|
goto out;
|
||||||
}
|
}
|
||||||
*deathp = monotime() + seconds;
|
*deathp = monotime() + seconds;
|
||||||
*secondsp = seconds;
|
*secondsp = seconds;
|
||||||
|
@ -605,65 +642,46 @@ parse_key_constraints(struct sshbuf *m, struct sshkey *k, time_t *deathp,
|
||||||
case SSH_AGENT_CONSTRAIN_CONFIRM:
|
case SSH_AGENT_CONSTRAIN_CONFIRM:
|
||||||
if (*confirmp != 0) {
|
if (*confirmp != 0) {
|
||||||
error_f("confirm already set");
|
error_f("confirm already set");
|
||||||
goto err;
|
r = SSH_ERR_INVALID_FORMAT;
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
*confirmp = 1;
|
*confirmp = 1;
|
||||||
break;
|
break;
|
||||||
case SSH_AGENT_CONSTRAIN_MAXSIGN:
|
case SSH_AGENT_CONSTRAIN_MAXSIGN:
|
||||||
if (k == NULL) {
|
if (k == NULL) {
|
||||||
error_f("maxsign not valid here");
|
error_f("maxsign not valid here");
|
||||||
goto err;
|
r = SSH_ERR_INVALID_FORMAT;
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
if (maxsign != 0) {
|
if (maxsign != 0) {
|
||||||
error_f("maxsign already set");
|
error_f("maxsign already set");
|
||||||
goto err;
|
r = SSH_ERR_INVALID_FORMAT;
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
if ((r = sshbuf_get_u32(m, &maxsign)) != 0) {
|
if ((r = sshbuf_get_u32(m, &maxsign)) != 0) {
|
||||||
error_fr(r, "parse maxsign constraint");
|
error_fr(r, "parse maxsign constraint");
|
||||||
goto err;
|
goto out;
|
||||||
}
|
}
|
||||||
if ((r = sshkey_enable_maxsign(k, maxsign)) != 0) {
|
if ((r = sshkey_enable_maxsign(k, maxsign)) != 0) {
|
||||||
error_fr(r, "enable maxsign");
|
error_fr(r, "enable maxsign");
|
||||||
goto err;
|
goto out;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SSH_AGENT_CONSTRAIN_EXTENSION:
|
case SSH_AGENT_CONSTRAIN_EXTENSION:
|
||||||
if ((r = sshbuf_get_cstring(m, &ext_name, NULL)) != 0) {
|
if ((r = parse_key_constraint_extension(m,
|
||||||
error_fr(r, "parse constraint extension");
|
sk_providerp)) != 0)
|
||||||
goto err;
|
goto out; /* error already logged */
|
||||||
}
|
|
||||||
debug_f("constraint ext %s", ext_name);
|
|
||||||
if (strcmp(ext_name, "sk-provider@openssh.com") == 0) {
|
|
||||||
if (sk_providerp == NULL) {
|
|
||||||
error_f("%s not valid here", ext_name);
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
if (*sk_providerp != NULL) {
|
|
||||||
error_f("%s already set", ext_name);
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
if ((r = sshbuf_get_cstring(m,
|
|
||||||
sk_providerp, NULL)) != 0) {
|
|
||||||
error_fr(r, "parse %s", ext_name);
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
error_f("unsupported constraint \"%s\"",
|
|
||||||
ext_name);
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
free(ext_name);
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
error_f("Unknown constraint %d", ctype);
|
error_f("Unknown constraint %d", ctype);
|
||||||
err:
|
r = SSH_ERR_FEATURE_UNSUPPORTED;
|
||||||
free(ext_name);
|
goto out;
|
||||||
sshbuf_free(b);
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* success */
|
/* success */
|
||||||
return 0;
|
r = 0;
|
||||||
|
out:
|
||||||
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
Loading…
Reference in New Issue