cipherbytes_test.c revision 1.1 1 1.1 christos /*
2 1.1 christos * Copyright 2017-2020 The OpenSSL Project Authors. All Rights Reserved.
3 1.1 christos *
4 1.1 christos * Licensed under the Apache License 2.0 (the "License");
5 1.1 christos * you may not use this file except in compliance with the License.
6 1.1 christos * You may obtain a copy of the License at
7 1.1 christos * https://www.openssl.org/source/license.html
8 1.1 christos * or in the file LICENSE in the source distribution.
9 1.1 christos */
10 1.1 christos
11 1.1 christos #include <string.h>
12 1.1 christos #include <stdio.h>
13 1.1 christos
14 1.1 christos #include <openssl/opensslconf.h>
15 1.1 christos #include <openssl/err.h>
16 1.1 christos #include <openssl/e_os2.h>
17 1.1 christos #include <openssl/ssl.h>
18 1.1 christos #include <openssl/ssl3.h>
19 1.1 christos #include <openssl/tls1.h>
20 1.1 christos
21 1.1 christos #include "internal/nelem.h"
22 1.1 christos #include "testutil.h"
23 1.1 christos
24 1.1 christos static SSL_CTX *ctx;
25 1.1 christos static SSL *s;
26 1.1 christos
27 1.1 christos static int test_empty(void)
28 1.1 christos {
29 1.1 christos STACK_OF(SSL_CIPHER) *sk = NULL, *scsv = NULL;
30 1.1 christos const unsigned char bytes[] = {0x00};
31 1.1 christos int ret = 0;
32 1.1 christos
33 1.1 christos if (!TEST_int_eq(SSL_bytes_to_cipher_list(s, bytes, 0, 0, &sk, &scsv), 0)
34 1.1 christos || !TEST_ptr_null(sk)
35 1.1 christos || !TEST_ptr_null(scsv))
36 1.1 christos goto err;
37 1.1 christos ret = 1;
38 1.1 christos
39 1.1 christos err:
40 1.1 christos sk_SSL_CIPHER_free(sk);
41 1.1 christos sk_SSL_CIPHER_free(scsv);
42 1.1 christos return ret;
43 1.1 christos }
44 1.1 christos
45 1.1 christos static int test_unsupported(void)
46 1.1 christos {
47 1.1 christos STACK_OF(SSL_CIPHER) *sk, *scsv;
48 1.1 christos /* ECDH-RSA-AES256 (unsupported), ECDHE-ECDSA-AES128, <unassigned> */
49 1.1 christos const unsigned char bytes[] = {0xc0, 0x0f, 0x00, 0x2f, 0x01, 0x00};
50 1.1 christos int ret = 0;
51 1.1 christos
52 1.1 christos if (!TEST_true(SSL_bytes_to_cipher_list(s, bytes, sizeof(bytes),
53 1.1 christos 0, &sk, &scsv))
54 1.1 christos || !TEST_ptr(sk)
55 1.1 christos || !TEST_int_eq(sk_SSL_CIPHER_num(sk), 1)
56 1.1 christos || !TEST_ptr(scsv)
57 1.1 christos || !TEST_int_eq(sk_SSL_CIPHER_num(scsv), 0)
58 1.1 christos || !TEST_str_eq(SSL_CIPHER_get_name(sk_SSL_CIPHER_value(sk, 0)),
59 1.1 christos "AES128-SHA"))
60 1.1 christos goto err;
61 1.1 christos
62 1.1 christos ret = 1;
63 1.1 christos err:
64 1.1 christos sk_SSL_CIPHER_free(sk);
65 1.1 christos sk_SSL_CIPHER_free(scsv);
66 1.1 christos return ret;
67 1.1 christos }
68 1.1 christos
69 1.1 christos static int test_v2(void)
70 1.1 christos {
71 1.1 christos STACK_OF(SSL_CIPHER) *sk, *scsv;
72 1.1 christos /* ECDHE-ECDSA-AES256GCM, SSL2_RC4_1238_WITH_MD5,
73 1.1 christos * ECDHE-ECDSA-CHACHA20-POLY1305 */
74 1.1 christos const unsigned char bytes[] = {0x00, 0x00, 0x35, 0x01, 0x00, 0x80,
75 1.1 christos 0x00, 0x00, 0x33};
76 1.1 christos int ret = 0;
77 1.1 christos
78 1.1 christos if (!TEST_true(SSL_bytes_to_cipher_list(s, bytes, sizeof(bytes), 1,
79 1.1 christos &sk, &scsv))
80 1.1 christos || !TEST_ptr(sk)
81 1.1 christos || !TEST_int_eq(sk_SSL_CIPHER_num(sk), 2)
82 1.1 christos || !TEST_ptr(scsv)
83 1.1 christos || !TEST_int_eq(sk_SSL_CIPHER_num(scsv), 0))
84 1.1 christos goto err;
85 1.1 christos if (strcmp(SSL_CIPHER_get_name(sk_SSL_CIPHER_value(sk, 0)),
86 1.1 christos "AES256-SHA") != 0 ||
87 1.1 christos strcmp(SSL_CIPHER_get_name(sk_SSL_CIPHER_value(sk, 1)),
88 1.1 christos "DHE-RSA-AES128-SHA") != 0)
89 1.1 christos goto err;
90 1.1 christos
91 1.1 christos ret = 1;
92 1.1 christos
93 1.1 christos err:
94 1.1 christos sk_SSL_CIPHER_free(sk);
95 1.1 christos sk_SSL_CIPHER_free(scsv);
96 1.1 christos return ret;
97 1.1 christos }
98 1.1 christos
99 1.1 christos static int test_v3(void)
100 1.1 christos {
101 1.1 christos STACK_OF(SSL_CIPHER) *sk = NULL, *scsv = NULL;
102 1.1 christos /* ECDHE-ECDSA-AES256GCM, ECDHE-ECDSA-CHACHAPOLY, DHE-RSA-AES256GCM,
103 1.1 christos * EMPTY-RENEGOTIATION-INFO-SCSV, FALLBACK-SCSV */
104 1.1 christos const unsigned char bytes[] = {0x00, 0x2f, 0x00, 0x33, 0x00, 0x9f, 0x00, 0xff,
105 1.1 christos 0x56, 0x00};
106 1.1 christos int ret = 0;
107 1.1 christos
108 1.1 christos if (!SSL_bytes_to_cipher_list(s, bytes, sizeof(bytes), 0, &sk, &scsv)
109 1.1 christos || !TEST_ptr(sk)
110 1.1 christos || !TEST_int_eq(sk_SSL_CIPHER_num(sk), 3)
111 1.1 christos || !TEST_ptr(scsv)
112 1.1 christos || !TEST_int_eq(sk_SSL_CIPHER_num(scsv), 2)
113 1.1 christos || !TEST_str_eq(SSL_CIPHER_get_name(sk_SSL_CIPHER_value(sk, 0)),
114 1.1 christos "AES128-SHA")
115 1.1 christos || !TEST_str_eq(SSL_CIPHER_get_name(sk_SSL_CIPHER_value(sk, 1)),
116 1.1 christos "DHE-RSA-AES128-SHA")
117 1.1 christos || !TEST_str_eq(SSL_CIPHER_get_name(sk_SSL_CIPHER_value(sk, 2)),
118 1.1 christos "DHE-RSA-AES256-GCM-SHA384")
119 1.1 christos || !TEST_str_eq(SSL_CIPHER_get_name(sk_SSL_CIPHER_value(scsv, 0)),
120 1.1 christos "TLS_EMPTY_RENEGOTIATION_INFO_SCSV")
121 1.1 christos || !TEST_str_eq(SSL_CIPHER_get_name(sk_SSL_CIPHER_value(scsv, 1)),
122 1.1 christos "TLS_FALLBACK_SCSV"))
123 1.1 christos goto err;
124 1.1 christos
125 1.1 christos ret = 1;
126 1.1 christos err:
127 1.1 christos sk_SSL_CIPHER_free(sk);
128 1.1 christos sk_SSL_CIPHER_free(scsv);
129 1.1 christos return ret;
130 1.1 christos }
131 1.1 christos
132 1.1 christos int setup_tests(void)
133 1.1 christos {
134 1.1 christos if (!TEST_ptr(ctx = SSL_CTX_new(TLS_server_method()))
135 1.1 christos || !TEST_ptr(s = SSL_new(ctx)))
136 1.1 christos return 0;
137 1.1 christos
138 1.1 christos ADD_TEST(test_empty);
139 1.1 christos ADD_TEST(test_unsupported);
140 1.1 christos ADD_TEST(test_v2);
141 1.1 christos ADD_TEST(test_v3);
142 1.1 christos return 1;
143 1.1 christos }
144 1.1 christos
145 1.1 christos void cleanup_tests(void)
146 1.1 christos {
147 1.1 christos SSL_free(s);
148 1.1 christos SSL_CTX_free(ctx);
149 1.1 christos }
150