/** @file C Run-Time Libraries (CRT) Wrapper Implementation for OpenSSL-based Cryptographic Library. Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include int errno = 0; FILE *stderr = NULL; FILE *stdin = NULL; FILE *stdout = NULL; typedef int (*SORT_COMPARE)( IN VOID *Buffer1, IN VOID *Buffer2 ); // // Duplicated from EDKII BaseSortLib for qsort() wrapper // STATIC VOID QuickSortWorker ( IN OUT VOID *BufferToSort, IN CONST UINTN Count, IN CONST UINTN ElementSize, IN SORT_COMPARE CompareFunction, IN VOID *Buffer ) { VOID *Pivot; UINTN LoopCount; UINTN NextSwapLocation; ASSERT (BufferToSort != NULL); ASSERT (CompareFunction != NULL); ASSERT (Buffer != NULL); if ((Count < 2) || (ElementSize < 1)) { return; } NextSwapLocation = 0; // // Pick a pivot (we choose last element) // Pivot = ((UINT8 *)BufferToSort + ((Count - 1) * ElementSize)); // // Now get the pivot such that all on "left" are below it // and everything "right" are above it // for (LoopCount = 0; LoopCount < Count - 1; LoopCount++) { // // If the element is less than the pivot // if (CompareFunction ((VOID *)((UINT8 *)BufferToSort + ((LoopCount) * ElementSize)), Pivot) <= 0) { // // Swap // CopyMem (Buffer, (UINT8 *)BufferToSort + (NextSwapLocation * ElementSize), ElementSize); CopyMem ((UINT8 *)BufferToSort + (NextSwapLocation * ElementSize), (UINT8 *)BufferToSort + ((LoopCount) * ElementSize), ElementSize); CopyMem ((UINT8 *)BufferToSort + ((LoopCount) * ElementSize), Buffer, ElementSize); // // Increment NextSwapLocation // NextSwapLocation++; } } // // Swap pivot to its final position (NextSwapLocation) // CopyMem (Buffer, Pivot, ElementSize); CopyMem (Pivot, (UINT8 *)BufferToSort + (NextSwapLocation * ElementSize), ElementSize); CopyMem ((UINT8 *)BufferToSort + (NextSwapLocation * ElementSize), Buffer, ElementSize); // // Now recurse on 2 partial lists. Neither of these will have the 'pivot' element. // IE list is sorted left half, pivot element, sorted right half... // QuickSortWorker ( BufferToSort, NextSwapLocation, ElementSize, CompareFunction, Buffer ); QuickSortWorker ( (UINT8 *)BufferToSort + (NextSwapLocation + 1) * ElementSize, Count - NextSwapLocation - 1, ElementSize, CompareFunction, Buffer ); return; } // --------------------------------------------------------- // Standard C Run-time Library Interface Wrapper // --------------------------------------------------------- // // -- String Manipulation Routines -- // char * strchr ( const char *str, int ch ) { return ScanMem8 (str, AsciiStrSize (str), (UINT8)ch); } /* Scan a string for the last occurrence of a character */ char * strrchr ( const char *str, int c ) { char *save; for (save = NULL; ; ++str) { if (*str == c) { save = (char *)str; } if (*str == 0) { return (save); } } } /* Compare first n bytes of string s1 with string s2, ignoring case */ int strncasecmp ( const char *s1, const char *s2, size_t n ) { int Val; ASSERT (s1 != NULL); ASSERT (s2 != NULL); if (n != 0) { do { Val = tolower (*s1) - tolower (*s2); if (Val != 0) { return Val; } ++s1; ++s2; if (*s1 == '\0') { break; } } while (--n != 0); } return 0; } /* Read formatted data from a string */ int sscanf ( const char *buffer, const char *format, ... ) { // // Null sscanf() function implementation to satisfy the linker, since // no direct functionality logic dependency in present UEFI cases. // return 0; } /* Maps errnum to an error-message string */ char * strerror ( int errnum ) { return NULL; } /* Computes the length of the maximum initial segment of the string pointed to by s1 which consists entirely of characters from the string pointed to by s2. */ size_t strspn ( const char *s1, const char *s2 ) { UINT8 Map[32]; UINT32 Index; size_t Count; for (Index = 0; Index < 32; Index++) { Map[Index] = 0; } while (*s2) { Map[*s2 >> 3] |= (1 << (*s2 & 7)); s2++; } if (*s1) { Count = 0; while (Map[*s1 >> 3] & (1 << (*s1 & 7))) { Count++; s1++; } return Count; } return 0; } /* Computes the length of the maximum initial segment of the string pointed to by s1 which consists entirely of characters not from the string pointed to by s2. */ size_t strcspn ( const char *s1, const char *s2 ) { UINT8 Map[32]; UINT32 Index; size_t Count; for (Index = 0; Index < 32; Index++) { Map[Index] = 0; } while (*s2) { Map[*s2 >> 3] |= (1 << (*s2 & 7)); s2++; } Map[0] |= 1; Count = 0; while (!(Map[*s1 >> 3] & (1 << (*s1 & 7)))) { Count++; s1++; } return Count; } // // -- Character Classification Routines -- // /* Determines if a particular character is a decimal-digit character */ int isdigit ( int c ) { // // ::= [0-9] // return (('0' <= (c)) && ((c) <= '9')); } /* Determine if an integer represents character that is a hex digit */ int isxdigit ( int c ) { // // ::= [0-9] | [a-f] | [A-F] // return ((('0' <= (c)) && ((c) <= '9')) || (('a' <= (c)) && ((c) <= 'f')) || (('A' <= (c)) && ((c) <= 'F'))); } /* Determines if a particular character represents a space character */ int isspace ( int c ) { // // ::= [ ] // return ((c) == ' '); } /* Determine if a particular character is an alphanumeric character */ int isalnum ( int c ) { // // ::= [0-9] | [a-z] | [A-Z] // return ((('0' <= (c)) && ((c) <= '9')) || (('a' <= (c)) && ((c) <= 'z')) || (('A' <= (c)) && ((c) <= 'Z'))); } /* Determines if a particular character is in upper case */ int isupper ( int c ) { // // := [A-Z] // return (('A' <= (c)) && ((c) <= 'Z')); } // // -- Data Conversion Routines -- // /* Convert strings to a long-integer value */ long strtol ( const char *nptr, char **endptr, int base ) { // // Null strtol() function implementation to satisfy the linker, since there is // no direct functionality logic dependency in present UEFI cases. // return 0; } /* Convert strings to an unsigned long-integer value */ unsigned long strtoul ( const char *nptr, char **endptr, int base ) { // // Null strtoul() function implementation to satisfy the linker, since there is // no direct functionality logic dependency in present UEFI cases. // return 0; } /* Convert character to lowercase */ int tolower ( int c ) { if (('A' <= (c)) && ((c) <= 'Z')) { return (c - ('A' - 'a')); } return (c); } // // -- Searching and Sorting Routines -- // /* Performs a quick sort */ void qsort ( void *base, size_t num, size_t width, int ( *compare )(const void *, const void *) ) { VOID *Buffer; ASSERT (base != NULL); ASSERT (compare != NULL); // // Use CRT-style malloc to cover BS and RT memory allocation. // Buffer = malloc (width); ASSERT (Buffer != NULL); // // Re-use PerformQuickSort() function Implementation in EDKII BaseSortLib. // QuickSortWorker (base, (UINTN)num, (UINTN)width, (SORT_COMPARE)compare, Buffer); free (Buffer); return; } // // -- Process and Environment Control Routines -- // /* Get a value from the current environment */ char * getenv ( const char *varname ) { // // Null getenv() function implementation to satisfy the linker, since there is // no direct functionality logic dependency in present UEFI cases. // return NULL; } /* Get a value from the current environment */ char * secure_getenv ( const char *varname ) { // // Null secure_getenv() function implementation to satisfy the linker, since // there is no direct functionality logic dependency in present UEFI cases. // // From the secure_getenv() manual: 'just like getenv() except that it // returns NULL in cases where "secure execution" is required'. // return NULL; } // // -- Stream I/O Routines -- // /* Write data to a stream */ size_t fwrite ( const void *buffer, size_t size, size_t count, FILE *stream ) { return 0; } // // -- Dummy OpenSSL Support Routines -- // int BIO_printf ( void *bio, const char *format, ... ) { return 0; } int BIO_snprintf ( char *buf, size_t n, const char *format, ... ) { return 0; } #ifdef __GNUC__ typedef VOID (EFIAPI *NoReturnFuncPtr)( VOID ) __attribute__ ((__noreturn__)); STATIC VOID EFIAPI NopFunction ( VOID ) { } void abort ( void ) { NoReturnFuncPtr NoReturnFunc; NoReturnFunc = (NoReturnFuncPtr)NopFunction; NoReturnFunc (); } #else void abort ( void ) { // Do nothing } #endif int fclose ( FILE *f ) { return 0; } FILE * fopen ( const char *c, const char *m ) { return NULL; } size_t fread ( void *b, size_t c, size_t i, FILE *f ) { return 0; } uid_t getuid ( void ) { return 0; } uid_t geteuid ( void ) { return 0; } gid_t getgid ( void ) { return 0; } gid_t getegid ( void ) { return 0; } int printf ( char const *fmt, ... ) { return 0; }