1 /* $OpenBSD: crypto_legacy.c,v 1.6 2024/11/06 04:18:42 tb Exp $ */ 2 /* ==================================================================== 3 * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in 14 * the documentation and/or other materials provided with the 15 * distribution. 16 * 17 * 3. All advertising materials mentioning features or use of this 18 * software must display the following acknowledgment: 19 * "This product includes software developed by the OpenSSL Project 20 * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" 21 * 22 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 23 * endorse or promote products derived from this software without 24 * prior written permission. For written permission, please contact 25 * openssl-core@openssl.org. 26 * 27 * 5. Products derived from this software may not be called "OpenSSL" 28 * nor may "OpenSSL" appear in their names without prior written 29 * permission of the OpenSSL Project. 30 * 31 * 6. Redistributions of any form whatsoever must retain the following 32 * acknowledgment: 33 * "This product includes software developed by the OpenSSL Project 34 * for use in the OpenSSL Toolkit (http://www.openssl.org/)" 35 * 36 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 37 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 38 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 39 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 40 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 41 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 42 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 43 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 44 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 45 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 46 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 47 * OF THE POSSIBILITY OF SUCH DAMAGE. 48 * ==================================================================== 49 * 50 * This product includes cryptographic software written by Eric Young 51 * (eay@cryptsoft.com). This product includes software written by Tim 52 * Hudson (tjh@cryptsoft.com). 53 * 54 */ 55 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 56 * All rights reserved. 57 * 58 * This package is an SSL implementation written 59 * by Eric Young (eay@cryptsoft.com). 60 * The implementation was written so as to conform with Netscapes SSL. 61 * 62 * This library is free for commercial and non-commercial use as long as 63 * the following conditions are aheared to. The following conditions 64 * apply to all code found in this distribution, be it the RC4, RSA, 65 * lhash, DES, etc., code; not just the SSL code. The SSL documentation 66 * included with this distribution is covered by the same copyright terms 67 * except that the holder is Tim Hudson (tjh@cryptsoft.com). 68 * 69 * Copyright remains Eric Young's, and as such any Copyright notices in 70 * the code are not to be removed. 71 * If this package is used in a product, Eric Young should be given attribution 72 * as the author of the parts of the library used. 73 * This can be in the form of a textual message at program startup or 74 * in documentation (online or textual) provided with the package. 75 * 76 * Redistribution and use in source and binary forms, with or without 77 * modification, are permitted provided that the following conditions 78 * are met: 79 * 1. Redistributions of source code must retain the copyright 80 * notice, this list of conditions and the following disclaimer. 81 * 2. Redistributions in binary form must reproduce the above copyright 82 * notice, this list of conditions and the following disclaimer in the 83 * documentation and/or other materials provided with the distribution. 84 * 3. All advertising materials mentioning features or use of this software 85 * must display the following acknowledgement: 86 * "This product includes cryptographic software written by 87 * Eric Young (eay@cryptsoft.com)" 88 * The word 'cryptographic' can be left out if the rouines from the library 89 * being used are not cryptographic related :-). 90 * 4. If you include any Windows specific code (or a derivative thereof) from 91 * the apps directory (application code) you must include an acknowledgement: 92 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 93 * 94 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 95 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 96 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 97 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 98 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 99 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 100 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 101 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 102 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 103 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 104 * SUCH DAMAGE. 105 * 106 * The licence and distribution terms for any publically available version or 107 * derivative of this code cannot be changed. i.e. this code cannot simply be 108 * copied and put under another distribution licence 109 * [including the GNU Public Licence.] 110 */ 111 /* ==================================================================== 112 * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. 113 * ECDH support in OpenSSL originally developed by 114 * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project. 115 */ 116 117 #include <pthread.h> 118 #include <stdarg.h> 119 #include <stdio.h> 120 #include <string.h> 121 #include <syslog.h> 122 #include <unistd.h> 123 124 #include <openssl/opensslconf.h> 125 #include <openssl/crypto.h> 126 #include <openssl/err.h> 127 128 #include "crypto_internal.h" 129 #include "crypto_local.h" 130 #include "x86_arch.h" 131 132 /* Machine independent capabilities. */ 133 uint64_t crypto_cpu_caps; 134 135 static void (*locking_callback)(int mode, int type, 136 const char *file, int line) = NULL; 137 static int (*add_lock_callback)(int *pointer, int amount, 138 int type, const char *file, int line) = NULL; 139 140 int 141 CRYPTO_num_locks(void) 142 { 143 return 1; 144 } 145 LCRYPTO_ALIAS(CRYPTO_num_locks); 146 147 unsigned long 148 (*CRYPTO_get_id_callback(void))(void) 149 { 150 return NULL; 151 } 152 LCRYPTO_ALIAS(CRYPTO_get_id_callback); 153 154 void 155 CRYPTO_set_id_callback(unsigned long (*func)(void)) 156 { 157 return; 158 } 159 LCRYPTO_ALIAS(CRYPTO_set_id_callback); 160 161 unsigned long 162 CRYPTO_thread_id(void) 163 { 164 return (unsigned long)pthread_self(); 165 } 166 LCRYPTO_ALIAS(CRYPTO_thread_id); 167 168 void 169 CRYPTO_set_locking_callback(void (*func)(int mode, int lock_num, 170 const char *file, int line)) 171 { 172 locking_callback = func; 173 } 174 LCRYPTO_ALIAS(CRYPTO_set_locking_callback); 175 176 void 177 (*CRYPTO_get_locking_callback(void))(int mode, int lock_num, 178 const char *file, int line) 179 { 180 return locking_callback; 181 } 182 LCRYPTO_ALIAS(CRYPTO_get_locking_callback); 183 184 void 185 CRYPTO_set_add_lock_callback(int (*func)(int *num, int mount, int lock_num, 186 const char *file, int line)) 187 { 188 add_lock_callback = func; 189 } 190 LCRYPTO_ALIAS(CRYPTO_set_add_lock_callback); 191 192 int 193 (*CRYPTO_get_add_lock_callback(void))(int *num, int mount, int type, 194 const char *file, int line) 195 { 196 return add_lock_callback; 197 } 198 LCRYPTO_ALIAS(CRYPTO_get_add_lock_callback); 199 200 const char * 201 CRYPTO_get_lock_name(int lock_num) 202 { 203 return ""; 204 } 205 LCRYPTO_ALIAS(CRYPTO_get_lock_name); 206 207 struct CRYPTO_dynlock_value * 208 CRYPTO_get_dynlock_value(int i) 209 { 210 return NULL; 211 } 212 LCRYPTO_ALIAS(CRYPTO_get_dynlock_value); 213 214 int 215 CRYPTO_get_new_dynlockid(void) 216 { 217 return 0; 218 } 219 LCRYPTO_ALIAS(CRYPTO_get_new_dynlockid); 220 221 void 222 CRYPTO_destroy_dynlockid(int i) 223 { 224 return; 225 } 226 LCRYPTO_ALIAS(CRYPTO_destroy_dynlockid); 227 228 int CRYPTO_get_new_lockid(char *name) 229 { 230 return 0; 231 } 232 LCRYPTO_ALIAS(CRYPTO_get_new_lockid); 233 234 int 235 CRYPTO_THREADID_set_callback(void (*func)(CRYPTO_THREADID *)) 236 { 237 return 1; 238 } 239 LCRYPTO_ALIAS(CRYPTO_THREADID_set_callback); 240 241 void 242 (*CRYPTO_THREADID_get_callback(void))(CRYPTO_THREADID *) 243 { 244 return NULL; 245 } 246 LCRYPTO_ALIAS(CRYPTO_THREADID_get_callback); 247 248 void 249 CRYPTO_THREADID_set_numeric(CRYPTO_THREADID *id, unsigned long val) 250 { 251 return; 252 } 253 LCRYPTO_ALIAS(CRYPTO_THREADID_set_numeric); 254 255 void 256 CRYPTO_THREADID_set_pointer(CRYPTO_THREADID *id, void *ptr) 257 { 258 return; 259 } 260 LCRYPTO_ALIAS(CRYPTO_THREADID_set_pointer); 261 262 void 263 CRYPTO_set_dynlock_create_callback(struct CRYPTO_dynlock_value *( 264 *dyn_create_function)(const char *file, int line)) 265 { 266 return; 267 } 268 LCRYPTO_ALIAS(CRYPTO_set_dynlock_create_callback); 269 270 void 271 CRYPTO_set_dynlock_lock_callback(void (*dyn_lock_function)( 272 int mode, struct CRYPTO_dynlock_value *l, const char *file, int line)) 273 { 274 return; 275 } 276 LCRYPTO_ALIAS(CRYPTO_set_dynlock_lock_callback); 277 278 void 279 CRYPTO_set_dynlock_destroy_callback(void (*dyn_destroy_function)( 280 struct CRYPTO_dynlock_value *l, const char *file, int line)) 281 { 282 return; 283 } 284 LCRYPTO_ALIAS(CRYPTO_set_dynlock_destroy_callback); 285 286 struct CRYPTO_dynlock_value * 287 (*CRYPTO_get_dynlock_create_callback(void))(const char *file, int line) 288 { 289 return NULL; 290 } 291 LCRYPTO_ALIAS(CRYPTO_get_dynlock_create_callback); 292 293 void 294 (*CRYPTO_get_dynlock_lock_callback(void))(int mode, 295 struct CRYPTO_dynlock_value *l, const char *file, int line) 296 { 297 return NULL; 298 } 299 LCRYPTO_ALIAS(CRYPTO_get_dynlock_lock_callback); 300 301 void 302 (*CRYPTO_get_dynlock_destroy_callback(void))( 303 struct CRYPTO_dynlock_value *l, const char *file, int line) 304 { 305 return NULL; 306 } 307 LCRYPTO_ALIAS(CRYPTO_get_dynlock_destroy_callback); 308 309 #if !defined(OPENSSL_CPUID_SETUP) && !defined(OPENSSL_CPUID_OBJ) 310 void 311 OPENSSL_cpuid_setup(void) 312 { 313 } 314 #endif 315 316 #ifndef HAVE_CRYPTO_CPU_CAPS_INIT 317 void 318 crypto_cpu_caps_init(void) 319 { 320 OPENSSL_cpuid_setup(); 321 } 322 #endif 323 324 #ifndef HAVE_CRYPTO_CPU_CAPS_IA32 325 uint64_t 326 crypto_cpu_caps_ia32(void) 327 { 328 return 0; 329 } 330 #endif 331 332 uint64_t 333 OPENSSL_cpu_caps(void) 334 { 335 return crypto_cpu_caps; 336 } 337 LCRYPTO_ALIAS(OPENSSL_cpu_caps); 338 339 static void 340 OPENSSL_showfatal(const char *fmta, ...) 341 { 342 struct syslog_data sdata = SYSLOG_DATA_INIT; 343 va_list ap; 344 345 va_start(ap, fmta); 346 vsyslog_r(LOG_CONS|LOG_LOCAL2, &sdata, fmta, ap); 347 va_end(ap); 348 } 349 350 void 351 OpenSSLDie(const char *file, int line, const char *assertion) 352 { 353 OPENSSL_showfatal( 354 "uid %u cmd %s %s(%d): OpenSSL internal error, assertion failed: %s\n", 355 getuid(), getprogname(), file, line, assertion); 356 _exit(1); 357 } 358 LCRYPTO_ALIAS(OpenSSLDie); 359 360 int 361 CRYPTO_mem_ctrl(int mode) 362 { 363 return CRYPTO_MEM_CHECK_OFF; 364 } 365 LCRYPTO_ALIAS(CRYPTO_mem_ctrl); 366 367 int 368 CRYPTO_memcmp(const void *in_a, const void *in_b, size_t len) 369 { 370 size_t i; 371 const unsigned char *a = in_a; 372 const unsigned char *b = in_b; 373 unsigned char x = 0; 374 375 for (i = 0; i < len; i++) 376 x |= a[i] ^ b[i]; 377 378 return x; 379 } 380 LCRYPTO_ALIAS(CRYPTO_memcmp); 381 382 int 383 FIPS_mode(void) 384 { 385 return 0; 386 } 387 LCRYPTO_ALIAS(FIPS_mode); 388 389 int 390 FIPS_mode_set(int r) 391 { 392 if (r == 0) 393 return 1; 394 CRYPTOerror(CRYPTO_R_FIPS_MODE_NOT_SUPPORTED); 395 return 0; 396 } 397 LCRYPTO_ALIAS(FIPS_mode_set); 398 399 const char * 400 SSLeay_version(int t) 401 { 402 switch (t) { 403 case SSLEAY_VERSION: 404 return OPENSSL_VERSION_TEXT; 405 case SSLEAY_BUILT_ON: 406 return "built on: date not available"; 407 case SSLEAY_CFLAGS: 408 return "compiler: information not available"; 409 case SSLEAY_PLATFORM: 410 return "platform: information not available"; 411 case SSLEAY_DIR: 412 return "OPENSSLDIR: \"" OPENSSLDIR "\""; 413 } 414 return "not available"; 415 } 416 LCRYPTO_ALIAS(SSLeay_version); 417 418 unsigned long 419 SSLeay(void) 420 { 421 return SSLEAY_VERSION_NUMBER; 422 } 423 LCRYPTO_ALIAS(SSLeay); 424 425 const char * 426 OpenSSL_version(int t) 427 { 428 switch (t) { 429 case OPENSSL_VERSION: 430 return OPENSSL_VERSION_TEXT; 431 case OPENSSL_BUILT_ON: 432 return "built on: date not available"; 433 case OPENSSL_CFLAGS: 434 return "compiler: information not available"; 435 case OPENSSL_PLATFORM: 436 return "platform: information not available"; 437 case OPENSSL_DIR: 438 return "OPENSSLDIR: \"" OPENSSLDIR "\""; 439 case OPENSSL_ENGINES_DIR: 440 return "ENGINESDIR: N/A"; 441 } 442 return "not available"; 443 } 444 LCRYPTO_ALIAS(OpenSSL_version); 445 446 unsigned long 447 OpenSSL_version_num(void) 448 { 449 return SSLeay(); 450 } 451 LCRYPTO_ALIAS(OpenSSL_version_num); 452