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