Add new interfaces to support PKCS7#7 signed data and authenticode signature. Update...
[mirror_edk2.git] / CryptoPkg / Library / BaseCryptLib / SysCall / CrtWrapper.c
1 /** @file\r
2   C Run-Time Libraries (CRT) Wrapper Implementation for OpenSSL-based\r
3   Cryptographic Library.\r
4 \r
5 Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>\r
6 This program and the accompanying materials\r
7 are licensed and made available under the terms and conditions of the BSD License\r
8 which accompanies this distribution.  The full text of the license may be found at\r
9 http://opensource.org/licenses/bsd-license.php\r
10 \r
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13 \r
14 **/\r
15 \r
16 #include <OpenSslSupport.h>\r
17 \r
18 int errno = 0;\r
19 \r
20 FILE  *stderr = NULL;\r
21 FILE  *stdin  = NULL;\r
22 FILE  *stdout = NULL;\r
23 \r
24 typedef\r
25 INTN\r
26 (*SORT_COMPARE)(\r
27   IN  VOID  *Buffer1,\r
28   IN  VOID  *Buffer2\r
29   );\r
30 \r
31 //\r
32 // Duplicated from EDKII BaseSortLib for qsort() wrapper\r
33 //\r
34 STATIC\r
35 VOID\r
36 QuickSortWorker (\r
37   IN OUT    VOID          *BufferToSort,\r
38   IN CONST  UINTN         Count,\r
39   IN CONST  UINTN         ElementSize,\r
40   IN        SORT_COMPARE  CompareFunction,\r
41   IN        VOID          *Buffer\r
42   )\r
43 {\r
44   VOID        *Pivot;\r
45   UINTN       LoopCount;\r
46   UINTN       NextSwapLocation;\r
47 \r
48   ASSERT(BufferToSort    != NULL);\r
49   ASSERT(CompareFunction != NULL);\r
50   ASSERT(Buffer          != NULL);\r
51 \r
52   if (Count < 2 || ElementSize  < 1) {\r
53     return;\r
54   }\r
55 \r
56   NextSwapLocation = 0;\r
57 \r
58   //\r
59   // Pick a pivot (we choose last element)\r
60   //\r
61   Pivot = ((UINT8 *)BufferToSort + ((Count - 1) * ElementSize));\r
62 \r
63   //\r
64   // Now get the pivot such that all on "left" are below it\r
65   // and everything "right" are above it\r
66   //\r
67   for (LoopCount = 0; LoopCount < Count - 1;  LoopCount++)\r
68   {\r
69     //\r
70     // If the element is less than the pivot\r
71     //\r
72     if (CompareFunction ((VOID *)((UINT8 *)BufferToSort + ((LoopCount) * ElementSize)), Pivot) <= 0) {\r
73       //\r
74       // Swap\r
75       //\r
76       CopyMem (Buffer, (UINT8 *)BufferToSort + (NextSwapLocation * ElementSize), ElementSize);\r
77       CopyMem ((UINT8 *)BufferToSort + (NextSwapLocation * ElementSize), (UINT8 *)BufferToSort + ((LoopCount) * ElementSize), ElementSize);\r
78       CopyMem ((UINT8 *)BufferToSort + ((LoopCount) * ElementSize), Buffer, ElementSize);\r
79 \r
80       //\r
81       // Increment NextSwapLocation\r
82       //\r
83       NextSwapLocation++;\r
84     }\r
85   }\r
86   //\r
87   // Swap pivot to it's final position (NextSwapLocaiton)\r
88   //\r
89   CopyMem (Buffer, Pivot, ElementSize);\r
90   CopyMem (Pivot, (UINT8 *)BufferToSort + (NextSwapLocation * ElementSize), ElementSize);\r
91   CopyMem ((UINT8 *)BufferToSort + (NextSwapLocation * ElementSize), Buffer, ElementSize);\r
92 \r
93   //\r
94   // Now recurse on 2 paritial lists.  Neither of these will have the 'pivot' element.\r
95   // IE list is sorted left half, pivot element, sorted right half...\r
96   //\r
97   QuickSortWorker (\r
98     BufferToSort,\r
99     NextSwapLocation,\r
100     ElementSize,\r
101     CompareFunction,\r
102     Buffer\r
103     );\r
104 \r
105   QuickSortWorker (\r
106     (UINT8 *)BufferToSort + (NextSwapLocation + 1) * ElementSize,\r
107     Count - NextSwapLocation - 1,\r
108     ElementSize,\r
109     CompareFunction,\r
110     Buffer\r
111     );\r
112 \r
113   return;\r
114 }\r
115 \r
116 //---------------------------------------------------------\r
117 // Standard C Run-time Library Interface Wrapper\r
118 //---------------------------------------------------------\r
119 \r
120 //\r
121 // -- String Manipulation Routines --\r
122 //\r
123 \r
124 /* Scan a string for the last occurrence of a character */\r
125 char *strrchr (const char *str, int c)\r
126 {\r
127   char * save;\r
128 \r
129   for (save = NULL; ; ++str) {\r
130     if (*str == c) {\r
131       save = (char *)str;\r
132     }\r
133     if (*str == 0) {\r
134       return (save);\r
135     }\r
136   }\r
137 }\r
138 \r
139 /* Read formatted data from a string */\r
140 int sscanf (const char *buffer, const char *format, ...)\r
141 {\r
142   //\r
143   // Null sscanf() function implementation to satisfy the linker, since\r
144   // no direct functionality logic dependency in present UEFI cases.\r
145   //\r
146   return 0;\r
147 }\r
148 \r
149 //\r
150 // -- Character Classification Routines --\r
151 //\r
152 \r
153 /* Determines if a particular character is a decimal-digit character */\r
154 int isdigit (int c)\r
155 {\r
156   //\r
157   // <digit> ::= [0-9]\r
158   //\r
159   return (('0' <= (c)) && ((c) <= '9'));\r
160 }\r
161 \r
162 /* Determine if an integer represents character that is a hex digit */\r
163 int isxdigit (int c)\r
164 {\r
165   //\r
166   // <hexdigit> ::= [0-9] | [a-f] | [A-F]\r
167   //\r
168   return ((('0' <= (c)) && ((c) <= '9')) ||\r
169           (('a' <= (c)) && ((c) <= 'f')) ||\r
170           (('A' <= (c)) && ((c) <= 'F')));\r
171 }\r
172 \r
173 /* Determines if a particular character represents a space character */\r
174 int isspace (int c)\r
175 {\r
176   //\r
177   // <space> ::= [ ]\r
178   //\r
179   return ((c) == ' ');\r
180 }\r
181 \r
182 /* Determine if a particular character is an alphanumeric character */\r
183 int isalnum (int c)\r
184 {\r
185   //\r
186   // <alnum> ::= [0-9] | [a-z] | [A-Z]\r
187   //\r
188   return ((('0' <= (c)) && ((c) <= '9')) ||\r
189           (('a' <= (c)) && ((c) <= 'z')) ||\r
190           (('A' <= (c)) && ((c) <= 'Z')));\r
191 }\r
192 \r
193 /* Determines if a particular character is in upper case */\r
194 int isupper (int c)\r
195 {\r
196   //\r
197   // <uppercase letter> := [A-Z]\r
198   //\r
199   return (('A' <= (c)) && ((c) <= 'Z'));\r
200 }\r
201 \r
202 //\r
203 // -- Data Conversion Routines --\r
204 //\r
205 \r
206 /* Convert strings to a long-integer value */\r
207 long strtol (const char *nptr, char **endptr, int base)\r
208 {\r
209   //\r
210   // Null strtol() function implementation to satisfy the linker, since there is\r
211   // no direct functionality logic dependency in present UEFI cases.\r
212   //\r
213   return 0;\r
214 }\r
215 \r
216 /* Convert strings to an unsigned long-integer value */\r
217 unsigned long strtoul (const char *nptr, char **endptr, int base)\r
218 {\r
219   //\r
220   // Null strtoul() function implementation to satisfy the linker, since there is\r
221   // no direct functionality logic dependency in present UEFI cases.\r
222   //\r
223   return 0;\r
224 }\r
225 \r
226 /* Convert character to lowercase */\r
227 int tolower (int c)\r
228 {\r
229   if (('A' <= (c)) && ((c) <= 'Z')) {\r
230     return (c - ('A' - 'a'));\r
231   }\r
232   return (c);\r
233 }\r
234 \r
235 //\r
236 // -- Searching and Sorting Routines --\r
237 //\r
238 \r
239 /* Performs a quick sort */\r
240 void qsort (void *base, size_t num, size_t width, int (*compare)(const void *, const void *))\r
241 {\r
242   VOID  *Buffer;\r
243 \r
244   ASSERT (base    != NULL);\r
245   ASSERT (compare != NULL);\r
246 \r
247   //\r
248   // Use CRT-style malloc to cover BS and RT memory allocation.\r
249   //\r
250   Buffer = malloc (width);\r
251   ASSERT (Buffer != NULL);\r
252 \r
253   //\r
254   // Re-use PerformQuickSort() function Implementation in EDKII BaseSortLib.\r
255   //\r
256   QuickSortWorker (base, (UINTN)num, (UINTN)width, (SORT_COMPARE)compare, Buffer);\r
257 \r
258   free (Buffer);\r
259   return;\r
260 }\r
261 \r
262 //\r
263 // -- Process and Environment Control Routines --\r
264 //\r
265 \r
266 /* Get a value from the current environment */\r
267 char *getenv (const char *varname)\r
268 {\r
269   //\r
270   // Null getenv() function implementation to satisfy the linker, since there is\r
271   // no direct functionality logic dependency in present UEFI cases.\r
272   //\r
273   return NULL;\r
274 }\r
275 \r
276 //\r
277 // -- Stream I/O Routines --\r
278 //\r
279 \r
280 /* Write formatted output using a pointer to a list of arguments */\r
281 int vfprintf (FILE *stream, const char *format, VA_LIST arg)\r
282 {\r
283   return 0;\r
284 }\r
285 \r
286 /* Write data to a stream */\r
287 size_t fwrite (const void *buffer, size_t size, size_t count, FILE *stream)\r
288 {\r
289   return 0;\r
290 }\r
291 \r
292 //\r
293 //  -- Dummy OpenSSL Support Routines --\r
294 //\r
295 \r
296 int BIO_printf (void *bio, const char *format, ...)\r
297 {\r
298   return 0;\r
299 }\r
300 \r
301 int BIO_snprintf(char *buf, size_t n, const char *format, ...)\r
302 {\r
303   return 0;\r
304 }\r
305 \r
306 void *UI_OpenSSL(void)\r
307 {\r
308   return NULL;\r
309 }\r
310 \r
311 int X509_load_cert_file (VOID *ctx, const char *file, int type)\r
312 {\r
313   return 0;\r
314 }\r
315 \r
316 int X509_load_crl_file (VOID *ctx, const char *file, int type)\r
317 {\r
318   return 0;\r
319 }\r
320 \r
321 int chmod (const char *c, mode_t m)\r
322 {\r
323   return -1;\r
324 }\r
325 \r
326 int close (int f)\r
327 {\r
328   return -1;\r
329 }\r
330 \r
331 void closelog (void)\r
332 {\r
333 \r
334 }\r
335 \r
336 #ifdef __GNUC__\r
337 \r
338 typedef\r
339 VOID\r
340 (EFIAPI *NoReturnFuncPtr)(\r
341   VOID\r
342   ) __attribute__((__noreturn__));\r
343 \r
344 \r
345 STATIC\r
346 VOID\r
347 EFIAPI\r
348 NopFunction (\r
349   VOID\r
350   )\r
351 {\r
352 }\r
353 \r
354 \r
355 void exit (int e)\r
356 {\r
357   NoReturnFuncPtr NoReturnFunc;\r
358 \r
359   NoReturnFunc = (NoReturnFuncPtr) NopFunction;\r
360 \r
361   NoReturnFunc ();\r
362 }\r
363 \r
364 #else\r
365 \r
366 void exit (int e)\r
367 {\r
368 }\r
369 \r
370 #endif\r
371 \r
372 int fclose (FILE *f)\r
373 {\r
374   return 0;\r
375 }\r
376 \r
377 FILE *fopen (const char *c, const char *m)\r
378 {\r
379   return NULL;\r
380 }\r
381 \r
382 size_t fread (void *b, size_t c, size_t i, FILE *f)\r
383 {\r
384   return 0;\r
385 }\r
386 \r
387 int fprintf (FILE *f, const char *s, ...)\r
388 {\r
389   return 0;\r
390 }\r
391 \r
392 uid_t getuid (void)\r
393 {\r
394   return 0;\r
395 }\r
396 \r
397 uid_t geteuid (void)\r
398 {\r
399   return 0;\r
400 }\r
401 \r
402 gid_t getgid (void)\r
403 {\r
404   return 0;\r
405 }\r
406 \r
407 gid_t getegid (void)\r
408 {\r
409   return 0;\r
410 }\r
411 \r
412 off_t lseek (int a, off_t o, int d)\r
413 {\r
414   return 0;\r
415 }\r
416 \r
417 void openlog (const char *c, int a, int b)\r
418 {\r
419 \r
420 }\r
421 \r
422 ssize_t read (int f, void *b, size_t c)\r
423 {\r
424   return 0;\r
425 }\r
426 \r
427 int stat (const char *c, struct stat *s)\r
428 {\r
429   return -1;\r
430 }\r
431 \r
432 int strcasecmp (const char *c, const char *s)\r
433 {\r
434   return 0;\r
435 }\r
436 \r
437 int strncasecmp (const char *c, const char *s, size_t l)\r
438 {\r
439   return 0;\r
440 }\r
441 \r
442 void syslog (int a, const char *c, ...)\r
443 {\r
444 \r
445 }\r
446 \r
447 ssize_t write (int f, const void *b, size_t l)\r
448 {\r
449   return 0;\r
450 }\r