1 /* $NetBSD: test_cipher.c,v 1.2 2017/01/28 21:31:47 christos Exp $ */ 2 3 /* 4 * Copyright (c) 2006-2016 Kungliga Tekniska Högskolan 5 * (Royal Institute of Technology, Stockholm, Sweden). 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * 3. Neither the name of the Institute nor the names of its contributors 20 * may be used to endorse or promote products derived from this software 21 * without specific prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33 * SUCH DAMAGE. 34 */ 35 36 #include <config.h> 37 #include <krb5/roken.h> 38 39 #define HC_DEPRECATED_CRYPTO 40 41 #include <krb5/getarg.h> 42 43 #include <evp.h> 44 #include <evp-hcrypto.h> 45 #include <evp-cc.h> 46 #if defined(_WIN32) 47 #include <evp-w32.h> 48 #endif 49 #include <evp-pkcs11.h> 50 #include <evp-openssl.h> 51 #include <krb5/hex.h> 52 #include <err.h> 53 54 struct tests { 55 const char *name; 56 void *key; 57 size_t keysize; 58 void *iv; 59 size_t datasize; 60 void *indata; 61 void *outdata; 62 void *outiv; 63 }; 64 65 struct tests aes_tests[] = { 66 { "aes-256", 67 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" 68 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 69 32, 70 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 71 16, 72 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 73 "\xdc\x95\xc0\x78\xa2\x40\x89\x89\xad\x48\xa2\x14\x92\x84\x20\x87", 74 NULL 75 } 76 }; 77 78 struct tests aes_cfb_tests[] = { 79 { "aes-cfb8-128", 80 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 81 16, 82 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 83 16, 84 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 85 "\x66\x16\xf9\x2e\x42\xa8\xf1\x1a\x91\x16\x68\x57\x8e\xc3\xaa\x0f", 86 NULL 87 } 88 }; 89 90 91 struct tests rc2_tests[] = { 92 { "rc2", 93 "\x88\xbc\xa9\x0e\x90\x87\x5a\x7f\x0f\x79\xc3\x84\x62\x7b\xaf\xb2", 94 16, 95 "\x00\x00\x00\x00\x00\x00\x00\x00", 96 8, 97 "\x00\x00\x00\x00\x00\x00\x00\x00", 98 "\x22\x69\x55\x2a\xb0\xf8\x5c\xa6", 99 NULL 100 } 101 }; 102 103 104 struct tests rc2_40_tests[] = { 105 { "rc2-40", 106 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 107 16, 108 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 109 16, 110 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 111 "\xc0\xb8\xff\xa5\xd6\xeb\xc9\x62\xcc\x52\x5f\xfe\x9a\x3c\x97\xe6", 112 NULL 113 } 114 }; 115 116 struct tests des_ede3_tests[] = { 117 { "des-ede3", 118 "\x19\x17\xff\xe6\xbb\x77\x2e\xfc" 119 "\x29\x76\x43\xbc\x63\x56\x7e\x9a" 120 "\x00\x2e\x4d\x43\x1d\x5f\xfd\x58", 121 24, 122 "\xbf\x9a\x12\xb7\x26\x69\xfd\x05", 123 16, 124 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 125 "\x55\x95\x97\x76\xa9\x6c\x66\x40\x64\xc7\xf4\x1c\x21\xb7\x14\x1b", 126 NULL 127 } 128 }; 129 130 struct tests camellia128_tests[] = { 131 { "camellia128", 132 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 133 16, 134 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 135 16, 136 "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 137 "\x07\x92\x3A\x39\xEB\x0A\x81\x7D\x1C\x4D\x87\xBD\xB8\x2D\x1F\x1C", 138 NULL 139 } 140 }; 141 142 struct tests rc4_tests[] = { 143 { 144 "rc4 8", 145 "\x01\x23\x45\x67\x89\xAB\xCD\xEF", 146 8, 147 NULL, 148 8, 149 "\x00\x00\x00\x00\x00\x00\x00\x00", 150 "\x74\x94\xC2\xE7\x10\x4B\x08\x79", 151 NULL 152 }, 153 { 154 "rc4 5", 155 "\x61\x8a\x63\xd2\xfb", 156 5, 157 NULL, 158 5, 159 "\xdc\xee\x4c\xf9\x2c", 160 "\xf1\x38\x29\xc9\xde", 161 NULL 162 }, 163 { 164 "rc4 309", 165 "\x29\x04\x19\x72\xfb\x42\xba\x5f\xc7\x12\x77\x12\xf1\x38\x29\xc9", 166 16, 167 NULL, 168 309, 169 "\x52\x75\x69\x73\x6c\x69\x6e\x6e" 170 "\x75\x6e\x20\x6c\x61\x75\x6c\x75" 171 "\x20\x6b\x6f\x72\x76\x69\x73\x73" 172 "\x73\x61\x6e\x69\x2c\x20\x74\xe4" 173 "\x68\x6b\xe4\x70\xe4\x69\x64\x65" 174 "\x6e\x20\x70\xe4\xe4\x6c\x6c\xe4" 175 "\x20\x74\xe4\x79\x73\x69\x6b\x75" 176 "\x75\x2e\x20\x4b\x65\x73\xe4\x79" 177 "\xf6\x6e\x20\x6f\x6e\x20\x6f\x6e" 178 "\x6e\x69\x20\x6f\x6d\x61\x6e\x61" 179 "\x6e\x69\x2c\x20\x6b\x61\x73\x6b" 180 "\x69\x73\x61\x76\x75\x75\x6e\x20" 181 "\x6c\x61\x61\x6b\x73\x6f\x74\x20" 182 "\x76\x65\x72\x68\x6f\x75\x75\x2e" 183 "\x20\x45\x6e\x20\x6d\x61\x20\x69" 184 "\x6c\x6f\x69\x74\x73\x65\x2c\x20" 185 "\x73\x75\x72\x65\x20\x68\x75\x6f" 186 "\x6b\x61\x61\x2c\x20\x6d\x75\x74" 187 "\x74\x61\x20\x6d\x65\x74\x73\xe4" 188 "\x6e\x20\x74\x75\x6d\x6d\x75\x75" 189 "\x73\x20\x6d\x75\x6c\x6c\x65\x20" 190 "\x74\x75\x6f\x6b\x61\x61\x2e\x20" 191 "\x50\x75\x75\x6e\x74\x6f\x20\x70" 192 "\x69\x6c\x76\x65\x6e\x2c\x20\x6d" 193 "\x69\x20\x68\x75\x6b\x6b\x75\x75" 194 "\x2c\x20\x73\x69\x69\x6e\x74\x6f" 195 "\x20\x76\x61\x72\x61\x6e\x20\x74" 196 "\x75\x75\x6c\x69\x73\x65\x6e\x2c" 197 "\x20\x6d\x69\x20\x6e\x75\x6b\x6b" 198 "\x75\x75\x2e\x20\x54\x75\x6f\x6b" 199 "\x73\x75\x74\x20\x76\x61\x6e\x61" 200 "\x6d\x6f\x6e\x20\x6a\x61\x20\x76" 201 "\x61\x72\x6a\x6f\x74\x20\x76\x65" 202 "\x65\x6e\x2c\x20\x6e\x69\x69\x73" 203 "\x74\xe4\x20\x73\x79\x64\xe4\x6d" 204 "\x65\x6e\x69\x20\x6c\x61\x75\x6c" 205 "\x75\x6e\x20\x74\x65\x65\x6e\x2e" 206 "\x20\x2d\x20\x45\x69\x6e\x6f\x20" 207 "\x4c\x65\x69\x6e\x6f", 208 "\x35\x81\x86\x99\x90\x01\xe6\xb5" 209 "\xda\xf0\x5e\xce\xeb\x7e\xee\x21" 210 "\xe0\x68\x9c\x1f\x00\xee\xa8\x1f" 211 "\x7d\xd2\xca\xae\xe1\xd2\x76\x3e" 212 "\x68\xaf\x0e\xad\x33\xd6\x6c\x26" 213 "\x8b\xc9\x46\xc4\x84\xfb\xe9\x4c" 214 "\x5f\x5e\x0b\x86\xa5\x92\x79\xe4" 215 "\xf8\x24\xe7\xa6\x40\xbd\x22\x32" 216 "\x10\xb0\xa6\x11\x60\xb7\xbc\xe9" 217 "\x86\xea\x65\x68\x80\x03\x59\x6b" 218 "\x63\x0a\x6b\x90\xf8\xe0\xca\xf6" 219 "\x91\x2a\x98\xeb\x87\x21\x76\xe8" 220 "\x3c\x20\x2c\xaa\x64\x16\x6d\x2c" 221 "\xce\x57\xff\x1b\xca\x57\xb2\x13" 222 "\xf0\xed\x1a\xa7\x2f\xb8\xea\x52" 223 "\xb0\xbe\x01\xcd\x1e\x41\x28\x67" 224 "\x72\x0b\x32\x6e\xb3\x89\xd0\x11" 225 "\xbd\x70\xd8\xaf\x03\x5f\xb0\xd8" 226 "\x58\x9d\xbc\xe3\xc6\x66\xf5\xea" 227 "\x8d\x4c\x79\x54\xc5\x0c\x3f\x34" 228 "\x0b\x04\x67\xf8\x1b\x42\x59\x61" 229 "\xc1\x18\x43\x07\x4d\xf6\x20\xf2" 230 "\x08\x40\x4b\x39\x4c\xf9\xd3\x7f" 231 "\xf5\x4b\x5f\x1a\xd8\xf6\xea\x7d" 232 "\xa3\xc5\x61\xdf\xa7\x28\x1f\x96" 233 "\x44\x63\xd2\xcc\x35\xa4\xd1\xb0" 234 "\x34\x90\xde\xc5\x1b\x07\x11\xfb" 235 "\xd6\xf5\x5f\x79\x23\x4d\x5b\x7c" 236 "\x76\x66\x22\xa6\x6d\xe9\x2b\xe9" 237 "\x96\x46\x1d\x5e\x4d\xc8\x78\xef" 238 "\x9b\xca\x03\x05\x21\xe8\x35\x1e" 239 "\x4b\xae\xd2\xfd\x04\xf9\x46\x73" 240 "\x68\xc4\xad\x6a\xc1\x86\xd0\x82" 241 "\x45\xb2\x63\xa2\x66\x6d\x1f\x6c" 242 "\x54\x20\xf1\x59\x9d\xfd\x9f\x43" 243 "\x89\x21\xc2\xf5\xa4\x63\x93\x8c" 244 "\xe0\x98\x22\x65\xee\xf7\x01\x79" 245 "\xbc\x55\x3f\x33\x9e\xb1\xa4\xc1" 246 "\xaf\x5f\x6a\x54\x7f", 247 NULL 248 } 249 }; 250 251 252 static int 253 test_cipher(int i, const EVP_CIPHER *c, struct tests *t) 254 { 255 EVP_CIPHER_CTX ectx; 256 EVP_CIPHER_CTX dctx; 257 void *d; 258 259 if (c == NULL) { 260 printf("%s not supported\n", t->name); 261 return 0; 262 } 263 264 EVP_CIPHER_CTX_init(&ectx); 265 EVP_CIPHER_CTX_init(&dctx); 266 267 if (EVP_CipherInit_ex(&ectx, c, NULL, NULL, NULL, 1) != 1) 268 errx(1, "%s: %d EVP_CipherInit_ex einit", t->name, i); 269 if (EVP_CipherInit_ex(&dctx, c, NULL, NULL, NULL, 0) != 1) 270 errx(1, "%s: %d EVP_CipherInit_ex dinit", t->name, i); 271 272 EVP_CIPHER_CTX_set_key_length(&ectx, t->keysize); 273 EVP_CIPHER_CTX_set_key_length(&dctx, t->keysize); 274 275 if (EVP_CipherInit_ex(&ectx, NULL, NULL, t->key, t->iv, 1) != 1) 276 errx(1, "%s: %d EVP_CipherInit_ex encrypt", t->name, i); 277 if (EVP_CipherInit_ex(&dctx, NULL, NULL, t->key, t->iv, 0) != 1) 278 errx(1, "%s: %d EVP_CipherInit_ex decrypt", t->name, i); 279 280 d = emalloc(t->datasize); 281 282 if (!EVP_Cipher(&ectx, d, t->indata, t->datasize)) 283 errx(1, "%s: %d EVP_Cipher encrypt failed", t->name, i); 284 285 if (memcmp(d, t->outdata, t->datasize) != 0) { 286 char *s, *s2; 287 hex_encode(d, t->datasize, &s); 288 hex_encode(t->outdata, t->datasize, &s2); 289 errx(1, "%s: %d encrypt not the same: %s != %s", t->name, i, s, s2); 290 } 291 292 if (!EVP_Cipher(&dctx, d, d, t->datasize)) 293 errx(1, "%s: %d EVP_Cipher decrypt failed", t->name, i); 294 295 if (memcmp(d, t->indata, t->datasize) != 0) { 296 char *s; 297 hex_encode(d, t->datasize, &s); 298 errx(1, "%s: %d decrypt not the same: %s", t->name, i, s); 299 } 300 if (t->outiv) 301 /* XXXX check */; 302 303 EVP_CIPHER_CTX_cleanup(&ectx); 304 EVP_CIPHER_CTX_cleanup(&dctx); 305 free(d); 306 307 return 0; 308 } 309 310 static int version_flag; 311 static int help_flag; 312 313 static struct getargs args[] = { 314 { "version", 0, arg_flag, &version_flag, 315 "print version", NULL }, 316 { "help", 0, arg_flag, &help_flag, 317 NULL, NULL } 318 }; 319 320 static void 321 usage (int ret) 322 { 323 arg_printusage (args, 324 sizeof(args)/sizeof(*args), 325 NULL, 326 ""); 327 exit (ret); 328 } 329 330 int 331 main(int argc, char **argv) 332 { 333 int ret = 0; 334 int i, idx = 0; 335 336 setprogname(argv[0]); 337 338 if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &idx)) 339 usage(1); 340 341 if (help_flag) 342 usage(0); 343 344 if(version_flag){ 345 print_version(NULL); 346 exit(0); 347 } 348 349 argc -= idx; 350 argv += idx; 351 352 /* hcrypto */ 353 for (i = 0; i < sizeof(aes_tests)/sizeof(aes_tests[0]); i++) 354 ret += test_cipher(i, EVP_hcrypto_aes_256_cbc(), &aes_tests[i]); 355 for (i = 0; i < sizeof(aes_cfb_tests)/sizeof(aes_cfb_tests[0]); i++) 356 ret += test_cipher(i, EVP_hcrypto_aes_128_cfb8(), &aes_cfb_tests[i]); 357 for (i = 0; i < sizeof(rc2_tests)/sizeof(rc2_tests[0]); i++) 358 ret += test_cipher(i, EVP_hcrypto_rc2_cbc(), &rc2_tests[i]); 359 for (i = 0; i < sizeof(rc2_40_tests)/sizeof(rc2_40_tests[0]); i++) 360 ret += test_cipher(i, EVP_hcrypto_rc2_40_cbc(), &rc2_40_tests[i]); 361 for (i = 0; i < sizeof(des_ede3_tests)/sizeof(des_ede3_tests[0]); i++) 362 ret += test_cipher(i, EVP_hcrypto_des_ede3_cbc(), &des_ede3_tests[i]); 363 for (i = 0; i < sizeof(camellia128_tests)/sizeof(camellia128_tests[0]); i++) 364 ret += test_cipher(i, EVP_hcrypto_camellia_128_cbc(), 365 &camellia128_tests[i]); 366 for (i = 0; i < sizeof(rc4_tests)/sizeof(rc4_tests[0]); i++) 367 ret += test_cipher(i, EVP_hcrypto_rc4(), &rc4_tests[i]); 368 369 /* Common Crypto */ 370 #ifdef __APPLE__ 371 for (i = 0; i < sizeof(aes_tests)/sizeof(aes_tests[0]); i++) 372 ret += test_cipher(i, EVP_cc_aes_256_cbc(), &aes_tests[i]); 373 for (i = 0; i < sizeof(aes_cfb_tests)/sizeof(aes_cfb_tests[0]); i++) 374 ret += test_cipher(i, EVP_cc_aes_128_cfb8(), &aes_cfb_tests[i]); 375 for (i = 0; i < sizeof(rc2_40_tests)/sizeof(rc2_40_tests[0]); i++) 376 ret += test_cipher(i, EVP_cc_rc2_40_cbc(), &rc2_40_tests[i]); 377 for (i = 0; i < sizeof(des_ede3_tests)/sizeof(des_ede3_tests[0]); i++) 378 ret += test_cipher(i, EVP_cc_des_ede3_cbc(), &des_ede3_tests[i]); 379 for (i = 0; i < sizeof(camellia128_tests)/sizeof(camellia128_tests[0]); i++) 380 ret += test_cipher(i, EVP_cc_camellia_128_cbc(), 381 &camellia128_tests[i]); 382 for (i = 0; i < sizeof(rc4_tests)/sizeof(rc4_tests[0]); i++) 383 ret += test_cipher(i, EVP_cc_rc4(), &rc4_tests[i]); 384 #endif /* __APPLE__ */ 385 386 /* Windows CNG (if available) */ 387 #ifdef WIN32 388 for (i = 0; i < sizeof(aes_tests)/sizeof(aes_tests[0]); i++) 389 ret += test_cipher(i, EVP_w32crypto_aes_256_cbc(), &aes_tests[i]); 390 for (i = 0; i < sizeof(aes_cfb_tests)/sizeof(aes_cfb_tests[0]); i++) 391 ret += test_cipher(i, EVP_w32crypto_aes_128_cfb8(), &aes_cfb_tests[i]); 392 for (i = 0; i < sizeof(rc2_tests)/sizeof(rc2_tests[0]); i++) 393 ret += test_cipher(i, EVP_w32crypto_rc2_cbc(), &rc2_tests[i]); 394 for (i = 0; i < sizeof(rc2_40_tests)/sizeof(rc2_40_tests[0]); i++) 395 ret += test_cipher(i, EVP_w32crypto_rc2_40_cbc(), &rc2_40_tests[i]); 396 for (i = 0; i < sizeof(des_ede3_tests)/sizeof(des_ede3_tests[0]); i++) 397 ret += test_cipher(i, EVP_w32crypto_des_ede3_cbc(), &des_ede3_tests[i]); 398 for (i = 0; i < sizeof(rc4_tests)/sizeof(rc4_tests[0]); i++) 399 ret += test_cipher(i, EVP_w32crypto_rc4(), &rc4_tests[i]); 400 #endif /* WIN32 */ 401 402 /* PKCS#11 */ 403 #if __sun || defined(PKCS11_MODULE_PATH) 404 for (i = 0; i < sizeof(aes_tests)/sizeof(aes_tests[0]); i++) 405 ret += test_cipher(i, EVP_pkcs11_aes_256_cbc(), &aes_tests[i]); 406 for (i = 0; i < sizeof(aes_cfb_tests)/sizeof(aes_cfb_tests[0]); i++) 407 ret += test_cipher(i, EVP_pkcs11_aes_128_cfb8(), &aes_cfb_tests[i]); 408 for (i = 0; i < sizeof(rc2_tests)/sizeof(rc2_tests[0]); i++) 409 ret += test_cipher(i, EVP_pkcs11_rc2_cbc(), &rc2_tests[i]); 410 for (i = 0; i < sizeof(rc2_40_tests)/sizeof(rc2_40_tests[0]); i++) 411 ret += test_cipher(i, EVP_pkcs11_rc2_40_cbc(), &rc2_40_tests[i]); 412 for (i = 0; i < sizeof(des_ede3_tests)/sizeof(des_ede3_tests[0]); i++) 413 ret += test_cipher(i, EVP_pkcs11_des_ede3_cbc(), &des_ede3_tests[i]); 414 for (i = 0; i < sizeof(rc4_tests)/sizeof(rc4_tests[0]); i++) 415 ret += test_cipher(i, EVP_pkcs11_rc4(), &rc4_tests[i]); 416 #endif /* PKCS11_MODULE_PATH */ 417 418 /* OpenSSL */ 419 #ifdef HAVE_HCRYPTO_W_OPENSSL 420 for (i = 0; i < sizeof(aes_tests)/sizeof(aes_tests[0]); i++) 421 ret += test_cipher(i, EVP_ossl_aes_256_cbc(), &aes_tests[i]); 422 for (i = 0; i < sizeof(aes_cfb_tests)/sizeof(aes_cfb_tests[0]); i++) 423 ret += test_cipher(i, EVP_ossl_aes_128_cfb8(), &aes_cfb_tests[i]); 424 for (i = 0; i < sizeof(rc2_tests)/sizeof(rc2_tests[0]); i++) 425 ret += test_cipher(i, EVP_ossl_rc2_cbc(), &rc2_tests[i]); 426 for (i = 0; i < sizeof(rc2_40_tests)/sizeof(rc2_40_tests[0]); i++) 427 ret += test_cipher(i, EVP_ossl_rc2_40_cbc(), &rc2_40_tests[i]); 428 for (i = 0; i < sizeof(des_ede3_tests)/sizeof(des_ede3_tests[0]); i++) 429 ret += test_cipher(i, EVP_ossl_des_ede3_cbc(), &des_ede3_tests[i]); 430 for (i = 0; i < sizeof(rc4_tests)/sizeof(rc4_tests[0]); i++) 431 ret += test_cipher(i, EVP_ossl_rc4(), &rc4_tests[i]); 432 #endif /* PKCS11_MODULE_PATH */ 433 434 return ret; 435 } 436