diff options
-rw-r--r-- | ssh-agent.c | 10 | ||||
-rw-r--r-- | sshkey-xmss.c | 56 | ||||
-rw-r--r-- | sshkey.c | 4 | ||||
-rw-r--r-- | sshkey.h | 9 |
4 files changed, 64 insertions, 15 deletions
diff --git a/ssh-agent.c b/ssh-agent.c index eb17b18b2..c62c263a6 100644 --- a/ssh-agent.c +++ b/ssh-agent.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ssh-agent.c,v 1.241 2019/11/12 22:36:44 djm Exp $ */ | 1 | /* $OpenBSD: ssh-agent.c,v 1.242 2019/11/13 07:53:10 markus Exp $ */ |
2 | /* | 2 | /* |
3 | * Author: Tatu Ylonen <ylo@cs.hut.fi> | 3 | * Author: Tatu Ylonen <ylo@cs.hut.fi> |
4 | * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland | 4 | * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland |
@@ -560,10 +560,6 @@ process_add_identity(SocketEntry *e) | |||
560 | error("%s: decode private key: %s", __func__, ssh_err(r)); | 560 | error("%s: decode private key: %s", __func__, ssh_err(r)); |
561 | goto err; | 561 | goto err; |
562 | } | 562 | } |
563 | if ((r = sshkey_shield_private(k)) != 0) { | ||
564 | error("%s: shield private key: %s", __func__, ssh_err(r)); | ||
565 | goto err; | ||
566 | } | ||
567 | while (sshbuf_len(e->request)) { | 563 | while (sshbuf_len(e->request)) { |
568 | if ((r = sshbuf_get_u8(e->request, &ctype)) != 0) { | 564 | if ((r = sshbuf_get_u8(e->request, &ctype)) != 0) { |
569 | error("%s: buffer error: %s", __func__, ssh_err(r)); | 565 | error("%s: buffer error: %s", __func__, ssh_err(r)); |
@@ -645,6 +641,10 @@ process_add_identity(SocketEntry *e) | |||
645 | goto send; | 641 | goto send; |
646 | } | 642 | } |
647 | } | 643 | } |
644 | if ((r = sshkey_shield_private(k)) != 0) { | ||
645 | error("%s: shield private key: %s", __func__, ssh_err(r)); | ||
646 | goto err; | ||
647 | } | ||
648 | 648 | ||
649 | success = 1; | 649 | success = 1; |
650 | if (lifetime && !death) | 650 | if (lifetime && !death) |
diff --git a/sshkey-xmss.c b/sshkey-xmss.c index e8e2e3816..88e9ddf4d 100644 --- a/sshkey-xmss.c +++ b/sshkey-xmss.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: sshkey-xmss.c,v 1.7 2019/10/14 06:00:02 djm Exp $ */ | 1 | /* $OpenBSD: sshkey-xmss.c,v 1.8 2019/11/13 07:53:10 markus Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2017 Markus Friedl. All rights reserved. | 3 | * Copyright (c) 2017 Markus Friedl. All rights reserved. |
4 | * | 4 | * |
@@ -69,7 +69,7 @@ struct ssh_xmss_state { | |||
69 | u_int32_t maxidx; /* restricted # of signatures */ | 69 | u_int32_t maxidx; /* restricted # of signatures */ |
70 | int have_state; /* .state file exists */ | 70 | int have_state; /* .state file exists */ |
71 | int lockfd; /* locked in sshkey_xmss_get_state() */ | 71 | int lockfd; /* locked in sshkey_xmss_get_state() */ |
72 | int allow_update; /* allow sshkey_xmss_update_state() */ | 72 | u_char allow_update; /* allow sshkey_xmss_update_state() */ |
73 | char *enc_ciphername;/* encrypt state with cipher */ | 73 | char *enc_ciphername;/* encrypt state with cipher */ |
74 | u_char *enc_keyiv; /* encrypt state with key */ | 74 | u_char *enc_keyiv; /* encrypt state with key */ |
75 | u_int32_t enc_keyiv_len; /* length of enc_keyiv */ | 75 | u_int32_t enc_keyiv_len; /* length of enc_keyiv */ |
@@ -716,6 +716,7 @@ sshkey_xmss_serialize_state_opt(const struct sshkey *k, struct sshbuf *b, | |||
716 | { | 716 | { |
717 | struct ssh_xmss_state *state = k->xmss_state; | 717 | struct ssh_xmss_state *state = k->xmss_state; |
718 | int r = SSH_ERR_INVALID_ARGUMENT; | 718 | int r = SSH_ERR_INVALID_ARGUMENT; |
719 | u_char have_stack, have_filename, have_enc; | ||
719 | 720 | ||
720 | if (state == NULL) | 721 | if (state == NULL) |
721 | return SSH_ERR_INVALID_ARGUMENT; | 722 | return SSH_ERR_INVALID_ARGUMENT; |
@@ -727,9 +728,35 @@ sshkey_xmss_serialize_state_opt(const struct sshkey *k, struct sshbuf *b, | |||
727 | break; | 728 | break; |
728 | case SSHKEY_SERIALIZE_FULL: | 729 | case SSHKEY_SERIALIZE_FULL: |
729 | if ((r = sshkey_xmss_serialize_enc_key(k, b)) != 0) | 730 | if ((r = sshkey_xmss_serialize_enc_key(k, b)) != 0) |
730 | break; | 731 | return r; |
731 | r = sshkey_xmss_serialize_state(k, b); | 732 | r = sshkey_xmss_serialize_state(k, b); |
732 | break; | 733 | break; |
734 | case SSHKEY_SERIALIZE_SHIELD: | ||
735 | /* all of stack/filename/enc are optional */ | ||
736 | have_stack = state->stack != NULL; | ||
737 | if ((r = sshbuf_put_u8(b, have_stack)) != 0) | ||
738 | return r; | ||
739 | if (have_stack) { | ||
740 | state->idx = PEEK_U32(k->xmss_sk); /* update */ | ||
741 | if ((r = sshkey_xmss_serialize_state(k, b)) != 0) | ||
742 | return r; | ||
743 | } | ||
744 | have_filename = k->xmss_filename != NULL; | ||
745 | if ((r = sshbuf_put_u8(b, have_filename)) != 0) | ||
746 | return r; | ||
747 | if (have_filename && | ||
748 | (r = sshbuf_put_cstring(b, k->xmss_filename)) != 0) | ||
749 | return r; | ||
750 | have_enc = state->enc_keyiv != NULL; | ||
751 | if ((r = sshbuf_put_u8(b, have_enc)) != 0) | ||
752 | return r; | ||
753 | if (have_enc && | ||
754 | (r = sshkey_xmss_serialize_enc_key(k, b)) != 0) | ||
755 | return r; | ||
756 | if ((r = sshbuf_put_u32(b, state->maxidx)) != 0 || | ||
757 | (r = sshbuf_put_u8(b, state->allow_update)) != 0) | ||
758 | return r; | ||
759 | break; | ||
733 | case SSHKEY_SERIALIZE_DEFAULT: | 760 | case SSHKEY_SERIALIZE_DEFAULT: |
734 | r = 0; | 761 | r = 0; |
735 | break; | 762 | break; |
@@ -808,8 +835,9 @@ sshkey_xmss_deserialize_state(struct sshkey *k, struct sshbuf *b) | |||
808 | int | 835 | int |
809 | sshkey_xmss_deserialize_state_opt(struct sshkey *k, struct sshbuf *b) | 836 | sshkey_xmss_deserialize_state_opt(struct sshkey *k, struct sshbuf *b) |
810 | { | 837 | { |
838 | struct ssh_xmss_state *state = k->xmss_state; | ||
811 | enum sshkey_serialize_rep opts; | 839 | enum sshkey_serialize_rep opts; |
812 | u_char have_state; | 840 | u_char have_state, have_stack, have_filename, have_enc; |
813 | int r; | 841 | int r; |
814 | 842 | ||
815 | if ((r = sshbuf_get_u8(b, &have_state)) != 0) | 843 | if ((r = sshbuf_get_u8(b, &have_state)) != 0) |
@@ -820,6 +848,26 @@ sshkey_xmss_deserialize_state_opt(struct sshkey *k, struct sshbuf *b) | |||
820 | case SSHKEY_SERIALIZE_DEFAULT: | 848 | case SSHKEY_SERIALIZE_DEFAULT: |
821 | r = 0; | 849 | r = 0; |
822 | break; | 850 | break; |
851 | case SSHKEY_SERIALIZE_SHIELD: | ||
852 | if ((r = sshbuf_get_u8(b, &have_stack)) != 0) | ||
853 | return r; | ||
854 | if (have_stack && | ||
855 | (r = sshkey_xmss_deserialize_state(k, b)) != 0) | ||
856 | return r; | ||
857 | if ((r = sshbuf_get_u8(b, &have_filename)) != 0) | ||
858 | return r; | ||
859 | if (have_filename && | ||
860 | (r = sshbuf_get_cstring(b, &k->xmss_filename, NULL)) != 0) | ||
861 | return r; | ||
862 | if ((r = sshbuf_get_u8(b, &have_enc)) != 0) | ||
863 | return r; | ||
864 | if (have_enc && | ||
865 | (r = sshkey_xmss_deserialize_enc_key(k, b)) != 0) | ||
866 | return r; | ||
867 | if ((r = sshbuf_get_u32(b, &state->maxidx)) != 0 || | ||
868 | (r = sshbuf_get_u8(b, &state->allow_update)) != 0) | ||
869 | return r; | ||
870 | break; | ||
823 | case SSHKEY_SERIALIZE_STATE: | 871 | case SSHKEY_SERIALIZE_STATE: |
824 | if ((r = sshkey_xmss_deserialize_state(k, b)) != 0) | 872 | if ((r = sshkey_xmss_deserialize_state(k, b)) != 0) |
825 | return r; | 873 | return r; |
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: sshkey.c,v 1.90 2019/11/12 19:33:08 markus Exp $ */ | 1 | /* $OpenBSD: sshkey.c,v 1.91 2019/11/13 07:53:10 markus Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2000, 2001 Markus Friedl. All rights reserved. | 3 | * Copyright (c) 2000, 2001 Markus Friedl. All rights reserved. |
4 | * Copyright (c) 2008 Alexander von Gernler. All rights reserved. | 4 | * Copyright (c) 2008 Alexander von Gernler. All rights reserved. |
@@ -2045,7 +2045,7 @@ sshkey_shield_private(struct sshkey *k) | |||
2045 | if (sshkey_is_shielded(k) && (r = sshkey_unshield_private(k)) != 0) | 2045 | if (sshkey_is_shielded(k) && (r = sshkey_unshield_private(k)) != 0) |
2046 | goto out; | 2046 | goto out; |
2047 | if ((r = sshkey_private_serialize_opt(k, prvbuf, | 2047 | if ((r = sshkey_private_serialize_opt(k, prvbuf, |
2048 | SSHKEY_SERIALIZE_FULL)) != 0) | 2048 | SSHKEY_SERIALIZE_SHIELD)) != 0) |
2049 | goto out; | 2049 | goto out; |
2050 | /* pad to cipher blocksize */ | 2050 | /* pad to cipher blocksize */ |
2051 | i = 0; | 2051 | i = 0; |
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: sshkey.h,v 1.38 2019/11/12 19:33:08 markus Exp $ */ | 1 | /* $OpenBSD: sshkey.h,v 1.39 2019/11/13 07:53:10 markus Exp $ */ |
2 | 2 | ||
3 | /* | 3 | /* |
4 | * Copyright (c) 2000, 2001 Markus Friedl. All rights reserved. | 4 | * Copyright (c) 2000, 2001 Markus Friedl. All rights reserved. |
@@ -87,9 +87,10 @@ enum sshkey_fp_rep { | |||
87 | /* Private key serialisation formats, used on the wire */ | 87 | /* Private key serialisation formats, used on the wire */ |
88 | enum sshkey_serialize_rep { | 88 | enum sshkey_serialize_rep { |
89 | SSHKEY_SERIALIZE_DEFAULT = 0, | 89 | SSHKEY_SERIALIZE_DEFAULT = 0, |
90 | SSHKEY_SERIALIZE_STATE = 1, | 90 | SSHKEY_SERIALIZE_STATE = 1, /* only state is serialized */ |
91 | SSHKEY_SERIALIZE_FULL = 2, | 91 | SSHKEY_SERIALIZE_FULL = 2, /* include keys for saving to disk */ |
92 | SSHKEY_SERIALIZE_INFO = 254, | 92 | SSHKEY_SERIALIZE_SHIELD = 3, /* everything, for encrypting in ram */ |
93 | SSHKEY_SERIALIZE_INFO = 254, /* minimal information */ | ||
93 | }; | 94 | }; |
94 | 95 | ||
95 | /* Private key disk formats */ | 96 | /* Private key disk formats */ |