123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 |
- /*
- * Copyright 1995-2024 The OpenSSL Project Authors. All Rights Reserved.
- *
- * Licensed under the Apache License 2.0 (the "License"). You may not use
- * this file except in compliance with the License. You can obtain a copy
- * in the file LICENSE in the source distribution or at
- * https://www.openssl.org/source/license.html
- */
- #ifndef OSSL_INTERNAL_COMMON_H
- # define OSSL_INTERNAL_COMMON_H
- # pragma once
- # include <stdlib.h>
- # include <string.h>
- # include "openssl/configuration.h"
- # include "internal/e_os.h" /* ossl_inline in many files */
- # include "internal/nelem.h"
- # if defined(__GNUC__) || defined(__clang__)
- # define ossl_likely(x) __builtin_expect(!!(x), 1)
- # define ossl_unlikely(x) __builtin_expect(!!(x), 0)
- # else
- # define ossl_likely(x) x
- # define ossl_unlikely(x) x
- # endif
- # if defined(__GNUC__) || defined(__clang__)
- # define ALIGN32 __attribute((aligned(32)))
- # define ALIGN64 __attribute((aligned(64)))
- # elif defined(_MSC_VER)
- # define ALIGN32 __declspec(align(32))
- # define ALIGN64 __declspec(align(64))
- # else
- # define ALIGN32
- # define ALIGN64
- # endif
- # ifdef NDEBUG
- # define ossl_assert(x) ossl_likely((x) != 0)
- # else
- __owur static ossl_inline int ossl_assert_int(int expr, const char *exprstr,
- const char *file, int line)
- {
- if (!expr)
- OPENSSL_die(exprstr, file, line);
- return expr;
- }
- # define ossl_assert(x) ossl_assert_int((x) != 0, "Assertion failed: "#x, \
- __FILE__, __LINE__)
- # endif
- /* Check if |pre|, which must be a string literal, is a prefix of |str| */
- #define HAS_PREFIX(str, pre) (strncmp(str, pre "", sizeof(pre) - 1) == 0)
- /* As before, and if check succeeds, advance |str| past the prefix |pre| */
- #define CHECK_AND_SKIP_PREFIX(str, pre) \
- (HAS_PREFIX(str, pre) ? ((str) += sizeof(pre) - 1, 1) : 0)
- /* Check if the string literal |p| is a case-insensitive prefix of |s| */
- #define HAS_CASE_PREFIX(s, p) (OPENSSL_strncasecmp(s, p "", sizeof(p) - 1) == 0)
- /* As before, and if check succeeds, advance |str| past the prefix |pre| */
- #define CHECK_AND_SKIP_CASE_PREFIX(str, pre) \
- (HAS_CASE_PREFIX(str, pre) ? ((str) += sizeof(pre) - 1, 1) : 0)
- /* Check if the string literal |suffix| is a case-insensitive suffix of |str| */
- #define HAS_CASE_SUFFIX(str, suffix) (strlen(str) < sizeof(suffix) - 1 ? 0 : \
- OPENSSL_strcasecmp(str + strlen(str) - sizeof(suffix) + 1, suffix "") == 0)
- /*
- * Use this inside a union with the field that needs to be aligned to a
- * reasonable boundary for the platform. The most pessimistic alignment
- * of the listed types will be used by the compiler.
- */
- # define OSSL_UNION_ALIGN \
- double align; \
- ossl_uintmax_t align_int; \
- void *align_ptr
- # define OPENSSL_CONF "openssl.cnf"
- # ifndef OPENSSL_SYS_VMS
- # define X509_CERT_AREA OPENSSLDIR
- # define X509_CERT_DIR OPENSSLDIR "/certs"
- # define X509_CERT_FILE OPENSSLDIR "/cert.pem"
- # define X509_PRIVATE_DIR OPENSSLDIR "/private"
- # define CTLOG_FILE OPENSSLDIR "/ct_log_list.cnf"
- # else
- # define X509_CERT_AREA "OSSL$DATAROOT:[000000]"
- # define X509_CERT_DIR "OSSL$DATAROOT:[CERTS]"
- # define X509_CERT_FILE "OSSL$DATAROOT:[000000]cert.pem"
- # define X509_PRIVATE_DIR "OSSL$DATAROOT:[PRIVATE]"
- # define CTLOG_FILE "OSSL$DATAROOT:[000000]ct_log_list.cnf"
- # endif
- # define X509_CERT_DIR_EVP "SSL_CERT_DIR"
- # define X509_CERT_FILE_EVP "SSL_CERT_FILE"
- # define CTLOG_FILE_EVP "CTLOG_FILE"
- /* size of string representations */
- # define DECIMAL_SIZE(type) ((sizeof(type)*8+2)/3+1)
- # define HEX_SIZE(type) (sizeof(type)*2)
- # define c2l(c,l) (l = ((unsigned long)(*((c)++))) , \
- l|=(((unsigned long)(*((c)++)))<< 8), \
- l|=(((unsigned long)(*((c)++)))<<16), \
- l|=(((unsigned long)(*((c)++)))<<24))
- /* NOTE - c is not incremented as per c2l */
- # define c2ln(c,l1,l2,n) { \
- c+=n; \
- l1=l2=0; \
- switch (n) { \
- case 8: l2 =((unsigned long)(*(--(c))))<<24; \
- case 7: l2|=((unsigned long)(*(--(c))))<<16; \
- case 6: l2|=((unsigned long)(*(--(c))))<< 8; \
- case 5: l2|=((unsigned long)(*(--(c)))); \
- case 4: l1 =((unsigned long)(*(--(c))))<<24; \
- case 3: l1|=((unsigned long)(*(--(c))))<<16; \
- case 2: l1|=((unsigned long)(*(--(c))))<< 8; \
- case 1: l1|=((unsigned long)(*(--(c)))); \
- } \
- }
- # define l2c(l,c) (*((c)++)=(unsigned char)(((l) )&0xff), \
- *((c)++)=(unsigned char)(((l)>> 8)&0xff), \
- *((c)++)=(unsigned char)(((l)>>16)&0xff), \
- *((c)++)=(unsigned char)(((l)>>24)&0xff))
- # define n2l(c,l) (l =((unsigned long)(*((c)++)))<<24, \
- l|=((unsigned long)(*((c)++)))<<16, \
- l|=((unsigned long)(*((c)++)))<< 8, \
- l|=((unsigned long)(*((c)++))))
- # define n2l8(c,l) (l =((uint64_t)(*((c)++)))<<56, \
- l|=((uint64_t)(*((c)++)))<<48, \
- l|=((uint64_t)(*((c)++)))<<40, \
- l|=((uint64_t)(*((c)++)))<<32, \
- l|=((uint64_t)(*((c)++)))<<24, \
- l|=((uint64_t)(*((c)++)))<<16, \
- l|=((uint64_t)(*((c)++)))<< 8, \
- l|=((uint64_t)(*((c)++))))
- # define l2n(l,c) (*((c)++)=(unsigned char)(((l)>>24)&0xff), \
- *((c)++)=(unsigned char)(((l)>>16)&0xff), \
- *((c)++)=(unsigned char)(((l)>> 8)&0xff), \
- *((c)++)=(unsigned char)(((l) )&0xff))
- # define l2n8(l,c) (*((c)++)=(unsigned char)(((l)>>56)&0xff), \
- *((c)++)=(unsigned char)(((l)>>48)&0xff), \
- *((c)++)=(unsigned char)(((l)>>40)&0xff), \
- *((c)++)=(unsigned char)(((l)>>32)&0xff), \
- *((c)++)=(unsigned char)(((l)>>24)&0xff), \
- *((c)++)=(unsigned char)(((l)>>16)&0xff), \
- *((c)++)=(unsigned char)(((l)>> 8)&0xff), \
- *((c)++)=(unsigned char)(((l) )&0xff))
- /* NOTE - c is not incremented as per l2c */
- # define l2cn(l1,l2,c,n) { \
- c+=n; \
- switch (n) { \
- case 8: *(--(c))=(unsigned char)(((l2)>>24)&0xff); \
- case 7: *(--(c))=(unsigned char)(((l2)>>16)&0xff); \
- case 6: *(--(c))=(unsigned char)(((l2)>> 8)&0xff); \
- case 5: *(--(c))=(unsigned char)(((l2) )&0xff); \
- case 4: *(--(c))=(unsigned char)(((l1)>>24)&0xff); \
- case 3: *(--(c))=(unsigned char)(((l1)>>16)&0xff); \
- case 2: *(--(c))=(unsigned char)(((l1)>> 8)&0xff); \
- case 1: *(--(c))=(unsigned char)(((l1) )&0xff); \
- } \
- }
- # define n2s(c,s) ((s=(((unsigned int)((c)[0]))<< 8)| \
- (((unsigned int)((c)[1])) )),(c)+=2)
- # define s2n(s,c) (((c)[0]=(unsigned char)(((s)>> 8)&0xff), \
- (c)[1]=(unsigned char)(((s) )&0xff)),(c)+=2)
- # define n2l3(c,l) ((l =(((unsigned long)((c)[0]))<<16)| \
- (((unsigned long)((c)[1]))<< 8)| \
- (((unsigned long)((c)[2])) )),(c)+=3)
- # define l2n3(l,c) (((c)[0]=(unsigned char)(((l)>>16)&0xff), \
- (c)[1]=(unsigned char)(((l)>> 8)&0xff), \
- (c)[2]=(unsigned char)(((l) )&0xff)),(c)+=3)
- static ossl_inline int ossl_ends_with_dirsep(const char *path)
- {
- if (*path != '\0')
- path += strlen(path) - 1;
- # if defined __VMS
- if (*path == ']' || *path == '>' || *path == ':')
- return 1;
- # elif defined _WIN32
- if (*path == '\\')
- return 1;
- # endif
- return *path == '/';
- }
- static ossl_inline char ossl_determine_dirsep(const char *path)
- {
- if (ossl_ends_with_dirsep(path))
- return '\0';
- # if defined(_WIN32)
- return '\\';
- # elif defined(__VMS)
- return ':';
- # else
- return '/';
- # endif
- }
- static ossl_inline int ossl_is_absolute_path(const char *path)
- {
- # if defined __VMS
- if (strchr(path, ':') != NULL
- || ((path[0] == '[' || path[0] == '<')
- && path[1] != '.' && path[1] != '-'
- && path[1] != ']' && path[1] != '>'))
- return 1;
- # elif defined _WIN32
- if (path[0] == '\\'
- || (path[0] != '\0' && path[1] == ':'))
- return 1;
- # endif
- return path[0] == '/';
- }
- #endif
|