1 /* $OpenBSD: cryptlib.c,v 1.45 2019/01/26 11:30:32 deraadt 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 127 static void (*locking_callback)(int mode, int type, 128 const char *file, int line) = NULL; 129 static int (*add_lock_callback)(int *pointer, int amount, 130 int type, const char *file, int line) = NULL; 131 132 int 133 CRYPTO_num_locks(void) 134 { 135 return 1; 136 } 137 138 unsigned long 139 (*CRYPTO_get_id_callback(void))(void) 140 { 141 return NULL; 142 } 143 144 void 145 CRYPTO_set_id_callback(unsigned long (*func)(void)) 146 { 147 return; 148 } 149 150 unsigned long 151 CRYPTO_thread_id(void) 152 { 153 return (unsigned long)pthread_self(); 154 } 155 156 void 157 CRYPTO_set_locking_callback(void (*func)(int mode, int lock_num, 158 const char *file, int line)) 159 { 160 locking_callback = func; 161 } 162 163 void 164 (*CRYPTO_get_locking_callback(void))(int mode, int lock_num, 165 const char *file, int line) 166 { 167 return locking_callback; 168 } 169 170 void 171 CRYPTO_set_add_lock_callback(int (*func)(int *num, int mount, int lock_num, 172 const char *file, int line)) 173 { 174 add_lock_callback = func; 175 } 176 177 int 178 (*CRYPTO_get_add_lock_callback(void))(int *num, int mount, int type, 179 const char *file, int line) 180 { 181 return add_lock_callback; 182 } 183 184 const char * 185 CRYPTO_get_lock_name(int lock_num) 186 { 187 return ""; 188 } 189 190 struct CRYPTO_dynlock_value * 191 CRYPTO_get_dynlock_value(int i) 192 { 193 return NULL; 194 } 195 196 int CRYPTO_get_new_dynlockid(void) 197 { 198 return 0; 199 } 200 201 void 202 CRYPTO_destroy_dynlockid(int i) 203 { 204 return; 205 } 206 207 int CRYPTO_get_new_lockid(char *name) 208 { 209 return 0; 210 } 211 212 int 213 CRYPTO_THREADID_set_callback(void (*func)(CRYPTO_THREADID *)) 214 { 215 return 1; 216 } 217 218 void 219 (*CRYPTO_THREADID_get_callback(void))(CRYPTO_THREADID *) 220 { 221 return NULL; 222 } 223 224 void 225 CRYPTO_THREADID_set_numeric(CRYPTO_THREADID *id, unsigned long val) 226 { 227 return; 228 } 229 230 void 231 CRYPTO_THREADID_set_pointer(CRYPTO_THREADID *id, void *ptr) 232 { 233 return; 234 } 235 236 void 237 CRYPTO_set_dynlock_create_callback(struct CRYPTO_dynlock_value *( 238 *dyn_create_function)(const char *file, int line)) 239 { 240 return; 241 } 242 243 void 244 CRYPTO_set_dynlock_lock_callback(void (*dyn_lock_function)( 245 int mode, struct CRYPTO_dynlock_value *l, const char *file, int line)) 246 { 247 return; 248 } 249 250 void 251 CRYPTO_set_dynlock_destroy_callback(void (*dyn_destroy_function)( 252 struct CRYPTO_dynlock_value *l, const char *file, int line)) 253 { 254 return; 255 } 256 257 struct CRYPTO_dynlock_value * 258 (*CRYPTO_get_dynlock_create_callback(void))( 259 const char *file, int line) 260 { 261 return NULL; 262 } 263 264 void 265 (*CRYPTO_get_dynlock_lock_callback(void))(int mode, 266 struct CRYPTO_dynlock_value *l, const char *file, int line) 267 { 268 return NULL; 269 } 270 271 void 272 (*CRYPTO_get_dynlock_destroy_callback(void))( 273 struct CRYPTO_dynlock_value *l, const char *file, int line) 274 { 275 return NULL; 276 } 277 278 void 279 CRYPTO_THREADID_current(CRYPTO_THREADID *id) 280 { 281 memset(id, 0, sizeof(*id)); 282 id->val = (unsigned long)pthread_self(); 283 } 284 285 int 286 CRYPTO_THREADID_cmp(const CRYPTO_THREADID *a, const CRYPTO_THREADID *b) 287 { 288 return memcmp(a, b, sizeof(*a)); 289 } 290 291 void 292 CRYPTO_THREADID_cpy(CRYPTO_THREADID *dest, const CRYPTO_THREADID *src) 293 { 294 memcpy(dest, src, sizeof(*src)); 295 } 296 297 unsigned long 298 CRYPTO_THREADID_hash(const CRYPTO_THREADID *id) 299 { 300 return id->val; 301 } 302 303 #if defined(__i386) || defined(__i386__) || defined(_M_IX86) || \ 304 defined(__INTEL__) || \ 305 defined(__x86_64) || defined(__x86_64__) || defined(_M_AMD64) || defined(_M_X64) 306 307 uint64_t OPENSSL_ia32cap_P; 308 309 uint64_t 310 OPENSSL_cpu_caps(void) 311 { 312 return OPENSSL_ia32cap_P; 313 } 314 315 #if defined(OPENSSL_CPUID_OBJ) && !defined(OPENSSL_NO_ASM) 316 #define OPENSSL_CPUID_SETUP 317 #ifdef __DragonFly__ 318 extern uint64_t OPENSSL_ia32_cpuid(void); 319 #endif 320 void 321 OPENSSL_cpuid_setup(void) 322 { 323 static int trigger = 0; 324 #ifndef __DragonFly__ 325 /* -Werror=nested-externs */ 326 uint64_t OPENSSL_ia32_cpuid(void); 327 #endif 328 329 if (trigger) 330 return; 331 trigger = 1; 332 OPENSSL_ia32cap_P = OPENSSL_ia32_cpuid(); 333 } 334 #endif 335 336 #else 337 uint64_t 338 OPENSSL_cpu_caps(void) 339 { 340 return 0; 341 } 342 #endif 343 344 #if !defined(OPENSSL_CPUID_SETUP) && !defined(OPENSSL_CPUID_OBJ) 345 void 346 OPENSSL_cpuid_setup(void) 347 { 348 } 349 #endif 350 351 static void 352 OPENSSL_showfatal(const char *fmta, ...) 353 { 354 #ifndef __DragonFly__ 355 struct syslog_data sdata = SYSLOG_DATA_INIT; 356 #endif 357 va_list ap; 358 359 va_start(ap, fmta); 360 #ifndef __DragonFly__ 361 /* syslog abusing? */ 362 vsyslog_r(LOG_INFO|LOG_LOCAL2, &sdata, fmta, ap); 363 #else 364 vsyslog(LOG_INFO|LOG_LOCAL2, fmta, ap); 365 #endif 366 va_end(ap); 367 } 368 369 void 370 OpenSSLDie(const char *file, int line, const char *assertion) 371 { 372 OPENSSL_showfatal( 373 "uid %u cmd %s %s(%d): OpenSSL internal error, assertion failed: %s\n", 374 getuid(), getprogname(), file, line, assertion); 375 _exit(1); 376 } 377 378 int 379 CRYPTO_memcmp(const void *in_a, const void *in_b, size_t len) 380 { 381 size_t i; 382 const unsigned char *a = in_a; 383 const unsigned char *b = in_b; 384 unsigned char x = 0; 385 386 for (i = 0; i < len; i++) 387 x |= a[i] ^ b[i]; 388 389 return x; 390 } 391