1e1051a39Sopenharmony_ci/* 2e1051a39Sopenharmony_ci * Copyright 1999-2021 The OpenSSL Project Authors. All Rights Reserved. 3e1051a39Sopenharmony_ci * 4e1051a39Sopenharmony_ci * Licensed under the Apache License 2.0 (the "License"). You may not use 5e1051a39Sopenharmony_ci * this file except in compliance with the License. You can obtain a copy 6e1051a39Sopenharmony_ci * in the file LICENSE in the source distribution or at 7e1051a39Sopenharmony_ci * https://www.openssl.org/source/license.html 8e1051a39Sopenharmony_ci */ 9e1051a39Sopenharmony_ci 10e1051a39Sopenharmony_ci/* Internal tests for the asn1 module */ 11e1051a39Sopenharmony_ci 12e1051a39Sopenharmony_ci/* 13e1051a39Sopenharmony_ci * RSA low level APIs are deprecated for public use, but still ok for 14e1051a39Sopenharmony_ci * internal use. 15e1051a39Sopenharmony_ci */ 16e1051a39Sopenharmony_ci#include "internal/deprecated.h" 17e1051a39Sopenharmony_ci 18e1051a39Sopenharmony_ci#include <stdio.h> 19e1051a39Sopenharmony_ci#include <string.h> 20e1051a39Sopenharmony_ci 21e1051a39Sopenharmony_ci#include <openssl/asn1.h> 22e1051a39Sopenharmony_ci#include <openssl/evp.h> 23e1051a39Sopenharmony_ci#include <openssl/objects.h> 24e1051a39Sopenharmony_ci#include "testutil.h" 25e1051a39Sopenharmony_ci#include "internal/nelem.h" 26e1051a39Sopenharmony_ci 27e1051a39Sopenharmony_ci/********************************************************************** 28e1051a39Sopenharmony_ci * 29e1051a39Sopenharmony_ci * Test of a_strnid's tbl_standard 30e1051a39Sopenharmony_ci * 31e1051a39Sopenharmony_ci ***/ 32e1051a39Sopenharmony_ci 33e1051a39Sopenharmony_ci#include "../crypto/asn1/tbl_standard.h" 34e1051a39Sopenharmony_ci 35e1051a39Sopenharmony_cistatic int test_tbl_standard(void) 36e1051a39Sopenharmony_ci{ 37e1051a39Sopenharmony_ci const ASN1_STRING_TABLE *tmp; 38e1051a39Sopenharmony_ci int last_nid = -1; 39e1051a39Sopenharmony_ci size_t i; 40e1051a39Sopenharmony_ci 41e1051a39Sopenharmony_ci for (tmp = tbl_standard, i = 0; i < OSSL_NELEM(tbl_standard); i++, tmp++) { 42e1051a39Sopenharmony_ci if (tmp->nid < last_nid) { 43e1051a39Sopenharmony_ci last_nid = 0; 44e1051a39Sopenharmony_ci break; 45e1051a39Sopenharmony_ci } 46e1051a39Sopenharmony_ci last_nid = tmp->nid; 47e1051a39Sopenharmony_ci } 48e1051a39Sopenharmony_ci 49e1051a39Sopenharmony_ci if (TEST_int_ne(last_nid, 0)) { 50e1051a39Sopenharmony_ci TEST_info("asn1 tbl_standard: Table order OK"); 51e1051a39Sopenharmony_ci return 1; 52e1051a39Sopenharmony_ci } 53e1051a39Sopenharmony_ci 54e1051a39Sopenharmony_ci TEST_info("asn1 tbl_standard: out of order"); 55e1051a39Sopenharmony_ci for (tmp = tbl_standard, i = 0; i < OSSL_NELEM(tbl_standard); i++, tmp++) 56e1051a39Sopenharmony_ci TEST_note("asn1 tbl_standard: Index %zu, NID %d, Name=%s", 57e1051a39Sopenharmony_ci i, tmp->nid, OBJ_nid2ln(tmp->nid)); 58e1051a39Sopenharmony_ci 59e1051a39Sopenharmony_ci return 0; 60e1051a39Sopenharmony_ci} 61e1051a39Sopenharmony_ci 62e1051a39Sopenharmony_ci/********************************************************************** 63e1051a39Sopenharmony_ci * 64e1051a39Sopenharmony_ci * Test of ameth_lib's standard_methods 65e1051a39Sopenharmony_ci * 66e1051a39Sopenharmony_ci ***/ 67e1051a39Sopenharmony_ci 68e1051a39Sopenharmony_ci#include "crypto/asn1.h" 69e1051a39Sopenharmony_ci#include "../crypto/asn1/standard_methods.h" 70e1051a39Sopenharmony_ci 71e1051a39Sopenharmony_cistatic int test_standard_methods(void) 72e1051a39Sopenharmony_ci{ 73e1051a39Sopenharmony_ci const EVP_PKEY_ASN1_METHOD **tmp; 74e1051a39Sopenharmony_ci int last_pkey_id = -1; 75e1051a39Sopenharmony_ci size_t i; 76e1051a39Sopenharmony_ci int ok = 1; 77e1051a39Sopenharmony_ci 78e1051a39Sopenharmony_ci for (tmp = standard_methods, i = 0; i < OSSL_NELEM(standard_methods); 79e1051a39Sopenharmony_ci i++, tmp++) { 80e1051a39Sopenharmony_ci if ((*tmp)->pkey_id < last_pkey_id) { 81e1051a39Sopenharmony_ci last_pkey_id = 0; 82e1051a39Sopenharmony_ci break; 83e1051a39Sopenharmony_ci } 84e1051a39Sopenharmony_ci last_pkey_id = (*tmp)->pkey_id; 85e1051a39Sopenharmony_ci 86e1051a39Sopenharmony_ci /* 87e1051a39Sopenharmony_ci * One of the following must be true: 88e1051a39Sopenharmony_ci * 89e1051a39Sopenharmony_ci * pem_str == NULL AND ASN1_PKEY_ALIAS is set 90e1051a39Sopenharmony_ci * pem_str != NULL AND ASN1_PKEY_ALIAS is clear 91e1051a39Sopenharmony_ci * 92e1051a39Sopenharmony_ci * Anything else is an error and may lead to a corrupt ASN1 method table 93e1051a39Sopenharmony_ci */ 94e1051a39Sopenharmony_ci if (!TEST_true(((*tmp)->pem_str == NULL && ((*tmp)->pkey_flags & ASN1_PKEY_ALIAS) != 0) 95e1051a39Sopenharmony_ci || ((*tmp)->pem_str != NULL && ((*tmp)->pkey_flags & ASN1_PKEY_ALIAS) == 0))) { 96e1051a39Sopenharmony_ci TEST_note("asn1 standard methods: Index %zu, pkey ID %d, Name=%s", 97e1051a39Sopenharmony_ci i, (*tmp)->pkey_id, OBJ_nid2sn((*tmp)->pkey_id)); 98e1051a39Sopenharmony_ci ok = 0; 99e1051a39Sopenharmony_ci } 100e1051a39Sopenharmony_ci } 101e1051a39Sopenharmony_ci 102e1051a39Sopenharmony_ci if (TEST_int_ne(last_pkey_id, 0)) { 103e1051a39Sopenharmony_ci TEST_info("asn1 standard methods: Table order OK"); 104e1051a39Sopenharmony_ci return ok; 105e1051a39Sopenharmony_ci } 106e1051a39Sopenharmony_ci 107e1051a39Sopenharmony_ci TEST_note("asn1 standard methods: out of order"); 108e1051a39Sopenharmony_ci for (tmp = standard_methods, i = 0; i < OSSL_NELEM(standard_methods); 109e1051a39Sopenharmony_ci i++, tmp++) 110e1051a39Sopenharmony_ci TEST_note("asn1 standard methods: Index %zu, pkey ID %d, Name=%s", 111e1051a39Sopenharmony_ci i, (*tmp)->pkey_id, OBJ_nid2sn((*tmp)->pkey_id)); 112e1051a39Sopenharmony_ci 113e1051a39Sopenharmony_ci return 0; 114e1051a39Sopenharmony_ci} 115e1051a39Sopenharmony_ci 116e1051a39Sopenharmony_ci/********************************************************************** 117e1051a39Sopenharmony_ci * 118e1051a39Sopenharmony_ci * Test of that i2d fail on non-existing non-optional items 119e1051a39Sopenharmony_ci * 120e1051a39Sopenharmony_ci ***/ 121e1051a39Sopenharmony_ci 122e1051a39Sopenharmony_ci#include <openssl/rsa.h> 123e1051a39Sopenharmony_ci 124e1051a39Sopenharmony_cistatic int test_empty_nonoptional_content(void) 125e1051a39Sopenharmony_ci{ 126e1051a39Sopenharmony_ci RSA *rsa = NULL; 127e1051a39Sopenharmony_ci BIGNUM *n = NULL; 128e1051a39Sopenharmony_ci BIGNUM *e = NULL; 129e1051a39Sopenharmony_ci int ok = 0; 130e1051a39Sopenharmony_ci 131e1051a39Sopenharmony_ci if (!TEST_ptr(rsa = RSA_new()) 132e1051a39Sopenharmony_ci || !TEST_ptr(n = BN_new()) 133e1051a39Sopenharmony_ci || !TEST_ptr(e = BN_new()) 134e1051a39Sopenharmony_ci || !TEST_true(RSA_set0_key(rsa, n, e, NULL))) 135e1051a39Sopenharmony_ci goto end; 136e1051a39Sopenharmony_ci 137e1051a39Sopenharmony_ci n = e = NULL; /* They are now "owned" by |rsa| */ 138e1051a39Sopenharmony_ci 139e1051a39Sopenharmony_ci /* 140e1051a39Sopenharmony_ci * This SHOULD fail, as we're trying to encode a public key as a private 141e1051a39Sopenharmony_ci * key. The private key bits MUST be present for a proper RSAPrivateKey. 142e1051a39Sopenharmony_ci */ 143e1051a39Sopenharmony_ci if (TEST_int_le(i2d_RSAPrivateKey(rsa, NULL), 0)) 144e1051a39Sopenharmony_ci ok = 1; 145e1051a39Sopenharmony_ci 146e1051a39Sopenharmony_ci end: 147e1051a39Sopenharmony_ci RSA_free(rsa); 148e1051a39Sopenharmony_ci BN_free(n); 149e1051a39Sopenharmony_ci BN_free(e); 150e1051a39Sopenharmony_ci return ok; 151e1051a39Sopenharmony_ci} 152e1051a39Sopenharmony_ci 153e1051a39Sopenharmony_ci/********************************************************************** 154e1051a39Sopenharmony_ci * 155e1051a39Sopenharmony_ci * Tests of the Unicode code point range 156e1051a39Sopenharmony_ci * 157e1051a39Sopenharmony_ci ***/ 158e1051a39Sopenharmony_ci 159e1051a39Sopenharmony_cistatic int test_unicode(const unsigned char *univ, size_t len, int expected) 160e1051a39Sopenharmony_ci{ 161e1051a39Sopenharmony_ci const unsigned char *end = univ + len; 162e1051a39Sopenharmony_ci int ok = 1; 163e1051a39Sopenharmony_ci 164e1051a39Sopenharmony_ci for (; univ < end; univ += 4) { 165e1051a39Sopenharmony_ci if (!TEST_int_eq(ASN1_mbstring_copy(NULL, univ, 4, MBSTRING_UNIV, 166e1051a39Sopenharmony_ci B_ASN1_UTF8STRING), 167e1051a39Sopenharmony_ci expected)) 168e1051a39Sopenharmony_ci ok = 0; 169e1051a39Sopenharmony_ci } 170e1051a39Sopenharmony_ci return ok; 171e1051a39Sopenharmony_ci} 172e1051a39Sopenharmony_ci 173e1051a39Sopenharmony_cistatic int test_unicode_range(void) 174e1051a39Sopenharmony_ci{ 175e1051a39Sopenharmony_ci const unsigned char univ_ok[] = "\0\0\0\0" 176e1051a39Sopenharmony_ci "\0\0\xd7\xff" 177e1051a39Sopenharmony_ci "\0\0\xe0\x00" 178e1051a39Sopenharmony_ci "\0\x10\xff\xff"; 179e1051a39Sopenharmony_ci const unsigned char univ_bad[] = "\0\0\xd8\x00" 180e1051a39Sopenharmony_ci "\0\0\xdf\xff" 181e1051a39Sopenharmony_ci "\0\x11\x00\x00" 182e1051a39Sopenharmony_ci "\x80\x00\x00\x00" 183e1051a39Sopenharmony_ci "\xff\xff\xff\xff"; 184e1051a39Sopenharmony_ci int ok = 1; 185e1051a39Sopenharmony_ci 186e1051a39Sopenharmony_ci if (!test_unicode(univ_ok, sizeof univ_ok - 1, V_ASN1_UTF8STRING)) 187e1051a39Sopenharmony_ci ok = 0; 188e1051a39Sopenharmony_ci if (!test_unicode(univ_bad, sizeof univ_bad - 1, -1)) 189e1051a39Sopenharmony_ci ok = 0; 190e1051a39Sopenharmony_ci return ok; 191e1051a39Sopenharmony_ci} 192e1051a39Sopenharmony_ci 193e1051a39Sopenharmony_ciint setup_tests(void) 194e1051a39Sopenharmony_ci{ 195e1051a39Sopenharmony_ci ADD_TEST(test_tbl_standard); 196e1051a39Sopenharmony_ci ADD_TEST(test_standard_methods); 197e1051a39Sopenharmony_ci ADD_TEST(test_empty_nonoptional_content); 198e1051a39Sopenharmony_ci ADD_TEST(test_unicode_range); 199e1051a39Sopenharmony_ci return 1; 200e1051a39Sopenharmony_ci} 201