version 1.6, 2019/10/09 00:02:57 |
version 1.7, 2019/10/14 06:00:02 |
|
|
u_int32_t i, lh, node; |
u_int32_t i, lh, node; |
size_t ls, lsl, la, lk, ln, lr; |
size_t ls, lsl, la, lk, ln, lr; |
char *magic; |
char *magic; |
int r; |
int r = SSH_ERR_INTERNAL_ERROR; |
|
|
if (state == NULL) |
if (state == NULL) |
return SSH_ERR_INVALID_ARGUMENT; |
return SSH_ERR_INVALID_ARGUMENT; |
|
|
(r = sshbuf_get_string(b, &state->th_nodes, &ln)) != 0 || |
(r = sshbuf_get_string(b, &state->th_nodes, &ln)) != 0 || |
(r = sshbuf_get_string(b, &state->retain, &lr)) != 0 || |
(r = sshbuf_get_string(b, &state->retain, &lr)) != 0 || |
(r = sshbuf_get_u32(b, &lh)) != 0) |
(r = sshbuf_get_u32(b, &lh)) != 0) |
return r; |
goto out; |
if (strcmp(magic, SSH_XMSS_K2_MAGIC) != 0) |
if (strcmp(magic, SSH_XMSS_K2_MAGIC) != 0) { |
return SSH_ERR_INVALID_ARGUMENT; |
r = SSH_ERR_INVALID_ARGUMENT; |
|
goto out; |
|
} |
/* XXX check stackoffset */ |
/* XXX check stackoffset */ |
if (ls != num_stack(state) || |
if (ls != num_stack(state) || |
lsl != num_stacklevels(state) || |
lsl != num_stacklevels(state) || |
|
|
lk != num_keep(state) || |
lk != num_keep(state) || |
ln != num_th_nodes(state) || |
ln != num_th_nodes(state) || |
lr != num_retain(state) || |
lr != num_retain(state) || |
lh != num_treehash(state)) |
lh != num_treehash(state)) { |
return SSH_ERR_INVALID_ARGUMENT; |
r = SSH_ERR_INVALID_ARGUMENT; |
|
goto out; |
|
} |
for (i = 0; i < num_treehash(state); i++) { |
for (i = 0; i < num_treehash(state); i++) { |
th = &state->treehash[i]; |
th = &state->treehash[i]; |
if ((r = sshbuf_get_u32(b, &th->h)) != 0 || |
if ((r = sshbuf_get_u32(b, &th->h)) != 0 || |
|
|
(r = sshbuf_get_u32(b, &th->stackusage)) != 0 || |
(r = sshbuf_get_u32(b, &th->stackusage)) != 0 || |
(r = sshbuf_get_u8(b, &th->completed)) != 0 || |
(r = sshbuf_get_u8(b, &th->completed)) != 0 || |
(r = sshbuf_get_u32(b, &node)) != 0) |
(r = sshbuf_get_u32(b, &node)) != 0) |
return r; |
goto out; |
if (node < num_th_nodes(state)) |
if (node < num_th_nodes(state)) |
th->node = &state->th_nodes[node]; |
th->node = &state->th_nodes[node]; |
} |
} |
|
|
xmss_set_bds_state(&state->bds, state->stack, state->stackoffset, |
xmss_set_bds_state(&state->bds, state->stack, state->stackoffset, |
state->stacklevels, state->auth, state->keep, state->treehash, |
state->stacklevels, state->auth, state->keep, state->treehash, |
state->retain, 0); |
state->retain, 0); |
return 0; |
/* success */ |
|
r = 0; |
|
out: |
|
free(magic); |
|
return r; |
} |
} |
|
|
int |
int |