1 /* 2 * Copyright 2015-2024 The OpenSSL Project Authors. All Rights Reserved. 3 * 4 * Licensed under the Apache License 2.0 (the "License"). You may not use 5 * this file except in compliance with the License. You can obtain a copy 6 * in the file LICENSE in the source distribution or at 7 * https://www.openssl.org/source/license.html 8 */ 9 10 /* We need to use some deprecated APIs */ 11 #define OPENSSL_SUPPRESS_DEPRECATED 12 13 /* 14 * Really these tests should be in evp_extra_test - but that doesn't 15 * yet support testing with a non-default libctx. Once it does we should move 16 * everything into one file. Consequently some things are duplicated between 17 * the two files. 18 */ 19 20 #include <openssl/evp.h> 21 #include <openssl/pem.h> 22 #include <openssl/provider.h> 23 #include <openssl/rsa.h> 24 #include <openssl/dh.h> 25 #include <openssl/core_names.h> 26 #include <openssl/ui.h> 27 28 #include "testutil.h" 29 #include "internal/nelem.h" 30 #include "crypto/evp.h" 31 #include "../crypto/evp/evp_local.h" 32 33 /* Defined in tls-provider.c */ 34 int tls_provider_init(const OSSL_CORE_HANDLE *handle, 35 const OSSL_DISPATCH *in, 36 const OSSL_DISPATCH **out, 37 void **provctx); 38 39 static OSSL_LIB_CTX *mainctx = NULL; 40 static OSSL_PROVIDER *nullprov = NULL; 41 42 /* 43 * kExampleRSAKeyDER is an RSA private key in ASN.1, DER format. Of course, you 44 * should never use this key anywhere but in an example. 45 */ 46 static const unsigned char kExampleRSAKeyDER[] = { 47 0x30, 0x82, 0x02, 0x5c, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81, 0x00, 0xf8, 48 0xb8, 0x6c, 0x83, 0xb4, 0xbc, 0xd9, 0xa8, 0x57, 0xc0, 0xa5, 0xb4, 0x59, 49 0x76, 0x8c, 0x54, 0x1d, 0x79, 0xeb, 0x22, 0x52, 0x04, 0x7e, 0xd3, 0x37, 50 0xeb, 0x41, 0xfd, 0x83, 0xf9, 0xf0, 0xa6, 0x85, 0x15, 0x34, 0x75, 0x71, 51 0x5a, 0x84, 0xa8, 0x3c, 0xd2, 0xef, 0x5a, 0x4e, 0xd3, 0xde, 0x97, 0x8a, 52 0xdd, 0xff, 0xbb, 0xcf, 0x0a, 0xaa, 0x86, 0x92, 0xbe, 0xb8, 0x50, 0xe4, 53 0xcd, 0x6f, 0x80, 0x33, 0x30, 0x76, 0x13, 0x8f, 0xca, 0x7b, 0xdc, 0xec, 54 0x5a, 0xca, 0x63, 0xc7, 0x03, 0x25, 0xef, 0xa8, 0x8a, 0x83, 0x58, 0x76, 55 0x20, 0xfa, 0x16, 0x77, 0xd7, 0x79, 0x92, 0x63, 0x01, 0x48, 0x1a, 0xd8, 56 0x7b, 0x67, 0xf1, 0x52, 0x55, 0x49, 0x4e, 0xd6, 0x6e, 0x4a, 0x5c, 0xd7, 57 0x7a, 0x37, 0x36, 0x0c, 0xde, 0xdd, 0x8f, 0x44, 0xe8, 0xc2, 0xa7, 0x2c, 58 0x2b, 0xb5, 0xaf, 0x64, 0x4b, 0x61, 0x07, 0x02, 0x03, 0x01, 0x00, 0x01, 59 0x02, 0x81, 0x80, 0x74, 0x88, 0x64, 0x3f, 0x69, 0x45, 0x3a, 0x6d, 0xc7, 60 0x7f, 0xb9, 0xa3, 0xc0, 0x6e, 0xec, 0xdc, 0xd4, 0x5a, 0xb5, 0x32, 0x85, 61 0x5f, 0x19, 0xd4, 0xf8, 0xd4, 0x3f, 0x3c, 0xfa, 0xc2, 0xf6, 0x5f, 0xee, 62 0xe6, 0xba, 0x87, 0x74, 0x2e, 0xc7, 0x0c, 0xd4, 0x42, 0xb8, 0x66, 0x85, 63 0x9c, 0x7b, 0x24, 0x61, 0xaa, 0x16, 0x11, 0xf6, 0xb5, 0xb6, 0xa4, 0x0a, 64 0xc9, 0x55, 0x2e, 0x81, 0xa5, 0x47, 0x61, 0xcb, 0x25, 0x8f, 0xc2, 0x15, 65 0x7b, 0x0e, 0x7c, 0x36, 0x9f, 0x3a, 0xda, 0x58, 0x86, 0x1c, 0x5b, 0x83, 66 0x79, 0xe6, 0x2b, 0xcc, 0xe6, 0xfa, 0x2c, 0x61, 0xf2, 0x78, 0x80, 0x1b, 67 0xe2, 0xf3, 0x9d, 0x39, 0x2b, 0x65, 0x57, 0x91, 0x3d, 0x71, 0x99, 0x73, 68 0xa5, 0xc2, 0x79, 0x20, 0x8c, 0x07, 0x4f, 0xe5, 0xb4, 0x60, 0x1f, 0x99, 69 0xa2, 0xb1, 0x4f, 0x0c, 0xef, 0xbc, 0x59, 0x53, 0x00, 0x7d, 0xb1, 0x02, 70 0x41, 0x00, 0xfc, 0x7e, 0x23, 0x65, 0x70, 0xf8, 0xce, 0xd3, 0x40, 0x41, 71 0x80, 0x6a, 0x1d, 0x01, 0xd6, 0x01, 0xff, 0xb6, 0x1b, 0x3d, 0x3d, 0x59, 72 0x09, 0x33, 0x79, 0xc0, 0x4f, 0xde, 0x96, 0x27, 0x4b, 0x18, 0xc6, 0xd9, 73 0x78, 0xf1, 0xf4, 0x35, 0x46, 0xe9, 0x7c, 0x42, 0x7a, 0x5d, 0x9f, 0xef, 74 0x54, 0xb8, 0xf7, 0x9f, 0xc4, 0x33, 0x6c, 0xf3, 0x8c, 0x32, 0x46, 0x87, 75 0x67, 0x30, 0x7b, 0xa7, 0xac, 0xe3, 0x02, 0x41, 0x00, 0xfc, 0x2c, 0xdf, 76 0x0c, 0x0d, 0x88, 0xf5, 0xb1, 0x92, 0xa8, 0x93, 0x47, 0x63, 0x55, 0xf5, 77 0xca, 0x58, 0x43, 0xba, 0x1c, 0xe5, 0x9e, 0xb6, 0x95, 0x05, 0xcd, 0xb5, 78 0x82, 0xdf, 0xeb, 0x04, 0x53, 0x9d, 0xbd, 0xc2, 0x38, 0x16, 0xb3, 0x62, 79 0xdd, 0xa1, 0x46, 0xdb, 0x6d, 0x97, 0x93, 0x9f, 0x8a, 0xc3, 0x9b, 0x64, 80 0x7e, 0x42, 0xe3, 0x32, 0x57, 0x19, 0x1b, 0xd5, 0x6e, 0x85, 0xfa, 0xb8, 81 0x8d, 0x02, 0x41, 0x00, 0xbc, 0x3d, 0xde, 0x6d, 0xd6, 0x97, 0xe8, 0xba, 82 0x9e, 0x81, 0x37, 0x17, 0xe5, 0xa0, 0x64, 0xc9, 0x00, 0xb7, 0xe7, 0xfe, 83 0xf4, 0x29, 0xd9, 0x2e, 0x43, 0x6b, 0x19, 0x20, 0xbd, 0x99, 0x75, 0xe7, 84 0x76, 0xf8, 0xd3, 0xae, 0xaf, 0x7e, 0xb8, 0xeb, 0x81, 0xf4, 0x9d, 0xfe, 85 0x07, 0x2b, 0x0b, 0x63, 0x0b, 0x5a, 0x55, 0x90, 0x71, 0x7d, 0xf1, 0xdb, 86 0xd9, 0xb1, 0x41, 0x41, 0x68, 0x2f, 0x4e, 0x39, 0x02, 0x40, 0x5a, 0x34, 87 0x66, 0xd8, 0xf5, 0xe2, 0x7f, 0x18, 0xb5, 0x00, 0x6e, 0x26, 0x84, 0x27, 88 0x14, 0x93, 0xfb, 0xfc, 0xc6, 0x0f, 0x5e, 0x27, 0xe6, 0xe1, 0xe9, 0xc0, 89 0x8a, 0xe4, 0x34, 0xda, 0xe9, 0xa2, 0x4b, 0x73, 0xbc, 0x8c, 0xb9, 0xba, 90 0x13, 0x6c, 0x7a, 0x2b, 0x51, 0x84, 0xa3, 0x4a, 0xe0, 0x30, 0x10, 0x06, 91 0x7e, 0xed, 0x17, 0x5a, 0x14, 0x00, 0xc9, 0xef, 0x85, 0xea, 0x52, 0x2c, 92 0xbc, 0x65, 0x02, 0x40, 0x51, 0xe3, 0xf2, 0x83, 0x19, 0x9b, 0xc4, 0x1e, 93 0x2f, 0x50, 0x3d, 0xdf, 0x5a, 0xa2, 0x18, 0xca, 0x5f, 0x2e, 0x49, 0xaf, 94 0x6f, 0xcc, 0xfa, 0x65, 0x77, 0x94, 0xb5, 0xa1, 0x0a, 0xa9, 0xd1, 0x8a, 95 0x39, 0x37, 0xf4, 0x0b, 0xa0, 0xd7, 0x82, 0x27, 0x5e, 0xae, 0x17, 0x17, 96 0xa1, 0x1e, 0x54, 0x34, 0xbf, 0x6e, 0xc4, 0x8e, 0x99, 0x5d, 0x08, 0xf1, 97 0x2d, 0x86, 0x9d, 0xa5, 0x20, 0x1b, 0xe5, 0xdf, 98 }; 99 100 /* 101 * kExampleRSAKeyPKCS8 is kExampleRSAKeyDER encoded in a PKCS #8 102 * PrivateKeyInfo. 103 */ 104 static const unsigned char kExampleRSAKeyPKCS8[] = { 105 0x30, 0x82, 0x02, 0x76, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 106 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, 107 0x02, 0x60, 0x30, 0x82, 0x02, 0x5c, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81, 108 0x00, 0xf8, 0xb8, 0x6c, 0x83, 0xb4, 0xbc, 0xd9, 0xa8, 0x57, 0xc0, 0xa5, 109 0xb4, 0x59, 0x76, 0x8c, 0x54, 0x1d, 0x79, 0xeb, 0x22, 0x52, 0x04, 0x7e, 110 0xd3, 0x37, 0xeb, 0x41, 0xfd, 0x83, 0xf9, 0xf0, 0xa6, 0x85, 0x15, 0x34, 111 0x75, 0x71, 0x5a, 0x84, 0xa8, 0x3c, 0xd2, 0xef, 0x5a, 0x4e, 0xd3, 0xde, 112 0x97, 0x8a, 0xdd, 0xff, 0xbb, 0xcf, 0x0a, 0xaa, 0x86, 0x92, 0xbe, 0xb8, 113 0x50, 0xe4, 0xcd, 0x6f, 0x80, 0x33, 0x30, 0x76, 0x13, 0x8f, 0xca, 0x7b, 114 0xdc, 0xec, 0x5a, 0xca, 0x63, 0xc7, 0x03, 0x25, 0xef, 0xa8, 0x8a, 0x83, 115 0x58, 0x76, 0x20, 0xfa, 0x16, 0x77, 0xd7, 0x79, 0x92, 0x63, 0x01, 0x48, 116 0x1a, 0xd8, 0x7b, 0x67, 0xf1, 0x52, 0x55, 0x49, 0x4e, 0xd6, 0x6e, 0x4a, 117 0x5c, 0xd7, 0x7a, 0x37, 0x36, 0x0c, 0xde, 0xdd, 0x8f, 0x44, 0xe8, 0xc2, 118 0xa7, 0x2c, 0x2b, 0xb5, 0xaf, 0x64, 0x4b, 0x61, 0x07, 0x02, 0x03, 0x01, 119 0x00, 0x01, 0x02, 0x81, 0x80, 0x74, 0x88, 0x64, 0x3f, 0x69, 0x45, 0x3a, 120 0x6d, 0xc7, 0x7f, 0xb9, 0xa3, 0xc0, 0x6e, 0xec, 0xdc, 0xd4, 0x5a, 0xb5, 121 0x32, 0x85, 0x5f, 0x19, 0xd4, 0xf8, 0xd4, 0x3f, 0x3c, 0xfa, 0xc2, 0xf6, 122 0x5f, 0xee, 0xe6, 0xba, 0x87, 0x74, 0x2e, 0xc7, 0x0c, 0xd4, 0x42, 0xb8, 123 0x66, 0x85, 0x9c, 0x7b, 0x24, 0x61, 0xaa, 0x16, 0x11, 0xf6, 0xb5, 0xb6, 124 0xa4, 0x0a, 0xc9, 0x55, 0x2e, 0x81, 0xa5, 0x47, 0x61, 0xcb, 0x25, 0x8f, 125 0xc2, 0x15, 0x7b, 0x0e, 0x7c, 0x36, 0x9f, 0x3a, 0xda, 0x58, 0x86, 0x1c, 126 0x5b, 0x83, 0x79, 0xe6, 0x2b, 0xcc, 0xe6, 0xfa, 0x2c, 0x61, 0xf2, 0x78, 127 0x80, 0x1b, 0xe2, 0xf3, 0x9d, 0x39, 0x2b, 0x65, 0x57, 0x91, 0x3d, 0x71, 128 0x99, 0x73, 0xa5, 0xc2, 0x79, 0x20, 0x8c, 0x07, 0x4f, 0xe5, 0xb4, 0x60, 129 0x1f, 0x99, 0xa2, 0xb1, 0x4f, 0x0c, 0xef, 0xbc, 0x59, 0x53, 0x00, 0x7d, 130 0xb1, 0x02, 0x41, 0x00, 0xfc, 0x7e, 0x23, 0x65, 0x70, 0xf8, 0xce, 0xd3, 131 0x40, 0x41, 0x80, 0x6a, 0x1d, 0x01, 0xd6, 0x01, 0xff, 0xb6, 0x1b, 0x3d, 132 0x3d, 0x59, 0x09, 0x33, 0x79, 0xc0, 0x4f, 0xde, 0x96, 0x27, 0x4b, 0x18, 133 0xc6, 0xd9, 0x78, 0xf1, 0xf4, 0x35, 0x46, 0xe9, 0x7c, 0x42, 0x7a, 0x5d, 134 0x9f, 0xef, 0x54, 0xb8, 0xf7, 0x9f, 0xc4, 0x33, 0x6c, 0xf3, 0x8c, 0x32, 135 0x46, 0x87, 0x67, 0x30, 0x7b, 0xa7, 0xac, 0xe3, 0x02, 0x41, 0x00, 0xfc, 136 0x2c, 0xdf, 0x0c, 0x0d, 0x88, 0xf5, 0xb1, 0x92, 0xa8, 0x93, 0x47, 0x63, 137 0x55, 0xf5, 0xca, 0x58, 0x43, 0xba, 0x1c, 0xe5, 0x9e, 0xb6, 0x95, 0x05, 138 0xcd, 0xb5, 0x82, 0xdf, 0xeb, 0x04, 0x53, 0x9d, 0xbd, 0xc2, 0x38, 0x16, 139 0xb3, 0x62, 0xdd, 0xa1, 0x46, 0xdb, 0x6d, 0x97, 0x93, 0x9f, 0x8a, 0xc3, 140 0x9b, 0x64, 0x7e, 0x42, 0xe3, 0x32, 0x57, 0x19, 0x1b, 0xd5, 0x6e, 0x85, 141 0xfa, 0xb8, 0x8d, 0x02, 0x41, 0x00, 0xbc, 0x3d, 0xde, 0x6d, 0xd6, 0x97, 142 0xe8, 0xba, 0x9e, 0x81, 0x37, 0x17, 0xe5, 0xa0, 0x64, 0xc9, 0x00, 0xb7, 143 0xe7, 0xfe, 0xf4, 0x29, 0xd9, 0x2e, 0x43, 0x6b, 0x19, 0x20, 0xbd, 0x99, 144 0x75, 0xe7, 0x76, 0xf8, 0xd3, 0xae, 0xaf, 0x7e, 0xb8, 0xeb, 0x81, 0xf4, 145 0x9d, 0xfe, 0x07, 0x2b, 0x0b, 0x63, 0x0b, 0x5a, 0x55, 0x90, 0x71, 0x7d, 146 0xf1, 0xdb, 0xd9, 0xb1, 0x41, 0x41, 0x68, 0x2f, 0x4e, 0x39, 0x02, 0x40, 147 0x5a, 0x34, 0x66, 0xd8, 0xf5, 0xe2, 0x7f, 0x18, 0xb5, 0x00, 0x6e, 0x26, 148 0x84, 0x27, 0x14, 0x93, 0xfb, 0xfc, 0xc6, 0x0f, 0x5e, 0x27, 0xe6, 0xe1, 149 0xe9, 0xc0, 0x8a, 0xe4, 0x34, 0xda, 0xe9, 0xa2, 0x4b, 0x73, 0xbc, 0x8c, 150 0xb9, 0xba, 0x13, 0x6c, 0x7a, 0x2b, 0x51, 0x84, 0xa3, 0x4a, 0xe0, 0x30, 151 0x10, 0x06, 0x7e, 0xed, 0x17, 0x5a, 0x14, 0x00, 0xc9, 0xef, 0x85, 0xea, 152 0x52, 0x2c, 0xbc, 0x65, 0x02, 0x40, 0x51, 0xe3, 0xf2, 0x83, 0x19, 0x9b, 153 0xc4, 0x1e, 0x2f, 0x50, 0x3d, 0xdf, 0x5a, 0xa2, 0x18, 0xca, 0x5f, 0x2e, 154 0x49, 0xaf, 0x6f, 0xcc, 0xfa, 0x65, 0x77, 0x94, 0xb5, 0xa1, 0x0a, 0xa9, 155 0xd1, 0x8a, 0x39, 0x37, 0xf4, 0x0b, 0xa0, 0xd7, 0x82, 0x27, 0x5e, 0xae, 156 0x17, 0x17, 0xa1, 0x1e, 0x54, 0x34, 0xbf, 0x6e, 0xc4, 0x8e, 0x99, 0x5d, 157 0x08, 0xf1, 0x2d, 0x86, 0x9d, 0xa5, 0x20, 0x1b, 0xe5, 0xdf, 158 }; 159 160 #ifndef OPENSSL_NO_DH 161 static const unsigned char kExampleDHPrivateKeyDER[] = { 162 0x30, 0x82, 0x02, 0x26, 0x02, 0x01, 0x00, 0x30, 0x82, 0x01, 0x17, 0x06, 163 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x03, 0x01, 0x30, 0x82, 164 0x01, 0x08, 0x02, 0x82, 0x01, 0x01, 0x00, 0xD8, 0x4B, 0x0F, 0x0E, 0x6B, 165 0x79, 0xE9, 0x23, 0x4E, 0xE4, 0xBE, 0x9A, 0x8F, 0x7A, 0x5C, 0xA3, 0x20, 166 0xD0, 0x86, 0x6B, 0x95, 0x78, 0x39, 0x59, 0x7A, 0x11, 0x2A, 0x5B, 0x87, 167 0xA4, 0xFB, 0x2F, 0x99, 0xD0, 0x57, 0xF5, 0xE1, 0xA3, 0xAF, 0x41, 0xD1, 168 0xCD, 0xA3, 0x94, 0xBB, 0xE5, 0x5A, 0x68, 0xE2, 0xEE, 0x69, 0x56, 0x51, 169 0xB2, 0xEE, 0xF2, 0xFE, 0x10, 0xC9, 0x55, 0xE3, 0x82, 0x3C, 0x50, 0x0D, 170 0xF5, 0x82, 0x73, 0xE4, 0xD6, 0x3E, 0x45, 0xB4, 0x89, 0x80, 0xE4, 0xF0, 171 0x99, 0x85, 0x2B, 0x4B, 0xF9, 0xB8, 0xFD, 0x2C, 0x3C, 0x49, 0x2E, 0xB3, 172 0x56, 0x7E, 0x99, 0x07, 0xD3, 0xF7, 0xD9, 0xE4, 0x0C, 0x64, 0xC5, 0x7D, 173 0x03, 0x8E, 0x05, 0x3C, 0x0A, 0x40, 0x17, 0xAD, 0xA8, 0x0F, 0x9B, 0xF4, 174 0x8B, 0xA7, 0xDB, 0x16, 0x4F, 0x4A, 0x57, 0x0B, 0x89, 0x80, 0x0B, 0x9F, 175 0x26, 0x56, 0x3F, 0x1D, 0xFA, 0x52, 0x2D, 0x1A, 0x9E, 0xDC, 0x42, 0xA3, 176 0x2E, 0xA9, 0x87, 0xE3, 0x8B, 0x45, 0x5E, 0xEE, 0x99, 0xB8, 0x30, 0x15, 177 0x58, 0xA3, 0x5F, 0xB5, 0x69, 0xD8, 0x0C, 0xE8, 0x6B, 0x36, 0xD8, 0xAB, 178 0xD8, 0xE4, 0x77, 0x46, 0x13, 0xA2, 0x15, 0xB3, 0x9C, 0xAD, 0x99, 0x91, 179 0xE5, 0xA3, 0x30, 0x7D, 0x40, 0x70, 0xB3, 0x32, 0x5E, 0xAF, 0x96, 0x8D, 180 0xE6, 0x3F, 0x47, 0xA3, 0x18, 0xDA, 0xE1, 0x9A, 0x20, 0x11, 0xE1, 0x49, 181 0x51, 0x45, 0xE3, 0x8C, 0xA5, 0x56, 0x39, 0x67, 0xCB, 0x9D, 0xCF, 0xBA, 182 0xF4, 0x46, 0x4E, 0x0A, 0xB6, 0x0B, 0xA9, 0xB4, 0xF6, 0xF1, 0x6A, 0xC8, 183 0x63, 0xE2, 0xB4, 0xB2, 0x9F, 0x44, 0xAA, 0x0A, 0xDA, 0x53, 0xF7, 0x52, 184 0x14, 0x57, 0xEE, 0x2C, 0x5D, 0x31, 0x9C, 0x27, 0x03, 0x64, 0x9E, 0xC0, 185 0x1E, 0x4B, 0x1B, 0x4F, 0xEE, 0xA6, 0x3F, 0xC1, 0x3E, 0x61, 0x93, 0x02, 186 0x01, 0x02, 0x04, 0x82, 0x01, 0x04, 0x02, 0x82, 0x01, 0x00, 0x7E, 0xC2, 187 0x04, 0xF9, 0x95, 0xC7, 0xEF, 0x96, 0xBE, 0xA0, 0x9D, 0x2D, 0xC3, 0x0C, 188 0x3A, 0x67, 0x02, 0x7C, 0x7D, 0x3B, 0xC9, 0xB1, 0xDE, 0x13, 0x97, 0x64, 189 0xEF, 0x87, 0x80, 0x4F, 0xBF, 0xA2, 0xAC, 0x18, 0x6B, 0xD5, 0xB2, 0x42, 190 0x0F, 0xDA, 0x28, 0x40, 0x93, 0x40, 0xB2, 0x1E, 0x80, 0xB0, 0x6C, 0xDE, 191 0x9C, 0x54, 0xA4, 0xB4, 0x68, 0x29, 0xE0, 0x13, 0x57, 0x1D, 0xC9, 0x87, 192 0xC0, 0xDE, 0x2F, 0x1D, 0x72, 0xF0, 0xC0, 0xE4, 0x4E, 0x04, 0x48, 0xF5, 193 0x2D, 0x8D, 0x9A, 0x1B, 0xE5, 0xEB, 0x06, 0xAB, 0x7C, 0x74, 0x10, 0x3C, 194 0xA8, 0x2D, 0x39, 0xBC, 0xE3, 0x15, 0x3E, 0x63, 0x37, 0x8C, 0x1B, 0xF1, 195 0xB3, 0x99, 0xB6, 0xAE, 0x5A, 0xEB, 0xB3, 0x3D, 0x30, 0x39, 0x69, 0xDB, 196 0xF2, 0x4F, 0x94, 0xB7, 0x71, 0xAF, 0xBA, 0x5C, 0x1F, 0xF8, 0x6B, 0xE5, 197 0xD1, 0xB1, 0x00, 0x81, 0xE2, 0x6D, 0xEC, 0x65, 0xF7, 0x7E, 0xCE, 0x03, 198 0x84, 0x68, 0x42, 0x6A, 0x8B, 0x47, 0x8E, 0x4A, 0x88, 0xDE, 0x82, 0xDD, 199 0xAF, 0xA9, 0x6F, 0x18, 0xF7, 0xC6, 0xE2, 0xB9, 0x97, 0xCE, 0x47, 0x8F, 200 0x85, 0x19, 0x61, 0x42, 0x67, 0x21, 0x7D, 0x13, 0x6E, 0xB5, 0x5A, 0x62, 201 0xF3, 0x08, 0xE2, 0x70, 0x3B, 0x0E, 0x85, 0x3C, 0xA1, 0xD3, 0xED, 0x7A, 202 0x43, 0xD6, 0xDE, 0x30, 0x5C, 0x48, 0xB2, 0x99, 0xAB, 0x3E, 0x65, 0xA6, 203 0x66, 0x80, 0x22, 0xFF, 0x92, 0xC1, 0x42, 0x1C, 0x30, 0x87, 0x74, 0x1E, 204 0x53, 0x57, 0x7C, 0xF8, 0x77, 0x51, 0xF1, 0x74, 0x16, 0xF4, 0x45, 0x26, 205 0x77, 0x0A, 0x05, 0x96, 0x13, 0x12, 0x06, 0x86, 0x2B, 0xB8, 0x49, 0x82, 206 0x69, 0x43, 0x0A, 0x57, 0xA7, 0x30, 0x19, 0x4C, 0xB8, 0x47, 0x82, 0x6E, 207 0x64, 0x7A, 0x06, 0x13, 0x5A, 0x82, 0x98, 0xD6, 0x7A, 0x09, 0xEC, 0x03, 208 0x8D, 0x03 209 }; 210 #endif /* OPENSSL_NO_DH */ 211 212 #ifndef OPENSSL_NO_EC 213 /* 214 * kExampleECKeyDER is a sample EC private key encoded as an ECPrivateKey 215 * structure. 216 */ 217 static const unsigned char kExampleECKeyDER[] = { 218 0x30, 0x77, 0x02, 0x01, 0x01, 0x04, 0x20, 0x07, 0x0f, 0x08, 0x72, 0x7a, 219 0xd4, 0xa0, 0x4a, 0x9c, 0xdd, 0x59, 0xc9, 0x4d, 0x89, 0x68, 0x77, 0x08, 220 0xb5, 0x6f, 0xc9, 0x5d, 0x30, 0x77, 0x0e, 0xe8, 0xd1, 0xc9, 0xce, 0x0a, 221 0x8b, 0xb4, 0x6a, 0xa0, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 222 0x03, 0x01, 0x07, 0xa1, 0x44, 0x03, 0x42, 0x00, 0x04, 0xe6, 0x2b, 0x69, 223 0xe2, 0xbf, 0x65, 0x9f, 0x97, 0xbe, 0x2f, 0x1e, 0x0d, 0x94, 0x8a, 0x4c, 224 0xd5, 0x97, 0x6b, 0xb7, 0xa9, 0x1e, 0x0d, 0x46, 0xfb, 0xdd, 0xa9, 0xa9, 225 0x1e, 0x9d, 0xdc, 0xba, 0x5a, 0x01, 0xe7, 0xd6, 0x97, 0xa8, 0x0a, 0x18, 226 0xf9, 0xc3, 0xc4, 0xa3, 0x1e, 0x56, 0xe2, 0x7c, 0x83, 0x48, 0xdb, 0x16, 227 0x1a, 0x1c, 0xf5, 0x1d, 0x7e, 0xf1, 0x94, 0x2d, 0x4b, 0xcf, 0x72, 0x22, 228 0xc1, 229 }; 230 231 /* P-384 sample EC private key in PKCS8 format (no public key) */ 232 static const unsigned char kExampleECKey2DER[] = { 233 0x30, 0x4E, 0x02, 0x01, 0x00, 0x30, 0x10, 0x06, 0x07, 0x2A, 0x86, 0x48, 234 0xCE, 0x3D, 0x02, 0x01, 0x06, 0x05, 0x2B, 0x81, 0x04, 0x00, 0x22, 0x04, 235 0x37, 0x30, 0x35, 0x02, 0x01, 0x01, 0x04, 0x30, 0x73, 0xE3, 0x3A, 0x05, 236 0xF2, 0xB6, 0x99, 0x6D, 0x0C, 0x33, 0x7F, 0x15, 0x9E, 0x10, 0xA9, 0x17, 237 0x4C, 0x0A, 0x82, 0x57, 0x71, 0x13, 0x7A, 0xAC, 0x46, 0xA2, 0x5E, 0x1C, 238 0xE0, 0xC7, 0xB2, 0xF8, 0x20, 0x40, 0xC2, 0x27, 0xC8, 0xBE, 0x02, 0x7E, 239 0x96, 0x69, 0xE0, 0x04, 0xCB, 0x89, 0x0B, 0x42 240 }; 241 242 # ifndef OPENSSL_NO_ECX 243 static const unsigned char kExampleECXKey2DER[] = { 244 0x30, 0x2E, 0x02, 0x01, 0x00, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, 0x6e, 245 0x04, 0x22, 0x04, 0x20, 0xc8, 0xa9, 0xd5, 0xa9, 0x10, 0x91, 0xad, 0x85, 246 0x1c, 0x66, 0x8b, 0x07, 0x36, 0xc1, 0xc9, 0xa0, 0x29, 0x36, 0xc0, 0xd3, 247 0xad, 0x62, 0x67, 0x08, 0x58, 0x08, 0x80, 0x47, 0xba, 0x05, 0x74, 0x75 248 }; 249 # endif 250 #endif 251 252 typedef struct APK_DATA_st { 253 const unsigned char *kder; 254 size_t size; 255 int evptype; 256 } APK_DATA; 257 258 static APK_DATA keydata[] = { 259 {kExampleRSAKeyDER, sizeof(kExampleRSAKeyDER), EVP_PKEY_RSA}, 260 {kExampleRSAKeyPKCS8, sizeof(kExampleRSAKeyPKCS8), EVP_PKEY_RSA}, 261 #ifndef OPENSSL_NO_EC 262 # ifndef OPENSSL_NO_ECX 263 {kExampleECXKey2DER, sizeof(kExampleECXKey2DER), EVP_PKEY_X25519}, 264 # endif 265 {kExampleECKeyDER, sizeof(kExampleECKeyDER), EVP_PKEY_EC}, 266 {kExampleECKey2DER, sizeof(kExampleECKey2DER), EVP_PKEY_EC}, 267 #endif 268 #ifndef OPENSSL_NO_DH 269 {kExampleDHPrivateKeyDER, sizeof(kExampleDHPrivateKeyDER), EVP_PKEY_DH}, 270 #endif 271 }; 272 273 static int pkey_has_private(EVP_PKEY *key, const char *privtag, 274 int use_octstring) 275 { 276 int ret = 0; 277 278 if (use_octstring) { 279 unsigned char buf[64]; 280 281 ret = EVP_PKEY_get_octet_string_param(key, privtag, buf, sizeof(buf), 282 NULL); 283 } else { 284 BIGNUM *bn = NULL; 285 286 ret = EVP_PKEY_get_bn_param(key, privtag, &bn); 287 BN_free(bn); 288 } 289 return ret; 290 } 291 292 static int do_pkey_tofrom_data_select(EVP_PKEY *key, const char *keytype) 293 { 294 int ret = 0; 295 OSSL_PARAM *pub_params = NULL, *keypair_params = NULL; 296 EVP_PKEY *fromkey = NULL, *fromkeypair = NULL; 297 EVP_PKEY_CTX *fromctx = NULL; 298 const char *privtag = strcmp(keytype, "RSA") == 0 ? "d" : "priv"; 299 const int use_octstring = strcmp(keytype, "X25519") == 0; 300 301 /* 302 * Select only the public key component when using EVP_PKEY_todata() and 303 * check that the resulting param array does not contain a private key. 304 */ 305 if (!TEST_int_eq(EVP_PKEY_todata(key, EVP_PKEY_PUBLIC_KEY, &pub_params), 1) 306 || !TEST_ptr_null(OSSL_PARAM_locate(pub_params, privtag))) 307 goto end; 308 /* 309 * Select the keypair when using EVP_PKEY_todata() and check that 310 * the param array contains a private key. 311 */ 312 if (!TEST_int_eq(EVP_PKEY_todata(key, EVP_PKEY_KEYPAIR, &keypair_params), 1) 313 || !TEST_ptr(OSSL_PARAM_locate(keypair_params, privtag))) 314 goto end; 315 316 /* 317 * Select only the public key when using EVP_PKEY_fromdata() and check that 318 * the resulting key does not contain a private key. 319 */ 320 if (!TEST_ptr(fromctx = EVP_PKEY_CTX_new_from_name(mainctx, keytype, NULL)) 321 || !TEST_int_eq(EVP_PKEY_fromdata_init(fromctx), 1) 322 || !TEST_int_eq(EVP_PKEY_fromdata(fromctx, &fromkey, EVP_PKEY_PUBLIC_KEY, 323 keypair_params), 1) 324 || !TEST_false(pkey_has_private(fromkey, privtag, use_octstring))) 325 goto end; 326 /* 327 * Select the keypair when using EVP_PKEY_fromdata() and check that 328 * the resulting key contains a private key. 329 */ 330 if (!TEST_int_eq(EVP_PKEY_fromdata(fromctx, &fromkeypair, 331 EVP_PKEY_KEYPAIR, keypair_params), 1) 332 || !TEST_true(pkey_has_private(fromkeypair, privtag, use_octstring))) 333 goto end; 334 ret = 1; 335 end: 336 EVP_PKEY_free(fromkeypair); 337 EVP_PKEY_free(fromkey); 338 EVP_PKEY_CTX_free(fromctx); 339 OSSL_PARAM_free(keypair_params); 340 OSSL_PARAM_free(pub_params); 341 return ret; 342 } 343 344 #ifndef OPENSSL_NO_DH 345 static int test_dh_tofrom_data_select(void) 346 { 347 int ret; 348 OSSL_PARAM params[2]; 349 EVP_PKEY *key = NULL; 350 EVP_PKEY_CTX *gctx = NULL; 351 # ifndef OPENSSL_NO_DEPRECATED_3_0 352 const DH *dhkey; 353 const BIGNUM *privkey; 354 # endif 355 356 params[0] = OSSL_PARAM_construct_utf8_string("group", "ffdhe2048", 0); 357 params[1] = OSSL_PARAM_construct_end(); 358 ret = TEST_ptr(gctx = EVP_PKEY_CTX_new_from_name(mainctx, "DHX", NULL)) 359 && TEST_int_gt(EVP_PKEY_keygen_init(gctx), 0) 360 && TEST_true(EVP_PKEY_CTX_set_params(gctx, params)) 361 && TEST_int_gt(EVP_PKEY_generate(gctx, &key), 0) 362 && TEST_true(do_pkey_tofrom_data_select(key, "DHX")); 363 # ifndef OPENSSL_NO_DEPRECATED_3_0 364 ret = ret && TEST_ptr(dhkey = EVP_PKEY_get0_DH(key)) 365 && TEST_ptr(privkey = DH_get0_priv_key(dhkey)) 366 && TEST_int_le(BN_num_bits(privkey), 225); 367 # endif 368 EVP_PKEY_free(key); 369 EVP_PKEY_CTX_free(gctx); 370 return ret; 371 } 372 373 static int test_dh_paramgen(void) 374 { 375 int ret; 376 OSSL_PARAM params[3]; 377 EVP_PKEY *pkey = NULL; 378 EVP_PKEY_CTX *gctx = NULL; 379 unsigned int pbits = 512; /* minimum allowed for speed */ 380 381 params[0] = OSSL_PARAM_construct_uint(OSSL_PKEY_PARAM_FFC_PBITS, &pbits); 382 params[1] = OSSL_PARAM_construct_utf8_string(OSSL_PKEY_PARAM_FFC_TYPE, 383 "generator", 0); 384 params[2] = OSSL_PARAM_construct_end(); 385 386 ret = TEST_ptr(gctx = EVP_PKEY_CTX_new_from_name(mainctx, "DH", NULL)) 387 && TEST_int_gt(EVP_PKEY_paramgen_init(gctx), 0) 388 && TEST_true(EVP_PKEY_CTX_set_params(gctx, params)) 389 && TEST_true(EVP_PKEY_paramgen(gctx, &pkey)) 390 && TEST_ptr(pkey); 391 392 EVP_PKEY_CTX_free(gctx); 393 gctx = NULL; 394 395 ret = ret && TEST_ptr(gctx = EVP_PKEY_CTX_new_from_pkey(mainctx, pkey, NULL)) 396 && TEST_int_eq(EVP_PKEY_param_check(gctx), 1) 397 && TEST_int_eq(EVP_PKEY_param_check_quick(gctx), 1); 398 399 EVP_PKEY_CTX_free(gctx); 400 EVP_PKEY_free(pkey); 401 return ret; 402 } 403 404 static int set_fromdata_string(EVP_PKEY_CTX *ctx, const char *name, char *value) 405 { 406 int ret; 407 OSSL_PARAM params[2]; 408 EVP_PKEY *pkey = NULL; 409 410 if (EVP_PKEY_fromdata_init(ctx) != 1) 411 return -1; 412 params[0] = OSSL_PARAM_construct_utf8_string(name, value, 0); 413 params[1] = OSSL_PARAM_construct_end(); 414 ret = EVP_PKEY_fromdata(ctx, &pkey, EVP_PKEY_KEY_PARAMETERS, params); 415 EVP_PKEY_free(pkey); 416 return ret; 417 } 418 419 static int set_fromdata_uint(EVP_PKEY_CTX *ctx, const char *name) 420 { 421 int ret; 422 unsigned int tmp = 0; 423 OSSL_PARAM params[2]; 424 EVP_PKEY *pkey = NULL; 425 426 if (EVP_PKEY_fromdata_init(ctx) != 1) 427 return -1; 428 params[0] = OSSL_PARAM_construct_uint(name, &tmp); 429 params[1] = OSSL_PARAM_construct_end(); 430 ret = EVP_PKEY_fromdata(ctx, &pkey, EVP_PKEY_KEY_PARAMETERS, params); 431 EVP_PKEY_free(pkey); 432 return ret; 433 } 434 435 static int test_dh_paramfromdata(void) 436 { 437 EVP_PKEY_CTX *ctx = NULL; 438 int ret = 0; 439 440 /* Test failure paths for FFC - mainly due to setting the wrong param type */ 441 ret = TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(mainctx, "DH", NULL)) 442 && TEST_int_eq(set_fromdata_uint(ctx, OSSL_PKEY_PARAM_GROUP_NAME), 0) 443 && TEST_int_eq(set_fromdata_string(ctx, OSSL_PKEY_PARAM_GROUP_NAME, "bad"), 0) 444 && TEST_int_eq(set_fromdata_string(ctx, OSSL_PKEY_PARAM_FFC_P, "bad"), 0) 445 && TEST_int_eq(set_fromdata_string(ctx, OSSL_PKEY_PARAM_FFC_GINDEX, "bad"), 0) 446 && TEST_int_eq(set_fromdata_string(ctx, OSSL_PKEY_PARAM_FFC_PCOUNTER, "bad"), 0) 447 && TEST_int_eq(set_fromdata_string(ctx, OSSL_PKEY_PARAM_FFC_COFACTOR, "bad"), 0) 448 && TEST_int_eq(set_fromdata_string(ctx, OSSL_PKEY_PARAM_FFC_H, "bad"), 0) 449 && TEST_int_eq(set_fromdata_uint(ctx, OSSL_PKEY_PARAM_FFC_SEED), 0) 450 && TEST_int_eq(set_fromdata_string(ctx, OSSL_PKEY_PARAM_FFC_VALIDATE_PQ, "bad"), 0) 451 && TEST_int_eq(set_fromdata_string(ctx, OSSL_PKEY_PARAM_FFC_VALIDATE_G, "bad"), 0) 452 && TEST_int_eq(set_fromdata_string(ctx, OSSL_PKEY_PARAM_FFC_VALIDATE_LEGACY, "bad"), 0) 453 && TEST_int_eq(set_fromdata_uint(ctx, OSSL_PKEY_PARAM_FFC_DIGEST), 0); 454 455 EVP_PKEY_CTX_free(ctx); 456 return ret; 457 } 458 459 #endif 460 461 /* Test that calling EVP_PKEY_Q_keygen() for a non-standard keytype works as expected */ 462 static int test_new_keytype(void) 463 { 464 int ret = 0; 465 EVP_PKEY *key = NULL; 466 OSSL_PROVIDER *tlsprov = NULL; 467 EVP_PKEY_CTX *ctx = NULL; 468 size_t outlen, secretlen, secretlen2; 469 unsigned char *out = NULL, *secret = NULL, *secret2 = NULL; 470 471 /* without tls-provider key should not be create-able */ 472 if (TEST_ptr(key = EVP_PKEY_Q_keygen(mainctx, NULL, "XOR"))) 473 goto err; 474 /* prepare & load tls-provider */ 475 if (!TEST_true(OSSL_PROVIDER_add_builtin(mainctx, "tls-provider", 476 tls_provider_init)) 477 || !TEST_ptr(tlsprov = OSSL_PROVIDER_load(mainctx, "tls-provider"))) 478 goto err; 479 /* now try creating key again, should work this time */ 480 if (!TEST_ptr(key = EVP_PKEY_Q_keygen(mainctx, NULL, "XOR"))) 481 goto err; 482 /* now do encaps/decaps to validate all is good */ 483 if (!TEST_ptr(ctx = EVP_PKEY_CTX_new(key, NULL)) 484 || !TEST_int_eq(EVP_PKEY_encapsulate_init(ctx, NULL), 1) 485 || !TEST_int_eq(EVP_PKEY_encapsulate(ctx, NULL, &outlen, NULL, &secretlen), 1)) 486 goto err; 487 out = OPENSSL_malloc(outlen); 488 secret = OPENSSL_malloc(secretlen); 489 secret2 = OPENSSL_malloc(secretlen); 490 if (out == NULL || secret == NULL || secret2 == NULL 491 || !TEST_int_eq(EVP_PKEY_encapsulate(ctx, out, &outlen, secret, &secretlen), 1) 492 || !TEST_int_eq(EVP_PKEY_decapsulate_init(ctx, NULL), 1) 493 || !TEST_int_eq(EVP_PKEY_decapsulate(ctx, secret2, &secretlen2, out, outlen), 1) 494 || !TEST_mem_eq(secret, secretlen, secret2, secretlen2)) 495 goto err; 496 ret = OSSL_PROVIDER_unload(tlsprov); 497 498 err: 499 OPENSSL_free(out); 500 OPENSSL_free(secret); 501 OPENSSL_free(secret2); 502 EVP_PKEY_CTX_free(ctx); 503 EVP_PKEY_free(key); 504 return ret; 505 } 506 507 #ifndef OPENSSL_NO_EC 508 509 static int test_ec_d2i_i2d_pubkey(void) 510 { 511 int ret = 0; 512 FILE *fp = NULL; 513 EVP_PKEY *key = NULL, *outkey = NULL; 514 static const char *filename = "pubkey.der"; 515 516 if (!TEST_ptr(fp = fopen(filename, "wb")) 517 || !TEST_ptr(key = EVP_PKEY_Q_keygen(mainctx, NULL, "EC", "P-256")) 518 || !TEST_true(i2d_PUBKEY_fp(fp, key)) 519 || !TEST_int_eq(fclose(fp), 0)) 520 goto err; 521 fp = NULL; 522 523 if (!TEST_ptr(fp = fopen(filename, "rb")) 524 || !TEST_ptr(outkey = d2i_PUBKEY_ex_fp(fp, NULL, mainctx, NULL)) 525 || !TEST_int_eq(EVP_PKEY_eq(key, outkey), 1)) 526 goto err; 527 528 ret = 1; 529 530 err: 531 EVP_PKEY_free(outkey); 532 EVP_PKEY_free(key); 533 fclose(fp); 534 return ret; 535 } 536 537 static int test_ec_tofrom_data_select(void) 538 { 539 int ret; 540 EVP_PKEY *key = NULL; 541 542 ret = TEST_ptr(key = EVP_PKEY_Q_keygen(mainctx, NULL, "EC", "P-256")) 543 && TEST_true(do_pkey_tofrom_data_select(key, "EC")); 544 EVP_PKEY_free(key); 545 return ret; 546 } 547 548 # ifndef OPENSSL_NO_ECX 549 static int test_ecx_tofrom_data_select(void) 550 { 551 int ret; 552 EVP_PKEY *key = NULL; 553 554 ret = TEST_ptr(key = EVP_PKEY_Q_keygen(mainctx, NULL, "X25519")) 555 && TEST_true(do_pkey_tofrom_data_select(key, "X25519")); 556 EVP_PKEY_free(key); 557 return ret; 558 } 559 # endif 560 #endif 561 562 #ifndef OPENSSL_NO_SM2 563 static int test_sm2_tofrom_data_select(void) 564 { 565 int ret; 566 EVP_PKEY *key = NULL; 567 568 ret = TEST_ptr(key = EVP_PKEY_Q_keygen(mainctx, NULL, "SM2")) 569 && TEST_true(do_pkey_tofrom_data_select(key, "SM2")); 570 EVP_PKEY_free(key); 571 return ret; 572 } 573 #endif 574 575 static int test_rsa_tofrom_data_select(void) 576 { 577 int ret; 578 EVP_PKEY *key = NULL; 579 const unsigned char *pdata = kExampleRSAKeyDER; 580 int pdata_len = sizeof(kExampleRSAKeyDER); 581 582 ret = TEST_ptr(key = d2i_AutoPrivateKey_ex(NULL, &pdata, pdata_len, 583 mainctx, NULL)) 584 && TEST_true(do_pkey_tofrom_data_select(key, "RSA")); 585 EVP_PKEY_free(key); 586 return ret; 587 } 588 589 /* This is the equivalent of test_d2i_AutoPrivateKey in evp_extra_test */ 590 static int test_d2i_AutoPrivateKey_ex(int i) 591 { 592 int ret = 0; 593 const unsigned char *p; 594 EVP_PKEY *pkey = NULL; 595 const APK_DATA *ak = &keydata[i]; 596 const unsigned char *input = ak->kder; 597 size_t input_len = ak->size; 598 int expected_id = ak->evptype; 599 BIGNUM *p_bn = NULL; 600 BIGNUM *g_bn = NULL; 601 BIGNUM *priv_bn = NULL; 602 603 p = input; 604 if (!TEST_ptr(pkey = d2i_AutoPrivateKey_ex(NULL, &p, input_len, mainctx, 605 NULL)) 606 || !TEST_ptr_eq(p, input + input_len) 607 || !TEST_int_eq(EVP_PKEY_get_id(pkey), expected_id)) 608 goto done; 609 610 if (ak->evptype == EVP_PKEY_RSA) { 611 if (!TEST_true(EVP_PKEY_get_bn_param(pkey, OSSL_PKEY_PARAM_RSA_D, 612 &priv_bn))) 613 goto done; 614 } else if (ak->evptype == EVP_PKEY_X25519) { 615 unsigned char buffer[32]; 616 size_t len; 617 618 if (!TEST_true(EVP_PKEY_get_octet_string_param(pkey, 619 OSSL_PKEY_PARAM_PRIV_KEY, 620 buffer, sizeof(buffer), 621 &len))) 622 goto done; 623 } else { 624 if (!TEST_true(EVP_PKEY_get_bn_param(pkey, OSSL_PKEY_PARAM_PRIV_KEY, 625 &priv_bn))) 626 goto done; 627 } 628 629 if (ak->evptype == EVP_PKEY_DH) { 630 if (!TEST_true(EVP_PKEY_get_bn_param(pkey, OSSL_PKEY_PARAM_FFC_P, &p_bn)) 631 || !TEST_true(EVP_PKEY_get_bn_param(pkey, OSSL_PKEY_PARAM_FFC_G, 632 &g_bn))) 633 goto done; 634 } 635 636 ret = 1; 637 done: 638 BN_free(p_bn); 639 BN_free(g_bn); 640 BN_free(priv_bn); 641 EVP_PKEY_free(pkey); 642 return ret; 643 } 644 645 #ifndef OPENSSL_NO_DES 646 static int test_pkcs8key_nid_bio(void) 647 { 648 int ret; 649 const int nid = NID_pbe_WithSHA1And3_Key_TripleDES_CBC; 650 static const char pwd[] = "PASSWORD"; 651 EVP_PKEY *pkey = NULL, *pkey_dec = NULL; 652 BIO *in = NULL, *enc_bio = NULL; 653 char *enc_data = NULL; 654 long enc_datalen = 0; 655 OSSL_PROVIDER *provider = NULL; 656 657 ret = TEST_ptr(provider = OSSL_PROVIDER_load(NULL, "default")) 658 && TEST_ptr(enc_bio = BIO_new(BIO_s_mem())) 659 && TEST_ptr(in = BIO_new_mem_buf(kExampleRSAKeyPKCS8, 660 sizeof(kExampleRSAKeyPKCS8))) 661 && TEST_ptr(pkey = d2i_PrivateKey_ex_bio(in, NULL, NULL, NULL)) 662 && TEST_int_eq(i2d_PKCS8PrivateKey_nid_bio(enc_bio, pkey, nid, 663 pwd, sizeof(pwd) - 1, 664 NULL, NULL), 1) 665 && TEST_int_gt(enc_datalen = BIO_get_mem_data(enc_bio, &enc_data), 0) 666 && TEST_ptr(pkey_dec = d2i_PKCS8PrivateKey_bio(enc_bio, NULL, NULL, 667 (void *)pwd)) 668 && TEST_true(EVP_PKEY_eq(pkey, pkey_dec)); 669 670 EVP_PKEY_free(pkey_dec); 671 EVP_PKEY_free(pkey); 672 BIO_free(in); 673 BIO_free(enc_bio); 674 OSSL_PROVIDER_unload(provider); 675 return ret; 676 } 677 #endif /* OPENSSL_NO_DES */ 678 679 static int test_alternative_default(void) 680 { 681 OSSL_LIB_CTX *oldctx; 682 EVP_MD *sha256; 683 int ok = 0; 684 685 /* 686 * setup_tests() loaded the "null" provider in the current default, so 687 * we know this fetch should fail. 688 */ 689 if (!TEST_ptr_null(sha256 = EVP_MD_fetch(NULL, "SHA2-256", NULL))) 690 goto err; 691 692 /* 693 * Now we switch to our main library context, and try again. Since no 694 * providers are loaded in this one, it should fall back to the default. 695 */ 696 if (!TEST_ptr(oldctx = OSSL_LIB_CTX_set0_default(mainctx)) 697 || !TEST_ptr(sha256 = EVP_MD_fetch(NULL, "SHA2-256", NULL))) 698 goto err; 699 EVP_MD_free(sha256); 700 sha256 = NULL; 701 702 /* 703 * Switching back should give us our main library context back, and 704 * fetching SHA2-256 should fail again. 705 */ 706 if (!TEST_ptr_eq(OSSL_LIB_CTX_set0_default(oldctx), mainctx) 707 || !TEST_ptr_null(sha256 = EVP_MD_fetch(NULL, "SHA2-256", NULL))) 708 goto err; 709 710 ok = 1; 711 err: 712 EVP_MD_free(sha256); 713 return ok; 714 } 715 716 static int test_provider_unload_effective(int testid) 717 { 718 EVP_MD *sha256 = NULL; 719 OSSL_PROVIDER *provider = NULL; 720 int ok = 0; 721 722 if (!TEST_ptr(provider = OSSL_PROVIDER_load(NULL, "default")) 723 || !TEST_ptr(sha256 = EVP_MD_fetch(NULL, "SHA2-256", NULL))) 724 goto err; 725 726 if (testid > 0) { 727 OSSL_PROVIDER_unload(provider); 728 provider = NULL; 729 EVP_MD_free(sha256); 730 sha256 = NULL; 731 } else { 732 EVP_MD_free(sha256); 733 sha256 = NULL; 734 OSSL_PROVIDER_unload(provider); 735 provider = NULL; 736 } 737 738 /* 739 * setup_tests() loaded the "null" provider in the current default, and 740 * we unloaded it above after the load so we know this fetch should fail. 741 */ 742 if (!TEST_ptr_null(sha256 = EVP_MD_fetch(NULL, "SHA2-256", NULL))) 743 goto err; 744 745 ok = 1; 746 err: 747 EVP_MD_free(sha256); 748 OSSL_PROVIDER_unload(provider); 749 return ok; 750 } 751 752 static int test_d2i_PrivateKey_ex(int testid) 753 { 754 int ok = 0; 755 OSSL_PROVIDER *provider = NULL; 756 BIO *key_bio = NULL; 757 EVP_PKEY *pkey = NULL; 758 int id = (testid == 0) ? 0 : 2; 759 760 if (!TEST_ptr(provider = OSSL_PROVIDER_load(NULL, "default"))) 761 goto err; 762 if (!TEST_ptr(key_bio = BIO_new_mem_buf(keydata[id].kder, keydata[id].size))) 763 goto err; 764 if (!TEST_ptr_null(pkey = PEM_read_bio_PrivateKey(key_bio, NULL, NULL, NULL))) 765 goto err; 766 767 ERR_clear_error(); 768 if (!TEST_int_ge(BIO_seek(key_bio, 0), 0)) 769 goto err; 770 ok = TEST_ptr(pkey = d2i_PrivateKey_bio(key_bio, NULL)); 771 TEST_int_eq(ERR_peek_error(), 0); 772 test_openssl_errors(); 773 774 err: 775 EVP_PKEY_free(pkey); 776 BIO_free(key_bio); 777 OSSL_PROVIDER_unload(provider); 778 779 return ok; 780 } 781 782 static int test_PEM_read_bio_negative(int testid) 783 { 784 int ok = 0; 785 OSSL_PROVIDER *provider = NULL; 786 BIO *key_bio = NULL; 787 EVP_PKEY *pkey = NULL; 788 789 if (!TEST_ptr(key_bio = BIO_new_mem_buf(keydata[testid].kder, keydata[testid].size))) 790 goto err; 791 ERR_clear_error(); 792 if (!TEST_ptr_null(pkey = PEM_read_bio_PrivateKey(key_bio, NULL, NULL, NULL))) 793 goto err; 794 if (!TEST_int_ne(ERR_peek_error(), 0)) 795 goto err; 796 if (!TEST_ptr(provider = OSSL_PROVIDER_load(NULL, "default"))) 797 goto err; 798 if (!TEST_int_ge(BIO_seek(key_bio, 0), 0)) 799 goto err; 800 ERR_clear_error(); 801 if (!TEST_ptr_null(pkey = PEM_read_bio_PrivateKey(key_bio, NULL, NULL, NULL))) 802 goto err; 803 if (!TEST_int_ne(ERR_peek_error(), 0)) 804 goto err; 805 806 ok = 1; 807 808 err: 809 test_openssl_errors(); 810 EVP_PKEY_free(pkey); 811 BIO_free(key_bio); 812 OSSL_PROVIDER_unload(provider); 813 814 return ok; 815 } 816 817 static int test_PEM_read_bio_negative_wrong_password(int testid) 818 { 819 int ok = 0; 820 OSSL_PROVIDER *provider = OSSL_PROVIDER_load(NULL, "default"); 821 EVP_PKEY *read_pkey = NULL; 822 EVP_PKEY *write_pkey = EVP_RSA_gen(1024); 823 BIO *key_bio = BIO_new(BIO_s_mem()); 824 const UI_METHOD *undo_ui_method = NULL; 825 const UI_METHOD *ui_method = NULL; 826 if (testid > 0) 827 ui_method = UI_null(); 828 829 if (!TEST_ptr(provider)) 830 goto err; 831 if (!TEST_ptr(key_bio)) 832 goto err; 833 if (!TEST_ptr(write_pkey)) 834 goto err; 835 undo_ui_method = UI_get_default_method(); 836 UI_set_default_method(ui_method); 837 838 if (/* Output Encrypted private key in PEM form */ 839 !TEST_true(PEM_write_bio_PrivateKey(key_bio, write_pkey, EVP_aes_256_cbc(), 840 NULL, 0, NULL, "pass"))) 841 goto err; 842 843 ERR_clear_error(); 844 read_pkey = PEM_read_bio_PrivateKey(key_bio, NULL, NULL, NULL); 845 if (!TEST_ptr_null(read_pkey)) 846 goto err; 847 848 if (!TEST_int_eq(ERR_GET_REASON(ERR_get_error()), PEM_R_PROBLEMS_GETTING_PASSWORD)) 849 goto err; 850 ok = 1; 851 852 err: 853 test_openssl_errors(); 854 EVP_PKEY_free(read_pkey); 855 EVP_PKEY_free(write_pkey); 856 BIO_free(key_bio); 857 OSSL_PROVIDER_unload(provider); 858 UI_set_default_method(undo_ui_method); 859 860 return ok; 861 } 862 863 static int do_fromdata_key_is_equal(const OSSL_PARAM params[], 864 const EVP_PKEY *expected, const char *type) 865 { 866 EVP_PKEY_CTX *ctx = NULL; 867 EVP_PKEY *pkey = NULL; 868 int ret; 869 870 ret = TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(mainctx, type, NULL)) 871 && TEST_int_eq(EVP_PKEY_fromdata_init(ctx), 1) 872 && TEST_int_eq(EVP_PKEY_fromdata(ctx, &pkey, 873 EVP_PKEY_KEYPAIR, 874 (OSSL_PARAM *)params), 1) 875 && TEST_true(EVP_PKEY_eq(pkey, expected)); 876 EVP_PKEY_CTX_free(ctx); 877 EVP_PKEY_free(pkey); 878 return ret; 879 } 880 881 #ifndef OPENSSL_NO_DSA 882 /* 883 * This data was generated using: 884 * > openssl genpkey \ 885 * -genparam -algorithm DSA -pkeyopt type:fips186_4 -text \ 886 * -pkeyopt gindex:5 -out dsa_param.pem 887 * > openssl genpkey \ 888 * -paramfile dsa_param.pem -pkeyopt type:fips186_4 -out dsa_priv.pem 889 */ 890 static const unsigned char dsa_key[] = { 891 0x30, 0x82, 0x03, 0x4e, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, 0x01, 0x00, 892 0xda, 0xb3, 0x46, 0x4d, 0x54, 0x57, 0xc7, 0xb4, 0x61, 0xa0, 0x6f, 0x66, 893 0x17, 0xda, 0xeb, 0x90, 0xf0, 0xa3, 0xd1, 0x29, 0xc9, 0x5f, 0xf2, 0x21, 894 0x3d, 0x85, 0xa3, 0x4a, 0xf0, 0xf8, 0x36, 0x39, 0x1b, 0xe3, 0xee, 0x37, 895 0x70, 0x06, 0x9b, 0xe8, 0xe3, 0x0a, 0xd2, 0xf1, 0xf6, 0xc4, 0x42, 0x23, 896 0x1f, 0x74, 0x78, 0xc2, 0x16, 0xf5, 0xce, 0xd6, 0xab, 0xa0, 0xc6, 0xe8, 897 0x99, 0x3d, 0xf8, 0x8b, 0xfb, 0x47, 0xf8, 0x5e, 0x05, 0x68, 0x6d, 0x8b, 898 0xa8, 0xad, 0xa1, 0xc2, 0x3a, 0x4e, 0xe0, 0xad, 0xec, 0x38, 0x75, 0x21, 899 0x55, 0x22, 0xce, 0xa2, 0xe9, 0xe5, 0x3b, 0xd7, 0x44, 0xeb, 0x5a, 0x03, 900 0x59, 0xa0, 0xc5, 0x7a, 0x92, 0x59, 0x7d, 0x7a, 0x07, 0x80, 0xfc, 0x4e, 901 0xf8, 0x56, 0x7e, 0xf1, 0x06, 0xe0, 0xba, 0xb2, 0xe7, 0x5b, 0x22, 0x55, 902 0xee, 0x4b, 0x42, 0x61, 0x67, 0x2c, 0x43, 0x9a, 0x38, 0x2b, 0x17, 0xc2, 903 0x62, 0x12, 0x8b, 0x0b, 0x22, 0x8c, 0x0c, 0x1c, 0x1c, 0x92, 0xb1, 0xec, 904 0x70, 0xce, 0x0f, 0x8c, 0xff, 0x8d, 0x21, 0xf9, 0x19, 0x68, 0x4d, 0x32, 905 0x59, 0x78, 0x42, 0x1d, 0x0c, 0xc5, 0x1a, 0xcb, 0x28, 0xe2, 0xc1, 0x1a, 906 0x35, 0xf1, 0x42, 0x0a, 0x19, 0x39, 0xfa, 0x83, 0xd1, 0xb4, 0xaa, 0x69, 907 0x0f, 0xc2, 0x8e, 0xf9, 0x59, 0x2c, 0xee, 0x11, 0xfc, 0x3e, 0x4b, 0x44, 908 0xfb, 0x9a, 0x32, 0xc8, 0x78, 0x23, 0x56, 0x85, 0x49, 0x21, 0x43, 0x12, 909 0x79, 0xbd, 0xa0, 0x70, 0x47, 0x2f, 0xae, 0xb6, 0xd7, 0x6c, 0xc6, 0x07, 910 0x76, 0xa9, 0x8a, 0xa2, 0x16, 0x02, 0x89, 0x1f, 0x1a, 0xd1, 0xa2, 0x96, 911 0x56, 0xd1, 0x1f, 0x10, 0xe1, 0xe5, 0x9f, 0x3f, 0xdd, 0x09, 0x0c, 0x40, 912 0x90, 0x71, 0xef, 0x14, 0x41, 0x02, 0x82, 0x3a, 0x6b, 0xe1, 0xf8, 0x2c, 913 0x5d, 0xbe, 0xfd, 0x1b, 0x02, 0x1d, 0x00, 0xe0, 0x20, 0xe0, 0x7c, 0x02, 914 0x16, 0xa7, 0x6c, 0x6a, 0x19, 0xba, 0xd5, 0x83, 0x73, 0xf3, 0x7d, 0x31, 915 0xef, 0xa7, 0xe1, 0x5d, 0x5b, 0x7f, 0xf3, 0xfc, 0xda, 0x84, 0x31, 0x02, 916 0x82, 0x01, 0x01, 0x00, 0x83, 0xdb, 0xa1, 0xbc, 0x3e, 0xc7, 0x29, 0xa5, 917 0x6a, 0x5c, 0x2c, 0xe8, 0x7a, 0x8c, 0x7e, 0xe8, 0xb8, 0x3e, 0x13, 0x47, 918 0xcd, 0x36, 0x7e, 0x79, 0x30, 0x7a, 0x28, 0x03, 0xd3, 0xd4, 0xd2, 0xe3, 919 0xee, 0x3b, 0x46, 0xda, 0xe0, 0x71, 0xe6, 0xcf, 0x46, 0x86, 0x0a, 0x37, 920 0x57, 0xb6, 0xe9, 0xcf, 0xa1, 0x78, 0x19, 0xb8, 0x72, 0x9f, 0x30, 0x8c, 921 0x2a, 0x04, 0x7c, 0x2f, 0x0c, 0x27, 0xa7, 0xb3, 0x23, 0xe0, 0x46, 0xf2, 922 0x75, 0x0c, 0x03, 0x4c, 0xad, 0xfb, 0xc1, 0xcb, 0x28, 0xcd, 0xa0, 0x63, 923 0xdb, 0x44, 0x88, 0xe0, 0xda, 0x6c, 0x5b, 0x89, 0xb2, 0x5b, 0x40, 0x6d, 924 0xeb, 0x78, 0x7a, 0xd5, 0xaf, 0x40, 0x52, 0x46, 0x63, 0x92, 0x13, 0x0d, 925 0xee, 0xee, 0xf9, 0x53, 0xca, 0x2d, 0x4e, 0x3b, 0x13, 0xd8, 0x0f, 0x50, 926 0xd0, 0x44, 0x57, 0x67, 0x0f, 0x45, 0x8f, 0x21, 0x30, 0x97, 0x9e, 0x80, 927 0xd9, 0xd0, 0x91, 0xb7, 0xc9, 0x5a, 0x69, 0xda, 0xeb, 0xd5, 0xea, 0x37, 928 0xf6, 0xb3, 0xbe, 0x1f, 0x24, 0xf1, 0x55, 0x14, 0x28, 0x05, 0xb5, 0xd8, 929 0x84, 0x0f, 0x62, 0x85, 0xaa, 0xec, 0x77, 0x64, 0xfd, 0x80, 0x7c, 0x41, 930 0x00, 0x88, 0xa3, 0x79, 0x7d, 0x4f, 0x6f, 0xe3, 0x76, 0xf4, 0xb5, 0x97, 931 0xb7, 0xeb, 0x67, 0x28, 0xba, 0x07, 0x1a, 0x59, 0x32, 0xc1, 0x53, 0xd9, 932 0x05, 0x6b, 0x63, 0x93, 0xce, 0xa1, 0xd9, 0x7a, 0xb2, 0xff, 0x1c, 0x12, 933 0x0a, 0x9a, 0xe5, 0x51, 0x1e, 0xba, 0xfc, 0x95, 0x2e, 0x28, 0xa9, 0xfc, 934 0x4c, 0xed, 0x7b, 0x05, 0xca, 0x67, 0xe0, 0x2d, 0xd7, 0x54, 0xb3, 0x05, 935 0x1c, 0x23, 0x2b, 0x35, 0x2e, 0x19, 0x48, 0x59, 0x0e, 0x58, 0xa8, 0x01, 936 0x56, 0xfb, 0x78, 0x90, 0xba, 0x08, 0x77, 0x94, 0x45, 0x05, 0x13, 0xc7, 937 0x6b, 0x96, 0xd2, 0xa3, 0xa6, 0x01, 0x9f, 0x34, 0x02, 0x82, 0x01, 0x00, 938 0x16, 0x1a, 0xb4, 0x6d, 0x9f, 0x16, 0x6c, 0xcc, 0x91, 0x66, 0xfe, 0x30, 939 0xeb, 0x8e, 0x44, 0xba, 0x2b, 0x7a, 0xc9, 0xa8, 0x95, 0xf2, 0xa6, 0x38, 940 0xd8, 0xaf, 0x3e, 0x91, 0x68, 0xe8, 0x52, 0xf3, 0x97, 0x37, 0x70, 0xf2, 941 0x47, 0xa3, 0xf4, 0x62, 0x26, 0xf5, 0x3b, 0x71, 0x52, 0x50, 0x15, 0x9c, 942 0x6d, 0xa6, 0x6d, 0x92, 0x4c, 0x48, 0x76, 0x31, 0x54, 0x48, 0xa5, 0x99, 943 0x7a, 0xd4, 0x61, 0xf7, 0x21, 0x44, 0xe7, 0xd8, 0x82, 0xc3, 0x50, 0xd3, 944 0xd9, 0xd4, 0x66, 0x20, 0xab, 0x70, 0x4c, 0x97, 0x9b, 0x8d, 0xac, 0x1f, 945 0x78, 0x27, 0x1e, 0x47, 0xf8, 0x3b, 0xd1, 0x55, 0x73, 0xf3, 0xb4, 0x8e, 946 0x6d, 0x45, 0x40, 0x54, 0xc6, 0xd8, 0x95, 0x15, 0x27, 0xb7, 0x5f, 0x65, 947 0xaa, 0xcb, 0x24, 0xc9, 0x49, 0x87, 0x32, 0xad, 0xcb, 0xf8, 0x35, 0x63, 948 0x56, 0x72, 0x7c, 0x4e, 0x6c, 0xad, 0x5f, 0x26, 0x8c, 0xd2, 0x80, 0x41, 949 0xaf, 0x88, 0x23, 0x20, 0x03, 0xa4, 0xd5, 0x3c, 0x53, 0x54, 0xb0, 0x3d, 950 0xed, 0x0e, 0x9e, 0x53, 0x0a, 0x63, 0x5f, 0xfd, 0x28, 0x57, 0x09, 0x07, 951 0x73, 0xf4, 0x0c, 0xd4, 0x71, 0x5d, 0x6b, 0xa0, 0xd7, 0x86, 0x99, 0x29, 952 0x9b, 0xca, 0xfb, 0xcc, 0xd6, 0x2f, 0xfe, 0xbe, 0x94, 0xef, 0x1a, 0x0e, 953 0x55, 0x84, 0xa7, 0xaf, 0x7b, 0xfa, 0xed, 0x77, 0x61, 0x28, 0x22, 0xee, 954 0x6b, 0x11, 0xdd, 0xb0, 0x17, 0x1e, 0x06, 0xe4, 0x29, 0x4c, 0xc2, 0x3f, 955 0xd6, 0x75, 0xb6, 0x08, 0x04, 0x55, 0x13, 0x48, 0x4f, 0x44, 0xea, 0x8d, 956 0xaf, 0xcb, 0xac, 0x22, 0xc4, 0x6a, 0xb3, 0x86, 0xe5, 0x47, 0xa9, 0xb5, 957 0x72, 0x17, 0x23, 0x11, 0x81, 0x7f, 0x00, 0x00, 0x67, 0x5c, 0xf4, 0x58, 958 0xcc, 0xe2, 0x46, 0xce, 0xf5, 0x6d, 0xd8, 0x18, 0x91, 0xc4, 0x20, 0xbf, 959 0x07, 0x48, 0x45, 0xfd, 0x02, 0x1c, 0x2f, 0x68, 0x44, 0xcb, 0xfb, 0x6b, 960 0xcb, 0x8d, 0x02, 0x49, 0x7c, 0xee, 0xd2, 0xa6, 0xd3, 0x43, 0xb8, 0xa4, 961 0x09, 0xb7, 0xc1, 0xd4, 0x4b, 0xc3, 0x66, 0xa7, 0xe0, 0x21, 962 }; 963 static const unsigned char dsa_p[] = { 964 0x00, 0xda, 0xb3, 0x46, 0x4d, 0x54, 0x57, 0xc7, 0xb4, 0x61, 0xa0, 0x6f, 0x66, 0x17, 0xda, 965 0xeb, 0x90, 0xf0, 0xa3, 0xd1, 0x29, 0xc9, 0x5f, 0xf2, 0x21, 0x3d, 0x85, 0xa3, 0x4a, 0xf0, 966 0xf8, 0x36, 0x39, 0x1b, 0xe3, 0xee, 0x37, 0x70, 0x06, 0x9b, 0xe8, 0xe3, 0x0a, 0xd2, 0xf1, 967 0xf6, 0xc4, 0x42, 0x23, 0x1f, 0x74, 0x78, 0xc2, 0x16, 0xf5, 0xce, 0xd6, 0xab, 0xa0, 0xc6, 968 0xe8, 0x99, 0x3d, 0xf8, 0x8b, 0xfb, 0x47, 0xf8, 0x5e, 0x05, 0x68, 0x6d, 0x8b, 0xa8, 0xad, 969 0xa1, 0xc2, 0x3a, 0x4e, 0xe0, 0xad, 0xec, 0x38, 0x75, 0x21, 0x55, 0x22, 0xce, 0xa2, 0xe9, 970 0xe5, 0x3b, 0xd7, 0x44, 0xeb, 0x5a, 0x03, 0x59, 0xa0, 0xc5, 0x7a, 0x92, 0x59, 0x7d, 0x7a, 971 0x07, 0x80, 0xfc, 0x4e, 0xf8, 0x56, 0x7e, 0xf1, 0x06, 0xe0, 0xba, 0xb2, 0xe7, 0x5b, 0x22, 972 0x55, 0xee, 0x4b, 0x42, 0x61, 0x67, 0x2c, 0x43, 0x9a, 0x38, 0x2b, 0x17, 0xc2, 0x62, 0x12, 973 0x8b, 0x0b, 0x22, 0x8c, 0x0c, 0x1c, 0x1c, 0x92, 0xb1, 0xec, 0x70, 0xce, 0x0f, 0x8c, 0xff, 974 0x8d, 0x21, 0xf9, 0x19, 0x68, 0x4d, 0x32, 0x59, 0x78, 0x42, 0x1d, 0x0c, 0xc5, 0x1a, 0xcb, 975 0x28, 0xe2, 0xc1, 0x1a, 0x35, 0xf1, 0x42, 0x0a, 0x19, 0x39, 0xfa, 0x83, 0xd1, 0xb4, 0xaa, 976 0x69, 0x0f, 0xc2, 0x8e, 0xf9, 0x59, 0x2c, 0xee, 0x11, 0xfc, 0x3e, 0x4b, 0x44, 0xfb, 0x9a, 977 0x32, 0xc8, 0x78, 0x23, 0x56, 0x85, 0x49, 0x21, 0x43, 0x12, 0x79, 0xbd, 0xa0, 0x70, 0x47, 978 0x2f, 0xae, 0xb6, 0xd7, 0x6c, 0xc6, 0x07, 0x76, 0xa9, 0x8a, 0xa2, 0x16, 0x02, 0x89, 0x1f, 979 0x1a, 0xd1, 0xa2, 0x96, 0x56, 0xd1, 0x1f, 0x10, 0xe1, 0xe5, 0x9f, 0x3f, 0xdd, 0x09, 0x0c, 980 0x40, 0x90, 0x71, 0xef, 0x14, 0x41, 0x02, 0x82, 0x3a, 0x6b, 0xe1, 0xf8, 0x2c, 0x5d, 0xbe, 981 0xfd, 0x1b 982 }; 983 static const unsigned char dsa_q[] = { 984 0x00, 0xe0, 0x20, 0xe0, 0x7c, 0x02, 0x16, 0xa7, 0x6c, 0x6a, 0x19, 0xba, 0xd5, 0x83, 0x73, 985 0xf3, 0x7d, 0x31, 0xef, 0xa7, 0xe1, 0x5d, 0x5b, 0x7f, 0xf3, 0xfc, 0xda, 0x84, 0x31 986 }; 987 static const unsigned char dsa_g[] = { 988 0x00, 0x83, 0xdb, 0xa1, 0xbc, 0x3e, 0xc7, 0x29, 0xa5, 0x6a, 0x5c, 0x2c, 0xe8, 0x7a, 0x8c, 989 0x7e, 0xe8, 0xb8, 0x3e, 0x13, 0x47, 0xcd, 0x36, 0x7e, 0x79, 0x30, 0x7a, 0x28, 0x03, 0xd3, 990 0xd4, 0xd2, 0xe3, 0xee, 0x3b, 0x46, 0xda, 0xe0, 0x71, 0xe6, 0xcf, 0x46, 0x86, 0x0a, 0x37, 991 0x57, 0xb6, 0xe9, 0xcf, 0xa1, 0x78, 0x19, 0xb8, 0x72, 0x9f, 0x30, 0x8c, 0x2a, 0x04, 0x7c, 992 0x2f, 0x0c, 0x27, 0xa7, 0xb3, 0x23, 0xe0, 0x46, 0xf2, 0x75, 0x0c, 0x03, 0x4c, 0xad, 0xfb, 993 0xc1, 0xcb, 0x28, 0xcd, 0xa0, 0x63, 0xdb, 0x44, 0x88, 0xe0, 0xda, 0x6c, 0x5b, 0x89, 0xb2, 994 0x5b, 0x40, 0x6d, 0xeb, 0x78, 0x7a, 0xd5, 0xaf, 0x40, 0x52, 0x46, 0x63, 0x92, 0x13, 0x0d, 995 0xee, 0xee, 0xf9, 0x53, 0xca, 0x2d, 0x4e, 0x3b, 0x13, 0xd8, 0x0f, 0x50, 0xd0, 0x44, 0x57, 996 0x67, 0x0f, 0x45, 0x8f, 0x21, 0x30, 0x97, 0x9e, 0x80, 0xd9, 0xd0, 0x91, 0xb7, 0xc9, 0x5a, 997 0x69, 0xda, 0xeb, 0xd5, 0xea, 0x37, 0xf6, 0xb3, 0xbe, 0x1f, 0x24, 0xf1, 0x55, 0x14, 0x28, 998 0x05, 0xb5, 0xd8, 0x84, 0x0f, 0x62, 0x85, 0xaa, 0xec, 0x77, 0x64, 0xfd, 0x80, 0x7c, 0x41, 999 0x00, 0x88, 0xa3, 0x79, 0x7d, 0x4f, 0x6f, 0xe3, 0x76, 0xf4, 0xb5, 0x97, 0xb7, 0xeb, 0x67, 1000 0x28, 0xba, 0x07, 0x1a, 0x59, 0x32, 0xc1, 0x53, 0xd9, 0x05, 0x6b, 0x63, 0x93, 0xce, 0xa1, 1001 0xd9, 0x7a, 0xb2, 0xff, 0x1c, 0x12, 0x0a, 0x9a, 0xe5, 0x51, 0x1e, 0xba, 0xfc, 0x95, 0x2e, 1002 0x28, 0xa9, 0xfc, 0x4c, 0xed, 0x7b, 0x05, 0xca, 0x67, 0xe0, 0x2d, 0xd7, 0x54, 0xb3, 0x05, 1003 0x1c, 0x23, 0x2b, 0x35, 0x2e, 0x19, 0x48, 0x59, 0x0e, 0x58, 0xa8, 0x01, 0x56, 0xfb, 0x78, 1004 0x90, 0xba, 0x08, 0x77, 0x94, 0x45, 0x05, 0x13, 0xc7, 0x6b, 0x96, 0xd2, 0xa3, 0xa6, 0x01, 1005 0x9f, 0x34 1006 }; 1007 static const unsigned char dsa_priv[] = { 1008 0x2f, 0x68, 0x44, 0xcb, 0xfb, 0x6b, 0xcb, 0x8d, 0x02, 0x49, 0x7c, 0xee, 0xd2, 0xa6, 0xd3, 1009 0x43, 0xb8, 0xa4, 0x09, 0xb7, 0xc1, 0xd4, 0x4b, 0xc3, 0x66, 0xa7, 0xe0, 0x21 1010 }; 1011 static const unsigned char dsa_pub[] = { 1012 0x16, 0x1a, 0xb4, 0x6d, 0x9f, 0x16, 0x6c, 0xcc, 0x91, 0x66, 0xfe, 0x30, 0xeb, 0x8e, 0x44, 1013 0xba, 0x2b, 0x7a, 0xc9, 0xa8, 0x95, 0xf2, 0xa6, 0x38, 0xd8, 0xaf, 0x3e, 0x91, 0x68, 0xe8, 1014 0x52, 0xf3, 0x97, 0x37, 0x70, 0xf2, 0x47, 0xa3, 0xf4, 0x62, 0x26, 0xf5, 0x3b, 0x71, 0x52, 1015 0x50, 0x15, 0x9c, 0x6d, 0xa6, 0x6d, 0x92, 0x4c, 0x48, 0x76, 0x31, 0x54, 0x48, 0xa5, 0x99, 1016 0x7a, 0xd4, 0x61, 0xf7, 0x21, 0x44, 0xe7, 0xd8, 0x82, 0xc3, 0x50, 0xd3, 0xd9, 0xd4, 0x66, 1017 0x20, 0xab, 0x70, 0x4c, 0x97, 0x9b, 0x8d, 0xac, 0x1f, 0x78, 0x27, 0x1e, 0x47, 0xf8, 0x3b, 1018 0xd1, 0x55, 0x73, 0xf3, 0xb4, 0x8e, 0x6d, 0x45, 0x40, 0x54, 0xc6, 0xd8, 0x95, 0x15, 0x27, 1019 0xb7, 0x5f, 0x65, 0xaa, 0xcb, 0x24, 0xc9, 0x49, 0x87, 0x32, 0xad, 0xcb, 0xf8, 0x35, 0x63, 1020 0x56, 0x72, 0x7c, 0x4e, 0x6c, 0xad, 0x5f, 0x26, 0x8c, 0xd2, 0x80, 0x41, 0xaf, 0x88, 0x23, 1021 0x20, 0x03, 0xa4, 0xd5, 0x3c, 0x53, 0x54, 0xb0, 0x3d, 0xed, 0x0e, 0x9e, 0x53, 0x0a, 0x63, 1022 0x5f, 0xfd, 0x28, 0x57, 0x09, 0x07, 0x73, 0xf4, 0x0c, 0xd4, 0x71, 0x5d, 0x6b, 0xa0, 0xd7, 1023 0x86, 0x99, 0x29, 0x9b, 0xca, 0xfb, 0xcc, 0xd6, 0x2f, 0xfe, 0xbe, 0x94, 0xef, 0x1a, 0x0e, 1024 0x55, 0x84, 0xa7, 0xaf, 0x7b, 0xfa, 0xed, 0x77, 0x61, 0x28, 0x22, 0xee, 0x6b, 0x11, 0xdd, 1025 0xb0, 0x17, 0x1e, 0x06, 0xe4, 0x29, 0x4c, 0xc2, 0x3f, 0xd6, 0x75, 0xb6, 0x08, 0x04, 0x55, 1026 0x13, 0x48, 0x4f, 0x44, 0xea, 0x8d, 0xaf, 0xcb, 0xac, 0x22, 0xc4, 0x6a, 0xb3, 0x86, 0xe5, 1027 0x47, 0xa9, 0xb5, 0x72, 0x17, 0x23, 0x11, 0x81, 0x7f, 0x00, 0x00, 0x67, 0x5c, 0xf4, 0x58, 1028 0xcc, 0xe2, 0x46, 0xce, 0xf5, 0x6d, 0xd8, 0x18, 0x91, 0xc4, 0x20, 0xbf, 0x07, 0x48, 0x45, 1029 0xfd 1030 }; 1031 1032 static int do_check_params(OSSL_PARAM key_params[], int expected) 1033 { 1034 EVP_PKEY_CTX *gen_ctx = NULL, *check_ctx = NULL; 1035 EVP_PKEY *pkey = NULL; 1036 int ret; 1037 1038 ret = TEST_ptr(gen_ctx = EVP_PKEY_CTX_new_from_name(mainctx, "DSA", NULL)) 1039 && TEST_int_eq(EVP_PKEY_fromdata_init(gen_ctx), 1) 1040 && TEST_int_eq(EVP_PKEY_fromdata(gen_ctx, &pkey, 1041 EVP_PKEY_KEYPAIR, key_params), 1) 1042 && TEST_ptr(check_ctx = EVP_PKEY_CTX_new_from_pkey(mainctx, pkey, 1043 NULL)) 1044 && TEST_int_eq(EVP_PKEY_param_check(check_ctx), expected); 1045 EVP_PKEY_CTX_free(check_ctx); 1046 EVP_PKEY_CTX_free(gen_ctx); 1047 EVP_PKEY_free(pkey); 1048 return ret; 1049 } 1050 1051 static int do_check_bn(OSSL_PARAM params[], const char *key, 1052 const unsigned char *expected, size_t expected_len) 1053 { 1054 OSSL_PARAM *p; 1055 BIGNUM *bn = NULL; 1056 unsigned char buffer[256 + 1]; 1057 int ret, len; 1058 1059 ret = TEST_ptr(p = OSSL_PARAM_locate(params, key)) 1060 && TEST_true(OSSL_PARAM_get_BN(p, &bn)) 1061 && TEST_int_gt(len = BN_bn2binpad(bn, buffer, expected_len), 0) 1062 && TEST_mem_eq(expected, expected_len, buffer, len); 1063 BN_free(bn); 1064 return ret; 1065 } 1066 1067 static int do_check_int(OSSL_PARAM params[], const char *key, int expected) 1068 { 1069 OSSL_PARAM *p; 1070 int val = 0; 1071 1072 return TEST_ptr(p = OSSL_PARAM_locate(params, key)) 1073 && TEST_true(OSSL_PARAM_get_int(p, &val)) 1074 && TEST_int_eq(val, expected); 1075 } 1076 1077 static int test_dsa_tofrom_data_select(void) 1078 { 1079 int ret; 1080 EVP_PKEY *key = NULL; 1081 const unsigned char *pkeydata = dsa_key; 1082 1083 ret = TEST_ptr(key = d2i_AutoPrivateKey_ex(NULL, &pkeydata, sizeof(dsa_key), 1084 mainctx, NULL)) 1085 && TEST_true(do_pkey_tofrom_data_select(key, "DSA")); 1086 1087 EVP_PKEY_free(key); 1088 return ret; 1089 } 1090 1091 static int test_dsa_todata(void) 1092 { 1093 EVP_PKEY *pkey = NULL; 1094 OSSL_PARAM *to_params = NULL, *all_params = NULL; 1095 OSSL_PARAM gen_params[4]; 1096 int ret = 0; 1097 const unsigned char *pkeydata = dsa_key; 1098 1099 unsigned char dsa_seed[] = { 1100 0xbc, 0x8a, 0x81, 0x64, 0x9e, 0x9d, 0x63, 0xa7, 0xa3, 0x5d, 0x87, 0xdd, 1101 0x32, 0xf3, 0xc1, 0x9f, 0x18, 0x22, 0xeb, 0x73, 0x63, 0xad, 0x5e, 0x7b, 1102 0x90, 0xc1, 0xe3, 0xe0 1103 }; 1104 int dsa_pcounter = 319; 1105 int dsa_gindex = 5; 1106 1107 gen_params[0] = OSSL_PARAM_construct_octet_string(OSSL_PKEY_PARAM_FFC_SEED, 1108 (void*)dsa_seed, 1109 sizeof(dsa_seed)); 1110 gen_params[1] = OSSL_PARAM_construct_int(OSSL_PKEY_PARAM_FFC_GINDEX, 1111 &dsa_gindex); 1112 gen_params[2] = OSSL_PARAM_construct_int(OSSL_PKEY_PARAM_FFC_PCOUNTER, 1113 &dsa_pcounter); 1114 gen_params[3] = OSSL_PARAM_construct_end(); 1115 1116 if (!TEST_ptr(pkey = d2i_AutoPrivateKey_ex(NULL, &pkeydata, sizeof(dsa_key), 1117 mainctx, NULL)) 1118 || !TEST_int_eq(EVP_PKEY_todata(pkey, EVP_PKEY_KEYPAIR, &to_params), 1) 1119 || !do_check_bn(to_params, OSSL_PKEY_PARAM_FFC_P, dsa_p, sizeof(dsa_p)) 1120 || !do_check_bn(to_params, OSSL_PKEY_PARAM_FFC_Q, dsa_q, sizeof(dsa_q)) 1121 || !do_check_bn(to_params, OSSL_PKEY_PARAM_FFC_G, dsa_g, sizeof(dsa_g)) 1122 || !do_check_bn(to_params, OSSL_PKEY_PARAM_PUB_KEY, dsa_pub, 1123 sizeof(dsa_pub)) 1124 || !do_check_bn(to_params, OSSL_PKEY_PARAM_PRIV_KEY, dsa_priv, 1125 sizeof(dsa_priv)) 1126 || !do_check_int(to_params, OSSL_PKEY_PARAM_FFC_GINDEX, -1) 1127 || !do_check_int(to_params, OSSL_PKEY_PARAM_FFC_PCOUNTER, -1) 1128 || !do_check_int(to_params, OSSL_PKEY_PARAM_FFC_H, 0) 1129 || !do_check_int(to_params, OSSL_PKEY_PARAM_FFC_VALIDATE_PQ, 1) 1130 || !do_check_int(to_params, OSSL_PKEY_PARAM_FFC_VALIDATE_G, 1) 1131 || !do_check_int(to_params, OSSL_PKEY_PARAM_FFC_VALIDATE_LEGACY, 0) 1132 || !TEST_ptr_null(OSSL_PARAM_locate(to_params, OSSL_PKEY_PARAM_FFC_SEED))) 1133 goto err; 1134 1135 if (!do_fromdata_key_is_equal(to_params, pkey, "DSA")) 1136 goto err; 1137 1138 if (!TEST_ptr(all_params = OSSL_PARAM_merge(to_params, gen_params)) 1139 || !do_check_params(all_params, 1)) 1140 goto err; 1141 gen_params[1] = OSSL_PARAM_construct_int(OSSL_PKEY_PARAM_FFC_GINDEX, 1142 &dsa_gindex); 1143 gen_params[2] = OSSL_PARAM_construct_int(OSSL_PKEY_PARAM_FFC_PCOUNTER, 1144 &dsa_pcounter); 1145 /* 1146 * Check that modifying the shallow copy values used in OSSL_PARAM_merge() 1147 * results in an invalid key. This also verifies that the fips186-4 1148 * validation code is running. 1149 */ 1150 dsa_gindex++; 1151 if (!do_check_params(all_params, 0)) 1152 goto err; 1153 dsa_gindex--; 1154 dsa_pcounter++; 1155 if (!do_check_params(all_params, 0)) 1156 goto err; 1157 dsa_pcounter--; 1158 dsa_seed[0] = 0xb0; 1159 if (!do_check_params(all_params, 0)) 1160 goto err; 1161 1162 ret = 1; 1163 err: 1164 EVP_PKEY_free(pkey); 1165 OSSL_PARAM_free(all_params); 1166 OSSL_PARAM_free(to_params); 1167 return ret; 1168 } 1169 1170 /* 1171 * Test that OSSL_PKEY_PARAM_FFC_DIGEST_PROPS is set properly when using fromdata 1172 * This test: 1173 * checks for failure when the property query is bad (tstid == 0) 1174 * checks for success when the property query is valid (tstid == 1) 1175 */ 1176 static int test_dsa_fromdata_digest_prop(int tstid) 1177 { 1178 EVP_PKEY_CTX *ctx = NULL, *gctx = NULL; 1179 EVP_PKEY *pkey = NULL, *pkey2 = NULL; 1180 OSSL_PARAM params[4], *p = params; 1181 int ret = 0; 1182 int expected = (tstid == 0 ? 0 : 1); 1183 unsigned int pbits = 512; /* minimum allowed for speed */ 1184 1185 *p++ = OSSL_PARAM_construct_uint(OSSL_PKEY_PARAM_FFC_PBITS, &pbits); 1186 *p++ = OSSL_PARAM_construct_utf8_string(OSSL_PKEY_PARAM_FFC_DIGEST, "SHA512", 0); 1187 /* Setting a bad prop query here should fail during paramgen - when it tries to do a fetch */ 1188 *p++ = OSSL_PARAM_construct_utf8_string(OSSL_PKEY_PARAM_FFC_DIGEST_PROPS, 1189 tstid == 0 ? "provider=unknown" : "provider=default", 0); 1190 *p++ = OSSL_PARAM_construct_end(); 1191 1192 if (!TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(mainctx, "DSA", NULL)) 1193 || !TEST_int_eq(EVP_PKEY_fromdata_init(ctx), 1) 1194 || !TEST_int_eq(EVP_PKEY_fromdata(ctx, &pkey, EVP_PKEY_KEY_PARAMETERS, params), 1)) 1195 goto err; 1196 1197 if (!TEST_ptr(gctx = EVP_PKEY_CTX_new_from_pkey(mainctx, pkey, NULL)) 1198 || !TEST_int_eq(EVP_PKEY_paramgen_init(gctx), 1) 1199 || !TEST_int_eq(EVP_PKEY_paramgen(gctx, &pkey2), expected)) 1200 goto err; 1201 1202 ret = 1; 1203 err: 1204 EVP_PKEY_free(pkey2); 1205 EVP_PKEY_free(pkey); 1206 EVP_PKEY_CTX_free(ctx); 1207 EVP_PKEY_CTX_free(gctx); 1208 return ret; 1209 } 1210 #endif /* OPENSSL_NO_DSA */ 1211 1212 static int test_pkey_todata_null(void) 1213 { 1214 OSSL_PARAM *params = NULL; 1215 EVP_PKEY *pkey = NULL; 1216 int ret = 0; 1217 const unsigned char *pdata = keydata[0].kder; 1218 1219 ret = TEST_ptr(pkey = d2i_AutoPrivateKey_ex(NULL, &pdata, keydata[0].size, 1220 mainctx, NULL)) 1221 && TEST_int_eq(EVP_PKEY_todata(NULL, EVP_PKEY_KEYPAIR, ¶ms), 0) 1222 && TEST_int_eq(EVP_PKEY_todata(pkey, EVP_PKEY_KEYPAIR, NULL), 0); 1223 EVP_PKEY_free(pkey); 1224 return ret; 1225 } 1226 1227 static OSSL_CALLBACK test_pkey_export_cb; 1228 1229 static int test_pkey_export_cb(const OSSL_PARAM params[], void *arg) 1230 { 1231 if (arg == NULL) 1232 return 0; 1233 return do_fromdata_key_is_equal(params, (EVP_PKEY *)arg, "RSA"); 1234 } 1235 1236 static int test_pkey_export_null(void) 1237 { 1238 EVP_PKEY *pkey = NULL; 1239 int ret = 0; 1240 const unsigned char *pdata = keydata[0].kder; 1241 1242 ret = TEST_ptr(pkey = d2i_AutoPrivateKey_ex(NULL, &pdata, keydata[0].size, 1243 mainctx, NULL)) 1244 && TEST_int_eq(EVP_PKEY_export(NULL, EVP_PKEY_KEYPAIR, 1245 test_pkey_export_cb, NULL), 0) 1246 && TEST_int_eq(EVP_PKEY_export(pkey, EVP_PKEY_KEYPAIR, NULL, NULL), 0); 1247 EVP_PKEY_free(pkey); 1248 return ret; 1249 } 1250 1251 static int test_pkey_export(void) 1252 { 1253 EVP_PKEY *pkey = NULL; 1254 #ifndef OPENSSL_NO_DEPRECATED_3_0 1255 RSA *rsa = NULL; 1256 #endif 1257 int ret = 1; 1258 const unsigned char *pdata = keydata[0].kder; 1259 int pdata_len = keydata[0].size; 1260 1261 if (!TEST_ptr(pkey = d2i_AutoPrivateKey_ex(NULL, &pdata, pdata_len, 1262 mainctx, NULL)) 1263 || !TEST_true(EVP_PKEY_export(pkey, EVP_PKEY_KEYPAIR, 1264 test_pkey_export_cb, pkey)) 1265 || !TEST_false(EVP_PKEY_export(pkey, EVP_PKEY_KEYPAIR, 1266 test_pkey_export_cb, NULL))) 1267 ret = 0; 1268 EVP_PKEY_free(pkey); 1269 1270 #ifndef OPENSSL_NO_DEPRECATED_3_0 1271 /* Now, try with a legacy key */ 1272 pdata = keydata[0].kder; 1273 pdata_len = keydata[0].size; 1274 if (!TEST_ptr(rsa = d2i_RSAPrivateKey(NULL, &pdata, pdata_len)) 1275 || !TEST_ptr(pkey = EVP_PKEY_new()) 1276 || !TEST_true(EVP_PKEY_assign_RSA(pkey, rsa)) 1277 || !TEST_true(EVP_PKEY_export(pkey, EVP_PKEY_KEYPAIR, 1278 test_pkey_export_cb, pkey)) 1279 || !TEST_false(EVP_PKEY_export(pkey, EVP_PKEY_KEYPAIR, 1280 test_pkey_export_cb, NULL))) 1281 ret = 0; 1282 EVP_PKEY_free(pkey); 1283 #endif 1284 return ret; 1285 } 1286 1287 static int test_rsa_pss_sign(void) 1288 { 1289 EVP_PKEY *pkey = NULL; 1290 EVP_PKEY_CTX *pctx = NULL; 1291 int ret = 0; 1292 const unsigned char *pdata = keydata[0].kder; 1293 const char *mdname = "SHA2-256"; 1294 OSSL_PARAM sig_params[3]; 1295 unsigned char mdbuf[256 / 8] = { 0 }; 1296 int padding = RSA_PKCS1_PSS_PADDING; 1297 unsigned char *sig = NULL; 1298 size_t sig_len = 0; 1299 1300 sig_params[0] = OSSL_PARAM_construct_int(OSSL_PKEY_PARAM_PAD_MODE, 1301 &padding); 1302 sig_params[1] = OSSL_PARAM_construct_utf8_string(OSSL_SIGNATURE_PARAM_DIGEST, 1303 (char *)mdname, 0); 1304 sig_params[2] = OSSL_PARAM_construct_end(); 1305 1306 ret = TEST_ptr(pkey = d2i_AutoPrivateKey_ex(NULL, &pdata, keydata[0].size, 1307 mainctx, NULL)) 1308 && TEST_ptr(pctx = EVP_PKEY_CTX_new_from_pkey(mainctx, pkey, NULL)) 1309 && TEST_int_gt(EVP_PKEY_sign_init_ex(pctx, sig_params), 0) 1310 && TEST_int_gt(EVP_PKEY_sign(pctx, NULL, &sig_len, mdbuf, 1311 sizeof(mdbuf)), 0) 1312 && TEST_int_gt(sig_len, 0) 1313 && TEST_ptr(sig = OPENSSL_malloc(sig_len)) 1314 && TEST_int_gt(EVP_PKEY_sign(pctx, sig, &sig_len, mdbuf, 1315 sizeof(mdbuf)), 0); 1316 1317 EVP_PKEY_CTX_free(pctx); 1318 OPENSSL_free(sig); 1319 EVP_PKEY_free(pkey); 1320 1321 return ret; 1322 } 1323 1324 static int test_evp_md_ctx_dup(void) 1325 { 1326 EVP_MD_CTX *mdctx; 1327 EVP_MD_CTX *copyctx = NULL; 1328 int ret; 1329 1330 /* test copying freshly initialized context */ 1331 ret = TEST_ptr(mdctx = EVP_MD_CTX_new()) 1332 && TEST_ptr(copyctx = EVP_MD_CTX_dup(mdctx)); 1333 1334 EVP_MD_CTX_free(mdctx); 1335 EVP_MD_CTX_free(copyctx); 1336 return ret; 1337 } 1338 1339 static int test_evp_md_ctx_copy(void) 1340 { 1341 EVP_MD_CTX *mdctx = NULL; 1342 EVP_MD_CTX *copyctx = NULL; 1343 int ret; 1344 1345 /* test copying freshly initialized context */ 1346 ret = TEST_ptr(mdctx = EVP_MD_CTX_new()) 1347 && TEST_ptr(copyctx = EVP_MD_CTX_new()) 1348 && TEST_true(EVP_MD_CTX_copy_ex(copyctx, mdctx)); 1349 1350 EVP_MD_CTX_free(mdctx); 1351 EVP_MD_CTX_free(copyctx); 1352 return ret; 1353 } 1354 1355 static int test_evp_md_ctx_copy2(void) 1356 { 1357 int ret = 0; 1358 EVP_MD *md = NULL; 1359 OSSL_LIB_CTX *ctx = NULL; 1360 EVP_MD_CTX *inctx = NULL, *outctx = NULL; 1361 void *origin_algctx = NULL; 1362 1363 if (!TEST_ptr(ctx = OSSL_LIB_CTX_new()) 1364 || !TEST_ptr(md = EVP_MD_fetch(ctx, "sha256", NULL))) 1365 goto end; 1366 1367 inctx = EVP_MD_CTX_new(); 1368 outctx = EVP_MD_CTX_new(); 1369 1370 if (!TEST_ptr(inctx) || !TEST_ptr(outctx)) 1371 goto end; 1372 1373 /* init inctx and outctx, now the contexts are from same providers */ 1374 if (!TEST_true(EVP_DigestInit_ex2(inctx, md, NULL))) 1375 goto end; 1376 if (!TEST_true(EVP_DigestInit_ex2(outctx, md, NULL))) 1377 goto end; 1378 1379 /* 1380 * Test the EVP_MD_CTX_copy_ex function. After copying, 1381 * outctx->algctx should be the same as the original. 1382 */ 1383 origin_algctx = outctx->algctx; 1384 ret = TEST_true(EVP_MD_CTX_copy_ex(outctx, inctx)) 1385 && TEST_true(outctx->algctx == origin_algctx); 1386 1387 end: 1388 EVP_MD_free(md); 1389 EVP_MD_CTX_free(inctx); 1390 EVP_MD_CTX_free(outctx); 1391 OSSL_LIB_CTX_free(ctx); 1392 return ret; 1393 } 1394 1395 #if !defined OPENSSL_NO_DES && !defined OPENSSL_NO_MD5 1396 static int test_evp_pbe_alg_add(void) 1397 { 1398 int ret = 0; 1399 int cipher_nid = 0, md_nid = 0; 1400 EVP_PBE_KEYGEN_EX *keygen_ex = NULL; 1401 EVP_PBE_KEYGEN *keygen = NULL; 1402 1403 if (!TEST_true(EVP_PBE_alg_add(NID_pbeWithMD5AndDES_CBC, EVP_des_cbc(), EVP_md5(), 1404 PKCS5_PBE_keyivgen))) 1405 goto err; 1406 1407 if (!TEST_true(EVP_PBE_find_ex(EVP_PBE_TYPE_OUTER, NID_pbeWithMD5AndDES_CBC, 1408 &cipher_nid, &md_nid, &keygen, &keygen_ex))) 1409 goto err; 1410 1411 if (!TEST_true(keygen != NULL)) 1412 goto err; 1413 if (!TEST_true(keygen_ex == NULL)) 1414 goto err; 1415 1416 ret = 1; 1417 1418 err: 1419 return ret; 1420 } 1421 #endif 1422 1423 /* 1424 * Currently, EVP_<OBJ>_fetch doesn't support 1425 * colon separated alternative names for lookup 1426 * so add a test here to ensure that when one is provided 1427 * libcrypto returns an error 1428 */ 1429 static int evp_test_name_parsing(void) 1430 { 1431 EVP_MD *md; 1432 1433 if (!TEST_ptr_null(md = EVP_MD_fetch(mainctx, "SHA256:BogusName", NULL))) { 1434 EVP_MD_free(md); 1435 return 0; 1436 } 1437 1438 return 1; 1439 } 1440 1441 int setup_tests(void) 1442 { 1443 if (!test_get_libctx(&mainctx, &nullprov, NULL, NULL, NULL)) { 1444 OSSL_LIB_CTX_free(mainctx); 1445 mainctx = NULL; 1446 return 0; 1447 } 1448 1449 ADD_TEST(evp_test_name_parsing); 1450 ADD_TEST(test_alternative_default); 1451 ADD_ALL_TESTS(test_d2i_AutoPrivateKey_ex, OSSL_NELEM(keydata)); 1452 ADD_TEST(test_new_keytype); 1453 #ifndef OPENSSL_NO_EC 1454 ADD_ALL_TESTS(test_d2i_PrivateKey_ex, 2); 1455 ADD_TEST(test_ec_tofrom_data_select); 1456 # ifndef OPENSSL_NO_ECX 1457 ADD_TEST(test_ecx_tofrom_data_select); 1458 # endif 1459 ADD_TEST(test_ec_d2i_i2d_pubkey); 1460 #else 1461 ADD_ALL_TESTS(test_d2i_PrivateKey_ex, 1); 1462 #endif 1463 #ifndef OPENSSL_NO_SM2 1464 ADD_TEST(test_sm2_tofrom_data_select); 1465 #endif 1466 #ifndef OPENSSL_NO_DSA 1467 ADD_TEST(test_dsa_todata); 1468 ADD_TEST(test_dsa_tofrom_data_select); 1469 ADD_ALL_TESTS(test_dsa_fromdata_digest_prop, 2); 1470 #endif 1471 #ifndef OPENSSL_NO_DH 1472 ADD_TEST(test_dh_tofrom_data_select); 1473 ADD_TEST(test_dh_paramgen); 1474 ADD_TEST(test_dh_paramfromdata); 1475 #endif 1476 ADD_TEST(test_rsa_tofrom_data_select); 1477 1478 ADD_TEST(test_pkey_todata_null); 1479 ADD_TEST(test_pkey_export_null); 1480 ADD_TEST(test_pkey_export); 1481 #ifndef OPENSSL_NO_DES 1482 ADD_TEST(test_pkcs8key_nid_bio); 1483 #endif 1484 ADD_ALL_TESTS(test_PEM_read_bio_negative, OSSL_NELEM(keydata)); 1485 ADD_ALL_TESTS(test_PEM_read_bio_negative_wrong_password, 2); 1486 ADD_TEST(test_rsa_pss_sign); 1487 ADD_TEST(test_evp_md_ctx_dup); 1488 ADD_TEST(test_evp_md_ctx_copy); 1489 ADD_TEST(test_evp_md_ctx_copy2); 1490 ADD_ALL_TESTS(test_provider_unload_effective, 2); 1491 #if !defined OPENSSL_NO_DES && !defined OPENSSL_NO_MD5 1492 ADD_TEST(test_evp_pbe_alg_add); 1493 #endif 1494 return 1; 1495 } 1496 1497 void cleanup_tests(void) 1498 { 1499 OSSL_LIB_CTX_free(mainctx); 1500 OSSL_PROVIDER_unload(nullprov); 1501 } 1502