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