]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - crypto/openssh/regress/unittests/kex/test_proposal.c
ssh: Update to OpenSSH 9.3p1
[FreeBSD/FreeBSD.git] / crypto / openssh / regress / unittests / kex / test_proposal.c
1 /*      $OpenBSD: test_proposal.c,v 1.2 2023/03/06 12:15:47 dtucker Exp $ */
2 /*
3  * Regress test KEX
4  *
5  * Placed in the public domain
6  */
7
8 #include "includes.h"
9
10 #include <sys/types.h>
11 #include <signal.h>
12 #include <stdio.h>
13 #ifdef HAVE_STDINT_H
14 #include <stdint.h>
15 #endif
16 #include <stdlib.h>
17 #include <string.h>
18
19 #include "../test_helper/test_helper.h"
20
21 #include "cipher.h"
22 #include "compat.h"
23 #include "ssherr.h"
24 #include "sshbuf.h"
25 #include "kex.h"
26 #include "myproposal.h"
27 #include "packet.h"
28 #include "xmalloc.h"
29
30 void kex_proposal_tests(void);
31 void kex_proposal_populate_tests(void);
32
33 #define CURVE25519 "curve25519-sha256@libssh.org"
34 #define DHGEX1 "diffie-hellman-group-exchange-sha1"
35 #define DHGEX256 "diffie-hellman-group-exchange-sha256"
36 #define KEXALGOS CURVE25519","DHGEX256","DHGEX1
37 void
38 kex_proposal_tests(void)
39 {
40         size_t i;
41         struct ssh ssh;
42         char *result, *out, *in;
43         struct {
44                 char *in;       /* TODO: make this const */
45                 char *out;
46                 int compat;
47         } tests[] = {
48                 { KEXALGOS, KEXALGOS, 0},
49                 { KEXALGOS, DHGEX256","DHGEX1, SSH_BUG_CURVE25519PAD },
50                 { KEXALGOS, CURVE25519, SSH_OLD_DHGEX },
51                 { "a,"KEXALGOS, "a", SSH_BUG_CURVE25519PAD|SSH_OLD_DHGEX },
52                 /* TODO: enable once compat_kex_proposal doesn't fatal() */
53                 /* { KEXALGOS, "", SSH_BUG_CURVE25519PAD|SSH_OLD_DHGEX }, */
54         };
55
56         TEST_START("compat_kex_proposal");
57         for (i = 0; i < sizeof(tests) / sizeof(*tests); i++) {
58                 ssh.compat = tests[i].compat;
59                 /* match entire string */
60                 result = compat_kex_proposal(&ssh, tests[i].in);
61                 ASSERT_STRING_EQ(result, tests[i].out);
62                 free(result);
63                 /* match at end */
64                 in = kex_names_cat("a", tests[i].in);
65                 out = kex_names_cat("a", tests[i].out);
66                 result = compat_kex_proposal(&ssh, in);
67                 ASSERT_STRING_EQ(result, out);
68                 free(result); free(in); free(out);
69                 /* match at start */
70                 in = kex_names_cat(tests[i].in, "a");
71                 out = kex_names_cat(tests[i].out, "a");
72                 result = compat_kex_proposal(&ssh, in);
73                 ASSERT_STRING_EQ(result, out);
74                 free(result); free(in); free(out);
75                 /* match in middle */
76                 xasprintf(&in, "a,%s,b", tests[i].in);
77                 if (*(tests[i].out) == '\0')
78                         out = xstrdup("a,b");
79                 else
80                         xasprintf(&out, "a,%s,b", tests[i].out);
81                 result = compat_kex_proposal(&ssh, in);
82                 ASSERT_STRING_EQ(result, out);
83                 free(result); free(in); free(out);
84         }
85         TEST_DONE();
86 }
87
88 void
89 kex_proposal_populate_tests(void)
90 {
91         char *prop[PROPOSAL_MAX], *kexalgs, *ciphers, *macs, *hkalgs;
92         const char *comp = compression_alg_list(0);
93         int i;
94         struct ssh ssh;
95         struct kex kex;
96
97         kexalgs = kex_alg_list(',');
98         ciphers = cipher_alg_list(',', 0);
99         macs = mac_alg_list(',');
100         hkalgs = kex_alg_list(',');
101
102         ssh.kex = &kex;
103         TEST_START("compat_kex_proposal_populate");
104         for (i = 0; i <= 1; i++) {
105                 kex.server = i;
106                 for (ssh.compat = 0; ssh.compat < 0x40000000; ) {
107                         kex_proposal_populate_entries(&ssh, prop, NULL, NULL,
108                             NULL, NULL, NULL);
109                         kex_proposal_free_entries(prop);
110                         kex_proposal_populate_entries(&ssh, prop, kexalgs,
111                             ciphers, macs, hkalgs, comp);
112                         kex_proposal_free_entries(prop);
113                         if (ssh.compat == 0)
114                                 ssh.compat = 1;
115                         else
116                                 ssh.compat <<= 1;
117                 }
118         }
119
120         free(kexalgs);
121         free(ciphers);
122         free(macs);
123         free(hkalgs);
124 }