]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Add CryptoPkg (from UDK2010.UP3)
authorhhtian <hhtian@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 1 Nov 2010 06:30:58 +0000 (06:30 +0000)
committerhhtian <hhtian@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 1 Nov 2010 06:30:58 +0000 (06:30 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10987 6f19259b-4bc3-4df7-8a09-765794883524

76 files changed:
CryptoPkg/Application/Cryptest/AuthenticodeVerify.c [new file with mode: 0644]
CryptoPkg/Application/Cryptest/Cryptest.c [new file with mode: 0644]
CryptoPkg/Application/Cryptest/Cryptest.inf [new file with mode: 0644]
CryptoPkg/CryptRuntimeDxe/CryptRuntime.c [new file with mode: 0644]
CryptoPkg/CryptRuntimeDxe/CryptRuntime.h [new file with mode: 0644]
CryptoPkg/CryptRuntimeDxe/CryptRuntimeDxe.inf [new file with mode: 0644]
CryptoPkg/CryptoPkg.dec [new file with mode: 0644]
CryptoPkg/CryptoPkg.dsc [new file with mode: 0644]
CryptoPkg/Include/Library/BaseCryptLib.h [new file with mode: 0644]
CryptoPkg/Include/OpenSslSupport.h [new file with mode: 0644]
CryptoPkg/Include/Protocol/RuntimeCrypt.h [new file with mode: 0644]
CryptoPkg/Include/arpa/inet.h [new file with mode: 0644]
CryptoPkg/Include/assert.h [new file with mode: 0644]
CryptoPkg/Include/ctype.h [new file with mode: 0644]
CryptoPkg/Include/dirent.h [new file with mode: 0644]
CryptoPkg/Include/errno.h [new file with mode: 0644]
CryptoPkg/Include/limits.h [new file with mode: 0644]
CryptoPkg/Include/malloc.h [new file with mode: 0644]
CryptoPkg/Include/math.h [new file with mode: 0644]
CryptoPkg/Include/netdb.h [new file with mode: 0644]
CryptoPkg/Include/netinet/in.h [new file with mode: 0644]
CryptoPkg/Include/openssl/README [new file with mode: 0644]
CryptoPkg/Include/sgtty.h [new file with mode: 0644]
CryptoPkg/Include/signal.h [new file with mode: 0644]
CryptoPkg/Include/stdarg.h [new file with mode: 0644]
CryptoPkg/Include/stddef.h [new file with mode: 0644]
CryptoPkg/Include/stdio.h [new file with mode: 0644]
CryptoPkg/Include/stdlib.h [new file with mode: 0644]
CryptoPkg/Include/string.h [new file with mode: 0644]
CryptoPkg/Include/strings.h [new file with mode: 0644]
CryptoPkg/Include/sys/ioctl.h [new file with mode: 0644]
CryptoPkg/Include/sys/param.h [new file with mode: 0644]
CryptoPkg/Include/sys/socket.h [new file with mode: 0644]
CryptoPkg/Include/sys/stat.h [new file with mode: 0644]
CryptoPkg/Include/sys/time.h [new file with mode: 0644]
CryptoPkg/Include/sys/times.h [new file with mode: 0644]
CryptoPkg/Include/sys/types.h [new file with mode: 0644]
CryptoPkg/Include/sys/un.h [new file with mode: 0644]
CryptoPkg/Include/syslog.h [new file with mode: 0644]
CryptoPkg/Include/time.h [new file with mode: 0644]
CryptoPkg/Include/unistd.h [new file with mode: 0644]
CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf [new file with mode: 0644]
CryptoPkg/Library/BaseCryptLib/Hash/CryptMd5.c [new file with mode: 0644]
CryptoPkg/Library/BaseCryptLib/Hash/CryptSha1.c [new file with mode: 0644]
CryptoPkg/Library/BaseCryptLib/Hash/CryptSha256.c [new file with mode: 0644]
CryptoPkg/Library/BaseCryptLib/PeiCryptLib.inf [new file with mode: 0644]
CryptoPkg/Library/BaseCryptLib/Pk/CryptPkcs7.c [new file with mode: 0644]
CryptoPkg/Library/BaseCryptLib/Pk/CryptRsa.c [new file with mode: 0644]
CryptoPkg/Library/BaseCryptLib/RuntimeCryptLib.inf [new file with mode: 0644]
CryptoPkg/Library/BaseCryptLib/SysCall/BaseMemAllocation.c [new file with mode: 0644]
CryptoPkg/Library/BaseCryptLib/SysCall/CrtWrapper.c [new file with mode: 0644]
CryptoPkg/Library/BaseCryptLib/SysCall/HelperWrapper.c [new file with mode: 0644]
CryptoPkg/Library/BaseCryptLib/SysCall/Ia32/Alloca.S [new file with mode: 0644]
CryptoPkg/Library/BaseCryptLib/SysCall/Ia32/MathDivU64x64.S [new file with mode: 0644]
CryptoPkg/Library/BaseCryptLib/SysCall/Ia32/MathDivU64x64.c [new file with mode: 0644]
CryptoPkg/Library/BaseCryptLib/SysCall/Ia32/MathLShiftS64.S [new file with mode: 0644]
CryptoPkg/Library/BaseCryptLib/SysCall/Ia32/MathLShiftS64.c [new file with mode: 0644]
CryptoPkg/Library/BaseCryptLib/SysCall/Ia32/MathMultS64x64.S [new file with mode: 0644]
CryptoPkg/Library/BaseCryptLib/SysCall/Ia32/MathMultS64x64.c [new file with mode: 0644]
CryptoPkg/Library/BaseCryptLib/SysCall/Ia32/MathRShiftU64.S [new file with mode: 0644]
CryptoPkg/Library/BaseCryptLib/SysCall/Ia32/MathRShiftU64.c [new file with mode: 0644]
CryptoPkg/Library/BaseCryptLib/SysCall/Ia32/MathReminderU64x64.S [new file with mode: 0644]
CryptoPkg/Library/BaseCryptLib/SysCall/Ia32/MathReminderU64x64.c [new file with mode: 0644]
CryptoPkg/Library/BaseCryptLib/SysCall/RuntimeMemAllocation.c [new file with mode: 0644]
CryptoPkg/Library/BaseCryptLib/SysCall/TimerWrapper.c [new file with mode: 0644]
CryptoPkg/Library/BaseCryptLibRuntimeCryptProtocol/BaseCryptLibRuntimeCryptProtocol.inf [new file with mode: 0644]
CryptoPkg/Library/BaseCryptLibRuntimeCryptProtocol/RuntimeDxeIpfCryptLib.c [new file with mode: 0644]
CryptoPkg/Library/IntrinsicLib/CopyMem.c [new file with mode: 0644]
CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf [new file with mode: 0644]
CryptoPkg/Library/IntrinsicLib/MemoryIntrinsics.c [new file with mode: 0644]
CryptoPkg/Library/OpensslLib/EDKII_openssl-0.9.8l.patch [new file with mode: 0644]
CryptoPkg/Library/OpensslLib/Install.cmd [new file with mode: 0644]
CryptoPkg/Library/OpensslLib/Install.sh [new file with mode: 0644]
CryptoPkg/Library/OpensslLib/OpensslLib.inf [new file with mode: 0644]
CryptoPkg/Library/OpensslLib/Patch-HOWTO.txt [new file with mode: 0644]
CryptoPkg/Library/OpensslLib/buildinf.h [new file with mode: 0644]

diff --git a/CryptoPkg/Application/Cryptest/AuthenticodeVerify.c b/CryptoPkg/Application/Cryptest/AuthenticodeVerify.c
new file mode 100644 (file)
index 0000000..72c4092
--- /dev/null
@@ -0,0 +1,658 @@
+/** @file  \r
+  Sample Implementation for Microsoft Authenticode Verification.\r
+\r
+Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <Library/BaseLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/MemoryAllocationLib.h>\r
+\r
+#include <Library/BaseCryptLib.h>\r
+\r
+//\r
+// DER encoding of SpcIndirectDataContent (Authenticode-specific Structure)\r
+// Last 20 bytes data should be the SHA-1 digest value of PE/COFF image\r
+//\r
+GLOBAL_REMOVE_IF_UNREFERENCED UINT8 SpcIndirectDataContentwithSha1[] = {\r
+  0x30, 0x33, 0x06, 0x0A, 0x2B, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x02, 0x01, 0x0F, 0x30, 0x25,\r
+  0x03, 0x01, 0x00, 0xA0, 0x20, 0xA2, 0x1E, 0x80, 0x1C, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x3C, 0x00, \r
+  0x4F, 0x00, 0x62, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x74, 0x00, 0x65, 0x00, \r
+  0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2B, 0x0E, 0x03, 0x02, 0x1A, \r
+  0x05, 0x00, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00\r
+  };\r
+\r
+//\r
+// DER encoding of SpcIndirectDataContent (Authenticode-specific Structure)\r
+// Last 16 bytes data should be the MD5 digest value of PE/COFF image\r
+// NOTE: Authenticode also support MD5 digest. Disable MD5 support here since MD5\r
+//       has been marked as "Deprecated, do not use".\r
+//\r
+#if 0\r
+GLOBAL_REMOVE_IF_UNREFERENCED UINT8 SpcIndirectDataContentwithMd5[] = {\r
+  0x30, 0x33, 0x06, 0x0A, 0x2B, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x02, 0x01, 0x0F, 0x30, 0x25,\r
+  0x03, 0x01, 0x00, 0xA0, 0x20, 0xA2, 0x1E, 0x80, 0x1C, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x3C, 0x00,\r
+  0x4F, 0x00, 0x62, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x74, 0x00, 0x65, 0x00,\r
+  0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x30, 0x20, 0x30, 0x0C, 0x06, 0x08, 0x2A, 0x86, 0x48, 0x86, 0xF7,\r
+  0x0D, 0x02, 0x05, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
+  0x00, 0x00, 0x00, 0x00\r
+  };\r
+#endif\r
+\r
+//\r
+// Sample PE/COFF Image Hash Value. \r
+// This value should be calculated following MSFT's Authenticode Specification\r
+//\r
+GLOBAL_REMOVE_IF_UNREFERENCED UINT8 PeHash[] = {\r
+  0x44, 0xFD, 0x4F, 0xA9, 0x17, 0xEE, 0xAC, 0xCF, 0x1F, 0x0B, 0xE3, 0xA1, 0x4D, 0x5B, 0xA6, 0x61, \r
+  0x82, 0x97, 0xC4, 0xB6\r
+  };\r
+\r
+//\r
+// Sample Authenticode Data (from MSFT Win7 BootLoader: bootmgfw.efi)\r
+// This data should be retrieved from signed PE/COFF image according to SECURITY \r
+// directory in PE/COFF Header\r
+//\r
+GLOBAL_REMOVE_IF_UNREFERENCED UINT8 Authenticode[] = {\r
+  0x30, 0x82, 0x1C, 0x43, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07, 0x02, 0xA0,\r
+  0x82, 0x1C, 0x34, 0x30, 0x82, 0x1C, 0x30, 0x02, 0x01, 0x01, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x05,\r
+  0x2B, 0x0E, 0x03, 0x02, 0x1A, 0x05, 0x00, 0x30, 0x68, 0x06, 0x0A, 0x2B, 0x06, 0x01, 0x04, 0x01,\r
+  0x82, 0x37, 0x02, 0x01, 0x04, 0xA0, 0x5A, 0x30, 0x58, 0x30, 0x33, 0x06, 0x0A, 0x2B, 0x06, 0x01,\r
+  0x04, 0x01, 0x82, 0x37, 0x02, 0x01, 0x0F, 0x30, 0x25, 0x03, 0x01, 0x00, 0xA0, 0x20, 0xA2, 0x1E,\r
+  0x80, 0x1C, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x4F, 0x00, 0x62, 0x00, 0x73, 0x00, 0x6F,\r
+  0x00, 0x6C, 0x00, 0x65, 0x00, 0x74, 0x00, 0x65, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x30, 0x21,\r
+  0x30, 0x09, 0x06, 0x05, 0x2B, 0x0E, 0x03, 0x02, 0x1A, 0x05, 0x00, 0x04, 0x14, 0x44, 0xFD, 0x4F,\r
+  0xA9, 0x17, 0xEE, 0xAC, 0xCF, 0x1F, 0x0B, 0xE3, 0xA1, 0x4D, 0x5B, 0xA6, 0x61, 0x82, 0x97, 0xC4,\r
+  0xB6, 0xA0, 0x82, 0x17, 0x18, 0x30, 0x82, 0x04, 0xCA, 0x30, 0x82, 0x03, 0xB2, 0xA0, 0x03, 0x02,\r
+  0x01, 0x02, 0x02, 0x0A, 0x61, 0x03, 0xDC, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x30, 0x0D,\r
+  0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x77, 0x31,\r
+  0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11,\r
+  0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x0A, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6E, 0x67, 0x74, 0x6F,\r
+  0x6E, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, 0x52, 0x65, 0x64, 0x6D,\r
+  0x6F, 0x6E, 0x64, 0x31, 0x1E, 0x30, 0x1C, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x15, 0x4D, 0x69,\r
+  0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x43, 0x6F, 0x72, 0x70, 0x6F, 0x72, 0x61, 0x74,\r
+  0x69, 0x6F, 0x6E, 0x31, 0x21, 0x30, 0x1F, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x18, 0x4D, 0x69,\r
+  0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x2D, 0x53, 0x74, 0x61,\r
+  0x6D, 0x70, 0x20, 0x50, 0x43, 0x41, 0x30, 0x1E, 0x17, 0x0D, 0x30, 0x38, 0x30, 0x37, 0x32, 0x35,\r
+  0x31, 0x39, 0x31, 0x32, 0x35, 0x30, 0x5A, 0x17, 0x0D, 0x31, 0x31, 0x30, 0x37, 0x32, 0x35, 0x31,\r
+  0x39, 0x32, 0x32, 0x35, 0x30, 0x5A, 0x30, 0x81, 0xB3, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55,\r
+  0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13,\r
+  0x0A, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6E, 0x67, 0x74, 0x6F, 0x6E, 0x31, 0x10, 0x30, 0x0E, 0x06,\r
+  0x03, 0x55, 0x04, 0x07, 0x13, 0x07, 0x52, 0x65, 0x64, 0x6D, 0x6F, 0x6E, 0x64, 0x31, 0x1E, 0x30,\r
+  0x1C, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x15, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66,\r
+  0x74, 0x20, 0x43, 0x6F, 0x72, 0x70, 0x6F, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x31, 0x0D, 0x30,\r
+  0x0B, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x04, 0x4D, 0x4F, 0x50, 0x52, 0x31, 0x27, 0x30, 0x25,\r
+  0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x1E, 0x6E, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x20, 0x44,\r
+  0x53, 0x45, 0x20, 0x45, 0x53, 0x4E, 0x3A, 0x31, 0x35, 0x39, 0x43, 0x2D, 0x41, 0x33, 0x46, 0x37,\r
+  0x2D, 0x32, 0x35, 0x37, 0x30, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1C,\r
+  0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x2D, 0x53,\r
+  0x74, 0x61, 0x6D, 0x70, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x30, 0x82, 0x01, 0x22,\r
+  0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03,\r
+  0x82, 0x01, 0x0F, 0x00, 0x30, 0x82, 0x01, 0x0A, 0x02, 0x82, 0x01, 0x01, 0x00, 0xC0, 0xED, 0x81,\r
+  0x14, 0xA1, 0x5E, 0x77, 0xC0, 0x5B, 0xF4, 0x76, 0x89, 0x62, 0xFA, 0xAD, 0x7C, 0x68, 0x14, 0xB4,\r
+  0xF7, 0xBD, 0x35, 0xD8, 0x13, 0x79, 0x5A, 0x17, 0xCA, 0xD9, 0x6C, 0x51, 0x45, 0x62, 0x26, 0x7A,\r
+  0x2F, 0x1F, 0xD8, 0xEA, 0xC1, 0x6E, 0x01, 0x17, 0xF9, 0xC3, 0xA6, 0x1F, 0x67, 0xDB, 0x51, 0xB0,\r
+  0x2C, 0xDE, 0x8A, 0x17, 0xED, 0xFF, 0x20, 0xAD, 0x34, 0xEA, 0x98, 0xFB, 0xA5, 0xD6, 0x2A, 0xD2,\r
+  0xF1, 0x44, 0x27, 0x07, 0x5A, 0x2D, 0x3A, 0x93, 0xFF, 0x56, 0x53, 0xB0, 0xC8, 0xF5, 0xF3, 0x03,\r
+  0xF2, 0x49, 0xCC, 0x16, 0xD0, 0xF5, 0x00, 0x4C, 0x58, 0xF8, 0x9B, 0xF5, 0x07, 0x25, 0xB1, 0x66,\r
+  0x17, 0xC0, 0xBD, 0xC8, 0xD2, 0x52, 0x85, 0x8D, 0xC2, 0x2B, 0x38, 0xB2, 0xC3, 0x36, 0xBE, 0xF9,\r
+  0x87, 0xDA, 0xF4, 0x8E, 0x5D, 0x43, 0xD7, 0x06, 0xBF, 0x99, 0x05, 0x9F, 0xA4, 0xCE, 0xFE, 0xAB,\r
+  0x8D, 0x61, 0x63, 0xE7, 0x39, 0xC5, 0xF3, 0x18, 0xF6, 0xD8, 0xFC, 0x31, 0x36, 0x69, 0x72, 0x5A,\r
+  0xA2, 0x1A, 0x4C, 0x3E, 0xEA, 0x87, 0x25, 0x42, 0x9D, 0xD1, 0x3E, 0xF1, 0x97, 0xD2, 0x18, 0x32,\r
+  0x93, 0x70, 0x55, 0x53, 0x81, 0x1E, 0xE3, 0x3B, 0x0D, 0xE8, 0xBE, 0x82, 0x78, 0x6D, 0xE6, 0xFA,\r
+  0xCD, 0x98, 0xA4, 0x6F, 0xDB, 0xEE, 0x66, 0xF4, 0x95, 0xC8, 0xCD, 0x35, 0xC9, 0x9E, 0xBB, 0x36,\r
+  0x0D, 0x83, 0x96, 0x94, 0x26, 0xA7, 0x90, 0xE0, 0xA9, 0x34, 0x3B, 0xD5, 0xC0, 0x9E, 0x3E, 0xF0,\r
+  0xD4, 0x47, 0x8D, 0x86, 0x0C, 0x82, 0xA4, 0x58, 0x30, 0x3A, 0x1C, 0x76, 0xE3, 0xAD, 0x95, 0x66,\r
+  0xB4, 0xB7, 0xFD, 0x09, 0x8A, 0x05, 0x60, 0x0F, 0xA3, 0x0F, 0xE2, 0x93, 0x96, 0x58, 0x22, 0x9C,\r
+  0x9D, 0x2B, 0xDB, 0xA2, 0x94, 0x18, 0x90, 0x95, 0x02, 0xBD, 0x06, 0x40, 0x95, 0x02, 0x03, 0x01,\r
+  0x00, 0x01, 0xA3, 0x82, 0x01, 0x19, 0x30, 0x82, 0x01, 0x15, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D,\r
+  0x0E, 0x04, 0x16, 0x04, 0x14, 0xD2, 0xED, 0x0D, 0x1E, 0x24, 0xBB, 0x37, 0xA9, 0xD8, 0x20, 0x6A,\r
+  0x4D, 0x1D, 0xD2, 0x16, 0xD5, 0x2E, 0xBE, 0x9E, 0xEB, 0x30, 0x1F, 0x06, 0x03, 0x55, 0x1D, 0x23,\r
+  0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x23, 0x34, 0xF8, 0xD9, 0x52, 0x46, 0x70, 0x0A, 0xED, 0x40,\r
+  0xFB, 0x76, 0xFB, 0xB3, 0x2B, 0xB0, 0xC3, 0x35, 0xB3, 0x0F, 0x30, 0x54, 0x06, 0x03, 0x55, 0x1D,\r
+  0x1F, 0x04, 0x4D, 0x30, 0x4B, 0x30, 0x49, 0xA0, 0x47, 0xA0, 0x45, 0x86, 0x43, 0x68, 0x74, 0x74,\r
+  0x70, 0x3A, 0x2F, 0x2F, 0x63, 0x72, 0x6C, 0x2E, 0x6D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66,\r
+  0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, 0x6B, 0x69, 0x2F, 0x63, 0x72, 0x6C, 0x2F, 0x70, 0x72,\r
+  0x6F, 0x64, 0x75, 0x63, 0x74, 0x73, 0x2F, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74,\r
+  0x54, 0x69, 0x6D, 0x65, 0x53, 0x74, 0x61, 0x6D, 0x70, 0x50, 0x43, 0x41, 0x2E, 0x63, 0x72, 0x6C,\r
+  0x30, 0x58, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x01, 0x04, 0x4C, 0x30, 0x4A,\r
+  0x30, 0x48, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x02, 0x86, 0x3C, 0x68, 0x74,\r
+  0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x6D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F,\r
+  0x66, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, 0x6B, 0x69, 0x2F, 0x63, 0x65, 0x72, 0x74, 0x73,\r
+  0x2F, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x54, 0x69, 0x6D, 0x65, 0x53, 0x74,\r
+  0x61, 0x6D, 0x70, 0x50, 0x43, 0x41, 0x2E, 0x63, 0x72, 0x74, 0x30, 0x13, 0x06, 0x03, 0x55, 0x1D,\r
+  0x25, 0x04, 0x0C, 0x30, 0x0A, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x08, 0x30,\r
+  0x0E, 0x06, 0x03, 0x55, 0x1D, 0x0F, 0x01, 0x01, 0xFF, 0x04, 0x04, 0x03, 0x02, 0x06, 0xC0, 0x30,\r
+  0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82,\r
+  0x01, 0x01, 0x00, 0x9C, 0x0A, 0x55, 0xC8, 0xCC, 0x44, 0x13, 0x34, 0x0C, 0xD8, 0x63, 0x27, 0x76,\r
+  0x7D, 0x3E, 0xFA, 0x38, 0x32, 0x83, 0x53, 0x9D, 0xF2, 0x08, 0xF9, 0x32, 0xF5, 0xC5, 0x6E, 0x70,\r
+  0xA1, 0xC9, 0xB1, 0x63, 0x6B, 0x19, 0x9D, 0x09, 0x67, 0xD9, 0x9D, 0xEB, 0x8A, 0x6A, 0xDB, 0x60,\r
+  0x66, 0xE9, 0xE9, 0x52, 0x26, 0xF3, 0x3B, 0xC6, 0x6A, 0xD3, 0xC2, 0x52, 0xBE, 0xA8, 0xB9, 0xEB,\r
+  0x6A, 0xAA, 0x78, 0x8C, 0xC9, 0x16, 0x7D, 0x90, 0x95, 0xA0, 0xCC, 0x21, 0xB3, 0x9E, 0x81, 0xBD,\r
+  0xCD, 0xC1, 0x8B, 0x29, 0xBD, 0x62, 0x25, 0xEF, 0x09, 0x57, 0xE7, 0x86, 0x4E, 0x2A, 0xEC, 0x80,\r
+  0xCA, 0xBB, 0xFC, 0x21, 0x16, 0xC4, 0x3F, 0x4E, 0x52, 0x19, 0xE6, 0x0E, 0xB1, 0xD8, 0xC1, 0xC2,\r
+  0x79, 0x90, 0x64, 0xB4, 0x50, 0x73, 0x10, 0x35, 0x5E, 0x5D, 0x11, 0xC1, 0xB8, 0xBA, 0xAA, 0xCF,\r
+  0x52, 0xF6, 0x80, 0x91, 0x00, 0xE6, 0xEF, 0x51, 0x43, 0x46, 0xE9, 0xD0, 0xE8, 0x94, 0xF6, 0x2C,\r
+  0x24, 0x0D, 0x8A, 0xC6, 0xB2, 0x31, 0x8A, 0xA3, 0x7E, 0x36, 0x6C, 0xA4, 0x05, 0x4C, 0x67, 0x07,\r
+  0x2A, 0xBB, 0xBB, 0x10, 0xA5, 0xA5, 0x30, 0x1A, 0x72, 0xD0, 0x06, 0x20, 0x3B, 0x24, 0x93, 0x5B,\r
+  0x15, 0xD9, 0x39, 0x93, 0xD3, 0x73, 0x2D, 0x1A, 0xC4, 0xD4, 0x6C, 0x1E, 0xA1, 0x08, 0xEC, 0xF6,\r
+  0x31, 0xB8, 0x6B, 0x4B, 0xEC, 0xEE, 0x5C, 0x33, 0x02, 0x14, 0x32, 0x8C, 0x7C, 0x11, 0x20, 0x2F,\r
+  0x20, 0x03, 0x7F, 0xF9, 0x0C, 0x9D, 0xB8, 0xD3, 0x9E, 0x5F, 0xD6, 0x08, 0xFC, 0x81, 0xA0, 0x99,\r
+  0xB8, 0xBB, 0x55, 0x6E, 0xCD, 0x42, 0x4B, 0x3A, 0x4D, 0x8C, 0x14, 0x2B, 0xCA, 0xC8, 0x12, 0xD3,\r
+  0x62, 0x6E, 0xEA, 0x0D, 0x0A, 0x9D, 0x09, 0xA3, 0x66, 0xD9, 0x79, 0x4F, 0x8E, 0x1A, 0xA2, 0xFF,\r
+  0xCC, 0x98, 0x04, 0x30, 0x82, 0x05, 0x96, 0x30, 0x82, 0x04, 0x7E, 0xA0, 0x03, 0x02, 0x01, 0x02,\r
+  0x02, 0x0A, 0x61, 0x01, 0xC6, 0xC1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x30, 0x0D, 0x06, 0x09,\r
+  0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, 0x81, 0x31, 0x0B,\r
+  0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06,\r
+  0x03, 0x55, 0x04, 0x08, 0x13, 0x0A, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6E, 0x67, 0x74, 0x6F, 0x6E,\r
+  0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, 0x52, 0x65, 0x64, 0x6D, 0x6F,\r
+  0x6E, 0x64, 0x31, 0x1E, 0x30, 0x1C, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x15, 0x4D, 0x69, 0x63,\r
+  0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x43, 0x6F, 0x72, 0x70, 0x6F, 0x72, 0x61, 0x74, 0x69,\r
+  0x6F, 0x6E, 0x31, 0x2B, 0x30, 0x29, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x22, 0x4D, 0x69, 0x63,\r
+  0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x56,\r
+  0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x50, 0x43, 0x41, 0x30,\r
+  0x1E, 0x17, 0x0D, 0x30, 0x38, 0x31, 0x30, 0x32, 0x32, 0x32, 0x30, 0x33, 0x39, 0x32, 0x32, 0x5A,\r
+  0x17, 0x0D, 0x31, 0x30, 0x30, 0x31, 0x32, 0x32, 0x32, 0x30, 0x34, 0x39, 0x32, 0x32, 0x5A, 0x30,\r
+  0x7F, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13,\r
+  0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x0A, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6E, 0x67,\r
+  0x74, 0x6F, 0x6E, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, 0x52, 0x65,\r
+  0x64, 0x6D, 0x6F, 0x6E, 0x64, 0x31, 0x1E, 0x30, 0x1C, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x15,\r
+  0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x43, 0x6F, 0x72, 0x70, 0x6F, 0x72,\r
+  0x61, 0x74, 0x69, 0x6F, 0x6E, 0x31, 0x0D, 0x30, 0x0B, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x04,\r
+  0x4D, 0x4F, 0x50, 0x52, 0x31, 0x1A, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x11, 0x4D,\r
+  0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73,\r
+  0x30, 0x82, 0x01, 0x22, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01,\r
+  0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0F, 0x00, 0x30, 0x82, 0x01, 0x0A, 0x02, 0x82, 0x01, 0x01,\r
+  0x00, 0xDC, 0x3A, 0xD3, 0x44, 0xF4, 0x6E, 0x20, 0x9F, 0xDD, 0xA4, 0x0E, 0x82, 0x4E, 0xC7, 0x86,\r
+  0x5E, 0x63, 0xCC, 0xCA, 0xE5, 0x42, 0x53, 0x4B, 0x85, 0xFA, 0x5D, 0x71, 0x6C, 0xCF, 0x76, 0x0C,\r
+  0x18, 0x8B, 0xA6, 0x0D, 0xF5, 0x4A, 0xF7, 0xFE, 0x17, 0xF2, 0x90, 0xCC, 0x62, 0xC7, 0x24, 0xAD,\r
+  0x9B, 0x9A, 0xE1, 0x45, 0x3B, 0x61, 0xD8, 0x0D, 0x05, 0x69, 0xC7, 0xCD, 0x88, 0x2A, 0xB8, 0xB9,\r
+  0x18, 0x1E, 0x60, 0x10, 0x5F, 0x88, 0xC6, 0xD2, 0x82, 0x4E, 0x6D, 0x49, 0xC5, 0xBE, 0x5C, 0x12,\r
+  0x86, 0x48, 0x85, 0x89, 0x91, 0x81, 0xCD, 0x1B, 0xAD, 0x1F, 0xB7, 0x2D, 0x67, 0x79, 0xF1, 0x7B,\r
+  0x9F, 0x25, 0x87, 0x14, 0x76, 0x5F, 0xE3, 0x0E, 0x64, 0xA1, 0x72, 0x61, 0x25, 0xE5, 0x75, 0x69,\r
+  0xC5, 0x14, 0xF1, 0x5F, 0x07, 0x56, 0xA4, 0x0D, 0x70, 0x06, 0x23, 0xA7, 0x6C, 0xDD, 0x82, 0xAE,\r
+  0xD9, 0x9B, 0x47, 0xA4, 0xA5, 0x6C, 0x08, 0xB0, 0x58, 0xF1, 0x53, 0x6A, 0x4F, 0xDA, 0x85, 0x61,\r
+  0xCB, 0x02, 0x7B, 0x49, 0xAF, 0x1F, 0xBB, 0xE0, 0xD7, 0xB9, 0x5E, 0xDB, 0x73, 0x89, 0x76, 0xC1,\r
+  0x3A, 0xBB, 0x0D, 0xF5, 0x97, 0xF0, 0x88, 0x5D, 0x69, 0x77, 0x80, 0xCF, 0xF1, 0x7E, 0x03, 0x9F,\r
+  0x73, 0x6D, 0xDE, 0x05, 0xB8, 0x2F, 0x77, 0xB5, 0x54, 0x55, 0x45, 0xD0, 0xD2, 0x38, 0xBD, 0x96,\r
+  0xE3, 0xF7, 0xEA, 0x40, 0xE5, 0xAC, 0x19, 0xFC, 0x71, 0xCB, 0x28, 0x27, 0xAA, 0x71, 0xA1, 0x72,\r
+  0xB5, 0x12, 0x27, 0xC1, 0x51, 0xF6, 0x36, 0xC5, 0xC0, 0xC7, 0x7B, 0x3A, 0x3A, 0x93, 0x37, 0x04,\r
+  0xCC, 0xEE, 0x0B, 0x69, 0x78, 0x64, 0x75, 0x41, 0xB6, 0x78, 0x22, 0x0F, 0x77, 0x84, 0xF7, 0x4B,\r
+  0x8D, 0x46, 0x65, 0x92, 0x5B, 0x4D, 0x56, 0x6B, 0x75, 0x04, 0x46, 0x3F, 0x0B, 0x1B, 0xB4, 0x19,\r
+  0xBF, 0x02, 0x03, 0x01, 0x00, 0x01, 0xA3, 0x82, 0x02, 0x0F, 0x30, 0x82, 0x02, 0x0B, 0x30, 0x1F,\r
+  0x06, 0x03, 0x55, 0x1D, 0x25, 0x04, 0x18, 0x30, 0x16, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05,\r
+  0x07, 0x03, 0x03, 0x06, 0x0A, 0x2B, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x0A, 0x03, 0x06, 0x30,\r
+  0x1D, 0x06, 0x03, 0x55, 0x1D, 0x0E, 0x04, 0x16, 0x04, 0x14, 0xA1, 0xE6, 0xC3, 0x65, 0xD0, 0xE6,\r
+  0xE8, 0x28, 0x62, 0xC2, 0xF3, 0xC2, 0x23, 0xA6, 0x1C, 0x49, 0x82, 0x0B, 0xD5, 0x53, 0x30, 0x0E,\r
+  0x06, 0x03, 0x55, 0x1D, 0x0F, 0x01, 0x01, 0xFF, 0x04, 0x04, 0x03, 0x02, 0x07, 0x80, 0x30, 0x1F,\r
+  0x06, 0x03, 0x55, 0x1D, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x90, 0x8B, 0x11, \r
+  0xA5, 0x70, 0xED, 0xE0, 0xF9, 0xA9, 0xC0, 0xAC, 0x08, 0xC7, 0xB5, 0xF4, 0x82, 0xB1, 0x3C, 0xC5,\r
+  0x4A, 0x30, 0x7B, 0x06, 0x03, 0x55, 0x1D, 0x1F, 0x04, 0x74, 0x30, 0x72, 0x30, 0x70, 0xA0, 0x6E,\r
+  0xA0, 0x6C, 0x86, 0x34, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x63, 0x72, 0x6C, 0x2E, 0x6D,\r
+  0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, 0x6B, 0x69,\r
+  0x2F, 0x63, 0x72, 0x6C, 0x2F, 0x70, 0x72, 0x6F, 0x64, 0x75, 0x63, 0x74, 0x73, 0x2F, 0x57, 0x69,\r
+  0x6E, 0x50, 0x43, 0x41, 0x2E, 0x63, 0x72, 0x6C, 0x86, 0x34, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F,\r
+  0x2F, 0x77, 0x77, 0x77, 0x2E, 0x6D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x2E, 0x63,\r
+  0x6F, 0x6D, 0x2F, 0x70, 0x6B, 0x69, 0x2F, 0x63, 0x72, 0x6C, 0x2F, 0x70, 0x72, 0x6F, 0x64, 0x75,\r
+  0x63, 0x74, 0x73, 0x2F, 0x57, 0x69, 0x6E, 0x50, 0x43, 0x41, 0x2E, 0x63, 0x72, 0x6C, 0x30, 0x52,\r
+  0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x01, 0x04, 0x46, 0x30, 0x44, 0x30, 0x42,\r
+  0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x02, 0x86, 0x36, 0x68, 0x74, 0x74, 0x70,\r
+  0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x6D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74,\r
+  0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, 0x6B, 0x69, 0x2F, 0x63, 0x65, 0x72, 0x74, 0x73, 0x2F, 0x4D,\r
+  0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x57, 0x69, 0x6E, 0x50, 0x43, 0x41, 0x2E, 0x63,\r
+  0x72, 0x74, 0x30, 0x81, 0xC6, 0x06, 0x03, 0x55, 0x1D, 0x20, 0x04, 0x81, 0xBE, 0x30, 0x81, 0xBB,\r
+  0x30, 0x81, 0xB8, 0x06, 0x09, 0x2B, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x15, 0x2F, 0x30, 0x81,\r
+  0xAA, 0x30, 0x40, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x34, 0x68,\r
+  0x74, 0x74, 0x70, 0x73, 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x6D, 0x69, 0x63, 0x72, 0x6F,\r
+  0x73, 0x6F, 0x66, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, 0x6B, 0x69, 0x2F, 0x73, 0x73, 0x6C,\r
+  0x2F, 0x63, 0x70, 0x73, 0x2F, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x50, 0x43, 0x41, 0x2E,\r
+  0x68, 0x74, 0x6D, 0x30, 0x66, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x02, 0x30,\r
+  0x5A, 0x1E, 0x58, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x79, 0x00, 0x72, 0x00, 0x69, 0x00,\r
+  0x67, 0x00, 0x68, 0x00, 0x74, 0x00, 0x20, 0x00, 0xA9, 0x00, 0x20, 0x00, 0x31, 0x00, 0x39, 0x00,\r
+  0x39, 0x00, 0x39, 0x00, 0x2D, 0x00, 0x32, 0x00, 0x30, 0x00, 0x30, 0x00, 0x35, 0x00, 0x20, 0x00,\r
+  0x4D, 0x00, 0x69, 0x00, 0x63, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x66, 0x00,\r
+  0x74, 0x00, 0x20, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00,\r
+  0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x2E, 0x30, 0x0D, 0x06, 0x09, 0x2A,\r
+  0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x73,\r
+  0x5F, 0xCA, 0x80, 0x1C, 0x60, 0x46, 0x6F, 0xB9, 0x34, 0x9D, 0x88, 0xE3, 0xBE, 0x22, 0x8C, 0xFA,\r
+  0xE6, 0x58, 0x9A, 0xAB, 0x7B, 0x1A, 0x97, 0xFD, 0xED, 0x2E, 0x39, 0xCC, 0x59, 0x5B, 0x1D, 0x7A,\r
+  0x06, 0x8A, 0xBB, 0x43, 0x93, 0x7B, 0x1E, 0xA1, 0x88, 0x53, 0xDF, 0x44, 0xF8, 0x53, 0xA9, 0xEA,\r
+  0xF6, 0x67, 0x1B, 0x3A, 0x78, 0x84, 0x11, 0x6A, 0x6F, 0x29, 0x47, 0x90, 0x0A, 0x0C, 0x7B, 0x22,\r
+  0x77, 0x4E, 0x6F, 0xB8, 0x64, 0x29, 0xDF, 0x06, 0xC7, 0xC8, 0x73, 0x84, 0xD6, 0x66, 0xA0, 0xCA,\r
+  0xD9, 0x5A, 0x26, 0x82, 0x57, 0xF9, 0xE3, 0x4F, 0x39, 0xAF, 0x2E, 0x8E, 0xB1, 0x06, 0x5B, 0x72,\r
+  0xF2, 0x37, 0x32, 0xAE, 0x4E, 0xCE, 0x3C, 0x7D, 0xB0, 0x12, 0x2B, 0x9E, 0xA5, 0x75, 0xE3, 0x43,\r
+  0xA6, 0x12, 0x8B, 0x06, 0x14, 0x98, 0x77, 0xE3, 0x58, 0x32, 0x25, 0x60, 0x07, 0x8C, 0x59, 0x71,\r
+  0xA7, 0x71, 0x41, 0xB3, 0x06, 0x8D, 0x5C, 0xEF, 0x9C, 0x7F, 0x5A, 0x22, 0x6D, 0xB7, 0xD3, 0xD9,\r
+  0xF5, 0xA6, 0x1B, 0x52, 0xDE, 0xF5, 0x7E, 0x76, 0x7C, 0xFE, 0xF4, 0xC8, 0x23, 0x1A, 0x4B, 0x25,\r
+  0xEB, 0xE4, 0xEE, 0xAF, 0x10, 0x0B, 0x55, 0xC3, 0xD8, 0xC1, 0x17, 0x85, 0x61, 0x6F, 0xD3, 0x3F,\r
+  0xB6, 0xE9, 0xEC, 0x84, 0xA5, 0xEE, 0x6D, 0xB2, 0xFF, 0xE8, 0x6C, 0x95, 0xAB, 0x2B, 0x5E, 0xC8,\r
+  0x85, 0xC3, 0x11, 0x60, 0xAC, 0xFA, 0x02, 0x05, 0xF1, 0x7B, 0xDA, 0xC3, 0x69, 0x49, 0x96, 0xA5,\r
+  0x70, 0xF9, 0x65, 0x66, 0x46, 0x10, 0x8D, 0x34, 0xE9, 0x21, 0x94, 0x3C, 0x0F, 0x71, 0x4A, 0x1C,\r
+  0xEA, 0x1F, 0xF7, 0x23, 0xA6, 0x87, 0x60, 0x34, 0xE9, 0x14, 0xE1, 0xDE, 0x03, 0x59, 0xB4, 0x02,\r
+  0x1D, 0x3A, 0xAF, 0xE3, 0x55, 0x05, 0xF5, 0xED, 0xC1, 0xF4, 0xE4, 0x5D, 0x0E, 0xD3, 0x97, 0x30,\r
+  0x82, 0x06, 0x07, 0x30, 0x82, 0x03, 0xEF, 0xA0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x0A, 0x61, 0x16,\r
+  0x68, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86,\r
+  0xF7, 0x0D, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x5F, 0x31, 0x13, 0x30, 0x11, 0x06, 0x0A, 0x09,\r
+  0x92, 0x26, 0x89, 0x93, 0xF2, 0x2C, 0x64, 0x01, 0x19, 0x16, 0x03, 0x63, 0x6F, 0x6D, 0x31, 0x19,\r
+  0x30, 0x17, 0x06, 0x0A, 0x09, 0x92, 0x26, 0x89, 0x93, 0xF2, 0x2C, 0x64, 0x01, 0x19, 0x16, 0x09,\r
+  0x6D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x31, 0x2D, 0x30, 0x2B, 0x06, 0x03, 0x55,\r
+  0x04, 0x03, 0x13, 0x24, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x52, 0x6F,\r
+  0x6F, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41,\r
+  0x75, 0x74, 0x68, 0x6F, 0x72, 0x69, 0x74, 0x79, 0x30, 0x1E, 0x17, 0x0D, 0x30, 0x37, 0x30, 0x34,\r
+  0x30, 0x33, 0x31, 0x32, 0x35, 0x33, 0x30, 0x39, 0x5A, 0x17, 0x0D, 0x32, 0x31, 0x30, 0x34, 0x30,\r
+  0x33, 0x31, 0x33, 0x30, 0x33, 0x30, 0x39, 0x5A, 0x30, 0x77, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03,\r
+  0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08,\r
+  0x13, 0x0A, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6E, 0x67, 0x74, 0x6F, 0x6E, 0x31, 0x10, 0x30, 0x0E,\r
+  0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, 0x52, 0x65, 0x64, 0x6D, 0x6F, 0x6E, 0x64, 0x31, 0x1E,\r
+  0x30, 0x1C, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x15, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F,\r
+  0x66, 0x74, 0x20, 0x43, 0x6F, 0x72, 0x70, 0x6F, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x31, 0x21,\r
+  0x30, 0x1F, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x18, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F,\r
+  0x66, 0x74, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x2D, 0x53, 0x74, 0x61, 0x6D, 0x70, 0x20, 0x50, 0x43,\r
+  0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01,\r
+  0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0F, 0x00, 0x30, 0x82, 0x01, 0x0A, 0x02, 0x82, 0x01,\r
+  0x01, 0x00, 0x9F, 0xA1, 0x6C, 0xB1, 0xDF, 0xDB, 0x48, 0x92, 0x2A, 0x7C, 0x6B, 0x2E, 0x19, 0xE1,\r
+  0xBD, 0xE2, 0xE3, 0xC5, 0x99, 0x51, 0x23, 0x50, 0xAD, 0xCE, 0xDD, 0x18, 0x4E, 0x24, 0x0F, 0xEE,\r
+  0xD1, 0xA7, 0xD1, 0x4C, 0xAD, 0x74, 0x30, 0x20, 0x11, 0xEB, 0x07, 0xD5, 0x54, 0x95, 0x15, 0x49,\r
+  0x94, 0x1B, 0x42, 0x92, 0xAE, 0x98, 0x5C, 0x30, 0x26, 0xDA, 0x00, 0x6B, 0xE8, 0x7B, 0xBD, 0xEC,\r
+  0x89, 0x07, 0x0F, 0xF7, 0x0E, 0x04, 0x98, 0xF0, 0x89, 0xCC, 0x1F, 0xCB, 0x33, 0x24, 0x87, 0x9D,\r
+  0xF2, 0xF4, 0x67, 0x1C, 0x2C, 0xFC, 0x7B, 0xE7, 0x88, 0x1D, 0xEA, 0xE7, 0x4E, 0xA3, 0xA1, 0xC1,\r
+  0x23, 0x53, 0xCA, 0x8D, 0xFA, 0x45, 0xCF, 0x09, 0xD0, 0x5E, 0xAF, 0xD0, 0xB0, 0x42, 0x04, 0xA2,\r
+  0xF9, 0xA6, 0x6C, 0x93, 0x67, 0xD7, 0x28, 0xDC, 0x46, 0x53, 0xB0, 0x86, 0xD0, 0xE5, 0x28, 0x46,\r
+  0x2E, 0x27, 0xAC, 0x86, 0x4F, 0x55, 0x52, 0x0C, 0xE4, 0x03, 0x2C, 0xFB, 0x6A, 0x90, 0x90, 0x30,\r
+  0x6E, 0x87, 0xF3, 0x59, 0x30, 0x9D, 0xFA, 0x7E, 0xD6, 0x97, 0xB3, 0xE8, 0x21, 0x97, 0x7E, 0xF8,\r
+  0xD2, 0x13, 0xF3, 0x08, 0xB7, 0x53, 0x6D, 0x52, 0xB4, 0x45, 0x90, 0x9F, 0x48, 0x00, 0x4A, 0x47,\r
+  0x66, 0x11, 0x27, 0x29, 0x66, 0xA8, 0x97, 0xE4, 0xD3, 0x06, 0x81, 0x4A, 0xA2, 0xF9, 0x84, 0xA7,\r
+  0x11, 0x47, 0x14, 0x09, 0x82, 0x9F, 0x84, 0xED, 0x55, 0x78, 0xFE, 0x01, 0x9A, 0x1D, 0x50, 0x08,\r
+  0x85, 0x00, 0x10, 0x30, 0x46, 0xED, 0xB7, 0xDE, 0x23, 0x46, 0xBB, 0xC4, 0x2D, 0x54, 0x9F, 0xAF,\r
+  0x1E, 0x78, 0x41, 0x31, 0x77, 0xCC, 0x9B, 0xDF, 0x3B, 0x83, 0x93, 0xA1, 0x61, 0x02, 0xB5, 0x1D,\r
+  0x0D, 0xB1, 0xFC, 0xF7, 0x9B, 0xB2, 0x01, 0xCE, 0x22, 0x4B, 0x54, 0xFF, 0xF9, 0x05, 0xC3, 0xC2,\r
+  0x20, 0x0B, 0x02, 0x03, 0x01, 0x00, 0x01, 0xA3, 0x82, 0x01, 0xAB, 0x30, 0x82, 0x01, 0xA7, 0x30,\r
+  0x0F, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x01, 0x01, 0xFF, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xFF,\r
+  0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x0E, 0x04, 0x16, 0x04, 0x14, 0x23, 0x34, 0xF8, 0xD9, 0x52,\r
+  0x46, 0x70, 0x0A, 0xED, 0x40, 0xFB, 0x76, 0xFB, 0xB3, 0x2B, 0xB0, 0xC3, 0x35, 0xB3, 0x0F, 0x30,\r
+  0x0B, 0x06, 0x03, 0x55, 0x1D, 0x0F, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x10, 0x06, 0x09,\r
+  0x2B, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x15, 0x01, 0x04, 0x03, 0x02, 0x01, 0x00, 0x30, 0x81,\r
+  0x98, 0x06, 0x03, 0x55, 0x1D, 0x23, 0x04, 0x81, 0x90, 0x30, 0x81, 0x8D, 0x80, 0x14, 0x0E, 0xAC,\r
+  0x82, 0x60, 0x40, 0x56, 0x27, 0x97, 0xE5, 0x25, 0x13, 0xFC, 0x2A, 0xE1, 0x0A, 0x53, 0x95, 0x59,\r
+  0xE4, 0xA4, 0xA1, 0x63, 0xA4, 0x61, 0x30, 0x5F, 0x31, 0x13, 0x30, 0x11, 0x06, 0x0A, 0x09, 0x92,\r
+  0x26, 0x89, 0x93, 0xF2, 0x2C, 0x64, 0x01, 0x19, 0x16, 0x03, 0x63, 0x6F, 0x6D, 0x31, 0x19, 0x30,\r
+  0x17, 0x06, 0x0A, 0x09, 0x92, 0x26, 0x89, 0x93, 0xF2, 0x2C, 0x64, 0x01, 0x19, 0x16, 0x09, 0x6D,\r
+  0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x31, 0x2D, 0x30, 0x2B, 0x06, 0x03, 0x55, 0x04,\r
+  0x03, 0x13, 0x24, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x52, 0x6F, 0x6F,\r
+  0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75,\r
+  0x74, 0x68, 0x6F, 0x72, 0x69, 0x74, 0x79, 0x82, 0x10, 0x79, 0xAD, 0x16, 0xA1, 0x4A, 0xA0, 0xA5,\r
+  0xAD, 0x4C, 0x73, 0x58, 0xF4, 0x07, 0x13, 0x2E, 0x65, 0x30, 0x50, 0x06, 0x03, 0x55, 0x1D, 0x1F,\r
+  0x04, 0x49, 0x30, 0x47, 0x30, 0x45, 0xA0, 0x43, 0xA0, 0x41, 0x86, 0x3F, 0x68, 0x74, 0x74, 0x70,\r
+  0x3A, 0x2F, 0x2F, 0x63, 0x72, 0x6C, 0x2E, 0x6D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74,\r
+  0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, 0x6B, 0x69, 0x2F, 0x63, 0x72, 0x6C, 0x2F, 0x70, 0x72, 0x6F,\r
+  0x64, 0x75, 0x63, 0x74, 0x73, 0x2F, 0x6D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x72,\r
+  0x6F, 0x6F, 0x74, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x72, 0x6C, 0x30, 0x54, 0x06, 0x08, 0x2B,\r
+  0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x01, 0x04, 0x48, 0x30, 0x46, 0x30, 0x44, 0x06, 0x08, 0x2B,\r
+  0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x02, 0x86, 0x38, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F,\r
+  0x77, 0x77, 0x77, 0x2E, 0x6D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x2E, 0x63, 0x6F,\r
+  0x6D, 0x2F, 0x70, 0x6B, 0x69, 0x2F, 0x63, 0x65, 0x72, 0x74, 0x73, 0x2F, 0x4D, 0x69, 0x63, 0x72,\r
+  0x6F, 0x73, 0x6F, 0x66, 0x74, 0x52, 0x6F, 0x6F, 0x74, 0x43, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x72,\r
+  0x74, 0x30, 0x13, 0x06, 0x03, 0x55, 0x1D, 0x25, 0x04, 0x0C, 0x30, 0x0A, 0x06, 0x08, 0x2B, 0x06,\r
+  0x01, 0x05, 0x05, 0x07, 0x03, 0x08, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D,\r
+  0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x10, 0x97, 0x8A, 0xC3, 0x5C, 0x03,\r
+  0x44, 0x36, 0xDD, 0xE9, 0xB4, 0xAD, 0x77, 0xDB, 0xCE, 0x79, 0x51, 0x4D, 0x01, 0xB1, 0x2E, 0x74,\r
+  0x71, 0x5B, 0x6D, 0x0C, 0x13, 0xAB, 0xCE, 0xBE, 0x7B, 0x8F, 0xB8, 0x2E, 0xD4, 0x12, 0xA2, 0x8C,\r
+  0x6D, 0x62, 0xB8, 0x57, 0x02, 0xCB, 0x4E, 0x20, 0x13, 0x50, 0x99, 0xDD, 0x7A, 0x40, 0xE2, 0x57,\r
+  0xBB, 0xAF, 0x58, 0x9A, 0x1C, 0xE1, 0x1D, 0x01, 0x86, 0xAC, 0xBB, 0x78, 0xF2, 0x8B, 0xD0, 0xEC,\r
+  0x3B, 0x01, 0xEE, 0xE2, 0xBE, 0x8F, 0x0A, 0x05, 0xC8, 0x8D, 0x48, 0xE2, 0xF0, 0x53, 0x15, 0xDD,\r
+  0x4F, 0xAB, 0x92, 0xE4, 0xE7, 0x8D, 0x6A, 0xD5, 0x80, 0xC1, 0xE6, 0x94, 0xF2, 0x06, 0x2F, 0x85,\r
+  0x03, 0xE9, 0x91, 0x2A, 0x24, 0x22, 0x70, 0xFB, 0xF6, 0xFC, 0xE4, 0x78, 0x99, 0x2E, 0x0D, 0xF7,\r
+  0x07, 0xE2, 0x70, 0xBC, 0x18, 0x4E, 0x9D, 0x8E, 0x6B, 0x0A, 0x72, 0x95, 0xB8, 0xA1, 0x39, 0x9C,\r
+  0x67, 0x2D, 0xC5, 0x51, 0x0E, 0xEA, 0x62, 0x5C, 0x3F, 0x16, 0x98, 0x8B, 0x20, 0x3F, 0xE2, 0x07,\r
+  0x1A, 0x32, 0xF9, 0xCC, 0x31, 0x4A, 0x76, 0x31, 0x3D, 0x2B, 0x72, 0x0B, 0xC8, 0xEA, 0x70, 0x3D,\r
+  0xFF, 0x85, 0x0A, 0x13, 0xDF, 0xC2, 0x0A, 0x61, 0x8E, 0xF0, 0xD7, 0xB8, 0x17, 0xEB, 0x4E, 0x8B,\r
+  0x7F, 0xC5, 0x35, 0x2B, 0x5E, 0xA3, 0xBF, 0xEB, 0xBC, 0x7D, 0x0B, 0x42, 0x7B, 0xD4, 0x53, 0x72,\r
+  0x21, 0xEE, 0x30, 0xCA, 0xBB, 0x78, 0x65, 0x5C, 0x5B, 0x01, 0x17, 0x0A, 0x14, 0x0E, 0xD2, 0xDA,\r
+  0x14, 0x98, 0xF5, 0x3C, 0xB9, 0x66, 0x58, 0xB3, 0x2D, 0x2F, 0xE7, 0xF9, 0x85, 0x86, 0xCC, 0x51,\r
+  0x56, 0xE8, 0x9D, 0x70, 0x94, 0x6C, 0xAC, 0x39, 0x4C, 0xD4, 0xF6, 0x79, 0xBF, 0xAA, 0x18, 0x7A,\r
+  0x62, 0x29, 0xEF, 0xA2, 0x9B, 0x29, 0x34, 0x06, 0x77, 0x1A, 0x62, 0xC9, 0x3D, 0x1E, 0x6D, 0x1F,\r
+  0x82, 0xF0, 0x0B, 0xC7, 0x2C, 0xBB, 0xCF, 0x43, 0xB3, 0xE5, 0xF9, 0xEC, 0x7D, 0xB5, 0xE3, 0xA4,\r
+  0xA8, 0x74, 0x35, 0xB8, 0x4E, 0xC5, 0x71, 0x23, 0x12, 0x26, 0x76, 0x0B, 0x3C, 0x52, 0x8C, 0x71,\r
+  0x5A, 0x46, 0x43, 0x14, 0xBC, 0xB3, 0xB3, 0xB0, 0x4D, 0x67, 0xC8, 0x9F, 0x42, 0xFF, 0x80, 0x79,\r
+  0x21, 0x80, 0x9E, 0x15, 0x30, 0x66, 0xE8, 0x42, 0x12, 0x5E, 0x1A, 0xC8, 0x9E, 0x22, 0x21, 0xD0,\r
+  0x43, 0xE9, 0x2B, 0xE9, 0xBB, 0xF4, 0x48, 0xCC, 0x2C, 0xD4, 0xD8, 0x32, 0x80, 0x4C, 0x26, 0x2A,\r
+  0x48, 0x24, 0x5F, 0x5A, 0xEA, 0x56, 0xEF, 0xA6, 0xDE, 0x99, 0x9D, 0xCA, 0x3A, 0x6F, 0xBD, 0x81,\r
+  0x27, 0x74, 0x06, 0x11, 0xEE, 0x76, 0x21, 0xBF, 0x9B, 0x82, 0xC1, 0x27, 0x54, 0xB6, 0xB1, 0x6A,\r
+  0x3D, 0x89, 0xA1, 0x76, 0x61, 0xB4, 0x6E, 0xA1, 0x13, 0xA6, 0xBF, 0xAA, 0x47, 0xF0, 0x12, 0x6F,\r
+  0xFD, 0x8A, 0x32, 0x6C, 0xB2, 0xFE, 0xDF, 0x51, 0xC8, 0x8C, 0x23, 0xC9, 0x66, 0xBD, 0x9D, 0x1D,\r
+  0x87, 0x12, 0x64, 0x02, 0x3D, 0x2D, 0xAF, 0x59, 0x8F, 0xB8, 0xE4, 0x21, 0xE5, 0xB5, 0xB0, 0xCA,\r
+  0x63, 0xB4, 0x78, 0x54, 0x05, 0xD4, 0x41, 0x2E, 0x50, 0xAC, 0x94, 0xB0, 0xA5, 0x78, 0xAB, 0xB3,\r
+  0xA0, 0x96, 0x75, 0x1A, 0xD9, 0x92, 0x87, 0x13, 0x75, 0x22, 0x2F, 0x32, 0xA8, 0x08, 0x6E, 0xA0,\r
+  0x5B, 0x8C, 0x25, 0xBF, 0xA0, 0xEF, 0x84, 0xCA, 0x21, 0xD6, 0xEB, 0x1E, 0x4F, 0xC9, 0x9A, 0xEE,\r
+  0x49, 0xE0, 0xF7, 0x01, 0x65, 0x6F, 0x89, 0x0B, 0x7D, 0xC8, 0x69, 0xC8, 0xE6, 0x6E, 0xEA, 0xA7,\r
+  0x97, 0xCE, 0x31, 0x29, 0xFF, 0x0E, 0xC5, 0x5B, 0x5C, 0xD8, 0x4D, 0x1B, 0xA1, 0xD8, 0xFA, 0x2F,\r
+  0x9E, 0x3F, 0x2E, 0x55, 0x16, 0x6B, 0xC9, 0x13, 0xA3, 0xFD, 0x30, 0x82, 0x06, 0xA1, 0x30, 0x82,\r
+  0x04, 0x89, 0xA0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x0A, 0x61, 0x07, 0x02, 0xDC, 0x00, 0x00, 0x00,\r
+  0x00, 0x00, 0x0B, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x05,\r
+  0x05, 0x00, 0x30, 0x5F, 0x31, 0x13, 0x30, 0x11, 0x06, 0x0A, 0x09, 0x92, 0x26, 0x89, 0x93, 0xF2,\r
+  0x2C, 0x64, 0x01, 0x19, 0x16, 0x03, 0x63, 0x6F, 0x6D, 0x31, 0x19, 0x30, 0x17, 0x06, 0x0A, 0x09,\r
+  0x92, 0x26, 0x89, 0x93, 0xF2, 0x2C, 0x64, 0x01, 0x19, 0x16, 0x09, 0x6D, 0x69, 0x63, 0x72, 0x6F,\r
+  0x73, 0x6F, 0x66, 0x74, 0x31, 0x2D, 0x30, 0x2B, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x24, 0x4D,\r
+  0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x65,\r
+  0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6F, 0x72,\r
+  0x69, 0x74, 0x79, 0x30, 0x1E, 0x17, 0x0D, 0x30, 0x35, 0x30, 0x39, 0x31, 0x35, 0x32, 0x31, 0x35,\r
+  0x35, 0x34, 0x31, 0x5A, 0x17, 0x0D, 0x31, 0x36, 0x30, 0x33, 0x31, 0x35, 0x32, 0x32, 0x30, 0x35,\r
+  0x34, 0x31, 0x5A, 0x30, 0x81, 0x81, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,\r
+  0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x0A, 0x57, 0x61,\r
+  0x73, 0x68, 0x69, 0x6E, 0x67, 0x74, 0x6F, 0x6E, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04,\r
+  0x07, 0x13, 0x07, 0x52, 0x65, 0x64, 0x6D, 0x6F, 0x6E, 0x64, 0x31, 0x1E, 0x30, 0x1C, 0x06, 0x03,\r
+  0x55, 0x04, 0x0A, 0x13, 0x15, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x43,\r
+  0x6F, 0x72, 0x70, 0x6F, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x31, 0x2B, 0x30, 0x29, 0x06, 0x03,\r
+  0x55, 0x04, 0x03, 0x13, 0x22, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x57,\r
+  0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74,\r
+  0x69, 0x6F, 0x6E, 0x20, 0x50, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0D, 0x06, 0x09, 0x2A,\r
+  0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0F, 0x00, 0x30,\r
+  0x82, 0x01, 0x0A, 0x02, 0x82, 0x01, 0x01, 0x00, 0xC5, 0xAC, 0x93, 0x4E, 0xE6, 0x4A, 0x11, 0x9E,\r
+  0x37, 0xD0, 0x35, 0xD2, 0xB0, 0x06, 0x5C, 0x83, 0x14, 0xA5, 0x61, 0x92, 0xFC, 0xFE, 0xB3, 0x89,\r
+  0xC1, 0xE6, 0xCD, 0xC8, 0x1F, 0x31, 0x84, 0x09, 0x91, 0x34, 0x46, 0x92, 0x2C, 0xB8, 0xEE, 0x2C,\r
+  0xC5, 0x20, 0x73, 0xC4, 0xE8, 0x1A, 0xD8, 0x8D, 0xCE, 0x7A, 0x68, 0xB5, 0x66, 0x78, 0x8B, 0xE5,\r
+  0x60, 0x15, 0xA2, 0xF6, 0x29, 0x5A, 0x1D, 0x5E, 0x5D, 0xFC, 0x62, 0xD3, 0xC1, 0x5C, 0x29, 0x89,\r
+  0xFB, 0x33, 0xF8, 0x16, 0x95, 0x36, 0xDD, 0xB1, 0x46, 0x74, 0x69, 0x72, 0x53, 0xD5, 0xAA, 0xE8,\r
+  0x8A, 0x99, 0x1A, 0xD8, 0xF7, 0x67, 0x09, 0xD9, 0x09, 0x20, 0x22, 0x38, 0x7A, 0xD6, 0x03, 0x23,\r
+  0xD7, 0x89, 0x9F, 0x1C, 0x01, 0xB7, 0x51, 0xDF, 0x98, 0x66, 0x2A, 0x02, 0x8B, 0x06, 0xEC, 0xE4,\r
+  0x29, 0xEF, 0x5B, 0x42, 0x17, 0x15, 0x97, 0x51, 0x8D, 0x7D, 0x25, 0x0A, 0xAF, 0x25, 0xE8, 0xDE,\r
+  0xDC, 0x9B, 0x67, 0x16, 0x0A, 0x56, 0x73, 0x9D, 0xB3, 0x1D, 0x85, 0x83, 0x0B, 0x7E, 0x33, 0x2B,\r
+  0x62, 0x33, 0xCE, 0x1C, 0x20, 0x81, 0x4B, 0x5E, 0xD3, 0xC6, 0x49, 0xB8, 0xF6, 0x2E, 0xD3, 0x4E,\r
+  0xB0, 0x71, 0x44, 0x46, 0x64, 0x3E, 0xDE, 0x43, 0x66, 0x04, 0xB9, 0xCC, 0x83, 0x48, 0x3A, 0xC5,\r
+  0x36, 0x7A, 0x04, 0x48, 0x0B, 0x89, 0x02, 0x3D, 0x63, 0xA2, 0x01, 0x76, 0x29, 0x97, 0x75, 0xE9,\r
+  0x01, 0xE6, 0x00, 0x97, 0x09, 0x92, 0xF8, 0xE2, 0x27, 0xF0, 0x29, 0x67, 0x43, 0x77, 0xC3, 0x50,\r
+  0x96, 0x53, 0x31, 0xE1, 0xB6, 0x71, 0x8B, 0xEC, 0x77, 0xC7, 0x7C, 0x31, 0x48, 0xD5, 0xB8, 0x25,\r
+  0x22, 0x8C, 0x00, 0xF7, 0x28, 0x38, 0x7A, 0xBD, 0x7C, 0xC7, 0x3F, 0xCD, 0x40, 0x26, 0x77, 0xDD,\r
+  0x00, 0x00, 0x11, 0x9A, 0x95, 0xBE, 0x1F, 0xDB, 0x02, 0x03, 0x01, 0x00, 0x01, 0xA3, 0x82, 0x02,\r
+  0x3A, 0x30, 0x82, 0x02, 0x36, 0x30, 0x10, 0x06, 0x09, 0x2B, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37,\r
+  0x15, 0x01, 0x04, 0x03, 0x02, 0x01, 0x00, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x0E, 0x04, 0x16,\r
+  0x04, 0x14, 0x90, 0x8B, 0x11, 0xA5, 0x70, 0xED, 0xE0, 0xF9, 0xA9, 0xC0, 0xAC, 0x08, 0xC7, 0xB5,\r
+  0xF4, 0x82, 0xB1, 0x3C, 0xC5, 0x4A, 0x30, 0x0B, 0x06, 0x03, 0x55, 0x1D, 0x0F, 0x04, 0x04, 0x03,\r
+  0x02, 0x01, 0xC6, 0x30, 0x0F, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x01, 0x01, 0xFF, 0x04, 0x05, 0x30,\r
+  0x03, 0x01, 0x01, 0xFF, 0x30, 0x81, 0x98, 0x06, 0x03, 0x55, 0x1D, 0x23, 0x04, 0x81, 0x90, 0x30,\r
+  0x81, 0x8D, 0x80, 0x14, 0x0E, 0xAC, 0x82, 0x60, 0x40, 0x56, 0x27, 0x97, 0xE5, 0x25, 0x13, 0xFC,\r
+  0x2A, 0xE1, 0x0A, 0x53, 0x95, 0x59, 0xE4, 0xA4, 0xA1, 0x63, 0xA4, 0x61, 0x30, 0x5F, 0x31, 0x13,\r
+  0x30, 0x11, 0x06, 0x0A, 0x09, 0x92, 0x26, 0x89, 0x93, 0xF2, 0x2C, 0x64, 0x01, 0x19, 0x16, 0x03,\r
+  0x63, 0x6F, 0x6D, 0x31, 0x19, 0x30, 0x17, 0x06, 0x0A, 0x09, 0x92, 0x26, 0x89, 0x93, 0xF2, 0x2C,\r
+  0x64, 0x01, 0x19, 0x16, 0x09, 0x6D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x31, 0x2D,\r
+  0x30, 0x2B, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x24, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F,\r
+  0x66, 0x74, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63,\r
+  0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6F, 0x72, 0x69, 0x74, 0x79, 0x82, 0x10, 0x79,\r
+  0xAD, 0x16, 0xA1, 0x4A, 0xA0, 0xA5, 0xAD, 0x4C, 0x73, 0x58, 0xF4, 0x07, 0x13, 0x2E, 0x65, 0x30,\r
+  0x50, 0x06, 0x03, 0x55, 0x1D, 0x1F, 0x04, 0x49, 0x30, 0x47, 0x30, 0x45, 0xA0, 0x43, 0xA0, 0x41,\r
+  0x86, 0x3F, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x63, 0x72, 0x6C, 0x2E, 0x6D, 0x69, 0x63,\r
+  0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, 0x6B, 0x69, 0x2F, 0x63,\r
+  0x72, 0x6C, 0x2F, 0x70, 0x72, 0x6F, 0x64, 0x75, 0x63, 0x74, 0x73, 0x2F, 0x6D, 0x69, 0x63, 0x72,\r
+  0x6F, 0x73, 0x6F, 0x66, 0x74, 0x72, 0x6F, 0x6F, 0x74, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x72,\r
+  0x6C, 0x30, 0x54, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x01, 0x04, 0x48, 0x30,\r
+  0x46, 0x30, 0x44, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x02, 0x86, 0x38, 0x68,\r
+  0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x6D, 0x69, 0x63, 0x72, 0x6F, 0x73,\r
+  0x6F, 0x66, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, 0x6B, 0x69, 0x2F, 0x63, 0x65, 0x72, 0x74,\r
+  0x73, 0x2F, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x52, 0x6F, 0x6F, 0x74, 0x43,\r
+  0x65, 0x72, 0x74, 0x2E, 0x63, 0x72, 0x74, 0x30, 0x81, 0x80, 0x06, 0x03, 0x55, 0x1D, 0x20, 0x04,\r
+  0x79, 0x30, 0x77, 0x30, 0x75, 0x06, 0x09, 0x2B, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x15, 0x2F,\r
+  0x30, 0x68, 0x30, 0x66, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x02, 0x30, 0x5A,\r
+  0x1E, 0x58, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x79, 0x00, 0x72, 0x00, 0x69, 0x00, 0x67,\r
+  0x00, 0x68, 0x00, 0x74, 0x00, 0x20, 0x00, 0xA9, 0x00, 0x20, 0x00, 0x31, 0x00, 0x39, 0x00, 0x39,\r
+  0x00, 0x39, 0x00, 0x2D, 0x00, 0x32, 0x00, 0x30, 0x00, 0x30, 0x00, 0x35, 0x00, 0x20, 0x00, 0x4D,\r
+  0x00, 0x69, 0x00, 0x63, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x66, 0x00, 0x74,\r
+  0x00, 0x20, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x61,\r
+  0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x2E, 0x30, 0x1F, 0x06, 0x03, 0x55, 0x1D,\r
+  0x25, 0x04, 0x18, 0x30, 0x16, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x03, 0x06,\r
+  0x0A, 0x2B, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x0A, 0x03, 0x06, 0x30, 0x0D, 0x06, 0x09, 0x2A,\r
+  0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x25,\r
+  0x31, 0xA1, 0x58, 0xEA, 0x52, 0xE5, 0xE1, 0x17, 0x0C, 0xE6, 0xF1, 0x3F, 0x78, 0xA3, 0x3F, 0x72,\r
+  0xAF, 0xA7, 0x57, 0x10, 0x53, 0x89, 0x10, 0x5E, 0x32, 0x9C, 0xB6, 0x70, 0xC3, 0x15, 0x2B, 0x4D,\r
+  0x15, 0x30, 0x34, 0xE8, 0xC0, 0x6A, 0xE4, 0x1C, 0xD3, 0x2E, 0x20, 0x65, 0x48, 0xD7, 0x1B, 0x98,\r
+  0x62, 0x21, 0xBA, 0x45, 0x9F, 0x4A, 0xEC, 0xDB, 0x2F, 0x09, 0x19, 0x51, 0xE5, 0xED, 0x32, 0x19,\r
+  0x51, 0x2F, 0xE1, 0xDD, 0xFB, 0xC6, 0x52, 0xFD, 0xEB, 0xC6, 0x82, 0x25, 0x42, 0x03, 0x09, 0xA6,\r
+  0x38, 0xB6, 0x36, 0x1F, 0xCC, 0xC9, 0x80, 0xBB, 0x5A, 0x69, 0x18, 0x31, 0xC3, 0xB3, 0xA0, 0xB3,\r
+  0x67, 0x47, 0xBE, 0x9D, 0xC7, 0xE2, 0x3F, 0x96, 0xB3, 0x88, 0xF8, 0x19, 0xBE, 0x39, 0xB9, 0xE9,\r
+  0x95, 0xCE, 0xFC, 0x7C, 0xAF, 0xA8, 0xCD, 0xD0, 0x41, 0x90, 0xE0, 0xD5, 0xB3, 0x1C, 0x2F, 0x68,\r
+  0xBB, 0xDB, 0x0F, 0x6C, 0x6A, 0xDD, 0xF2, 0xAF, 0xDE, 0xF2, 0xB5, 0xDE, 0x0D, 0xB6, 0xA6, 0x5A,\r
+  0xF0, 0x86, 0x0A, 0xB9, 0x6D, 0x99, 0x4B, 0x3F, 0x7B, 0x2D, 0x01, 0x84, 0x6C, 0x8F, 0x87, 0xDC,\r
+  0x7F, 0x8F, 0xAB, 0x14, 0x88, 0xD0, 0x06, 0x91, 0x34, 0xBE, 0x1B, 0x82, 0x22, 0xA4, 0xBC, 0x55,\r
+  0x8A, 0xAD, 0x9B, 0xFC, 0x73, 0x14, 0x10, 0xC4, 0xC9, 0x19, 0x1E, 0x07, 0x7D, 0x9B, 0x0E, 0xC0,\r
+  0x95, 0x26, 0x5D, 0xC6, 0x1F, 0xAC, 0xB4, 0xF2, 0x7E, 0xBA, 0x25, 0x70, 0x4A, 0x7B, 0xD7, 0x8E,\r
+  0xD1, 0x9D, 0xA0, 0x13, 0x49, 0x7A, 0xB0, 0x02, 0x52, 0x52, 0x24, 0xF4, 0xAF, 0xDD, 0x40, 0x2D,\r
+  0xE5, 0x3E, 0x32, 0x58, 0xB3, 0x4A, 0x6A, 0xDD, 0x11, 0x59, 0xAA, 0x2D, 0xBC, 0xA4, 0xA0, 0x73,\r
+  0x38, 0xF9, 0x40, 0x77, 0x6B, 0x34, 0x19, 0x57, 0xCD, 0x38, 0x68, 0x27, 0x82, 0xF8, 0xD1, 0x6F,\r
+  0xEB, 0x23, 0xC0, 0x3F, 0x52, 0xF3, 0x4E, 0xD5, 0x02, 0x3E, 0x6A, 0x9A, 0x2B, 0xC1, 0xF5, 0x31,\r
+  0x71, 0xDB, 0x41, 0x4D, 0x3B, 0xDE, 0xEF, 0xAD, 0xAF, 0x1F, 0x88, 0x65, 0x43, 0x1B, 0x51, 0xB7,\r
+  0x9A, 0x75, 0xCA, 0x8E, 0x69, 0x49, 0x10, 0x8F, 0x78, 0x8A, 0x74, 0x45, 0xB9, 0x09, 0x8E, 0x73,\r
+  0x77, 0x07, 0x32, 0x4A, 0x4B, 0xD7, 0x68, 0x2B, 0x98, 0xC5, 0xBA, 0x54, 0xEA, 0x3F, 0xCB, 0xA2,\r
+  0x00, 0x8C, 0xBB, 0xD8, 0x10, 0x58, 0xF2, 0xDB, 0xDC, 0x9B, 0xCD, 0xD8, 0xEA, 0x48, 0x43, 0xE2,\r
+  0x4A, 0x7E, 0x65, 0xB2, 0xDC, 0xF5, 0x2D, 0x4E, 0x25, 0x67, 0xA8, 0xE0, 0xB5, 0xBA, 0xA7, 0xDD,\r
+  0x7E, 0x5E, 0xC1, 0x4C, 0x02, 0x74, 0xC9, 0xB3, 0x6E, 0xE3, 0xF8, 0xF0, 0x0B, 0xED, 0xFC, 0xB9,\r
+  0x29, 0xC5, 0x5B, 0xC9, 0x36, 0x51, 0x90, 0xDB, 0x78, 0x7D, 0xB9, 0x32, 0x0F, 0x5E, 0x76, 0xD2,\r
+  0x15, 0x5C, 0x3B, 0x37, 0x21, 0xC6, 0xDB, 0xC9, 0x19, 0x6E, 0xED, 0x74, 0x2A, 0x5C, 0x2C, 0x0B,\r
+  0x51, 0x49, 0x45, 0x53, 0xB0, 0xB2, 0xB3, 0x23, 0xD4, 0xA1, 0xB0, 0x5F, 0x0D, 0x19, 0xCD, 0x14,\r
+  0xA7, 0xE3, 0x3C, 0x9B, 0x97, 0x72, 0x94, 0x14, 0xDF, 0xFF, 0xC1, 0x90, 0x1B, 0xA5, 0xDF, 0xF5,\r
+  0xA9, 0xF3, 0x1B, 0x17, 0xDA, 0xB5, 0xFC, 0x44, 0xE0, 0xE8, 0xE2, 0x3C, 0xA2, 0x7A, 0xBB, 0xBB,\r
+  0x65, 0xE6, 0x4D, 0xB1, 0xB5, 0x15, 0xA1, 0xD9, 0x67, 0x3B, 0xB0, 0x0C, 0x7D, 0x3B, 0xE9, 0xEE,\r
+  0x51, 0x2A, 0x47, 0xF5, 0x15, 0x0F, 0x8C, 0xAD, 0x5D, 0x2E, 0x35, 0xDF, 0xF4, 0xA4, 0x2E, 0xF6,\r
+  0x13, 0x37, 0x5A, 0x2B, 0xE8, 0x55, 0x9A, 0x49, 0x2C, 0x97, 0xCE, 0x9D, 0x01, 0x9E, 0x97, 0x46,\r
+  0x5C, 0xD9, 0x2D, 0xBC, 0x24, 0x5A, 0x95, 0x59, 0x6F, 0x4D, 0xCA, 0x9D, 0xD6, 0x57, 0x26, 0x31,\r
+  0x82, 0x04, 0x96, 0x30, 0x82, 0x04, 0x92, 0x02, 0x01, 0x01, 0x30, 0x81, 0x90, 0x30, 0x81, 0x81,\r
+  0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30,\r
+  0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x0A, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6E, 0x67, 0x74,\r
+  0x6F, 0x6E, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, 0x52, 0x65, 0x64,\r
+  0x6D, 0x6F, 0x6E, 0x64, 0x31, 0x1E, 0x30, 0x1C, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x15, 0x4D,\r
+  0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x43, 0x6F, 0x72, 0x70, 0x6F, 0x72, 0x61,\r
+  0x74, 0x69, 0x6F, 0x6E, 0x31, 0x2B, 0x30, 0x29, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x22, 0x4D,\r
+  0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73,\r
+  0x20, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x50, 0x43,\r
+  0x41, 0x02, 0x0A, 0x61, 0x01, 0xC6, 0xC1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x30, 0x09, 0x06,\r
+  0x05, 0x2B, 0x0E, 0x03, 0x02, 0x1A, 0x05, 0x00, 0xA0, 0x81, 0xBA, 0x30, 0x19, 0x06, 0x09, 0x2A,\r
+  0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x03, 0x31, 0x0C, 0x06, 0x0A, 0x2B, 0x06, 0x01, 0x04,\r
+  0x01, 0x82, 0x37, 0x02, 0x01, 0x04, 0x30, 0x1C, 0x06, 0x0A, 0x2B, 0x06, 0x01, 0x04, 0x01, 0x82,\r
+  0x37, 0x02, 0x01, 0x0B, 0x31, 0x0E, 0x30, 0x0C, 0x06, 0x0A, 0x2B, 0x06, 0x01, 0x04, 0x01, 0x82,\r
+  0x37, 0x02, 0x01, 0x15, 0x30, 0x23, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09,\r
+  0x04, 0x31, 0x16, 0x04, 0x14, 0xC5, 0xC5, 0xC1, 0xC3, 0x46, 0xC4, 0x12, 0xB9, 0x38, 0xED, 0xE5,\r
+  0x7E, 0x66, 0x78, 0x4E, 0x8F, 0x55, 0x10, 0x7D, 0xAC, 0x30, 0x5A, 0x06, 0x0A, 0x2B, 0x06, 0x01,\r
+  0x04, 0x01, 0x82, 0x37, 0x02, 0x01, 0x0C, 0x31, 0x4C, 0x30, 0x4A, 0xA0, 0x24, 0x80, 0x22, 0x00,\r
+  0x4D, 0x00, 0x69, 0x00, 0x63, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x66, 0x00,\r
+  0x74, 0x00, 0x20, 0x00, 0x57, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x77, 0x00,\r
+  0x73, 0xA1, 0x22, 0x80, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E,\r
+  0x6D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x77, 0x69,\r
+  0x6E, 0x64, 0x6F, 0x77, 0x73, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01,\r
+  0x01, 0x01, 0x05, 0x00, 0x04, 0x82, 0x01, 0x00, 0xC0, 0x53, 0x19, 0xE7, 0x27, 0xE6, 0xD6, 0xD7,\r
+  0xA8, 0xAE, 0xA0, 0xE6, 0x4C, 0xEF, 0x9A, 0xBC, 0x1D, 0x19, 0xD4, 0xC5, 0x7F, 0x7C, 0x71, 0xFF,\r
+  0x14, 0x7C, 0xAD, 0x7A, 0x8F, 0x2D, 0x0F, 0x40, 0x38, 0x9B, 0x83, 0x09, 0xEE, 0xF5, 0x34, 0x92,\r
+  0xB4, 0x85, 0x34, 0x7C, 0xBA, 0x9B, 0x58, 0x5D, 0xA6, 0x15, 0xDE, 0x99, 0xBF, 0x25, 0x89, 0xDB,\r
+  0xC0, 0x3A, 0x98, 0x21, 0x1C, 0x25, 0x09, 0xBD, 0x41, 0xAA, 0x0F, 0x90, 0x6C, 0x62, 0xE9, 0xBD,\r
+  0x1D, 0xDD, 0x7C, 0xA4, 0x1F, 0x19, 0x3F, 0xC8, 0x11, 0xF5, 0x1C, 0x9E, 0xEA, 0x2E, 0x1A, 0xCE,\r
+  0x5A, 0x61, 0x8A, 0x77, 0xFA, 0x65, 0x1F, 0x03, 0xB4, 0x45, 0x02, 0x0F, 0xB4, 0x0E, 0xB9, 0x44,\r
+  0xF6, 0x75, 0xF6, 0x67, 0x91, 0xAD, 0xFA, 0xF9, 0xC3, 0xFA, 0x63, 0x91, 0x58, 0xFE, 0x40, 0xDF,\r
+  0x92, 0x6B, 0x59, 0x42, 0x44, 0x66, 0xD2, 0x88, 0x49, 0x59, 0x29, 0x1D, 0x6A, 0xF9, 0x93, 0x9B,\r
+  0xD5, 0x38, 0x84, 0x96, 0xD7, 0xAF, 0xBA, 0xEC, 0x29, 0x8D, 0x06, 0x8C, 0x8B, 0xF4, 0xA1, 0x56,\r
+  0x0F, 0x78, 0x3F, 0x35, 0xCB, 0x12, 0x8A, 0x85, 0xD5, 0x7C, 0xFC, 0x63, 0xDD, 0x72, 0xA1, 0x13,\r
+  0xD3, 0x25, 0x4A, 0x59, 0x21, 0xD0, 0xC6, 0x47, 0x9F, 0x22, 0xF7, 0xF8, 0x32, 0xA2, 0x05, 0x2B,\r
+  0x53, 0xC5, 0x96, 0x98, 0x0D, 0x39, 0x02, 0xAD, 0x85, 0xF7, 0x18, 0x73, 0x34, 0x12, 0x7F, 0x5A,\r
+  0xCB, 0xE1, 0xA2, 0xFB, 0x4E, 0x25, 0x81, 0xF0, 0x9F, 0x7A, 0x79, 0xDB, 0x4F, 0x4B, 0x66, 0x44,\r
+  0x30, 0x8E, 0x0D, 0x57, 0x23, 0xD3, 0x7F, 0x60, 0x87, 0xDE, 0xD0, 0x4C, 0x90, 0x90, 0x84, 0x64,\r
+  0x70, 0xE8, 0x15, 0x65, 0xCA, 0x18, 0xF8, 0x9A, 0xB6, 0x0C, 0x24, 0xF5, 0xDF, 0xC3, 0x47, 0xE2,\r
+  0x7C, 0xAD, 0x91, 0x70, 0x6D, 0xF8, 0x43, 0xE9, 0xA1, 0x82, 0x02, 0x1D, 0x30, 0x82, 0x02, 0x19,\r
+  0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x06, 0x31, 0x82, 0x02, 0x0A, 0x30,\r
+  0x82, 0x02, 0x06, 0x02, 0x01, 0x01, 0x30, 0x81, 0x85, 0x30, 0x77, 0x31, 0x0B, 0x30, 0x09, 0x06,\r
+  0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04,\r
+  0x08, 0x13, 0x0A, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6E, 0x67, 0x74, 0x6F, 0x6E, 0x31, 0x10, 0x30,\r
+  0x0E, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, 0x52, 0x65, 0x64, 0x6D, 0x6F, 0x6E, 0x64, 0x31,\r
+  0x1E, 0x30, 0x1C, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x15, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73,\r
+  0x6F, 0x66, 0x74, 0x20, 0x43, 0x6F, 0x72, 0x70, 0x6F, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x31,\r
+  0x21, 0x30, 0x1F, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x18, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73,\r
+  0x6F, 0x66, 0x74, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x2D, 0x53, 0x74, 0x61, 0x6D, 0x70, 0x20, 0x50,\r
+  0x43, 0x41, 0x02, 0x0A, 0x61, 0x03, 0xDC, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x30, 0x07,\r
+  0x06, 0x05, 0x2B, 0x0E, 0x03, 0x02, 0x1A, 0xA0, 0x5D, 0x30, 0x18, 0x06, 0x09, 0x2A, 0x86, 0x48,\r
+  0x86, 0xF7, 0x0D, 0x01, 0x09, 0x03, 0x31, 0x0B, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D,\r
+  0x01, 0x07, 0x01, 0x30, 0x1C, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x05,\r
+  0x31, 0x0F, 0x17, 0x0D, 0x30, 0x39, 0x30, 0x34, 0x32, 0x32, 0x30, 0x35, 0x35, 0x34, 0x33, 0x34,\r
+  0x5A, 0x30, 0x23, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x04, 0x31, 0x16,\r
+  0x04, 0x14, 0x74, 0xD7, 0x54, 0xA0, 0xC0, 0x9E, 0x62, 0xF0, 0xDD, 0x92, 0xDC, 0xD6, 0x96, 0x34,\r
+  0xA1, 0x0B, 0xF0, 0xD5, 0xB5, 0x3A, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D,\r
+  0x01, 0x01, 0x05, 0x05, 0x00, 0x04, 0x82, 0x01, 0x00, 0x8D, 0x16, 0xB5, 0xC8, 0x3D, 0xBC, 0x8A,\r
+  0xB5, 0xC3, 0x23, 0xF3, 0x33, 0xB0, 0xFA, 0x75, 0xAD, 0xAC, 0x53, 0x0D, 0x5C, 0xF4, 0xD9, 0xBE,\r
+  0x63, 0xEB, 0x0D, 0x6F, 0x69, 0x63, 0x91, 0xF8, 0x8E, 0x67, 0x03, 0xE1, 0xC6, 0x2E, 0xCD, 0x9C,\r
+  0xEB, 0xDD, 0x9C, 0xCA, 0x65, 0x4A, 0xBB, 0xF2, 0xF4, 0x1C, 0x85, 0x44, 0xD6, 0x58, 0x70, 0x2E,\r
+  0x3B, 0xFE, 0x97, 0xD0, 0xEC, 0x72, 0x77, 0x20, 0xA8, 0x20, 0xAC, 0xF0, 0xED, 0x86, 0xC4, 0xFF,\r
+  0x3A, 0x3D, 0x40, 0xD9, 0xF6, 0xD5, 0x99, 0xBE, 0xCC, 0xD2, 0xD8, 0xBA, 0x71, 0x51, 0x60, 0xAA,\r
+  0x72, 0x36, 0x13, 0x8B, 0x0A, 0xA9, 0xD6, 0xF5, 0x36, 0xE0, 0x44, 0x6B, 0xC1, 0x44, 0x42, 0x43,\r
+  0x56, 0x1A, 0xD6, 0xF1, 0x5A, 0x98, 0xCC, 0xBA, 0xA9, 0x4C, 0xCF, 0xC9, 0x86, 0xC3, 0x5B, 0x1C,\r
+  0xDF, 0x75, 0x22, 0x54, 0x6A, 0xF0, 0x18, 0x34, 0x0B, 0x29, 0xB0, 0x26, 0x07, 0x59, 0xB6, 0x52,\r
+  0x7B, 0x69, 0x74, 0x11, 0x1B, 0xB8, 0x29, 0x19, 0x36, 0x0E, 0xB7, 0x65, 0xCB, 0x87, 0x09, 0x9E,\r
+  0x03, 0x28, 0x6C, 0xDB, 0xA7, 0xFB, 0xDF, 0xC7, 0xF7, 0xCE, 0x0D, 0xC2, 0xBA, 0xEA, 0x3C, 0xE8,\r
+  0x43, 0x1E, 0x7F, 0xF2, 0x64, 0xDA, 0x87, 0x89, 0xC0, 0xCD, 0x67, 0xE4, 0x84, 0x9B, 0xA7, 0x77,\r
+  0xFA, 0x6C, 0x69, 0x19, 0x5B, 0xD1, 0xF7, 0xD9, 0x07, 0x91, 0x50, 0xDD, 0x98, 0x26, 0x10, 0xE3,\r
+  0x2E, 0x39, 0x62, 0xF0, 0x56, 0xE9, 0xD9, 0x5C, 0x85, 0x67, 0x9B, 0x2F, 0xDE, 0xD1, 0x00, 0x45,\r
+  0x0E, 0x99, 0x1F, 0xDF, 0x7E, 0xC9, 0x10, 0x56, 0xC7, 0x00, 0x6D, 0x5F, 0x23, 0x57, 0x12, 0x84,\r
+  0xCD, 0xAC, 0x82, 0xAE, 0x39, 0x52, 0xA5, 0x19, 0x23, 0xA3, 0x6B, 0xE7, 0x49, 0x8F, 0x86, 0x74,\r
+  0x46, 0x41, 0x2A, 0x0F, 0x3D, 0x29, 0xB7, 0xAE, 0x8C, 0x00  \r
+  };\r
+\r
+//\r
+// Sample MSFT's root certificate for code signing. \r
+// A trusted certificate with self-signing, will be used to construct the certificate chains for \r
+// authority checking.\r
+//\r
+GLOBAL_REMOVE_IF_UNREFERENCED UINT8 MsftRootCert[] = {\r
+  0x30, 0x82, 0x05, 0x99, 0x30, 0x82, 0x03, 0x81, 0xA0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x79,\r
+  0xAD, 0x16, 0xA1, 0x4A, 0xA0, 0xA5, 0xAD, 0x4C, 0x73, 0x58, 0xF4, 0x07, 0x13, 0x2E, 0x65, 0x30,\r
+  0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x5F,\r
+  0x31, 0x13, 0x30, 0x11, 0x06, 0x0A, 0x09, 0x92, 0x26, 0x89, 0x93, 0xF2, 0x2C, 0x64, 0x01, 0x19,\r
+  0x16, 0x03, 0x63, 0x6F, 0x6D, 0x31, 0x19, 0x30, 0x17, 0x06, 0x0A, 0x09, 0x92, 0x26, 0x89, 0x93,\r
+  0xF2, 0x2C, 0x64, 0x01, 0x19, 0x16, 0x09, 0x6D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74,\r
+  0x31, 0x2D, 0x30, 0x2B, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x24, 0x4D, 0x69, 0x63, 0x72, 0x6F,\r
+  0x73, 0x6F, 0x66, 0x74, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66,\r
+  0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6F, 0x72, 0x69, 0x74, 0x79, 0x30,\r
+  0x1E, 0x17, 0x0D, 0x30, 0x31, 0x30, 0x35, 0x30, 0x39, 0x32, 0x33, 0x31, 0x39, 0x32, 0x32, 0x5A,\r
+  0x17, 0x0D, 0x32, 0x31, 0x30, 0x35, 0x30, 0x39, 0x32, 0x33, 0x32, 0x38, 0x31, 0x33, 0x5A, 0x30,\r
+  0x5F, 0x31, 0x13, 0x30, 0x11, 0x06, 0x0A, 0x09, 0x92, 0x26, 0x89, 0x93, 0xF2, 0x2C, 0x64, 0x01,\r
+  0x19, 0x16, 0x03, 0x63, 0x6F, 0x6D, 0x31, 0x19, 0x30, 0x17, 0x06, 0x0A, 0x09, 0x92, 0x26, 0x89,\r
+  0x93, 0xF2, 0x2C, 0x64, 0x01, 0x19, 0x16, 0x09, 0x6D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66,\r
+  0x74, 0x31, 0x2D, 0x30, 0x2B, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x24, 0x4D, 0x69, 0x63, 0x72,\r
+  0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69,\r
+  0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6F, 0x72, 0x69, 0x74, 0x79,\r
+  0x30, 0x82, 0x02, 0x22, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01,\r
+  0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0F, 0x00, 0x30, 0x82, 0x02, 0x0A, 0x02, 0x82, 0x02, 0x01,\r
+  0x00, 0xF3, 0x5D, 0xFA, 0x80, 0x67, 0xD4, 0x5A, 0xA7, 0xA9, 0x0C, 0x2C, 0x90, 0x20, 0xD0, 0x35,\r
+  0x08, 0x3C, 0x75, 0x84, 0xCD, 0xB7, 0x07, 0x89, 0x9C, 0x89, 0xDA, 0xDE, 0xCE, 0xC3, 0x60, 0xFA,\r
+  0x91, 0x68, 0x5A, 0x9E, 0x94, 0x71, 0x29, 0x18, 0x76, 0x7C, 0xC2, 0xE0, 0xC8, 0x25, 0x76, 0x94,\r
+  0x0E, 0x58, 0xFA, 0x04, 0x34, 0x36, 0xE6, 0xDF, 0xAF, 0xF7, 0x80, 0xBA, 0xE9, 0x58, 0x0B, 0x2B,\r
+  0x93, 0xE5, 0x9D, 0x05, 0xE3, 0x77, 0x22, 0x91, 0xF7, 0x34, 0x64, 0x3C, 0x22, 0x91, 0x1D, 0x5E,\r
+  0xE1, 0x09, 0x90, 0xBC, 0x14, 0xFE, 0xFC, 0x75, 0x58, 0x19, 0xE1, 0x79, 0xB7, 0x07, 0x92, 0xA3,\r
+  0xAE, 0x88, 0x59, 0x08, 0xD8, 0x9F, 0x07, 0xCA, 0x03, 0x58, 0xFC, 0x68, 0x29, 0x6D, 0x32, 0xD7,\r
+  0xD2, 0xA8, 0xCB, 0x4B, 0xFC, 0xE1, 0x0B, 0x48, 0x32, 0x4F, 0xE6, 0xEB, 0xB8, 0xAD, 0x4F, 0xE4,\r
+  0x5C, 0x6F, 0x13, 0x94, 0x99, 0xDB, 0x95, 0xD5, 0x75, 0xDB, 0xA8, 0x1A, 0xB7, 0x94, 0x91, 0xB4,\r
+  0x77, 0x5B, 0xF5, 0x48, 0x0C, 0x8F, 0x6A, 0x79, 0x7D, 0x14, 0x70, 0x04, 0x7D, 0x6D, 0xAF, 0x90,\r
+  0xF5, 0xDA, 0x70, 0xD8, 0x47, 0xB7, 0xBF, 0x9B, 0x2F, 0x6C, 0xE7, 0x05, 0xB7, 0xE1, 0x11, 0x60,\r
+  0xAC, 0x79, 0x91, 0x14, 0x7C, 0xC5, 0xD6, 0xA6, 0xE4, 0xE1, 0x7E, 0xD5, 0xC3, 0x7E, 0xE5, 0x92,\r
+  0xD2, 0x3C, 0x00, 0xB5, 0x36, 0x82, 0xDE, 0x79, 0xE1, 0x6D, 0xF3, 0xB5, 0x6E, 0xF8, 0x9F, 0x33,\r
+  0xC9, 0xCB, 0x52, 0x7D, 0x73, 0x98, 0x36, 0xDB, 0x8B, 0xA1, 0x6B, 0xA2, 0x95, 0x97, 0x9B, 0xA3,\r
+  0xDE, 0xC2, 0x4D, 0x26, 0xFF, 0x06, 0x96, 0x67, 0x25, 0x06, 0xC8, 0xE7, 0xAC, 0xE4, 0xEE, 0x12,\r
+  0x33, 0x95, 0x31, 0x99, 0xC8, 0x35, 0x08, 0x4E, 0x34, 0xCA, 0x79, 0x53, 0xD5, 0xB5, 0xBE, 0x63,\r
+  0x32, 0x59, 0x40, 0x36, 0xC0, 0xA5, 0x4E, 0x04, 0x4D, 0x3D, 0xDB, 0x5B, 0x07, 0x33, 0xE4, 0x58,\r
+  0xBF, 0xEF, 0x3F, 0x53, 0x64, 0xD8, 0x42, 0x59, 0x35, 0x57, 0xFD, 0x0F, 0x45, 0x7C, 0x24, 0x04,\r
+  0x4D, 0x9E, 0xD6, 0x38, 0x74, 0x11, 0x97, 0x22, 0x90, 0xCE, 0x68, 0x44, 0x74, 0x92, 0x6F, 0xD5,\r
+  0x4B, 0x6F, 0xB0, 0x86, 0xE3, 0xC7, 0x36, 0x42, 0xA0, 0xD0, 0xFC, 0xC1, 0xC0, 0x5A, 0xF9, 0xA3,\r
+  0x61, 0xB9, 0x30, 0x47, 0x71, 0x96, 0x0A, 0x16, 0xB0, 0x91, 0xC0, 0x42, 0x95, 0xEF, 0x10, 0x7F,\r
+  0x28, 0x6A, 0xE3, 0x2A, 0x1F, 0xB1, 0xE4, 0xCD, 0x03, 0x3F, 0x77, 0x71, 0x04, 0xC7, 0x20, 0xFC,\r
+  0x49, 0x0F, 0x1D, 0x45, 0x88, 0xA4, 0xD7, 0xCB, 0x7E, 0x88, 0xAD, 0x8E, 0x2D, 0xEC, 0x45, 0xDB,\r
+  0xC4, 0x51, 0x04, 0xC9, 0x2A, 0xFC, 0xEC, 0x86, 0x9E, 0x9A, 0x11, 0x97, 0x5B, 0xDE, 0xCE, 0x53,\r
+  0x88, 0xE6, 0xE2, 0xB7, 0xFD, 0xAC, 0x95, 0xC2, 0x28, 0x40, 0xDB, 0xEF, 0x04, 0x90, 0xDF, 0x81,\r
+  0x33, 0x39, 0xD9, 0xB2, 0x45, 0xA5, 0x23, 0x87, 0x06, 0xA5, 0x55, 0x89, 0x31, 0xBB, 0x06, 0x2D,\r
+  0x60, 0x0E, 0x41, 0x18, 0x7D, 0x1F, 0x2E, 0xB5, 0x97, 0xCB, 0x11, 0xEB, 0x15, 0xD5, 0x24, 0xA5,\r
+  0x94, 0xEF, 0x15, 0x14, 0x89, 0xFD, 0x4B, 0x73, 0xFA, 0x32, 0x5B, 0xFC, 0xD1, 0x33, 0x00, 0xF9,\r
+  0x59, 0x62, 0x70, 0x07, 0x32, 0xEA, 0x2E, 0xAB, 0x40, 0x2D, 0x7B, 0xCA, 0xDD, 0x21, 0x67, 0x1B,\r
+  0x30, 0x99, 0x8F, 0x16, 0xAA, 0x23, 0xA8, 0x41, 0xD1, 0xB0, 0x6E, 0x11, 0x9B, 0x36, 0xC4, 0xDE,\r
+  0x40, 0x74, 0x9C, 0xE1, 0x58, 0x65, 0xC1, 0x60, 0x1E, 0x7A, 0x5B, 0x38, 0xC8, 0x8F, 0xBB, 0x04,\r
+  0x26, 0x7C, 0xD4, 0x16, 0x40, 0xE5, 0xB6, 0x6B, 0x6C, 0xAA, 0x86, 0xFD, 0x00, 0xBF, 0xCE, 0xC1,\r
+  0x35, 0x02, 0x03, 0x01, 0x00, 0x01, 0xA3, 0x51, 0x30, 0x4F, 0x30, 0x0B, 0x06, 0x03, 0x55, 0x1D,\r
+  0x0F, 0x04, 0x04, 0x03, 0x02, 0x01, 0xC6, 0x30, 0x0F, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x01, 0x01,\r
+  0xFF, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xFF, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x0E, 0x04,\r
+  0x16, 0x04, 0x14, 0x0E, 0xAC, 0x82, 0x60, 0x40, 0x56, 0x27, 0x97, 0xE5, 0x25, 0x13, 0xFC, 0x2A,\r
+  0xE1, 0x0A, 0x53, 0x95, 0x59, 0xE4, 0xA4, 0x30, 0x10, 0x06, 0x09, 0x2B, 0x06, 0x01, 0x04, 0x01,\r
+  0x82, 0x37, 0x15, 0x01, 0x04, 0x03, 0x02, 0x01, 0x00, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48,\r
+  0x86, 0xF7, 0x0D, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0xC5, 0x11, 0x4D,\r
+  0x03, 0x3A, 0x60, 0xDD, 0x5D, 0x52, 0x11, 0x77, 0x8F, 0xB2, 0xBB, 0x36, 0xC8, 0xB2, 0x05, 0xBF,\r
+  0xB4, 0xB7, 0xA8, 0xD8, 0x20, 0x9D, 0x5C, 0x13, 0x03, 0xB6, 0x1C, 0x22, 0xFA, 0x06, 0x13, 0x35,\r
+  0xB6, 0xC8, 0x63, 0xD4, 0x9A, 0x47, 0x6F, 0x26, 0x57, 0xD2, 0x55, 0xF1, 0x04, 0xB1, 0x26, 0x5F,\r
+  0xD6, 0xA9, 0x50, 0x68, 0xA0, 0xBC, 0xD2, 0xB8, 0x6E, 0xCC, 0xC3, 0xE9, 0xAC, 0xDF, 0x19, 0xCD,\r
+  0x78, 0xAC, 0x59, 0x74, 0xAC, 0x66, 0x34, 0x36, 0xC4, 0x1B, 0x3E, 0x6C, 0x38, 0x4C, 0x33, 0x0E,\r
+  0x30, 0x12, 0x0D, 0xA3, 0x26, 0xFE, 0x51, 0x53, 0x00, 0xFF, 0xAF, 0x5A, 0x4E, 0x84, 0x0D, 0x0F,\r
+  0x1F, 0xE4, 0x6D, 0x05, 0x2E, 0x4E, 0x85, 0x4B, 0x8D, 0x6C, 0x33, 0x6F, 0x54, 0xD2, 0x64, 0xAB,\r
+  0xBF, 0x50, 0xAF, 0x7D, 0x7A, 0x39, 0xA0, 0x37, 0xED, 0x63, 0x03, 0x0F, 0xFC, 0x13, 0x06, 0xCE,\r
+  0x16, 0x36, 0xD4, 0x54, 0x3B, 0x95, 0x1B, 0x51, 0x62, 0x3A, 0xE5, 0x4D, 0x17, 0xD4, 0x05, 0x39,\r
+  0x92, 0x9A, 0x27, 0xA8, 0x5B, 0xAA, 0xBD, 0xEC, 0xBB, 0xBE, 0xE3, 0x20, 0x89, 0x60, 0x71, 0x6C,\r
+  0x56, 0xB3, 0xA5, 0x13, 0xD0, 0x6D, 0x0E, 0x23, 0x7E, 0x95, 0x03, 0xED, 0x68, 0x3D, 0xF2, 0xD8,\r
+  0x63, 0xB8, 0x6B, 0x4D, 0xB6, 0xE8, 0x30, 0xB5, 0xE1, 0xCA, 0x94, 0x4B, 0xF7, 0xA2, 0xAA, 0x5D,\r
+  0x99, 0x30, 0xB2, 0x3D, 0xA7, 0xC2, 0x51, 0x6C, 0x28, 0x20, 0x01, 0x24, 0x27, 0x2B, 0x4B, 0x00,\r
+  0xB7, 0x9D, 0x11, 0x6B, 0x70, 0xBE, 0xB2, 0x10, 0x82, 0xBC, 0x0C, 0x9B, 0x68, 0xD0, 0x8D, 0x3B,\r
+  0x24, 0x87, 0xAA, 0x99, 0x28, 0x72, 0x9D, 0x33, 0x5F, 0x59, 0x90, 0xBD, 0xF5, 0xDE, 0x93, 0x9E,\r
+  0x3A, 0x62, 0x5A, 0x34, 0x39, 0xE2, 0x88, 0x55, 0x1D, 0xB9, 0x06, 0xB0, 0xC1, 0x89, 0x6B, 0x2D,\r
+  0xD7, 0x69, 0xC3, 0x19, 0x12, 0x36, 0x84, 0xD0, 0xC9, 0xA0, 0xDA, 0xFF, 0x2F, 0x69, 0x78, 0xB2,\r
+  0xE5, 0x7A, 0xDA, 0xEB, 0xD7, 0x0C, 0xC0, 0xF7, 0xBD, 0x63, 0x17, 0xB8, 0x39, 0x13, 0x38, 0xA2,\r
+  0x36, 0x5B, 0x7B, 0xF2, 0x85, 0x56, 0x6A, 0x1D, 0x64, 0x62, 0xC1, 0x38, 0xE2, 0xAA, 0xBF, 0x51,\r
+  0x66, 0xA2, 0x94, 0xF5, 0x12, 0x9C, 0x66, 0x22, 0x10, 0x6B, 0xF2, 0xB7, 0x30, 0x92, 0x2D, 0xF2,\r
+  0x29, 0xF0, 0x3D, 0x3B, 0x14, 0x43, 0x68, 0xA2, 0xF1, 0x9C, 0x29, 0x37, 0xCB, 0xCE, 0x38, 0x20,\r
+  0x25, 0x6D, 0x7C, 0x67, 0xF3, 0x7E, 0x24, 0x12, 0x24, 0x03, 0x08, 0x81, 0x47, 0xEC, 0xA5, 0x9E,\r
+  0x97, 0xF5, 0x18, 0xD7, 0xCF, 0xBB, 0xD5, 0xEF, 0x76, 0x96, 0xEF, 0xFD, 0xCE, 0xDB, 0x56, 0x9D,\r
+  0x95, 0xA0, 0x42, 0xF9, 0x97, 0x58, 0xE1, 0xD7, 0x31, 0x22, 0xD3, 0x5F, 0x59, 0xE6, 0x3E, 0x6E,\r
+  0x22, 0x00, 0xEA, 0x43, 0x84, 0xB6, 0x25, 0xDB, 0xD9, 0xF3, 0x08, 0x56, 0x68, 0xC0, 0x64, 0x6B,\r
+  0x1D, 0x7C, 0xEC, 0xB6, 0x93, 0xA2, 0x62, 0x57, 0x6E, 0x2E, 0xD8, 0xE7, 0x58, 0x8F, 0xC4, 0x31,\r
+  0x49, 0x26, 0xDD, 0xDE, 0x29, 0x35, 0x87, 0xF5, 0x30, 0x71, 0x70, 0x5B, 0x14, 0x3C, 0x69, 0xBD,\r
+  0x89, 0x12, 0x7D, 0xEB, 0x2E, 0xA3, 0xFE, 0xD8, 0x7F, 0x9E, 0x82, 0x5A, 0x52, 0x0A, 0x2B, 0xC1,\r
+  0x43, 0x2B, 0xD9, 0x30, 0x88, 0x9F, 0xC8, 0x10, 0xFB, 0x89, 0x8D, 0xE6, 0xA1, 0x85, 0x75, 0x33,\r
+  0x7E, 0x6C, 0x9E, 0xDB, 0x73, 0x13, 0x64, 0x62, 0x69, 0xA5, 0x2F, 0x7D, 0xCA, 0x96, 0x6D, 0x9F,\r
+  0xF8, 0x04, 0x4D, 0x30, 0x92, 0x3D, 0x6E, 0x21, 0x14, 0x21, 0xC9, 0x3D, 0xE0, 0xC3, 0xFD, 0x8A,\r
+  0x6B, 0x9D, 0x4A, 0xFD, 0xD1, 0xA1, 0x9D, 0x99, 0x43, 0x77, 0x3F, 0xB0, 0xDA\r
+};\r
+\r
+\r
+/**\r
+  Validate MSFT Authenticode using PKCS#7 Verification Interfaces.\r
+\r
+  @return  EFI_SUCCESS  Validation succeeds. \r
+\r
+**/\r
+BOOLEAN\r
+AuthenticodeVerify (\r
+  VOID\r
+  )\r
+{\r
+  UINT8    *SpcIndirectDataContent;\r
+  UINTN    Size;\r
+  BOOLEAN  Status;\r
+\r
+  //\r
+  // Construct SpcIndirectDataContent with the SHA-1 digest calculated from PE/COFF image\r
+  //\r
+  Size = sizeof (SpcIndirectDataContentwithSha1);\r
+  SpcIndirectDataContent = (UINT8 *)AllocatePool (Size);\r
+  CopyMem (SpcIndirectDataContent, SpcIndirectDataContentwithSha1, Size);\r
+  CopyMem (SpcIndirectDataContent + Size - SHA1_DIGEST_SIZE, PeHash, SHA1_DIGEST_SIZE);\r
+\r
+  //\r
+  // Verify Authenticode struct. SpcIndirectDataContent will be regarded as opaque data for\r
+  // PKCS#7 signed data verification.\r
+  //\r
+  Status = Pkcs7Verify (\r
+             Authenticode,\r
+             sizeof (Authenticode),\r
+             MsftRootCert,\r
+             sizeof (MsftRootCert),\r
+             SpcIndirectDataContent,\r
+             Size\r
+             );\r
+  FreePool (SpcIndirectDataContent);\r
+\r
+  return Status;\r
+}\r
diff --git a/CryptoPkg/Application/Cryptest/Cryptest.c b/CryptoPkg/Application/Cryptest/Cryptest.c
new file mode 100644 (file)
index 0000000..6afe299
--- /dev/null
@@ -0,0 +1,372 @@
+/** @file  \r
+  Application for Cryptographic Primitives Validation.\r
+\r
+Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <Uefi.h>\r
+#include <Library/BaseLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/MemoryAllocationLib.h>\r
+#include <Library/UefiLib.h>\r
+#include <Library/UefiApplicationEntryPoint.h>\r
+#include <Library/DebugLib.h>\r
+\r
+#include <Library/BaseCryptLib.h>\r
+\r
+//\r
+// Max Known Digest Size is SHA512 Output (64 bytes) by far\r
+//\r
+#define MAX_DIGEST_SIZE    64\r
+\r
+//\r
+// Message string for digest validation\r
+//\r
+GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 *HashData = "abc";\r
+\r
+//\r
+// Result for MD5("abc"). (From "A.5 Test suite" of IETF RFC1321)\r
+//\r
+GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Md5Digest[MD5_DIGEST_SIZE] = {\r
+  0x90, 0x01, 0x50, 0x98, 0x3c, 0xd2, 0x4f, 0xb0, 0xd6, 0x96, 0x3f, 0x7d, 0x28, 0xe1, 0x7f, 0x72\r
+  };\r
+\r
+//\r
+// Result for SHA-1("abc"). (From "A.1 SHA-1 Example" of NIST FIPS 180-2)\r
+//\r
+GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Sha1Digest[SHA1_DIGEST_SIZE] = {\r
+  0xa9, 0x99, 0x3e, 0x36, 0x47, 0x06, 0x81, 0x6a, 0xba, 0x3e, 0x25, 0x71, 0x78, 0x50, 0xc2, 0x6c,\r
+  0x9c, 0xd0, 0xd8, 0x9d\r
+  };\r
+\r
+//\r
+// Result for SHA-256("abc"). (From "B.1 SHA-256 Example" of NIST FIPS 180-2)\r
+//\r
+GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Sha256Digest[SHA256_DIGEST_SIZE] = {\r
+  0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea, 0x41, 0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23,\r
+  0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c, 0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad\r
+  };\r
+\r
+//\r
+// RSA PKCS#1 Validation Data from OpenSSL "Fips_rsa_selftest.c"\r
+//\r
+\r
+// Public Modulus of RSA Key\r
+GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 RsaN[] = {\r
+  0xBB, 0xF8, 0x2F, 0x09, 0x06, 0x82, 0xCE, 0x9C, 0x23, 0x38, 0xAC, 0x2B, 0x9D, 0xA8, 0x71, 0xF7, \r
+  0x36, 0x8D, 0x07, 0xEE, 0xD4, 0x10, 0x43, 0xA4, 0x40, 0xD6, 0xB6, 0xF0, 0x74, 0x54, 0xF5, 0x1F,\r
+  0xB8, 0xDF, 0xBA, 0xAF, 0x03, 0x5C, 0x02, 0xAB, 0x61, 0xEA, 0x48, 0xCE, 0xEB, 0x6F, 0xCD, 0x48,\r
+  0x76, 0xED, 0x52, 0x0D, 0x60, 0xE1, 0xEC, 0x46, 0x19, 0x71, 0x9D, 0x8A, 0x5B, 0x8B, 0x80, 0x7F,\r
+  0xAF, 0xB8, 0xE0, 0xA3, 0xDF, 0xC7, 0x37, 0x72, 0x3E, 0xE6, 0xB4, 0xB7, 0xD9, 0x3A, 0x25, 0x84,\r
+  0xEE, 0x6A, 0x64, 0x9D, 0x06, 0x09, 0x53, 0x74, 0x88, 0x34, 0xB2, 0x45, 0x45, 0x98, 0x39, 0x4E,\r
+  0xE0, 0xAA, 0xB1, 0x2D, 0x7B, 0x61, 0xA5, 0x1F, 0x52, 0x7A, 0x9A, 0x41, 0xF6, 0xC1, 0x68, 0x7F,\r
+  0xE2, 0x53, 0x72, 0x98, 0xCA, 0x2A, 0x8F, 0x59, 0x46, 0xF8, 0xE5, 0xFD, 0x09, 0x1D, 0xBD, 0xCB\r
+  };\r
+\r
+// Public Exponent of RSA Key\r
+GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 RsaE[] = { 0x11 };\r
+\r
+// Known Answer Test (KAT) Data for RSA PKCS#1 Signing\r
+GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 RsaSignData[] = "OpenSSL FIPS 140-2 Public Key RSA KAT";\r
+\r
+// Known Signature for the above message, under SHA-1 Digest\r
+GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 RsaPkcs1Signature[] = {\r
+  0x71, 0xEE, 0x1A, 0xC0, 0xFE, 0x01, 0x93, 0x54, 0x79, 0x5C, 0xF2, 0x4C, 0x4A, 0xFD, 0x1A, 0x05,\r
+  0x8F, 0x64, 0xB1, 0x6D, 0x61, 0x33, 0x8D, 0x9B, 0xE7, 0xFD, 0x60, 0xA3, 0x83, 0xB5, 0xA3, 0x51,\r
+  0x55, 0x77, 0x90, 0xCF, 0xDC, 0x22, 0x37, 0x8E, 0xD0, 0xE1, 0xAE, 0x09, 0xE3, 0x3D, 0x1E, 0xF8,\r
+  0x80, 0xD1, 0x8B, 0xC2, 0xEC, 0x0A, 0xD7, 0x6B, 0x88, 0x8B, 0x8B, 0xA1, 0x20, 0x22, 0xBE, 0x59,\r
+  0x5B, 0xE0, 0x23, 0x24, 0xA1, 0x49, 0x30, 0xBA, 0xA9, 0x9E, 0xE8, 0xB1, 0x8A, 0x62, 0x16, 0xBF,\r
+  0x4E, 0xCA, 0x2E, 0x4E, 0xBC, 0x29, 0xA8, 0x67, 0x13, 0xB7, 0x9F, 0x1D, 0x04, 0x44, 0xE5, 0x5F,\r
+  0x35, 0x07, 0x11, 0xBC, 0xED, 0x19, 0x37, 0x21, 0xCF, 0x23, 0x48, 0x1F, 0x72, 0x05, 0xDE, 0xE6,\r
+  0xE8, 0x7F, 0x33, 0x8A, 0x76, 0x4B, 0x2F, 0x95, 0xDF, 0xF1, 0x5F, 0x84, 0x80, 0xD9, 0x46, 0xB4\r
+  };\r
+\r
+/**\r
+  Validate MSFT Authenticode using PKCS#7 Verification Interfaces.\r
+\r
+  @return  EFI_SUCCESS  Validation succeeds. \r
+\r
+**/\r
+BOOLEAN\r
+AuthenticodeVerify (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  Validate UEFI-OpenSSL Digest Interfaces.\r
+\r
+  @return  EFI_SUCCESS  Validation succeeded.\r
+\r
+**/\r
+EFI_STATUS\r
+ValidateCryptDigest (\r
+  VOID\r
+  )\r
+{\r
+  UINTN    CtxSize;\r
+  VOID     *HashCtx;\r
+  UINTN    DataSize;\r
+  UINT8    Digest[MAX_DIGEST_SIZE];\r
+  UINTN    Index;\r
+  BOOLEAN  Status;\r
+\r
+  Print (L" UEFI-OpenSSL Hash Engine Testing (Hashing(\"abc\")): ");\r
+  DataSize = AsciiStrLen (HashData);\r
+\r
+  //\r
+  // MD5 Digest Validation\r
+  //\r
+  ZeroMem (Digest, MAX_DIGEST_SIZE);\r
+  CtxSize = Md5GetContextSize ();\r
+  HashCtx = AllocatePool (CtxSize);\r
+  Status  = Md5Init (HashCtx);\r
+  Status  = Md5Update (HashCtx, HashData, DataSize);\r
+  Status  = Md5Final (HashCtx, Digest);\r
+  FreePool (HashCtx);\r
+  Print (L"\n   - MD5 Digest: \n     = 0x");\r
+  for (Index = 0; Index < MD5_DIGEST_SIZE; Index++) {\r
+    Print (L"%02x", Digest[Index]);\r
+  }\r
+  if (CompareMem (Digest, Md5Digest, MD5_DIGEST_SIZE) == 0) {\r
+    Print (L" [Pass]");\r
+  } else {\r
+    Print (L" [Failed]");\r
+  }\r
+\r
+  //\r
+  // SHA-1 Digest Validation\r
+  //\r
+  ZeroMem (Digest, MAX_DIGEST_SIZE);\r
+  CtxSize = Sha1GetContextSize ();\r
+  HashCtx = AllocatePool (CtxSize);\r
+  Status  = Sha1Init (HashCtx);\r
+  Status  = Sha1Update (HashCtx, HashData, DataSize);\r
+  Status  = Sha1Final (HashCtx, Digest);\r
+  FreePool (HashCtx);\r
+  Print (L"\n   - SHA-1 Digest: \n     = 0x");\r
+  for (Index = 0; Index < SHA1_DIGEST_SIZE; Index++) {\r
+    Print (L"%02x", Digest[Index]);\r
+  }\r
+  if (CompareMem (Digest, Sha1Digest, SHA1_DIGEST_SIZE) == 0) {\r
+    Print (L" [Pass]");\r
+  } else {\r
+    Print (L" [Failed]");\r
+  }\r
+\r
+  //\r
+  // SHA256 Digest Validation\r
+  //\r
+  ZeroMem (Digest, MAX_DIGEST_SIZE);\r
+  CtxSize = Sha256GetContextSize ();\r
+  HashCtx = AllocatePool (CtxSize);\r
+  Status  = Sha256Init (HashCtx);\r
+  Status  = Sha256Update (HashCtx, HashData, DataSize);\r
+  Status  = Sha256Final (HashCtx, Digest);\r
+  FreePool (HashCtx);\r
+  Print (L"\n   - SHA-256 Digest: \n     = 0x");\r
+  for (Index = 0; Index < SHA256_DIGEST_SIZE; Index++) {\r
+    Print (L"%02x", Digest[Index]);\r
+  }\r
+  if (CompareMem (Digest, Sha256Digest, SHA256_DIGEST_SIZE) == 0) {\r
+    Print (L" [Pass]");\r
+  } else {\r
+    Print (L" [Failed]");\r
+  }  \r
+\r
+  Print (L"\n");\r
+  \r
+  return EFI_SUCCESS;\r
+}\r
+\r
+\r
+/**\r
+  Validate UEFI-OpenSSL Message Authentication Codes Interfaces.\r
+\r
+  @return  EFI_SUCCESS  Validation succeeded. \r
+\r
+**/\r
+EFI_STATUS\r
+ValidateCryptHmac (\r
+  VOID\r
+  )\r
+{\r
+  Print (L"\n UEFI-OpenSSL HMAC Engine Testing: ");\r
+  Print (L"\n   ==> No HMAC Support in Base Crypto Library!\n");\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+\r
+/**\r
+  Validate UEFI-OpenSSL Block Ciphers (Symmetric Crypto) Interfaces.\r
+\r
+  @return  EFI_SUCCESS  Validation succeeded.\r
+\r
+**/\r
+EFI_STATUS\r
+ValidateCryptBlockCipher (\r
+  VOID\r
+  )\r
+{\r
+  Print (L"\n UEFI-OpenSSL Block Cipher Engine Testing: ");\r
+  Print (L"\n   ==> No Block Cipher Support in Base Crypto Library!\n");\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+\r
+/**\r
+  Validate UEFI-OpenSSL RSA Interfaces.\r
+\r
+  @return  EFI_SUCCESS  Validation succeeded.\r
+\r
+**/\r
+EFI_STATUS\r
+ValidateCryptRsa (\r
+  VOID\r
+  )\r
+{\r
+  VOID     *Rsa;\r
+  UINT8    mHash[SHA1_DIGEST_SIZE];\r
+  UINTN    HashSize;\r
+  UINTN    CtxSize;\r
+  VOID     *Sha1Ctx;\r
+  UINT8    *Signature;\r
+  UINTN    SigSize;\r
+  BOOLEAN  Status;\r
+\r
+  Print (L"\n UEFI-OpenSSL RSA Engine Testing: ");\r
+\r
+  //\r
+  // Generate & Initialize RSA Context\r
+  //\r
+  Rsa = RsaNew ();\r
+  Print (L"\n   - Generate RSA Context .............. ");\r
+  if (Rsa != NULL) {\r
+    Print (L"[Pass]");\r
+  } else {\r
+    Print (L"[Failed]");\r
+  }\r
+\r
+  //\r
+  // Set RSA Key Components\r
+  // NOTE: Only N and E are needed to be set as RSA public key for signature verification\r
+  //\r
+  Print (L"\n   - Set RSA Key Components ............ ");\r
+  Status = RsaSetKey (Rsa, RsaKeyN, RsaN, sizeof (RsaN));\r
+  Status = RsaSetKey (Rsa, RsaKeyE, RsaE, sizeof (RsaE));\r
+  if (Status) {\r
+    Print (L"[Pass]");\r
+  } else {\r
+    Print (L"[Failed]");\r
+  }\r
+\r
+  //\r
+  // SHA-1 Digest Message for PKCS#1 Signature \r
+  //\r
+  Print (L"\n   - Hash Original Message ............. ");\r
+  HashSize = SHA1_DIGEST_SIZE;\r
+  ZeroMem (mHash, HashSize);\r
+  CtxSize = Sha1GetContextSize ();\r
+  Sha1Ctx = AllocatePool (CtxSize);\r
+  Status  = Sha1Init (Sha1Ctx);\r
+  Status  = Sha1Update (Sha1Ctx, RsaSignData, AsciiStrLen (RsaSignData));\r
+  Status  = Sha1Final (Sha1Ctx, mHash);\r
+  FreePool (Sha1Ctx);\r
+  if (Status) {\r
+    Print (L"[Pass]");\r
+  } else {\r
+    Print (L"[Failed]");\r
+  }\r
+\r
+  //\r
+  // Verify RSA PKCS#1-encoded Signature\r
+  //\r
+  Print (L"\n   - PKCS#1 Signature Verification ..... ");\r
+  SigSize   = sizeof (RsaPkcs1Signature);\r
+  Signature = (UINT8 *)AllocatePool (SigSize);\r
+  CopyMem (Signature, RsaPkcs1Signature, SigSize);\r
+  Status = RsaPkcs1Verify (Rsa, mHash, HashSize, Signature, SigSize);\r
+  if (Status) {\r
+    Print (L"[Pass]");\r
+  } else {\r
+    Print (L"[Failed]");\r
+  }   \r
+\r
+  //\r
+  // Release Resources\r
+  //\r
+  RsaFree (Rsa);\r
+  Print (L"\n   - Release RSA Context ............... [Pass]");\r
+\r
+  Print (L"\n");\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Validate UEFI-OpenSSL PKCS#7 Verification Interfaces.\r
+\r
+  @return  EFI_SUCCESS  Validation succeeded.\r
+\r
+**/\r
+EFI_STATUS\r
+ValidateAuthenticode (\r
+  VOID\r
+  )\r
+{\r
+  Print (L"\n UEFI-OpenSSL PKCS#7-Signed-Data Testing: ");\r
+\r
+  Print (L"\n   - Authenticode (PKCS#7 Signed Data) Verification ... ");\r
+\r
+  if (AuthenticodeVerify ()) {\r
+    Print (L"[Pass]");\r
+  } else {\r
+    Print (L"[Failed]");\r
+  }   \r
+\r
+  Print (L"\n");\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+\r
+/**\r
+  Entry Point of Cryptographic Validation Utility.\r
+\r
+  @param  ImageHandle  The image handle of the UEFI Application.\r
+  @param  SystemTable  A pointer to the EFI System Table.\r
+\r
+  @retval EFI_SUCCESS       The entry point is executed successfully.\r
+  @retval other             Some error occurs when executing this entry point.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+CryptestMain (\r
+  IN     EFI_HANDLE                 ImageHandle,\r
+  IN     EFI_SYSTEM_TABLE           *SystemTable\r
+  )\r
+{\r
+  EFI_STATUS  Status;\r
+\r
+  Print (L"\nUEFI-OpenSSL Wrapper Cryptosystem Testing: \n");\r
+  Print (L"-------------------------------------------- \n");\r
+\r
+  Status = EFI_SUCCESS;\r
+  Status = ValidateCryptDigest ();\r
+  Status = ValidateCryptHmac ();\r
+  Status = ValidateCryptBlockCipher ();\r
+  Status = ValidateCryptRsa ();\r
+  Status = ValidateAuthenticode ();\r
+\r
+  return Status;\r
+}\r
diff --git a/CryptoPkg/Application/Cryptest/Cryptest.inf b/CryptoPkg/Application/Cryptest/Cryptest.inf
new file mode 100644 (file)
index 0000000..8517294
--- /dev/null
@@ -0,0 +1,47 @@
+## @file\r
+#  UEFI Application for the Validation of cryptography library \r
+#  (based on OpenSSL 0.9.8l).\r
+#  This is a shell application that will test the crypto library.\r
+#\r
+#  Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+#  This program and the accompanying materials\r
+#  are licensed and made available under the terms and conditions of the BSD License\r
+#  which accompanies this distribution.  The full text of the license may be found at\r
+#  http://opensource.org/licenses/bsd-license.php\r
+#  \r
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#  \r
+##\r
+\r
+[Defines]\r
+  INF_VERSION                    = 0x00010005\r
+  BASE_NAME                      = Cryptest\r
+  FILE_GUID                      = fb925ac7-192a-9567-8586-7c6f5f710607\r
+  MODULE_TYPE                    = UEFI_APPLICATION\r
+  VERSION_STRING                 = 1.0\r
+  ENTRY_POINT                    = CryptestMain\r
+\r
+#\r
+# The following information is for reference only and not required by the build tools.\r
+#\r
+#  VALID_ARCHITECTURES           = IA32 X64 IPF\r
+#\r
+\r
+[Sources]\r
+  Cryptest.c\r
+  AuthenticodeVerify.c\r
+\r
+[Packages]\r
+  MdePkg/MdePkg.dec\r
+  CryptoPkg/CryptoPkg.dec\r
+\r
+[LibraryClasses]\r
+  UefiApplicationEntryPoint\r
+  UefiLib\r
+  BaseLib\r
+  UefiBootServicesTableLib\r
+  BaseMemoryLib\r
+  DebugLib\r
+  MemoryAllocationLib\r
+  BaseCryptLib\r
diff --git a/CryptoPkg/CryptRuntimeDxe/CryptRuntime.c b/CryptoPkg/CryptRuntimeDxe/CryptRuntime.c
new file mode 100644 (file)
index 0000000..ff20da4
--- /dev/null
@@ -0,0 +1,248 @@
+/** @file\r
+  Runtime Cryptographic Driver Implementation, which produce one crypto\r
+  protocol.\r
+\r
+Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include "CryptRuntime.h"\r
+\r
+//\r
+// The handle onto which the Runtime Crypt Protocol instance is installed\r
+//\r
+EFI_HANDLE  mRuntimeCryptHandle = NULL;\r
+\r
+//\r
+// The Runtime Crypt Protocol instance produced by this driver\r
+//\r
+EFI_RUNTIME_CRYPT_PROTOCOL  mRuntimeCryptProtocol = {\r
+  RuntimeCryptSha256GetContextSize,\r
+  RuntimeCryptSha256Init,\r
+  RuntimeCryptSha256Update,\r
+  RuntimeCryptSha256Final,\r
+  RuntimeCryptRsaNew,\r
+  RuntimeCryptRsaFree,\r
+  RuntimeCryptRsaSetKey,\r
+  RuntimeCryptRsaPkcs1Verify\r
+};\r
+\r
+/**\r
+  Retrieves the size, in bytes, of the context buffer required for SHA-256 operations.\r
+\r
+  @return  The size, in bytes, of the context buffer required for SHA-256 operations.\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+RuntimeCryptSha256GetContextSize (\r
+  VOID\r
+  )\r
+{\r
+  return Sha256GetContextSize ();\r
+}\r
+\r
+/**\r
+  Initializes user-supplied memory pointed by Sha256Context as SHA-256 hash context for\r
+  subsequent use.\r
+\r
+  If Sha256Context is NULL, then ASSERT().\r
+\r
+  @param[in, out]  Sha256Context  Pointer to SHA-256 Context being initialized.\r
+\r
+  @retval TRUE   SHA-256 context initialization succeeded.\r
+  @retval FALSE  SHA-256 context initialization failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+RuntimeCryptSha256Init (\r
+  IN OUT  VOID  *Sha256Context\r
+  )\r
+{\r
+  return Sha256Init (Sha256Context);\r
+}\r
+\r
+/**\r
+  Performs SHA-256 digest on a data buffer of the specified length. This function can\r
+  be called multiple times to compute the digest of long or discontinuous data streams.\r
+\r
+  If Sha256Context is NULL, then ASSERT().\r
+\r
+  @param[in, out]  Sha256Context  Pointer to the SHA-256 context.\r
+  @param[in]       Data           Pointer to the buffer containing the data to be hashed.\r
+  @param[in]       DataLength     Length of Data buffer in bytes.\r
+\r
+  @retval TRUE   SHA-256 data digest succeeded.\r
+  @retval FALSE  Invalid SHA-256 context. After Sha256Final function has been called, the\r
+                 SHA-256 context cannot be reused.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+RuntimeCryptSha256Update (\r
+  IN OUT  VOID        *Sha256Context,\r
+  IN      CONST VOID  *Data,\r
+  IN      UINTN       DataLength\r
+  )\r
+{\r
+  return Sha256Update (Sha256Context, Data, DataLength);\r
+}\r
+\r
+/**\r
+  Completes SHA-256 hash computation and retrieves the digest value into the specified\r
+  memory. After this function has been called, the SHA-256 context cannot be used again.\r
+\r
+  If Sha256Context is NULL, then ASSERT().\r
+  If HashValue is NULL, then ASSERT().\r
+\r
+  @param[in, out]  Sha256Context  Pointer to SHA-256 context\r
+  @param[out]      HashValue      Pointer to a buffer that receives the SHA-256 digest\r
+                                  value (32 bytes).\r
+\r
+  @retval TRUE   SHA-256 digest computation succeeded.\r
+  @retval FALSE  SHA-256 digest computation failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+RuntimeCryptSha256Final (\r
+  IN OUT  VOID   *Sha256Context,\r
+  OUT     UINT8  *HashValue\r
+  )\r
+{\r
+  return Sha256Final (Sha256Context, HashValue);\r
+}\r
+\r
+/**\r
+  Allocates and Initializes one RSA Context for subsequent use.\r
+\r
+  @return  Pointer to the RSA Context that has been initialized.\r
+           If the allocations fails, RsaNew() returns NULL.\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+RuntimeCryptRsaNew (\r
+  VOID\r
+  )\r
+{\r
+  return RsaNew ();\r
+}\r
+\r
+/**\r
+  Release the specified RSA Context.\r
+\r
+  @param[in]  RsaContext  Pointer to the RSA context to be released.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+RuntimeCryptRsaFree (\r
+  IN  VOID  *RsaContext\r
+  )\r
+{\r
+  RsaFree (RsaContext);\r
+}\r
+\r
+/**\r
+  Sets the tag-designated RSA key component into the established RSA context from\r
+  the user-specified nonnegative integer (octet string format represented in RSA\r
+  PKCS#1).\r
+\r
+  If RsaContext is NULL, then ASSERT().\r
+\r
+  @param[in, out]  RsaContext  Pointer to RSA context being set.\r
+  @param[in]       KeyTag      Tag of RSA key component being set.\r
+  @param[in]       BigNumber   Pointer to octet integer buffer.\r
+  @param[in]       BnLength    Length of big number buffer in bytes.\r
+\r
+  @return  TRUE   RSA key component was set successfully.\r
+  @return  FALSE  Invalid RSA key component tag.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+RuntimeCryptRsaSetKey (\r
+  IN OUT VOID         *RsaContext,\r
+  IN     RSA_KEY_TAG  KeyTag,\r
+  IN     CONST UINT8  *BigNumber,\r
+  IN     UINTN        BnLength\r
+  )\r
+{\r
+  return RsaSetKey (RsaContext, KeyTag, BigNumber, BnLength);\r
+}\r
+\r
+/**\r
+  Verifies the RSA-SSA signature with EMSA-PKCS1-v1_5 encoding scheme defined in\r
+  RSA PKCS#1.\r
+\r
+  If RsaContext is NULL, then ASSERT().\r
+  If MessageHash is NULL, then ASSERT().\r
+  If Signature is NULL, then ASSERT().\r
+  If HashLength is not equal to the size of MD5, SHA-1 or SHA-256 digest, then ASSERT().\r
+\r
+  @param[in]  RsaContext   Pointer to RSA context for signature verification.\r
+  @param[in]  MessageHash  Pointer to octet message hash to be checked.\r
+  @param[in]  HashLength   Length of the message hash in bytes.\r
+  @param[in]  Signature    Pointer to RSA PKCS1-v1_5 signature to be verified.\r
+  @param[in]  SigLength    Length of signature in bytes.\r
+\r
+  @return  TRUE   Valid signature encoded in PKCS1-v1_5.\r
+  @return  FALSE  Invalid signature or invalid RSA context.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+RuntimeCryptRsaPkcs1Verify (\r
+  IN  VOID         *RsaContext,\r
+  IN  CONST UINT8  *MessageHash,\r
+  IN  UINTN        HashLength,\r
+  IN  UINT8        *Signature,\r
+  IN  UINTN        SigLength\r
+  )\r
+{\r
+  return RsaPkcs1Verify (RsaContext, MessageHash, HashLength, Signature, SigLength);\r
+}\r
+\r
+/**\r
+  Entry Point for Runtime Cryptographic Driver.\r
+\r
+  This function installs Runtime Crypt Protocol.\r
+\r
+  @param ImageHandle     Image handle of this driver.\r
+  @param SystemTable     a Pointer to the EFI System Table.\r
+\r
+  @retval  EFI_SUCEESS  Runtime Crypt Protocol is successfully installed\r
+  @return  Others       Some error occurs when installing Runtime Crypt Protocol.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+CryptRuntimeDriverInitialize (\r
+  IN EFI_HANDLE                            ImageHandle,\r
+  IN EFI_SYSTEM_TABLE                      *SystemTable\r
+  )\r
+{\r
+  EFI_STATUS  Status;\r
+\r
+  //\r
+  // Install the Runtime Crypt Protocol onto a new handle\r
+  //\r
+  Status = gBS->InstallMultipleProtocolInterfaces (\r
+                  &mRuntimeCryptHandle,\r
+                  &gEfiRuntimeCryptProtocolGuid,\r
+                  &mRuntimeCryptProtocol,\r
+                  NULL\r
+                  );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  return Status;\r
+}\r
diff --git a/CryptoPkg/CryptRuntimeDxe/CryptRuntime.h b/CryptoPkg/CryptRuntimeDxe/CryptRuntime.h
new file mode 100644 (file)
index 0000000..312d7b4
--- /dev/null
@@ -0,0 +1,186 @@
+/** @file\r
+  Header file of Runtime Cryptographic Driver.\r
+\r
+Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef _CRYPT_RUNTIME_H_\r
+#define _CRYPT_RUNTIME_H_\r
+\r
+#include <Uefi.h>\r
+\r
+#include <Protocol/RuntimeCrypt.h>\r
+\r
+#include <Library/DebugLib.h>\r
+#include <Library/UefiDriverEntryPoint.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+#include <Library/BaseCryptLib.h>\r
+\r
+/**\r
+  Retrieves the size, in bytes, of the context buffer required for SHA-256 operations.\r
+\r
+  @return  The size, in bytes, of the context buffer required for SHA-256 operations.\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+RuntimeCryptSha256GetContextSize (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Initializes user-supplied memory pointed by Sha256Context as SHA-256 hash context for\r
+  subsequent use.\r
+\r
+  If Sha256Context is NULL, then ASSERT().\r
+\r
+  @param[in, out]  Sha256Context  Pointer to SHA-256 Context being initialized.\r
+\r
+  @retval TRUE   SHA-256 context initialization succeeded.\r
+  @retval FALSE  SHA-256 context initialization failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+RuntimeCryptSha256Init (\r
+  IN OUT  VOID  *Sha256Context\r
+  );\r
+\r
+\r
+/**\r
+  Performs SHA-256 digest on a data buffer of the specified length. This function can\r
+  be called multiple times to compute the digest of long or discontinuous data streams.\r
+\r
+  If Sha256Context is NULL, then ASSERT().\r
+\r
+  @param[in, out]  Sha256Context  Pointer to the SHA-256 context.\r
+  @param[in]       Data           Pointer to the buffer containing the data to be hashed.\r
+  @param[in]       DataLength     Length of Data buffer in bytes.\r
+\r
+  @retval TRUE   SHA-256 data digest succeeded.\r
+  @retval FALSE  Invalid SHA-256 context. After Sha256Final function has been called, the\r
+                 SHA-256 context cannot be reused.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+RuntimeCryptSha256Update (\r
+  IN OUT  VOID        *Sha256Context,\r
+  IN      CONST VOID  *Data,\r
+  IN      UINTN       DataLength\r
+  );\r
+\r
+\r
+/**\r
+  Completes SHA-256 hash computation and retrieves the digest value into the specified\r
+  memory. After this function has been called, the SHA-256 context cannot be used again.\r
+\r
+  If Sha256Context is NULL, then ASSERT().\r
+  If HashValue is NULL, then ASSERT().\r
+\r
+  @param[in, out]  Sha256Context  Pointer to SHA-256 context\r
+  @param[out]      HashValue      Pointer to a buffer that receives the SHA-256 digest\r
+                                  value (32 bytes).\r
+\r
+  @retval TRUE   SHA-256 digest computation succeeded.\r
+  @retval FALSE  SHA-256 digest computation failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+RuntimeCryptSha256Final (\r
+  IN OUT  VOID   *Sha256Context,\r
+  OUT     UINT8  *HashValue\r
+  );\r
+\r
+/**\r
+  Allocates and Initializes one RSA Context for subsequent use.\r
+\r
+  @return  Pointer to the RSA Context that has been initialized.\r
+           If the allocations fails, RsaNew() returns NULL.\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+RuntimeCryptRsaNew (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Release the specified RSA Context.\r
+\r
+  @param[in]  RsaContext  Pointer to the RSA context to be released.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+RuntimeCryptRsaFree (\r
+  IN  VOID  *RsaContext\r
+  );\r
+\r
+/**\r
+  Sets the tag-designated RSA key component into the established RSA context from\r
+  the user-specified nonnegative integer (octet string format represented in RSA\r
+  PKCS#1).\r
+\r
+  If RsaContext is NULL, then ASSERT().\r
+\r
+  @param[in, out]  RsaContext  Pointer to RSA context being set.\r
+  @param[in]       KeyTag      Tag of RSA key component being set.\r
+  @param[in]       BigNumber   Pointer to octet integer buffer.\r
+  @param[in]       BnLength    Length of big number buffer in bytes.\r
+\r
+  @return  TRUE   RSA key component was set successfully.\r
+  @return  FALSE  Invalid RSA key component tag.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+RuntimeCryptRsaSetKey (\r
+  IN OUT VOID         *RsaContext,\r
+  IN     RSA_KEY_TAG  KeyTag,\r
+  IN     CONST UINT8  *BigNumber,\r
+  IN     UINTN        BnLength\r
+  );\r
+\r
+\r
+/**\r
+  Verifies the RSA-SSA signature with EMSA-PKCS1-v1_5 encoding scheme defined in\r
+  RSA PKCS#1.\r
+\r
+  If RsaContext is NULL, then ASSERT().\r
+  If MessageHash is NULL, then ASSERT().\r
+  If Signature is NULL, then ASSERT().\r
+  If HashLength is not equal to the size of MD5, SHA-1 or SHA-256 digest, then ASSERT().\r
+\r
+  @param[in]  RsaContext   Pointer to RSA context for signature verification.\r
+  @param[in]  MessageHash  Pointer to octet message hash to be checked.\r
+  @param[in]  HashLength   Length of the message hash in bytes.\r
+  @param[in]  Signature    Pointer to RSA PKCS1-v1_5 signature to be verified.\r
+  @param[in]  SigLength    Length of signature in bytes.\r
+\r
+  @return  TRUE   Valid signature encoded in PKCS1-v1_5.\r
+  @return  FALSE  Invalid signature or invalid RSA context.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+RuntimeCryptRsaPkcs1Verify (\r
+  IN  VOID         *RsaContext,\r
+  IN  CONST UINT8  *MessageHash,\r
+  IN  UINTN        HashLength,\r
+  IN  UINT8        *Signature,\r
+  IN  UINTN        SigLength\r
+  );\r
+\r
+#endif\r
diff --git a/CryptoPkg/CryptRuntimeDxe/CryptRuntimeDxe.inf b/CryptoPkg/CryptRuntimeDxe/CryptRuntimeDxe.inf
new file mode 100644 (file)
index 0000000..7625c40
--- /dev/null
@@ -0,0 +1,49 @@
+## @file\r
+#  Component description file for Cryptographic Runtime Driver.\r
+#\r
+#  Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+#  This program and the accompanying materials\r
+#  are licensed and made available under the terms and conditions of the BSD License\r
+#  which accompanies this distribution.  The full text of the license may be found at\r
+#  http://opensource.org/licenses/bsd-license.php\r
+#  \r
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#  \r
+##\r
+\r
+[Defines]\r
+  INF_VERSION                    = 0x00010005\r
+  BASE_NAME                      = CryptRuntimeDxe\r
+  FILE_GUID                      = 858031F3-96A2-406E-ABCC-ED264A3A31D6\r
+  MODULE_TYPE                    = DXE_RUNTIME_DRIVER\r
+  VERSION_STRING                 = 1.0\r
+\r
+  ENTRY_POINT                    = CryptRuntimeDriverInitialize\r
+\r
+#\r
+# The following information is for reference only and not required by the build tools.\r
+#\r
+#  VALID_ARCHITECTURES           = IA32 X64 IPF\r
+#\r
+\r
+[Sources]\r
+  CryptRuntime.h\r
+  CryptRuntime.c\r
+\r
+[Packages]\r
+  MdePkg/MdePkg.dec\r
+  CryptoPkg/CryptoPkg.dec\r
+\r
+[LibraryClasses]\r
+  UefiDriverEntryPoint\r
+  UefiBootServicesTableLib\r
+  DebugLib\r
+  UefiRuntimeLib\r
+  BaseCryptLib\r
+\r
+[Protocols]\r
+  gEfiRuntimeCryptProtocolGuid            ## PRODUCES\r
+\r
+[Depex]\r
+  TRUE\r
diff --git a/CryptoPkg/CryptoPkg.dec b/CryptoPkg/CryptoPkg.dec
new file mode 100644 (file)
index 0000000..d1adfd8
--- /dev/null
@@ -0,0 +1,39 @@
+## @file\r
+#  Package for cryptography modules.\r
+#\r
+#  This Package provides cryptographic-related libraries for UEFI\r
+#  security modules.\r
+#\r
+#  Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+#  This program and the accompanying materials\r
+#  are licensed and made available under the terms and conditions of the BSD License\r
+#  which accompanies this distribution.  The full text of the license may be found at\r
+#  http://opensource.org/licenses/bsd-license.php\r
+#  \r
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#  \r
+##\r
+\r
+################################################################################\r
+#\r
+# Defines Section - statements that will be processed to create a Makefile.\r
+#\r
+################################################################################\r
+[Defines]\r
+  DEC_SPECIFICATION              = 0x00010005\r
+  PACKAGE_NAME                   = CryptoPkg\r
+  PACKAGE_GUID                   = 36470E80-36F2-4ba0-8CC8-937C7D9FF888\r
+  PACKAGE_VERSION                = 0.91\r
+\r
+[Includes]\r
+  Include\r
+\r
+[LibraryClasses]\r
+  ##  @libraryclass  Provides basic library functions for cryptographic primitives.\r
+  ##\r
+  BaseCryptLib|Include/Library/BaseCryptLib.h\r
+\r
+[Protocols]\r
+  ## Include/Protocol/RuntimeCrypt.h\r
+  gEfiRuntimeCryptProtocolGuid = { 0xe1475e0c, 0x1746, 0x4802, {0x86, 0x2e, 0x1, 0x1c, 0x2c, 0x2d, 0x9d, 0x86 }}\r
diff --git a/CryptoPkg/CryptoPkg.dsc b/CryptoPkg/CryptoPkg.dsc
new file mode 100644 (file)
index 0000000..c5a7d4a
--- /dev/null
@@ -0,0 +1,123 @@
+## @file\r
+#  Cryptographic Library Package for UEFI Security Implementation.\r
+#\r
+#  Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+#  This program and the accompanying materials\r
+#  are licensed and made available under the terms and conditions of the BSD License\r
+#  which accompanies this distribution.  The full text of the license may be found at\r
+#  http://opensource.org/licenses/bsd-license.php\r
+#  \r
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#  \r
+##\r
+\r
+################################################################################\r
+#\r
+# Defines Section - statements that will be processed to create a Makefile.\r
+#\r
+################################################################################\r
+[Defines]\r
+  PLATFORM_NAME                  = CryptoPkg\r
+  PLATFORM_GUID                  = E1063286-6C8C-4c25-AEF0-67A9A5B6E6B6\r
+  PLATFORM_VERSION               = 0.91\r
+  DSC_SPECIFICATION              = 0x00010005\r
+  OUTPUT_DIRECTORY               = Build/CryptoPkg\r
+  SUPPORTED_ARCHITECTURES        = IA32|X64|IPF|EBC\r
+  BUILD_TARGETS                  = DEBUG|RELEASE\r
+  SKUID_IDENTIFIER               = DEFAULT\r
+\r
+################################################################################\r
+#\r
+# Library Class section - list of all Library Classes needed by this Platform.\r
+#\r
+################################################################################\r
+[LibraryClasses]\r
+  BaseLib|MdePkg/Library/BaseLib/BaseLib.inf\r
+  BaseMemoryLib|MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf\r
+  MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf\r
+  PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf\r
+  DebugLib|MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull.inf\r
+  PrintLib|MdePkg/Library/BasePrintLib/BasePrintLib.inf\r
+  UefiLib|MdePkg/Library/UefiLib/UefiLib.inf\r
+  DevicePathLib|MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf\r
+  UefiBootServicesTableLib|MdePkg/Library/UefiBootServicesTableLib/UefiBootServicesTableLib.inf\r
+  UefiRuntimeServicesTableLib|MdePkg/Library/UefiRuntimeServicesTableLib/UefiRuntimeServicesTableLib.inf\r
+  UefiRuntimeLib|MdePkg/Library/UefiRuntimeLib/UefiRuntimeLib.inf\r
+  UefiDriverEntryPoint|MdePkg/Library/UefiDriverEntryPoint/UefiDriverEntryPoint.inf\r
+  UefiApplicationEntryPoint|MdePkg/Library/UefiApplicationEntryPoint/UefiApplicationEntryPoint.inf\r
+\r
+  IntrinsicLib|CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf\r
+  OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLib.inf\r
+\r
+[LibraryClasses.common.PEIM]\r
+  BaseCryptLib|CryptoPkg/Library/BaseCryptLib/PeiCryptLib.inf\r
+\r
+[LibraryClasses.common.DXE_DRIVER]\r
+  BaseCryptLib|CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf\r
+\r
+[LibraryClasses.common.DXE_RUNTIME_DRIVER]\r
+  BaseCryptLib|CryptoPkg/Library/BaseCryptLib/RuntimeCryptLib.inf\r
+\r
+[LibraryClasses.common.DXE_SAL_DRIVER]\r
+  BaseCryptLib|CryptoPkg/Library/BaseCryptLibRuntimeCryptProtocol/BaseCryptLibRuntimeCryptProtocol.inf\r
+\r
+[LibraryClasses.common.UEFI_DRIVER]\r
+  BaseCryptLib|CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf\r
+\r
+[LibraryClasses.common.UEFI_APPLICATION]\r
+  BaseCryptLib|CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf\r
+\r
+################################################################################\r
+#\r
+# Pcd Section - list of all EDK II PCD Entries defined by this Platform\r
+#\r
+################################################################################\r
+[PcdsFeatureFlag]\r
+  gEfiMdePkgTokenSpaceGuid.PcdComponentNameDisable|FALSE\r
+  gEfiMdePkgTokenSpaceGuid.PcdDriverDiagnosticsDisable|FALSE\r
+  gEfiMdePkgTokenSpaceGuid.PcdComponentName2Disable|TRUE\r
+  gEfiMdePkgTokenSpaceGuid.PcdDriverDiagnostics2Disable|TRUE\r
+\r
+[PcdsFixedAtBuild]\r
+  gEfiMdePkgTokenSpaceGuid.PcdMaximumUnicodeStringLength|1000000\r
+  gEfiMdePkgTokenSpaceGuid.PcdMaximumAsciiStringLength|1000000\r
+  gEfiMdePkgTokenSpaceGuid.PcdMaximumLinkedListLength|1000000\r
+\r
+  gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x0f\r
+  gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000000\r
+  gEfiMdePkgTokenSpaceGuid.PcdReportStatusCodePropertyMask|0x06\r
+  gEfiMdePkgTokenSpaceGuid.PcdDebugClearMemoryValue|0xAF\r
+  gEfiMdePkgTokenSpaceGuid.PcdPerformanceLibraryPropertyMask|0\r
+  gEfiMdePkgTokenSpaceGuid.PcdPostCodePropertyMask|0\r
+  gEfiMdePkgTokenSpaceGuid.PcdUefiLibMaxPrintBufferSize|320\r
+\r
+###################################################################################################\r
+#\r
+# Components Section - list of the modules and components that will be processed by compilation\r
+#                      tools and the EDK II tools to generate PE32/PE32+/Coff image files.\r
+#\r
+# Note: The EDK II DSC file is not used to specify how compiled binary images get placed\r
+#       into firmware volume images. This section is just a list of modules to compile from\r
+#       source into UEFI-compliant binaries.\r
+#       It is the FDF file that contains information on combining binary files into firmware\r
+#       volume images, whose concept is beyond UEFI and is described in PI specification.\r
+#       Binary modules do not need to be listed in this section, as they should be\r
+#       specified in the FDF file. For example: Shell binary (Shell_Full.efi), FAT binary (Fat.efi),\r
+#       Logo (Logo.bmp), and etc.\r
+#       There may also be modules listed in this section that are not required in the FDF file,\r
+#       When a module listed here is excluded from FDF file, then UEFI-compliant binary will be\r
+#       generated for it, but the binary will not be put into any firmware volume.\r
+#\r
+###################################################################################################\r
+[Components]\r
+  CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf\r
+  CryptoPkg/Library/BaseCryptLib/PeiCryptLib.inf\r
+  CryptoPkg/Library/BaseCryptLib/RuntimeCryptLib.inf\r
+\r
+  CryptoPkg/Application/Cryptest/Cryptest.inf\r
+\r
+  CryptoPkg/CryptRuntimeDxe/CryptRuntimeDxe.inf\r
+\r
+[Components.IPF]\r
+  CryptoPkg/Library/BaseCryptLibRuntimeCryptProtocol/BaseCryptLibRuntimeCryptProtocol.inf\r
diff --git a/CryptoPkg/Include/Library/BaseCryptLib.h b/CryptoPkg/Include/Library/BaseCryptLib.h
new file mode 100644 (file)
index 0000000..556026e
--- /dev/null
@@ -0,0 +1,425 @@
+/** @file\r
+  Defines base cryptographic library APIs.\r
+  The Base Cryptographic Library provides implementations of basic cryptography\r
+  primitives (MD5, SHA-1, SHA-256, RSA, etc) for UEFI security functionality enabling.\r
+\r
+Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef __BASE_CRYPT_LIB_H__\r
+#define __BASE_CRYPT_LIB_H__\r
+\r
+///\r
+/// MD5 digest size in bytes\r
+///\r
+#define MD5_DIGEST_SIZE     16\r
+\r
+///\r
+/// SHA-1 digest size in bytes.\r
+///\r
+#define SHA1_DIGEST_SIZE    20\r
+\r
+///\r
+/// SHA-256 digest size in bytes\r
+///\r
+#define SHA256_DIGEST_SIZE  32\r
+\r
+///\r
+/// RSA Key Tags Definition used in RsaSetKey() function for key component identification.\r
+///\r
+typedef enum {\r
+  RsaKeyN,      ///< RSA public Modulus (N)\r
+  RsaKeyE,      ///< RSA Public exponent (e)\r
+  RsaKeyD,      ///< RSA Private exponent (d)\r
+  RsaKeyP,      ///< RSA secret prime factor of Modulus (p)\r
+  RsaKeyQ,      ///< RSA secret prime factor of Modules (q)\r
+  RsaKeyDp,     ///< p's CRT exponent (== d mod (p - 1))\r
+  RsaKeyDq,     ///< q's CRT exponent (== d mod (q - 1))\r
+  RsaKeyQInv    ///< The CRT coefficient (== 1/q mod p)\r
+} RSA_KEY_TAG;\r
+\r
+//=====================================================================================\r
+//    One-Way Cryptographic Hash Primitives\r
+//=====================================================================================\r
+\r
+/**\r
+  Retrieves the size, in bytes, of the context buffer required for MD5 hash operations.\r
+\r
+  @return  The size, in bytes, of the context buffer required for MD5 hash operations.\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+Md5GetContextSize (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Initializes user-supplied memory pointed by Md5Context as MD5 hash context for\r
+  subsequent use.\r
+\r
+  If Md5Context is NULL, then ASSERT().\r
+\r
+  @param[in, out]  Md5Context  Pointer to MD5 Context being initialized.\r
+\r
+  @retval TRUE   MD5 context initialization succeeded.\r
+  @retval FALSE  MD5 context initialization failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+Md5Init (\r
+  IN OUT  VOID  *Md5Context\r
+  );\r
+\r
+\r
+/**\r
+  Performs MD5 digest on a data buffer of the specified length. This function can\r
+  be called multiple times to compute the digest of long or discontinuous data streams.\r
+\r
+  If Md5Context is NULL, then ASSERT().\r
+\r
+  @param[in, out]  Md5Context  Pointer to the MD5 context.\r
+  @param[in]       Data        Pointer to the buffer containing the data to be hashed.\r
+  @param[in]       DataLength  Length of Data buffer in bytes.\r
+\r
+  @retval TRUE   MD5 data digest succeeded.\r
+  @retval FALSE  Invalid MD5 context. After Md5Final function has been called, the\r
+                 MD5 context cannot be reused.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+Md5Update (\r
+  IN OUT  VOID        *Md5Context,\r
+  IN      CONST VOID  *Data,\r
+  IN      UINTN       DataLength\r
+  );\r
+\r
+\r
+/**\r
+  Completes MD5 hash computation and retrieves the digest value into the specified\r
+  memory. After this function has been called, the MD5 context cannot be used again.\r
+\r
+  If Md5Context is NULL, then ASSERT().\r
+  If HashValue is NULL, then ASSERT().\r
+\r
+  @param[in, out]  Md5Context  Pointer to the MD5 context\r
+  @param[out]      HashValue   Pointer to a buffer that receives the MD5 digest\r
+                               value (16 bytes).\r
+\r
+  @retval TRUE   MD5 digest computation succeeded.\r
+  @retval FALSE  MD5 digest computation failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+Md5Final (\r
+  IN OUT  VOID   *Md5Context,\r
+  OUT     UINT8  *HashValue\r
+  );\r
+\r
+\r
+/**\r
+  Retrieves the size, in bytes, of the context buffer required for SHA-1 hash operations.\r
+\r
+  @return  The size, in bytes, of the context buffer required for SHA-1 hash operations.\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+Sha1GetContextSize (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Initializes user-supplied memory pointed by Sha1Context as the SHA-1 hash context for\r
+  subsequent use.\r
+\r
+  If Sha1Context is NULL, then ASSERT().\r
+\r
+  @param[in, out]  Sha1Context  Pointer to the SHA-1 Context being initialized.\r
+\r
+  @retval TRUE   SHA-1 initialization succeeded.\r
+  @retval FALSE  SHA-1 initialization failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+Sha1Init (\r
+  IN OUT  VOID  *Sha1Context\r
+  );\r
+\r
+\r
+/**\r
+  Performs SHA-1 digest on a data buffer of the specified length. This function can\r
+  be called multiple times to compute the digest of long or discontinuous data streams.\r
+\r
+  If Sha1Context is NULL, then ASSERT().\r
+\r
+  @param[in, out]  Sha1Context  Pointer to the SHA-1 context.\r
+  @param[in]       Data         Pointer to the buffer containing the data to be hashed.\r
+  @param[in]       DataLength   Length of Data buffer in bytes.\r
+\r
+  @retval TRUE   SHA-1 data digest succeeded.\r
+  @retval FALSE  Invalid SHA-1 context. After Sha1Final function has been called, the\r
+                 SHA-1 context cannot be reused.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+Sha1Update (\r
+  IN OUT  VOID        *Sha1Context,\r
+  IN      CONST VOID  *Data,\r
+  IN      UINTN       DataLength\r
+  );\r
+\r
+\r
+/**\r
+  Completes SHA-1 hash computation and retrieves the digest value into the specified\r
+  memory. After this function has been called, the SHA-1 context cannot be used again.\r
+\r
+  If Sha1Context is NULL, then ASSERT().\r
+  If HashValue is NULL, then ASSERT().\r
+\r
+  @param[in, out]  Sha1Context  Pointer to the SHA-1 context\r
+  @param[out]      HashValue    Pointer to a buffer that receives the SHA-1 digest\r
+                                value (20 bytes).\r
+\r
+  @retval TRUE   SHA-1 digest computation succeeded.\r
+  @retval FALSE  SHA-1 digest computation failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+Sha1Final (\r
+  IN OUT  VOID   *Sha1Context,\r
+  OUT     UINT8  *HashValue\r
+  );\r
+\r
+\r
+/**\r
+  Retrieves the size, in bytes, of the context buffer required for SHA-256 operations.\r
+\r
+  @return  The size, in bytes, of the context buffer required for SHA-256 operations.\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+Sha256GetContextSize (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Initializes user-supplied memory pointed by Sha256Context as SHA-256 hash context for\r
+  subsequent use.\r
+\r
+  If Sha256Context is NULL, then ASSERT().\r
+\r
+  @param[in, out]  Sha256Context  Pointer to SHA-256 Context being initialized.\r
+\r
+  @retval TRUE   SHA-256 context initialization succeeded.\r
+  @retval FALSE  SHA-256 context initialization failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+Sha256Init (\r
+  IN OUT  VOID  *Sha256Context\r
+  );\r
+\r
+\r
+/**\r
+  Performs SHA-256 digest on a data buffer of the specified length. This function can\r
+  be called multiple times to compute the digest of long or discontinuous data streams.\r
+\r
+  If Sha256Context is NULL, then ASSERT().\r
+\r
+  @param[in, out]  Sha256Context  Pointer to the SHA-256 context.\r
+  @param[in]       Data           Pointer to the buffer containing the data to be hashed.\r
+  @param[in]       DataLength     Length of Data buffer in bytes.\r
+\r
+  @retval TRUE   SHA-256 data digest succeeded.\r
+  @retval FALSE  Invalid SHA-256 context. After Sha256Final function has been called, the\r
+                 SHA-256 context cannot be reused.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+Sha256Update (\r
+  IN OUT  VOID        *Sha256Context,\r
+  IN      CONST VOID  *Data,\r
+  IN      UINTN       DataLength\r
+  );\r
+\r
+\r
+/**\r
+  Completes SHA-256 hash computation and retrieves the digest value into the specified\r
+  memory. After this function has been called, the SHA-256 context cannot be used again.\r
+\r
+  If Sha256Context is NULL, then ASSERT().\r
+  If HashValue is NULL, then ASSERT().\r
+\r
+  @param[in, out]  Sha256Context  Pointer to SHA-256 context\r
+  @param[out]      HashValue      Pointer to a buffer that receives the SHA-256 digest\r
+                                  value (32 bytes).\r
+\r
+  @retval TRUE   SHA-256 digest computation succeeded.\r
+  @retval FALSE  SHA-256 digest computation failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+Sha256Final (\r
+  IN OUT  VOID   *Sha256Context,\r
+  OUT     UINT8  *HashValue\r
+  );\r
+\r
+\r
+//=====================================================================================\r
+//    MAC (Message Authentication Code) Primitive\r
+//=====================================================================================\r
+\r
+///\r
+/// No MAC supports for minimum scope required by UEFI\r
+///\r
+\r
+\r
+//=====================================================================================\r
+//    Symmetric Cryptography Primitive\r
+//=====================================================================================\r
+\r
+///\r
+/// No symmetric cryptographic supports for minimum scope required by UEFI\r
+///\r
+\r
+\r
+//=====================================================================================\r
+//    Asymmetric Cryptography Primitive\r
+//=====================================================================================\r
+\r
+/**\r
+  Allocates and Initializes one RSA Context for subsequent use.\r
+\r
+  @return  Pointer to the RSA Context that has been initialized.\r
+           If the allocations fails, RsaNew() returns NULL.\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+RsaNew (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Release the specified RSA Context.\r
+\r
+  @param[in]  RsaContext  Pointer to the RSA context to be released.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+RsaFree (\r
+  IN  VOID  *RsaContext\r
+  );\r
+\r
+\r
+/**\r
+  Sets the tag-designated RSA key component into the established RSA context from\r
+  the user-specified nonnegative integer (octet string format represented in RSA\r
+  PKCS#1).\r
+\r
+  If RsaContext is NULL, then ASSERT().\r
+\r
+  @param[in, out]  RsaContext  Pointer to RSA context being set.\r
+  @param[in]       KeyTag      Tag of RSA key component being set.\r
+  @param[in]       BigNumber   Pointer to octet integer buffer.\r
+  @param[in]       BnLength    Length of big number buffer in bytes.\r
+\r
+  @return  TRUE   RSA key component was set successfully.\r
+  @return  FALSE  Invalid RSA key component tag.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+RsaSetKey (\r
+  IN OUT VOID         *RsaContext,\r
+  IN     RSA_KEY_TAG  KeyTag,\r
+  IN     CONST UINT8  *BigNumber,\r
+  IN     UINTN        BnLength\r
+  );\r
+\r
+\r
+/**\r
+  Verifies the RSA-SSA signature with EMSA-PKCS1-v1_5 encoding scheme defined in\r
+  RSA PKCS#1.\r
+\r
+  If RsaContext is NULL, then ASSERT().\r
+  If MessageHash is NULL, then ASSERT().\r
+  If Signature is NULL, then ASSERT().\r
+  If HashLength is not equal to the size of MD5, SHA-1 or SHA-256 digest, then ASSERT().\r
+\r
+  @param[in]  RsaContext   Pointer to RSA context for signature verification.\r
+  @param[in]  MessageHash  Pointer to octet message hash to be checked.\r
+  @param[in]  HashLength   Length of the message hash in bytes.\r
+  @param[in]  Signature    Pointer to RSA PKCS1-v1_5 signature to be verified.\r
+  @param[in]  SigLength    Length of signature in bytes.\r
+\r
+  @return  TRUE   Valid signature encoded in PKCS1-v1_5.\r
+  @return  FALSE  Invalid signature or invalid RSA context.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+RsaPkcs1Verify (\r
+  IN  VOID         *RsaContext,\r
+  IN  CONST UINT8  *MessageHash,\r
+  IN  UINTN        HashLength,\r
+  IN  UINT8        *Signature,\r
+  IN  UINTN        SigLength\r
+  );\r
+\r
+\r
+/**\r
+  Verifies the validility of a PKCS#7 signed data as described in "PKCS #7: Cryptographic\r
+  Message Syntax Standard".\r
+\r
+  If P7Data is NULL, then ASSERT().\r
+\r
+  @param[in]  P7Data       Pointer to the PKCS#7 message to verify.\r
+  @param[in]  P7Length     Length of the PKCS#7 message in bytes.\r
+  @param[in]  TrustedCert  Pointer to a trusted/root certificate encoded in DER, which\r
+                           is used for certificate chain verification.\r
+  @param[in]  CertLength   Length of the trusted certificate in bytes.\r
+  @param[in]  InData       Pointer to the content to be verified.\r
+  @param[in]  DataLength   Length of InData in bytes.\r
+\r
+  @return  TRUE  The specified PKCS#7 signed data is valid.\r
+  @return  FALSE Invalid PKCS#7 signed data.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+Pkcs7Verify (\r
+  IN  CONST UINT8  *P7Data,\r
+  IN  UINTN        P7Length,\r
+  IN  CONST UINT8  *TrustedCert,\r
+  IN  UINTN        CertLength,\r
+  IN  CONST UINT8  *InData,\r
+  IN  UINTN        DataLength\r
+  );\r
+\r
+\r
+#endif // __BASE_CRYPT_LIB_H__\r
diff --git a/CryptoPkg/Include/OpenSslSupport.h b/CryptoPkg/Include/OpenSslSupport.h
new file mode 100644 (file)
index 0000000..1c51cdb
--- /dev/null
@@ -0,0 +1,238 @@
+/** @file\r
+  Root include file to support building OpenSSL Crypto Library.\r
+\r
+Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef __OPEN_SSL_SUPPORT_H__\r
+#define __OPEN_SSL_SUPPORT_H__\r
+\r
+#include <Base.h>\r
+#include <Library/BaseLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/MemoryAllocationLib.h>\r
+#include <Library/DebugLib.h>\r
+\r
+//\r
+// File operations are not required for building Open SSL, \r
+// so FILE is mapped to VOID * to pass build\r
+//\r
+typedef VOID  *FILE;\r
+\r
+//\r
+// Map all va_xxxx elements to VA_xxx defined in MdePkg/Include/Base.h\r
+//\r
+#define va_list   VA_LIST\r
+#define va_arg    VA_ARG\r
+#define va_start  VA_START\r
+#define va_end    VA_END\r
+\r
+//\r
+// #defines from EFI Application Toolkit required to buiild Open SSL\r
+//\r
+#define ENOMEM       12               /* Cannot allocate memory */\r
+#define EINVAL       22               /* Invalid argument */\r
+#define BUFSIZ       1024             /* size of buffer used by setbuf */\r
+#define INT_MAX      2147483647       /* max value for an int */\r
+#define INT_MIN      (-2147483647-1)  /* min value for an int */\r
+#define LONG_MAX     2147483647L      /* max value for a long */\r
+#define LONG_MIN     (-2147483647-1)  /* min value for a long */\r
+#define ULONG_MAX    0xffffffff       /* max value for an unsigned long */\r
+#define LOG_DAEMON   (3<<3)           /* system daemons */\r
+#define LOG_EMERG    0                /* system is unusable */\r
+#define LOG_ALERT    1                /* action must be taken immediately */\r
+#define LOG_CRIT     2                /* critical conditions */\r
+#define LOG_ERR      3                /* error conditions */\r
+#define LOG_WARNING  4                /* warning conditions */\r
+#define LOG_NOTICE   5                /* normal but significant condition */\r
+#define LOG_INFO     6                /* informational */\r
+#define LOG_DEBUG    7                /* debug-level messages */\r
+#define LOG_PID      0x01             /* log the pid with each message */\r
+#define LOG_CONS     0x02             /* log on the console if errors in sending */\r
+\r
+//\r
+// Macros from EFI Application Toolkit required to buiild Open SSL\r
+//\r
+/* The offsetof() macro calculates the offset of a structure member\r
+   in its structure.  Unfortunately this cannot be written down\r
+   portably, hence it is provided by a Standard C header file.\r
+   For pre-Standard C compilers, here is a version that usually works\r
+   (but watch out!): */\r
+#define offsetof(type, member) ( (int) & ((type*)0) -> member )\r
+\r
+//\r
+// Basic types from EFI Application Toolkit required to buiild Open SSL\r
+//\r
+typedef UINTN          size_t;\r
+typedef INTN           ssize_t;\r
+typedef INT64          off_t;\r
+typedef UINT16         mode_t;\r
+typedef long           time_t;\r
+typedef unsigned long  clock_t;\r
+typedef UINT32         uid_t;\r
+typedef UINT32         gid_t;\r
+typedef UINT32         ino_t;\r
+typedef UINT32         dev_t;\r
+typedef UINT16         nlink_t;\r
+typedef int            pid_t;\r
+typedef void           *DIR;\r
+typedef void           __sighandler_t (int);\r
+\r
+//\r
+// Structures from EFI Application Toolkit required to buiild Open SSL\r
+//\r
+struct tm {\r
+  int   tm_sec;     /* seconds after the minute [0-60] */\r
+  int   tm_min;     /* minutes after the hour [0-59] */\r
+  int   tm_hour;    /* hours since midnight [0-23] */\r
+  int   tm_mday;    /* day of the month [1-31] */\r
+  int   tm_mon;     /* months since January [0-11] */\r
+  int   tm_year;    /* years since 1900 */\r
+  int   tm_wday;    /* days since Sunday [0-6] */\r
+  int   tm_yday;    /* days since January 1 [0-365] */\r
+  int   tm_isdst;   /* Daylight Savings Time flag */\r
+  long  tm_gmtoff;  /* offset from CUT in seconds */\r
+  char  *tm_zone;   /* timezone abbreviation */\r
+};\r
+\r
+struct dirent {\r
+  UINT32  d_fileno;         /* file number of entry */\r
+  UINT16  d_reclen;         /* length of this record */\r
+  UINT8   d_type;           /* file type, see below */\r
+  UINT8   d_namlen;         /* length of string in d_name */\r
+  char    d_name[255 + 1];  /* name must be no longer than this */\r
+};\r
+\r
+struct stat {\r
+  dev_t    st_dev;          /* inode's device */\r
+  ino_t    st_ino;          /* inode's number */\r
+  mode_t   st_mode;         /* inode protection mode */\r
+  nlink_t  st_nlink;        /* number of hard links */\r
+  uid_t    st_uid;          /* user ID of the file's owner */\r
+  gid_t    st_gid;          /* group ID of the file's group */\r
+  dev_t    st_rdev;         /* device type */\r
+  time_t   st_atime;        /* time of last access */\r
+  long     st_atimensec;    /* nsec of last access */\r
+  time_t   st_mtime;        /* time of last data modification */\r
+  long     st_mtimensec;    /* nsec of last data modification */\r
+  time_t   st_ctime;        /* time of last file status change */\r
+  long     st_ctimensec;    /* nsec of last file status change */\r
+  off_t    st_size;         /* file size, in bytes */\r
+  INT64    st_blocks;       /* blocks allocated for file */\r
+  UINT32   st_blksize;      /* optimal blocksize for I/O */\r
+  UINT32   st_flags;        /* user defined flags for file */\r
+  UINT32   st_gen;          /* file generation number */\r
+  INT32    st_lspare;\r
+  INT64    st_qspare[2];\r
+};\r
+\r
+//\r
+// Externs from EFI Application Toolkit required to buiild Open SSL\r
+//\r
+extern int errno;\r
+\r
+//\r
+// Function prototypes from EFI Application Toolkit required to buiild Open SSL\r
+//\r
+void           *malloc     (size_t);\r
+void           *realloc    (void *, size_t);\r
+void           free        (void *);\r
+int            isdigit     (int);\r
+int            isspace     (int);\r
+int            tolower     (int);\r
+int            isupper     (int);\r
+int            isxdigit    (int);\r
+int            isalnum     (int);\r
+void           *memcpy     (void *, const void *, size_t);\r
+void           *memset     (void *, int, size_t);\r
+void           *memchr     (const void *, int, size_t);\r
+int            memcmp      (const void *, const void *, size_t);\r
+void           *memmove    (void *, const void *, size_t);\r
+int            strcmp      (const char *, const char *);\r
+int            strncmp     (const char *, const char *, size_t);\r
+char           *strcpy     (char *, const char *);\r
+char           *strncpy    (char *, const char *, size_t);\r
+size_t         strlen      (const char *);\r
+char           *strcat     (char *, const char *);\r
+char           *strchr     (const char *, int);\r
+int            strcasecmp  (const char *, const char *);\r
+int            strncasecmp (const char *, const char *, size_t);\r
+char           *strncpy    (char *, const char *, size_t);\r
+int            strncmp     (const char *, const char *, size_t);\r
+char           *strrchr    (const char *, int);\r
+unsigned long  strtoul     (const char *, char **, int);\r
+long           strtol      (const char *, char **, int);\r
+int            printf      (const char *, ...);\r
+int            sscanf      (const char *, const char *, ...);\r
+int            open        (const char *, int, ...);\r
+int            chmod       (const char *, mode_t);\r
+int            stat        (const char *, struct stat *);\r
+off_t          lseek       (int, off_t, int);\r
+ssize_t        read        (int, void *, size_t);\r
+ssize_t        write       (int, const void *, size_t);\r
+int            close       (int);\r
+FILE           *fopen      (const char *, const char *);\r
+size_t         fread       (void *, size_t, size_t, FILE *);\r
+size_t         fwrite      (const void *, size_t, size_t, FILE *);\r
+char           *fgets      (char *, int, FILE *);\r
+int            fputs       (const char *, FILE *);\r
+int            fprintf     (FILE *, const char *, ...);\r
+int            vfprintf    (FILE *, const char *, VA_LIST);\r
+int            fflush      (FILE *);\r
+int            fclose      (FILE *);\r
+DIR            *opendir    (const char *);\r
+struct dirent  *readdir    (DIR *);\r
+int            closedir    (DIR *);\r
+void           openlog     (const char *, int, int);\r
+void           closelog    (void);\r
+void           syslog      (int, const char *, ...);\r
+time_t         time        (time_t *);\r
+struct tm      *localtime  (const time_t *);\r
+struct tm      *gmtime     (const time_t *);\r
+struct tm      *gmtime_r   (const time_t *, struct tm *);\r
+uid_t          getuid      (void);\r
+uid_t          geteuid     (void);\r
+gid_t          getgid      (void);\r
+gid_t          getegid     (void);\r
+void           qsort       (void *, size_t, size_t, int (*)(const void *, const void *));\r
+char           *getenv     (const char *);\r
+void           exit        (int);\r
+void           abort       (void);\r
+__sighandler_t *signal     (int, __sighandler_t *);\r
+\r
+//\r
+// Global variables from EFI Application Toolkit required to buiild Open SSL\r
+//\r
+FILE  *stderr;\r
+FILE  *stdin;\r
+FILE  *stdout;\r
+\r
+//\r
+// Macros that directly map functions to BaseLib, BaseMemoryLib, and DebugLib functions\r
+//\r
+#define memcpy(dest,source,count)         CopyMem(dest,source,(UINTN)(count))\r
+#define memset(dest,ch,count)             SetMem(dest,(UINTN)(count),(UINT8)(ch))\r
+#define memchr(buf,ch,count)              ScanMem8(buf,(UINTN)(count),(UINT8)ch)\r
+#define memcmp(buf1,buf2,count)           (int)(CompareMem(buf1,buf2,(UINTN)(count)))\r
+#define strcmp                            AsciiStrCmp\r
+#define strncmp(string1,string2,count)    (int)(AsciiStrnCmp(string1,string2,(UINTN)(count)))\r
+#define strcpy(strDest,strSource)         AsciiStrCpy(strDest,strSource)\r
+#define strncpy(strDest,strSource,count)  AsciiStrnCpy(strDest,strSource,(UINTN)count)\r
+#define strlen(str)                       (size_t)(AsciiStrLen(str))\r
+#define strcat(strDest,strSource)         AsciiStrCat(strDest,strSource)\r
+#define strchr(str,ch)                    ScanMem8((VOID *)(str),AsciiStrSize(str),(UINT8)ch)\r
+#define abort()                           ASSERT (FALSE)\r
+#define assert(expression)\r
+#define localtime(timer)                  NULL\r
+#define gmtime(timer)                     NULL\r
+#define gmtime_r(timer,result)            (result = NULL)\r
+\r
+#endif\r
diff --git a/CryptoPkg/Include/Protocol/RuntimeCrypt.h b/CryptoPkg/Include/Protocol/RuntimeCrypt.h
new file mode 100644 (file)
index 0000000..bb97d91
--- /dev/null
@@ -0,0 +1,204 @@
+/** @file\r
+  The runtime cryptographic protocol.\r
+  Only limited crypto primitives (SHA-256 and RSA) are provided for runtime\r
+  authenticated variable service.\r
+\r
+Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef __EFI_RUNTIME_CRYPT_PROTOCOL_H__\r
+#define __EFI_RUNTIME_CRYPT_PROTOCOL_H__\r
+\r
+#include <Library/BaseCryptLib.h>\r
+\r
+///\r
+/// Runtime Cryptographic Protocol GUID.\r
+///\r
+#define EFI_RUNTIME_CRYPT_PROTOCOL_GUID \\r
+  { \\r
+    0xe1475e0c, 0x1746, 0x4802, { 0x86, 0x2e, 0x1, 0x1c, 0x2c, 0x2d, 0x9d, 0x86 } \\r
+  }\r
+\r
+/**\r
+  Retrieves the size, in bytes, of the context buffer required for SHA-256 operations.\r
+\r
+  @return  The size, in bytes, of the context buffer required for SHA-256 operations.\r
+\r
+**/\r
+typedef\r
+UINTN\r
+(EFIAPI *EFI_RUNTIME_CRYPT_SHA256_GET_CONTEXT_SIZE) (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Initializes user-supplied memory pointed by Sha256Context as SHA-256 hash context for\r
+  subsequent use.\r
+\r
+  If Sha256Context is NULL, then ASSERT().\r
+\r
+  @param[in, out]  Sha256Context  Pointer to SHA-256 Context being initialized.\r
+\r
+  @retval TRUE   SHA-256 context initialization succeeded.\r
+  @retval FALSE  SHA-256 context initialization failed.\r
+\r
+**/\r
+typedef\r
+BOOLEAN\r
+(EFIAPI *EFI_RUNTIME_CRYPT_SHA256_INIT) (\r
+  IN OUT  VOID  *Sha256Context\r
+  );\r
+\r
+\r
+/**\r
+  Performs SHA-256 digest on a data buffer of the specified length. This function can\r
+  be called multiple times to compute the digest of long or discontinuous data streams.\r
+\r
+  If Sha256Context is NULL, then ASSERT().\r
+\r
+  @param[in, out]  Sha256Context  Pointer to the SHA-256 context.\r
+  @param[in]       Data           Pointer to the buffer containing the data to be hashed.\r
+  @param[in]       DataLength     Length of Data buffer in bytes.\r
+\r
+  @retval TRUE   SHA-256 data digest succeeded.\r
+  @retval FALSE  Invalid SHA-256 context. After Sha256Final function has been called, the\r
+                 SHA-256 context cannot be reused.\r
+\r
+**/\r
+typedef\r
+BOOLEAN\r
+(EFIAPI *EFI_RUNTIME_CRYPT_SHA256_UPDATE) (\r
+  IN OUT  VOID        *Sha256Context,\r
+  IN      CONST VOID  *Data,\r
+  IN      UINTN       DataLength\r
+  );\r
+\r
+\r
+/**\r
+  Completes SHA-256 hash computation and retrieves the digest value into the specified\r
+  memory. After this function has been called, the SHA-256 context cannot be used again.\r
+\r
+  If Sha256Context is NULL, then ASSERT().\r
+  If HashValue is NULL, then ASSERT().\r
+\r
+  @param[in, out]  Sha256Context  Pointer to SHA-256 context\r
+  @param[out]      HashValue      Pointer to a buffer that receives the SHA-256 digest\r
+                                  value (32 bytes).\r
+\r
+  @retval TRUE   SHA-256 digest computation succeeded.\r
+  @retval FALSE  SHA-256 digest computation failed.\r
+\r
+**/\r
+typedef\r
+BOOLEAN\r
+(EFIAPI *EFI_RUNTIME_CRYPT_SHA256_FINAL) (\r
+  IN OUT  VOID   *Sha256Context,\r
+  OUT     UINT8  *HashValue\r
+  );\r
+\r
+\r
+/**\r
+  Allocates and Initializes one RSA Context for subsequent use.\r
+\r
+  @return  Pointer to the RSA Context that has been initialized.\r
+           If the allocations fails, RsaNew() returns NULL.\r
+\r
+**/\r
+typedef\r
+VOID *\r
+(EFIAPI *EFI_RUNTIME_CRYPT_RSA_NEW) (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  Release the specified RSA Context.\r
+\r
+  @param[in]  RsaContext  Pointer to the RSA context to be released.\r
+\r
+**/\r
+typedef\r
+VOID\r
+(EFIAPI *EFI_RUNTIME_CRYPT_RSA_FREE) (\r
+  IN  VOID  *RsaContext\r
+  );\r
+\r
+/**\r
+  Sets the tag-designated RSA key component into the established RSA context from\r
+  the user-specified nonnegative integer (octet string format represented in RSA\r
+  PKCS#1).\r
+\r
+  If RsaContext is NULL, then ASSERT().\r
+\r
+  @param[in, out]  RsaContext  Pointer to RSA context being set.\r
+  @param[in]       KeyTag      Tag of RSA key component being set.\r
+  @param[in]       BigNumber   Pointer to octet integer buffer.\r
+  @param[in]       BnLength    Length of big number buffer in bytes.\r
+\r
+  @return  TRUE   RSA key component was set successfully.\r
+  @return  FALSE  Invalid RSA key component tag.\r
+\r
+**/\r
+typedef\r
+BOOLEAN\r
+(EFIAPI *EFI_RUNTIME_CRYPT_RSA_SET_KEY) (\r
+  IN OUT VOID         *RsaContext,\r
+  IN     RSA_KEY_TAG  KeyTag,\r
+  IN     CONST UINT8  *BigNumber,\r
+  IN     UINTN        BnLength\r
+  );\r
+\r
+/**\r
+  Verifies the RSA-SSA signature with EMSA-PKCS1-v1_5 encoding scheme defined in\r
+  RSA PKCS#1.\r
+\r
+  If RsaContext is NULL, then ASSERT().\r
+  If MessageHash is NULL, then ASSERT().\r
+  If Signature is NULL, then ASSERT().\r
+  If HashLength is not equal to the size of MD5, SHA-1 or SHA-256 digest, then ASSERT().\r
+\r
+  @param[in]  RsaContext   Pointer to RSA context for signature verification.\r
+  @param[in]  MessageHash  Pointer to octet message hash to be checked.\r
+  @param[in]  HashLength   Length of the message hash in bytes.\r
+  @param[in]  Signature    Pointer to RSA PKCS1-v1_5 signature to be verified.\r
+  @param[in]  SigLength    Length of signature in bytes.\r
+\r
+  @return  TRUE   Valid signature encoded in PKCS1-v1_5.\r
+  @return  FALSE  Invalid signature or invalid RSA context.\r
+\r
+**/\r
+typedef\r
+BOOLEAN\r
+(EFIAPI *EFI_RUNTIME_CRYPT_RSA_PKCS1_VERIFY) (\r
+  IN  VOID         *RsaContext,\r
+  IN  CONST UINT8  *MessageHash,\r
+  IN  UINTN        HashLength,\r
+  IN  UINT8        *Signature,\r
+  IN  UINTN        SigLength\r
+  );\r
+\r
+///\r
+/// Runtime Cryptographic Protocol Structure.\r
+///\r
+typedef struct {\r
+  EFI_RUNTIME_CRYPT_SHA256_GET_CONTEXT_SIZE  Sha256GetContextSize;\r
+  EFI_RUNTIME_CRYPT_SHA256_INIT              Sha256Init;\r
+  EFI_RUNTIME_CRYPT_SHA256_UPDATE            Sha256Update;\r
+  EFI_RUNTIME_CRYPT_SHA256_FINAL             Sha256Final;\r
+  EFI_RUNTIME_CRYPT_RSA_NEW                  RsaNew;\r
+  EFI_RUNTIME_CRYPT_RSA_FREE                 RsaFree;\r
+  EFI_RUNTIME_CRYPT_RSA_SET_KEY              RsaSetKey;\r
+  EFI_RUNTIME_CRYPT_RSA_PKCS1_VERIFY         RsaPkcs1Verify;\r
+} EFI_RUNTIME_CRYPT_PROTOCOL;\r
+\r
+extern EFI_GUID gEfiRuntimeCryptProtocolGuid;\r
+\r
+#endif\r
diff --git a/CryptoPkg/Include/arpa/inet.h b/CryptoPkg/Include/arpa/inet.h
new file mode 100644 (file)
index 0000000..ee07f6b
--- /dev/null
@@ -0,0 +1,16 @@
+/** @file\r
+  Include file to support building OpenSSL Crypto Library.\r
+\r
+Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <OpenSslSupport.h>\r
+\r
diff --git a/CryptoPkg/Include/assert.h b/CryptoPkg/Include/assert.h
new file mode 100644 (file)
index 0000000..ee07f6b
--- /dev/null
@@ -0,0 +1,16 @@
+/** @file\r
+  Include file to support building OpenSSL Crypto Library.\r
+\r
+Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <OpenSslSupport.h>\r
+\r
diff --git a/CryptoPkg/Include/ctype.h b/CryptoPkg/Include/ctype.h
new file mode 100644 (file)
index 0000000..ee07f6b
--- /dev/null
@@ -0,0 +1,16 @@
+/** @file\r
+  Include file to support building OpenSSL Crypto Library.\r
+\r
+Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <OpenSslSupport.h>\r
+\r
diff --git a/CryptoPkg/Include/dirent.h b/CryptoPkg/Include/dirent.h
new file mode 100644 (file)
index 0000000..ee07f6b
--- /dev/null
@@ -0,0 +1,16 @@
+/** @file\r
+  Include file to support building OpenSSL Crypto Library.\r
+\r
+Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <OpenSslSupport.h>\r
+\r
diff --git a/CryptoPkg/Include/errno.h b/CryptoPkg/Include/errno.h
new file mode 100644 (file)
index 0000000..ee07f6b
--- /dev/null
@@ -0,0 +1,16 @@
+/** @file\r
+  Include file to support building OpenSSL Crypto Library.\r
+\r
+Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <OpenSslSupport.h>\r
+\r
diff --git a/CryptoPkg/Include/limits.h b/CryptoPkg/Include/limits.h
new file mode 100644 (file)
index 0000000..ee07f6b
--- /dev/null
@@ -0,0 +1,16 @@
+/** @file\r
+  Include file to support building OpenSSL Crypto Library.\r
+\r
+Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <OpenSslSupport.h>\r
+\r
diff --git a/CryptoPkg/Include/malloc.h b/CryptoPkg/Include/malloc.h
new file mode 100644 (file)
index 0000000..ee07f6b
--- /dev/null
@@ -0,0 +1,16 @@
+/** @file\r
+  Include file to support building OpenSSL Crypto Library.\r
+\r
+Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <OpenSslSupport.h>\r
+\r
diff --git a/CryptoPkg/Include/math.h b/CryptoPkg/Include/math.h
new file mode 100644 (file)
index 0000000..a21f554
--- /dev/null
@@ -0,0 +1,16 @@
+/** @file\r
+  Include file to support building OPEN SSL \r
+\r
+Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <OpenSslSupport.h>\r
+\r
diff --git a/CryptoPkg/Include/netdb.h b/CryptoPkg/Include/netdb.h
new file mode 100644 (file)
index 0000000..ee07f6b
--- /dev/null
@@ -0,0 +1,16 @@
+/** @file\r
+  Include file to support building OpenSSL Crypto Library.\r
+\r
+Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <OpenSslSupport.h>\r
+\r
diff --git a/CryptoPkg/Include/netinet/in.h b/CryptoPkg/Include/netinet/in.h
new file mode 100644 (file)
index 0000000..ee07f6b
--- /dev/null
@@ -0,0 +1,16 @@
+/** @file\r
+  Include file to support building OpenSSL Crypto Library.\r
+\r
+Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <OpenSslSupport.h>\r
+\r
diff --git a/CryptoPkg/Include/openssl/README b/CryptoPkg/Include/openssl/README
new file mode 100644 (file)
index 0000000..1594010
--- /dev/null
@@ -0,0 +1 @@
+This directory contains all the public include files from the OpenSSL project.\r
diff --git a/CryptoPkg/Include/sgtty.h b/CryptoPkg/Include/sgtty.h
new file mode 100644 (file)
index 0000000..ee07f6b
--- /dev/null
@@ -0,0 +1,16 @@
+/** @file\r
+  Include file to support building OpenSSL Crypto Library.\r
+\r
+Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <OpenSslSupport.h>\r
+\r
diff --git a/CryptoPkg/Include/signal.h b/CryptoPkg/Include/signal.h
new file mode 100644 (file)
index 0000000..ee07f6b
--- /dev/null
@@ -0,0 +1,16 @@
+/** @file\r
+  Include file to support building OpenSSL Crypto Library.\r
+\r
+Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <OpenSslSupport.h>\r
+\r
diff --git a/CryptoPkg/Include/stdarg.h b/CryptoPkg/Include/stdarg.h
new file mode 100644 (file)
index 0000000..ee07f6b
--- /dev/null
@@ -0,0 +1,16 @@
+/** @file\r
+  Include file to support building OpenSSL Crypto Library.\r
+\r
+Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <OpenSslSupport.h>\r
+\r
diff --git a/CryptoPkg/Include/stddef.h b/CryptoPkg/Include/stddef.h
new file mode 100644 (file)
index 0000000..8dfc36f
--- /dev/null
@@ -0,0 +1,15 @@
+/** @file\r
+  Include file to support building OpenSSL Crypto Library.\r
+\r
+Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <OpenSslSupport.h>\r
diff --git a/CryptoPkg/Include/stdio.h b/CryptoPkg/Include/stdio.h
new file mode 100644 (file)
index 0000000..ee07f6b
--- /dev/null
@@ -0,0 +1,16 @@
+/** @file\r
+  Include file to support building OpenSSL Crypto Library.\r
+\r
+Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <OpenSslSupport.h>\r
+\r
diff --git a/CryptoPkg/Include/stdlib.h b/CryptoPkg/Include/stdlib.h
new file mode 100644 (file)
index 0000000..ee07f6b
--- /dev/null
@@ -0,0 +1,16 @@
+/** @file\r
+  Include file to support building OpenSSL Crypto Library.\r
+\r
+Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <OpenSslSupport.h>\r
+\r
diff --git a/CryptoPkg/Include/string.h b/CryptoPkg/Include/string.h
new file mode 100644 (file)
index 0000000..ee07f6b
--- /dev/null
@@ -0,0 +1,16 @@
+/** @file\r
+  Include file to support building OpenSSL Crypto Library.\r
+\r
+Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <OpenSslSupport.h>\r
+\r
diff --git a/CryptoPkg/Include/strings.h b/CryptoPkg/Include/strings.h
new file mode 100644 (file)
index 0000000..8dfc36f
--- /dev/null
@@ -0,0 +1,15 @@
+/** @file\r
+  Include file to support building OpenSSL Crypto Library.\r
+\r
+Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <OpenSslSupport.h>\r
diff --git a/CryptoPkg/Include/sys/ioctl.h b/CryptoPkg/Include/sys/ioctl.h
new file mode 100644 (file)
index 0000000..ee07f6b
--- /dev/null
@@ -0,0 +1,16 @@
+/** @file\r
+  Include file to support building OpenSSL Crypto Library.\r
+\r
+Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <OpenSslSupport.h>\r
+\r
diff --git a/CryptoPkg/Include/sys/param.h b/CryptoPkg/Include/sys/param.h
new file mode 100644 (file)
index 0000000..ee07f6b
--- /dev/null
@@ -0,0 +1,16 @@
+/** @file\r
+  Include file to support building OpenSSL Crypto Library.\r
+\r
+Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <OpenSslSupport.h>\r
+\r
diff --git a/CryptoPkg/Include/sys/socket.h b/CryptoPkg/Include/sys/socket.h
new file mode 100644 (file)
index 0000000..ee07f6b
--- /dev/null
@@ -0,0 +1,16 @@
+/** @file\r
+  Include file to support building OpenSSL Crypto Library.\r
+\r
+Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <OpenSslSupport.h>\r
+\r
diff --git a/CryptoPkg/Include/sys/stat.h b/CryptoPkg/Include/sys/stat.h
new file mode 100644 (file)
index 0000000..ee07f6b
--- /dev/null
@@ -0,0 +1,16 @@
+/** @file\r
+  Include file to support building OpenSSL Crypto Library.\r
+\r
+Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <OpenSslSupport.h>\r
+\r
diff --git a/CryptoPkg/Include/sys/time.h b/CryptoPkg/Include/sys/time.h
new file mode 100644 (file)
index 0000000..ee07f6b
--- /dev/null
@@ -0,0 +1,16 @@
+/** @file\r
+  Include file to support building OpenSSL Crypto Library.\r
+\r
+Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <OpenSslSupport.h>\r
+\r
diff --git a/CryptoPkg/Include/sys/times.h b/CryptoPkg/Include/sys/times.h
new file mode 100644 (file)
index 0000000..ee07f6b
--- /dev/null
@@ -0,0 +1,16 @@
+/** @file\r
+  Include file to support building OpenSSL Crypto Library.\r
+\r
+Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <OpenSslSupport.h>\r
+\r
diff --git a/CryptoPkg/Include/sys/types.h b/CryptoPkg/Include/sys/types.h
new file mode 100644 (file)
index 0000000..ee07f6b
--- /dev/null
@@ -0,0 +1,16 @@
+/** @file\r
+  Include file to support building OpenSSL Crypto Library.\r
+\r
+Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <OpenSslSupport.h>\r
+\r
diff --git a/CryptoPkg/Include/sys/un.h b/CryptoPkg/Include/sys/un.h
new file mode 100644 (file)
index 0000000..ee07f6b
--- /dev/null
@@ -0,0 +1,16 @@
+/** @file\r
+  Include file to support building OpenSSL Crypto Library.\r
+\r
+Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <OpenSslSupport.h>\r
+\r
diff --git a/CryptoPkg/Include/syslog.h b/CryptoPkg/Include/syslog.h
new file mode 100644 (file)
index 0000000..8dfc36f
--- /dev/null
@@ -0,0 +1,15 @@
+/** @file\r
+  Include file to support building OpenSSL Crypto Library.\r
+\r
+Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <OpenSslSupport.h>\r
diff --git a/CryptoPkg/Include/time.h b/CryptoPkg/Include/time.h
new file mode 100644 (file)
index 0000000..8dfc36f
--- /dev/null
@@ -0,0 +1,15 @@
+/** @file\r
+  Include file to support building OpenSSL Crypto Library.\r
+\r
+Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <OpenSslSupport.h>\r
diff --git a/CryptoPkg/Include/unistd.h b/CryptoPkg/Include/unistd.h
new file mode 100644 (file)
index 0000000..8dfc36f
--- /dev/null
@@ -0,0 +1,15 @@
+/** @file\r
+  Include file to support building OpenSSL Crypto Library.\r
+\r
+Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <OpenSslSupport.h>\r
diff --git a/CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf b/CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf
new file mode 100644 (file)
index 0000000..5395da0
--- /dev/null
@@ -0,0 +1,79 @@
+## @file\r
+#  Cryptographic Library Instance for DXE_DRIVER.\r
+#\r
+#  Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+#  This program and the accompanying materials\r
+#  are licensed and made available under the terms and conditions of the BSD License\r
+#  which accompanies this distribution.  The full text of the license may be found at\r
+#  http://opensource.org/licenses/bsd-license.php\r
+#  \r
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#  \r
+##\r
+\r
+[Defines]\r
+  INF_VERSION                    = 0x00010005\r
+  BASE_NAME                      = BaseCryptLib\r
+  FILE_GUID                      = be3bb803-91b6-4da0-bd91-a8b21c18ca5d\r
+  MODULE_TYPE                    = BASE\r
+  VERSION_STRING                 = 1.0\r
+  LIBRARY_CLASS                  = BaseCryptLib\r
+\r
+#\r
+# The following information is for reference only and not required by the build tools.\r
+#\r
+#  VALID_ARCHITECTURES           = IA32 X64 IPF\r
+#\r
+\r
+[Sources]\r
+  Hash/CryptMd5.c\r
+  Hash/CryptSha1.c\r
+  Hash/CryptSha256.c\r
+  Pk/CryptRsa.c\r
+  Pk/CryptPkcs7.c\r
+\r
+  SysCall/CrtWrapper.c\r
+  SysCall/TimerWrapper.c\r
+  SysCall/BaseMemAllocation.c\r
+\r
+[Sources.Ia32]\r
+  SysCall/HelperWrapper.c\r
+\r
+  SysCall/Ia32/MathMultS64x64.c     | MSFT\r
+  SysCall/Ia32/MathDivU64x64.c      | MSFT\r
+  SysCall/Ia32/MathReminderU64x64.c | MSFT\r
+  SysCall/Ia32/MathLShiftS64.c      | MSFT\r
+  SysCall/Ia32/MathRShiftU64.c      | MSFT\r
+\r
+  SysCall/Ia32/MathMultS64x64.c     | INTEL\r
+  SysCall/Ia32/MathDivU64x64.c      | INTEL\r
+  SysCall/Ia32/MathReminderU64x64.c | INTEL\r
+  SysCall/Ia32/MathLShiftS64.c      | INTEL\r
+  SysCall/Ia32/MathRShiftU64.c      | INTEL\r
+\r
+  SysCall/Ia32/MathMultS64x64.S     | GCC\r
+  SysCall/Ia32/MathDivU64x64.S      | GCC\r
+  SysCall/Ia32/MathReminderU64x64.S | GCC\r
+  SysCall/Ia32/MathLShiftS64.S      | GCC\r
+  SysCall/Ia32/MathRShiftU64.S      | GCC\r
+\r
+  SysCall/Ia32/Alloca.S             | GCC\r
+\r
+[Packages]\r
+  MdePkg/MdePkg.dec\r
+  CryptoPkg/CryptoPkg.dec\r
+\r
+[LibraryClasses]\r
+  BaseLib\r
+  BaseMemoryLib\r
+  MemoryAllocationLib\r
+  DebugLib\r
+  OpensslLib\r
+  IntrinsicLib\r
+\r
+#\r
+# Remove these [BuildOptions] after this library is cleaned up\r
+#\r
+[BuildOptions]\r
+  GCC:*_GCC44_IA32_CC_FLAGS = "-D__cdecl=__attribute__((cdecl))" "-D__declspec(t)=__attribute__((t))"\r
diff --git a/CryptoPkg/Library/BaseCryptLib/Hash/CryptMd5.c b/CryptoPkg/Library/BaseCryptLib/Hash/CryptMd5.c
new file mode 100644 (file)
index 0000000..99471a0
--- /dev/null
@@ -0,0 +1,145 @@
+/** @file\r
+  MD5 Digest Wrapper Implementation over OpenSSL.\r
+\r
+Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <Library/BaseLib.h>\r
+#include <Library/DebugLib.h>\r
+\r
+#include <Library/BaseCryptLib.h>\r
+#include <openssl/md5.h>\r
+\r
+\r
+/**\r
+  Retrieves the size, in bytes, of the context buffer required for MD5 hash operations.\r
+\r
+  @return  The size, in bytes, of the context buffer required for MD5 hash operations.\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+Md5GetContextSize (\r
+  VOID\r
+  )\r
+{\r
+  //\r
+  // Retrieves the OpenSSL MD5 Context Size\r
+  //\r
+  return (UINTN)(sizeof (MD5_CTX));\r
+}\r
+\r
+\r
+/**\r
+  Initializes user-supplied memory pointed by Md5Context as MD5 hash context for\r
+  subsequent use.\r
+\r
+  If Md5Context is NULL, then ASSERT().\r
+\r
+  @param[in, out]  Md5Context  Pointer to MD5 Context being initialized.\r
+\r
+  @retval TRUE   MD5 context initialization succeeded.\r
+  @retval FALSE  MD5 context initialization failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+Md5Init (\r
+  IN OUT  VOID  *Md5Context\r
+  )\r
+{\r
+  //\r
+  // ASSERT if Md5Context is NULL.\r
+  //\r
+  ASSERT (Md5Context != NULL);\r
+\r
+  //\r
+  // OpenSSL MD5 Context Initialization\r
+  //\r
+  return (BOOLEAN) (MD5_Init ((MD5_CTX *)Md5Context));\r
+}\r
+\r
+\r
+/**\r
+  Performs MD5 digest on a data buffer of the specified length. This function can\r
+  be called multiple times to compute the digest of long or discontinuous data streams.\r
+\r
+  If Md5Context is NULL, then ASSERT().\r
+\r
+  @param[in, out]  Md5Context  Pointer to the MD5 context.\r
+  @param[in]       Data        Pointer to the buffer containing the data to be hashed.\r
+  @param[in]       DataLength  Length of Data buffer in bytes.\r
+\r
+  @retval TRUE   MD5 data digest succeeded.\r
+  @retval FALSE  Invalid MD5 context. After Md5Final function has been called, the\r
+                 MD5 context cannot be reused.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+Md5Update (\r
+  IN OUT  VOID        *Md5Context,\r
+  IN      CONST VOID  *Data,\r
+  IN      UINTN       DataLength\r
+  )\r
+{\r
+  //\r
+  // ASSERT if Md5Context is NULL\r
+  //\r
+  ASSERT (Md5Context != NULL);\r
+\r
+  //\r
+  // ASSERT if invalid parameters, in case that only DataLength was checked in OpenSSL\r
+  //\r
+  if (Data == NULL) {\r
+    ASSERT (DataLength == 0);\r
+  }\r
+\r
+  //\r
+  // OpenSSL MD5 Hash Update\r
+  //\r
+  return (BOOLEAN) (MD5_Update ((MD5_CTX *)Md5Context, Data, DataLength));\r
+}\r
+\r
+\r
+/**\r
+  Completes MD5 hash computation and retrieves the digest value into the specified\r
+  memory. After this function has been called, the MD5 context cannot be used again.\r
+\r
+  If Md5Context is NULL, then ASSERT().\r
+  If HashValue is NULL, then ASSERT().\r
+\r
+  @param[in, out]  Md5Context  Pointer to the MD5 context\r
+  @param[out]      HashValue   Pointer to a buffer that receives the MD5 digest\r
+                               value (16 bytes).\r
+\r
+  @retval TRUE   MD5 digest computation succeeded.\r
+  @retval FALSE  MD5 digest computation failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+Md5Final (\r
+  IN OUT  VOID   *Md5Context,\r
+  OUT     UINT8  *HashValue\r
+  )\r
+{\r
+  //\r
+  // ASSERT if Md5Context is NULL or HashValue is NULL\r
+  //\r
+  ASSERT (Md5Context != NULL);\r
+  ASSERT (HashValue  != NULL);\r
+\r
+  //\r
+  // OpenSSL MD5 Hash Finalization\r
+  //\r
+  return (BOOLEAN) (MD5_Final (HashValue, (MD5_CTX *)Md5Context));\r
+}\r
diff --git a/CryptoPkg/Library/BaseCryptLib/Hash/CryptSha1.c b/CryptoPkg/Library/BaseCryptLib/Hash/CryptSha1.c
new file mode 100644 (file)
index 0000000..d774059
--- /dev/null
@@ -0,0 +1,145 @@
+/** @file\r
+  SHA-1 Digest Wrapper Implementation over OpenSSL.\r
+\r
+Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <Library/BaseLib.h>\r
+#include <Library/DebugLib.h>\r
+\r
+#include <Library/BaseCryptLib.h>\r
+#include <openssl/sha.h>\r
+\r
+\r
+/**\r
+  Retrieves the size, in bytes, of the context buffer required for SHA-1 hash operations.\r
+\r
+  @return  The size, in bytes, of the context buffer required for SHA-1 hash operations.\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+Sha1GetContextSize (\r
+  VOID\r
+  )\r
+{\r
+  //\r
+  // Retrieves OpenSSL SHA Context Size\r
+  //\r
+  return (UINTN)(sizeof (SHA_CTX));\r
+}\r
+\r
+\r
+/**\r
+  Initializes user-supplied memory pointed by Sha1Context as the SHA-1 hash context for\r
+  subsequent use.\r
+\r
+  If Sha1Context is NULL, then ASSERT().\r
+\r
+  @param[in, out]  Sha1Context  Pointer to the SHA-1 Context being initialized.\r
+\r
+  @retval TRUE   SHA-1 initialization succeeded.\r
+  @retval FALSE  SHA-1 initialization failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+Sha1Init (\r
+  IN OUT  VOID  *Sha1Context\r
+  )\r
+{\r
+  //\r
+  // ASSERT if Sha1Context is NULL\r
+  //\r
+  ASSERT (Sha1Context != NULL);\r
+\r
+  //\r
+  // OpenSSL SHA-1 Context Initialization\r
+  //\r
+  return (BOOLEAN) (SHA1_Init ((SHA_CTX *)Sha1Context));\r
+}\r
+\r
+\r
+/**\r
+  Performs SHA-1 digest on a data buffer of the specified length. This function can\r
+  be called multiple times to compute the digest of long or discontinuous data streams.\r
+\r
+  If Sha1Context is NULL, then ASSERT().\r
+\r
+  @param[in, out]  Sha1Context  Pointer to the SHA-1 context.\r
+  @param[in]       Data         Pointer to the buffer containing the data to be hashed.\r
+  @param[in]       DataLength   Length of Data buffer in bytes.\r
+\r
+  @retval TRUE   SHA-1 data digest succeeded.\r
+  @retval FALSE  Invalid SHA-1 context. After Sha1Final function has been called, the\r
+                 SHA-1 context cannot be reused.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+Sha1Update (\r
+  IN OUT  VOID        *Sha1Context,\r
+  IN      CONST VOID  *Data,\r
+  IN      UINTN       DataLength\r
+  )\r
+{\r
+  //\r
+  // ASSERT if Sha1Context is NULL\r
+  //\r
+  ASSERT (Sha1Context != NULL);\r
+\r
+  //\r
+  // ASSERT if invalid parameters, in case that only DataLength was checked in OpenSSL\r
+  //\r
+  if (Data == NULL) {\r
+    ASSERT (DataLength == 0);\r
+  }\r
+\r
+  //\r
+  // OpenSSL SHA-1 Hash Update\r
+  //\r
+  return (BOOLEAN) (SHA1_Update ((SHA_CTX *)Sha1Context, Data, DataLength));\r
+}\r
+\r
+\r
+/**\r
+  Completes SHA-1 hash computation and retrieves the digest value into the specified\r
+  memory. After this function has been called, the SHA-1 context cannot be used again.\r
+\r
+  If Sha1Context is NULL, then ASSERT().\r
+  If HashValue is NULL, then ASSERT().\r
+\r
+  @param[in, out]  Sha1Context  Pointer to the SHA-1 context\r
+  @param[out]      HashValue    Pointer to a buffer that receives the SHA-1 digest\r
+                                value (20 bytes).\r
+\r
+  @retval TRUE   SHA-1 digest computation succeeded.\r
+  @retval FALSE  SHA-1 digest computation failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+Sha1Final (\r
+  IN OUT  VOID   *Sha1Context,\r
+  OUT     UINT8  *HashValue\r
+  )\r
+{\r
+  //\r
+  // ASSERT if Sha1Context is NULL or HashValue is NULL\r
+  //\r
+  ASSERT (Sha1Context != NULL);\r
+  ASSERT (HashValue   != NULL);\r
+\r
+  //\r
+  // OpenSSL SHA-1 Hash Finalization\r
+  //\r
+  return (BOOLEAN) (SHA1_Final (HashValue, (SHA_CTX *)Sha1Context));\r
+}\r
diff --git a/CryptoPkg/Library/BaseCryptLib/Hash/CryptSha256.c b/CryptoPkg/Library/BaseCryptLib/Hash/CryptSha256.c
new file mode 100644 (file)
index 0000000..9b566a4
--- /dev/null
@@ -0,0 +1,145 @@
+/** @file\r
+  SHA-256 Digest Wrapper Implementation over OpenSSL.\r
+\r
+Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <Library/BaseLib.h>\r
+#include <Library/DebugLib.h>\r
+\r
+#include <Library/BaseCryptLib.h>\r
+#include <openssl/sha.h>\r
+\r
+\r
+/**\r
+  Retrieves the size, in bytes, of the context buffer required for SHA-256 operations.\r
+\r
+  @return  The size, in bytes, of the context buffer required for SHA-256 operations.\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+Sha256GetContextSize (\r
+  VOID\r
+  )\r
+{\r
+  //\r
+  // Retrieves OpenSSL SHA-256 Context Size\r
+  //\r
+  return (UINTN)(sizeof (SHA256_CTX));\r
+}\r
+\r
+\r
+/**\r
+  Initializes user-supplied memory pointed by Sha256Context as SHA-256 hash context for\r
+  subsequent use.\r
+\r
+  If Sha256Context is NULL, then ASSERT().\r
+\r
+  @param[in, out]  Sha256Context  Pointer to SHA-256 Context being initialized.\r
+\r
+  @retval TRUE   SHA-256 context initialization succeeded.\r
+  @retval FALSE  SHA-256 context initialization failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+Sha256Init (\r
+  IN OUT  VOID  *Sha256Context\r
+  )\r
+{\r
+  //\r
+  // ASSERT if Sha256Context is NULL\r
+  //\r
+  ASSERT (Sha256Context != NULL);\r
+\r
+  //\r
+  // OpenSSL SHA-256 Context Initialization\r
+  //\r
+  return (BOOLEAN) (SHA256_Init ((SHA256_CTX *)Sha256Context));\r
+}\r
+\r
+\r
+/**\r
+  Performs SHA-256 digest on a data buffer of the specified length. This function can\r
+  be called multiple times to compute the digest of long or discontinuous data streams.\r
+\r
+  If Sha256Context is NULL, then ASSERT().\r
+\r
+  @param[in, out]  Sha256Context  Pointer to the SHA-256 context.\r
+  @param[in]       Data           Pointer to the buffer containing the data to be hashed.\r
+  @param[in]       DataLength     Length of Data buffer in bytes.\r
+\r
+  @retval TRUE   SHA-256 data digest succeeded.\r
+  @retval FALSE  Invalid SHA-256 context. After Sha256Final function has been called, the\r
+                 SHA-256 context cannot be reused.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+Sha256Update (\r
+  IN OUT  VOID        *Sha256Context,\r
+  IN      CONST VOID  *Data,\r
+  IN      UINTN       DataLength\r
+  )\r
+{\r
+  //\r
+  // ASSERT if Sha256Context is NULL\r
+  //\r
+  ASSERT (Sha256Context != NULL);\r
+\r
+  //\r
+  // ASSERT if invalid parameters, in case that only DataLength was checked in OpenSSL\r
+  //\r
+  if (Data == NULL) {\r
+    ASSERT (DataLength == 0);\r
+  }\r
+\r
+  //\r
+  // OpenSSL SHA-256 Hash Update\r
+  //\r
+  return (BOOLEAN) (SHA256_Update ((SHA256_CTX *)Sha256Context, Data, DataLength));\r
+}\r
+\r
+\r
+/**\r
+  Completes SHA-256 hash computation and retrieves the digest value into the specified\r
+  memory. After this function has been called, the SHA-256 context cannot be used again.\r
+\r
+  If Sha256Context is NULL, then ASSERT().\r
+  If HashValue is NULL, then ASSERT().\r
+\r
+  @param[in, out]  Sha256Context  Pointer to SHA-256 context\r
+  @param[out]      HashValue      Pointer to a buffer that receives the SHA-256 digest\r
+                                  value (32 bytes).\r
+\r
+  @retval TRUE   SHA-256 digest computation succeeded.\r
+  @retval FALSE  SHA-256 digest computation failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+Sha256Final (\r
+  IN OUT  VOID   *Sha256Context,\r
+  OUT     UINT8  *HashValue\r
+  )\r
+{\r
+  //\r
+  // ASSERT if Sha256Context is NULL or HashValue is NULL\r
+  //\r
+  ASSERT (Sha256Context != NULL);\r
+  ASSERT (HashValue     != NULL);\r
+\r
+  //\r
+  // OpenSSL SHA-256 Hash Finalization\r
+  //\r
+  return (BOOLEAN) (SHA256_Final (HashValue, (SHA256_CTX *)Sha256Context));\r
+}\r
diff --git a/CryptoPkg/Library/BaseCryptLib/PeiCryptLib.inf b/CryptoPkg/Library/BaseCryptLib/PeiCryptLib.inf
new file mode 100644 (file)
index 0000000..30061a6
--- /dev/null
@@ -0,0 +1,77 @@
+## @file\r
+#  Cryptographic Library Instance for PEIM.\r
+#\r
+#  Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+#  This program and the accompanying materials\r
+#  are licensed and made available under the terms and conditions of the BSD License\r
+#  which accompanies this distribution.  The full text of the license may be found at\r
+#  http://opensource.org/licenses/bsd-license.php\r
+#  \r
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#  \r
+##\r
+\r
+[Defines]\r
+  INF_VERSION                    = 0x00010005\r
+  BASE_NAME                      = PeiCryptLib\r
+  FILE_GUID                      = 9a2a4375-194c-4e97-9f67-547ec98d96ca\r
+  MODULE_TYPE                    = PEIM\r
+  VERSION_STRING                 = 1.0\r
+  LIBRARY_CLASS                  = BaseCryptLib|PEIM PEI_CORE SEC\r
+\r
+#\r
+# The following information is for reference only and not required by the build tools.\r
+#\r
+#  VALID_ARCHITECTURES           = IA32 X64\r
+#\r
+\r
+[Sources]\r
+  Hash/CryptMd5.c\r
+  Hash/CryptSha1.c\r
+  Hash/CryptSha256.c\r
+  Pk/CryptRsa.c\r
+\r
+  SysCall/CrtWrapper.c\r
+  SysCall/HelperWrapper.c\r
+  SysCall/BaseMemAllocation.c\r
+\r
+[Sources.Ia32]\r
+  SysCall/Ia32/MathMultS64x64.c     | MSFT\r
+  SysCall/Ia32/MathDivU64x64.c      | MSFT\r
+  SysCall/Ia32/MathReminderU64x64.c | MSFT\r
+  SysCall/Ia32/MathLShiftS64.c      | MSFT\r
+  SysCall/Ia32/MathRShiftU64.c      | MSFT\r
+\r
+  SysCall/Ia32/MathMultS64x64.c     | INTEL\r
+  SysCall/Ia32/MathDivU64x64.c      | INTEL\r
+  SysCall/Ia32/MathReminderU64x64.c | INTEL\r
+  SysCall/Ia32/MathLShiftS64.c      | INTEL\r
+  SysCall/Ia32/MathRShiftU64.c      | INTEL\r
+\r
+  SysCall/Ia32/MathMultS64x64.S     | GCC\r
+  SysCall/Ia32/MathDivU64x64.S      | GCC\r
+  SysCall/Ia32/MathReminderU64x64.S | GCC\r
+  SysCall/Ia32/MathLShiftS64.S      | GCC\r
+  SysCall/Ia32/MathRShiftU64.S      | GCC\r
+\r
+  SysCall/Ia32/Alloca.S             | GCC\r
+\r
+[Packages]\r
+  MdePkg/MdePkg.dec\r
+  CryptoPkg/CryptoPkg.dec\r
+\r
+[LibraryClasses]\r
+  BaseLib\r
+  BaseMemoryLib\r
+  MemoryAllocationLib\r
+  DebugLib\r
+  OpensslLib\r
+  IntrinsicLib\r
+\r
+#\r
+# Remove these [BuildOptions] after this library is cleaned up\r
+#\r
+[BuildOptions]\r
+  GCC:*_GCC44_IA32_CC_FLAGS = "-D__cdecl=__attribute__((cdecl))" "-D__declspec(t)=__attribute__((t))"\r
+  \r
diff --git a/CryptoPkg/Library/BaseCryptLib/Pk/CryptPkcs7.c b/CryptoPkg/Library/BaseCryptLib/Pk/CryptPkcs7.c
new file mode 100644 (file)
index 0000000..d0a6ea5
--- /dev/null
@@ -0,0 +1,160 @@
+/** @file\r
+  PKCS#7 SignedData Verification Wrapper Implementation over OpenSSL.\r
+\r
+Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <Library/BaseLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/DebugLib.h>\r
+\r
+#include <Library/BaseCryptLib.h>\r
+#include <openssl/objects.h>\r
+#include <openssl/x509.h>\r
+#include <openssl/pkcs7.h>\r
+\r
+\r
+/**\r
+  Verifies the validility of a PKCS#7 signed data as described in "PKCS #7: Cryptographic\r
+  Message Syntax Standard".\r
+\r
+  If P7Data is NULL, then ASSERT().\r
+\r
+  @param[in]  P7Data       Pointer to the PKCS#7 message to verify.\r
+  @param[in]  P7Length     Length of the PKCS#7 message in bytes.\r
+  @param[in]  TrustedCert  Pointer to a trusted/root certificate encoded in DER, which\r
+                           is used for certificate chain verification.\r
+  @param[in]  CertLength   Length of the trusted certificate in bytes.\r
+  @param[in]  InData       Pointer to the content to be verified.\r
+  @param[in]  DataLength   Length of InData in bytes.\r
+\r
+  @return  TRUE  The specified PKCS#7 signed data is valid.\r
+  @return  FALSE Invalid PKCS#7 signed data.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+Pkcs7Verify (\r
+  IN  CONST UINT8  *P7Data,\r
+  IN  UINTN        P7Length,\r
+  IN  CONST UINT8  *TrustedCert,\r
+  IN  UINTN        CertLength,\r
+  IN  CONST UINT8  *InData,\r
+  IN  UINTN        DataLength\r
+  )\r
+{\r
+  PKCS7       *Pkcs7;\r
+  UINT8       *Content;\r
+  BIO         *CertBio;\r
+  BIO         *DataBio;\r
+  BOOLEAN     Status;\r
+  X509        *Cert;\r
+  X509_STORE  *CertStore;\r
+\r
+  //\r
+  // ASSERT if P7Data is NULL\r
+  //\r
+  ASSERT (P7Data != NULL);\r
+\r
+  Status    = FALSE;\r
+  Pkcs7     = NULL;\r
+  CertBio   = NULL;\r
+  DataBio   = NULL;\r
+  Cert      = NULL;\r
+  CertStore = NULL;\r
+\r
+  //\r
+  // Register & Initialize necessary digest algorithms for PKCS#7 Handling\r
+  //\r
+  EVP_add_digest (EVP_md5());\r
+  EVP_add_digest (EVP_sha1());\r
+  EVP_add_digest (EVP_sha256());\r
+\r
+  //\r
+  // Retrieve PKCS#7 Data (DER encoding)\r
+  //\r
+  Pkcs7 = d2i_PKCS7 (NULL, &P7Data, (int)P7Length);\r
+  if (Pkcs7 == NULL) {\r
+    goto _Exit;\r
+  }\r
+\r
+  //\r
+  // Check if it's PKCS#7 Signed Data (for Authenticode Scenario)\r
+  //\r
+  if (!PKCS7_type_is_signed (Pkcs7)) {\r
+    goto _Exit;\r
+  }\r
+\r
+  //\r
+  // Check PKCS#7 embedded signed content with InData.\r
+  //\r
+  if (InData != NULL) {\r
+    //\r
+    // NOTE: PKCS7_dataDecode() didn't work for Authenticode-format signed data due to\r
+    //       some authenticode-specific structure. Use opaque ASN.1 string to retrieve\r
+    //       PKCS#7 ContentInfo here.\r
+    //\r
+    Content = (UINT8 *)(Pkcs7->d.sign->contents->d.other->value.asn1_string->data);\r
+\r
+    // Ignore two bytes for DER encoding of ASN.1 "SEQUENCE"\r
+    if (CompareMem (Content + 2, InData, DataLength) != 0) {\r
+      goto _Exit;\r
+    }\r
+  }\r
+\r
+  //\r
+  // Read DER-encoded root certificate and Construct X509 Certificate\r
+  //\r
+  CertBio = BIO_new (BIO_s_mem ());\r
+  BIO_write (CertBio, TrustedCert, (int)CertLength);\r
+  if (CertBio == NULL) {\r
+    goto _Exit;\r
+  }\r
+  Cert = d2i_X509_bio (CertBio, NULL);\r
+  if (Cert == NULL) {\r
+    goto _Exit;\r
+  }\r
+\r
+  //\r
+  // Setup X509 Store for trusted certificate\r
+  //\r
+  CertStore = X509_STORE_new ();\r
+  if (CertStore == NULL) {\r
+    goto _Exit;\r
+  }\r
+  if (!(X509_STORE_add_cert (CertStore, Cert))) {\r
+    goto _Exit;\r
+  }\r
+\r
+  //\r
+  // For generic PKCS#7 handling, InData may be NULL if the content is present\r
+  // in PKCS#7 structure. So ignore NULL checking here.\r
+  //\r
+  DataBio = BIO_new (BIO_s_mem ());\r
+  BIO_write (DataBio, InData, (int)DataLength);\r
+\r
+  //\r
+  // Verifies the PKCS#7 signedData structure\r
+  //\r
+  Status = (BOOLEAN) PKCS7_verify (Pkcs7, NULL, CertStore, DataBio, NULL, 0);\r
+\r
+_Exit:\r
+  //\r
+  // Release Resources\r
+  //\r
+  BIO_free (DataBio);\r
+  BIO_free (CertBio);\r
+  X509_free (Cert);\r
+  X509_STORE_free (CertStore);\r
+  PKCS7_free (Pkcs7);\r
+\r
+  return Status;\r
+}\r
diff --git a/CryptoPkg/Library/BaseCryptLib/Pk/CryptRsa.c b/CryptoPkg/Library/BaseCryptLib/Pk/CryptRsa.c
new file mode 100644 (file)
index 0000000..763213a
--- /dev/null
@@ -0,0 +1,277 @@
+/** @file\r
+  RSA Asymmetric Cipher Wrapper Implementation over OpenSSL.\r
+\r
+Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <Library/BaseLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+\r
+#include <Library/BaseCryptLib.h>\r
+#include <openssl/rsa.h>\r
+\r
+\r
+/**\r
+  Allocates and Initializes one RSA Context for subsequent use.\r
+\r
+  @return  Pointer to the RSA Context that has been initialized.\r
+           If the allocations fails, RsaNew() returns NULL.\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+RsaNew (\r
+  VOID\r
+  )\r
+{\r
+  //\r
+  // Allocates & Initializes RSA Context by OpenSSL RSA_new()\r
+  //\r
+  return (VOID *)RSA_new ();\r
+}\r
+\r
+\r
+/**\r
+  Release the specified RSA Context.\r
+\r
+  @param[in]  RsaContext  Pointer to the RSA context to be released.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+RsaFree (\r
+  IN  VOID  *RsaContext\r
+  )\r
+{\r
+  //\r
+  // Free OpenSSL RSA Context\r
+  //\r
+  RSA_free ((RSA *)RsaContext);\r
+}\r
+\r
+\r
+/**\r
+  Sets the tag-designated RSA key component into the established RSA context from\r
+  the user-specified nonnegative integer (octet string format represented in RSA\r
+  PKCS#1).\r
+\r
+  If RsaContext is NULL, then ASSERT().\r
+\r
+  @param[in, out]  RsaContext  Pointer to RSA context being set.\r
+  @param[in]       KeyTag      Tag of RSA key component being set.\r
+  @param[in]       BigNumber   Pointer to octet integer buffer.\r
+  @param[in]       BnLength    Length of big number buffer in bytes.\r
+\r
+  @return  TRUE   RSA key component was set successfully.\r
+  @return  FALSE  Invalid RSA key component tag.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+RsaSetKey (\r
+  IN OUT VOID         *RsaContext,\r
+  IN     RSA_KEY_TAG  KeyTag,\r
+  IN     CONST UINT8  *BigNumber,\r
+  IN     UINTN        BnLength\r
+  )\r
+{\r
+  RSA  *RsaKey;\r
+\r
+  //\r
+  // ASSERT if RsaContext is NULL\r
+  //\r
+  ASSERT (RsaContext != NULL);\r
+\r
+\r
+  RsaKey = (RSA *)RsaContext;\r
+  //\r
+  // Set RSA Key Components by converting octet string to OpenSSL BN representation.\r
+  // NOTE: For RSA public key (used in signature verification), only public components\r
+  //       (N, e) are needed.\r
+  //\r
+  switch (KeyTag) {\r
+\r
+  //\r
+  // RSA Public Modulus (N)\r
+  //\r
+  case RsaKeyN:\r
+    if (RsaKey->n != NULL) {\r
+      BN_free (RsaKey->n);\r
+    }\r
+    RsaKey->n = BN_bin2bn (BigNumber, (int)BnLength, RsaKey->n);\r
+    break;\r
+\r
+  //\r
+  // RSA Public Exponent (e)\r
+  //\r
+  case RsaKeyE:\r
+    if (RsaKey->e != NULL) {\r
+      BN_free (RsaKey->e);\r
+    }\r
+    RsaKey->e = BN_bin2bn (BigNumber, (int)BnLength, RsaKey->e);\r
+    break;\r
+\r
+  //\r
+  // RSA Private Exponent (d)\r
+  //\r
+  case RsaKeyD:\r
+    if (RsaKey->d != NULL) {\r
+      BN_free (RsaKey->d);\r
+    }\r
+    RsaKey->d = BN_bin2bn (BigNumber, (int)BnLength, RsaKey->d);\r
+    break;\r
+\r
+  //\r
+  // RSA Secret Prime Factor of Modulus (p)\r
+  //\r
+  case RsaKeyP:\r
+    if (RsaKey->p != NULL) {\r
+      BN_free (RsaKey->p);\r
+    }\r
+    RsaKey->p = BN_bin2bn (BigNumber, (int)BnLength, RsaKey->p);\r
+    break;\r
+\r
+  //\r
+  // RSA Secret Prime Factor of Modules (q)\r
+  //\r
+  case RsaKeyQ:\r
+    if (RsaKey->q != NULL) {\r
+      BN_free (RsaKey->q);\r
+    }\r
+    RsaKey->q = BN_bin2bn (BigNumber, (int)BnLength, RsaKey->q);\r
+    break;\r
+\r
+  //\r
+  // p's CRT Exponent (== d mod (p - 1))\r
+  //\r
+  case RsaKeyDp:\r
+    if (RsaKey->dmp1 != NULL) {\r
+      BN_free (RsaKey->dmp1);\r
+    }\r
+    RsaKey->dmp1 = BN_bin2bn (BigNumber, (int)BnLength, RsaKey->dmp1);\r
+    break;\r
+\r
+  //\r
+  // q's CRT Exponent (== d mod (q - 1))\r
+  //\r
+  case RsaKeyDq:\r
+    if (RsaKey->dmq1 != NULL) {\r
+      BN_free (RsaKey->dmq1);\r
+    }\r
+    RsaKey->dmq1 = BN_bin2bn (BigNumber, (int)BnLength, RsaKey->dmq1);\r
+    break;\r
+\r
+  //\r
+  // The CRT Coefficient (== 1/q mod p)\r
+  //\r
+  case RsaKeyQInv:\r
+    if (RsaKey->iqmp != NULL) {\r
+      BN_free (RsaKey->iqmp);\r
+    }\r
+    RsaKey->iqmp = BN_bin2bn (BigNumber, (int)BnLength, RsaKey->iqmp);\r
+    break;\r
+\r
+  default:\r
+    return FALSE;\r
+  }\r
+\r
+  return TRUE;\r
+}\r
+\r
+\r
+/**\r
+  Verifies the RSA-SSA signature with EMSA-PKCS1-v1_5 encoding scheme defined in\r
+  RSA PKCS#1.\r
+\r
+  If RsaContext is NULL, then ASSERT().\r
+  If MessageHash is NULL, then ASSERT().\r
+  If Signature is NULL, then ASSERT().\r
+  If HashLength is not equal to the size of MD5, SHA-1 or SHA-256 digest, then ASSERT().\r
+\r
+  @param[in]  RsaContext   Pointer to RSA context for signature verification.\r
+  @param[in]  MessageHash  Pointer to octet message hash to be checked.\r
+  @param[in]  HashLength   Length of the message hash in bytes.\r
+  @param[in]  Signature    Pointer to RSA PKCS1-v1_5 signature to be verified.\r
+  @param[in]  SigLength    Length of signature in bytes.\r
+\r
+  @return  TRUE   Valid signature encoded in PKCS1-v1_5.\r
+  @return  FALSE  Invalid signature or invalid RSA context.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+RsaPkcs1Verify (\r
+  IN  VOID         *RsaContext,\r
+  IN  CONST UINT8  *MessageHash,\r
+  IN  UINTN        HashLength,\r
+  IN  UINT8        *Signature,\r
+  IN  UINTN        SigLength\r
+  )\r
+{\r
+  INTN     Length;\r
+\r
+  //\r
+  // ASSERT if RsaContext, MessageHash or Signature is NULL\r
+  //\r
+  ASSERT (RsaContext  != NULL);\r
+  ASSERT (MessageHash != NULL);\r
+  ASSERT (Signature   != NULL);\r
+\r
+  //\r
+  // ASSERT if unsupported hash length:\r
+  //    Only MD5, SHA-1 or SHA-256 digest size is supported\r
+  //\r
+  ASSERT ((HashLength == MD5_DIGEST_SIZE) || (HashLength == SHA1_DIGEST_SIZE) ||\r
+          (HashLength == SHA256_DIGEST_SIZE));\r
+\r
+  //\r
+  // RSA PKCS#1 Signature Decoding using OpenSSL RSA Decryption with Public Key\r
+  //\r
+  Length = RSA_public_decrypt (\r
+             (int)SigLength,\r
+             Signature,\r
+             Signature,\r
+             RsaContext,\r
+             RSA_PKCS1_PADDING\r
+             );\r
+\r
+  //\r
+  // Invalid RSA Key or PKCS#1 Padding Checking Failed (if Length < 0)\r
+  // NOTE: Length should be the addition of HashLength and some DER value.\r
+  //       Ignore more strict length checking here.\r
+  //\r
+  if (Length < (INTN) HashLength) {\r
+    return FALSE;\r
+  }\r
+\r
+  //\r
+  // Validate the MessageHash and Decoded Signature\r
+  // NOTE: The decoded Signature should be the DER encoding of the DigestInfo value\r
+  //       DigestInfo ::= SEQUENCE {\r
+  //           digestAlgorithm AlgorithmIdentifier\r
+  //           digest OCTET STRING\r
+  //       }\r
+  //       Then Memory Comparing should skip the DER value of the underlying SEQUENCE\r
+  //       type and AlgorithmIdentifier.\r
+  //\r
+  if (CompareMem (MessageHash, Signature + Length - HashLength, HashLength) == 0) {\r
+    //\r
+    // Valid RSA PKCS#1 Signature\r
+    //\r
+    return TRUE;\r
+  } else {\r
+    //\r
+    // Failed to verification\r
+    //\r
+    return FALSE;\r
+  }\r
+}\r
diff --git a/CryptoPkg/Library/BaseCryptLib/RuntimeCryptLib.inf b/CryptoPkg/Library/BaseCryptLib/RuntimeCryptLib.inf
new file mode 100644 (file)
index 0000000..d31095b
--- /dev/null
@@ -0,0 +1,81 @@
+## @file\r
+#  Cryptographic Library Instance for DXE_RUNTIME_DRIVER\r
+#\r
+#  Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+#  This program and the accompanying materials\r
+#  are licensed and made available under the terms and conditions of the BSD License\r
+#  which accompanies this distribution.  The full text of the license may be found at\r
+#  http://opensource.org/licenses/bsd-license.php\r
+#  \r
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#  \r
+##\r
+\r
+[Defines]\r
+  INF_VERSION                    = 0x00010005\r
+  BASE_NAME                      = RuntimeCryptLib\r
+  FILE_GUID                      = 78189cc0-727d-46a4-84ea-f7dd860de64a\r
+  MODULE_TYPE                    = DXE_RUNTIME_DRIVER\r
+  VERSION_STRING                 = 1.0\r
+  LIBRARY_CLASS                  = BaseCryptLib\r
+  CONSTRUCTOR                    = RuntimeCryptLibConstructor\r
+\r
+#\r
+# The following information is for reference only and not required by the build tools.\r
+#\r
+#  VALID_ARCHITECTURES           = IA32 X64 IPF\r
+#\r
+\r
+[Sources]\r
+  Hash/CryptMd5.c\r
+  Hash/CryptSha1.c\r
+  Hash/CryptSha256.c\r
+  Pk/CryptRsa.c\r
+  \r
+  SysCall/CrtWrapper.c\r
+  SysCall/TimerWrapper.c\r
+  SysCall/HelperWrapper.c\r
+  SysCall/RuntimeMemAllocation.c\r
+\r
+[Sources.Ia32]\r
+  SysCall/Ia32/MathMultS64x64.c     | MSFT\r
+  SysCall/Ia32/MathDivU64x64.c      | MSFT\r
+  SysCall/Ia32/MathReminderU64x64.c | MSFT\r
+  SysCall/Ia32/MathLShiftS64.c      | MSFT\r
+  SysCall/Ia32/MathRShiftU64.c      | MSFT\r
+\r
+  SysCall/Ia32/MathMultS64x64.c     | INTEL\r
+  SysCall/Ia32/MathDivU64x64.c      | INTEL\r
+  SysCall/Ia32/MathReminderU64x64.c | INTEL\r
+  SysCall/Ia32/MathLShiftS64.c      | INTEL\r
+  SysCall/Ia32/MathRShiftU64.c      | INTEL\r
+\r
+  SysCall/Ia32/MathMultS64x64.S     | GCC\r
+  SysCall/Ia32/MathDivU64x64.S      | GCC\r
+  SysCall/Ia32/MathReminderU64x64.S | GCC\r
+  SysCall/Ia32/MathLShiftS64.S      | GCC\r
+  SysCall/Ia32/MathRShiftU64.S      | GCC\r
+\r
+  SysCall/Ia32/Alloca.S             | GCC\r
+\r
+[Packages]\r
+  MdePkg/MdePkg.dec\r
+  CryptoPkg/CryptoPkg.dec\r
+\r
+[LibraryClasses]\r
+  BaseLib\r
+  BaseMemoryLib\r
+  MemoryAllocationLib\r
+  UefiBootServicesTableLib\r
+  UefiRuntimeServicesTableLib\r
+  DebugLib\r
+  OpensslLib\r
+  IntrinsicLib\r
+\r
+#\r
+# Remove these [BuildOptions] after this library is cleaned up\r
+#\r
+[BuildOptions]\r
+  GCC:*_GCC44_IA32_CC_FLAGS = "-D__cdecl=__attribute__((cdecl))" "-D__declspec(t)=__attribute__((t))"\r
+  \r
diff --git a/CryptoPkg/Library/BaseCryptLib/SysCall/BaseMemAllocation.c b/CryptoPkg/Library/BaseCryptLib/SysCall/BaseMemAllocation.c
new file mode 100644 (file)
index 0000000..68bc25a
--- /dev/null
@@ -0,0 +1,42 @@
+/** @file\r
+  Base Memory Allocation Routines Wrapper for Crypto library over OpenSSL\r
+  during PEI & DXE phases.\r
+\r
+Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <OpenSslSupport.h>\r
+\r
+//\r
+// -- Memory-Allocation Routines --\r
+//\r
+\r
+/* Allocates memory blocks */\r
+void *malloc (size_t size)\r
+{\r
+  return AllocatePool ((UINTN)size);\r
+}\r
+\r
+/* Reallocate memory blocks */\r
+void *realloc (void *ptr, size_t size)\r
+{\r
+  //\r
+  // BUG: hardcode OldSize == size! We have no any knowledge about\r
+  // memory size of original pointer ptr.\r
+  //\r
+  return ReallocatePool ((UINTN)size, (UINTN)size, ptr);\r
+}\r
+\r
+/* De-allocates or frees a memory block */\r
+void free (void *ptr)\r
+{\r
+  FreePool (ptr);\r
+}\r
diff --git a/CryptoPkg/Library/BaseCryptLib/SysCall/CrtWrapper.c b/CryptoPkg/Library/BaseCryptLib/SysCall/CrtWrapper.c
new file mode 100644 (file)
index 0000000..4bef42e
--- /dev/null
@@ -0,0 +1,281 @@
+/** @file\r
+  C Run-Time Libraries (CRT) Wrapper Implementation for OpenSSL-based\r
+  Cryptographic Library.\r
+\r
+Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <OpenSslSupport.h>\r
+\r
+typedef\r
+INTN\r
+(*SORT_COMPARE)(\r
+  IN  VOID  *Buffer1,\r
+  IN  VOID  *Buffer2\r
+  );\r
+\r
+//\r
+// Duplicated from EDKII BaseSortLib for qsort() wrapper\r
+//\r
+STATIC\r
+VOID\r
+QuickSortWorker (\r
+  IN OUT    VOID          *BufferToSort,\r
+  IN CONST  UINTN         Count,\r
+  IN CONST  UINTN         ElementSize,\r
+  IN        SORT_COMPARE  CompareFunction,\r
+  IN        VOID          *Buffer\r
+  )\r
+{\r
+  VOID        *Pivot;\r
+  UINTN       LoopCount;\r
+  UINTN       NextSwapLocation;\r
+\r
+  ASSERT(BufferToSort    != NULL);\r
+  ASSERT(CompareFunction != NULL);\r
+  ASSERT(Buffer          != NULL);\r
+\r
+  if (Count < 2 || ElementSize  < 1) {\r
+    return;\r
+  }\r
+\r
+  NextSwapLocation = 0;\r
+\r
+  //\r
+  // Pick a pivot (we choose last element)\r
+  //\r
+  Pivot = ((UINT8 *)BufferToSort + ((Count - 1) * ElementSize));\r
+\r
+  //\r
+  // Now get the pivot such that all on "left" are below it\r
+  // and everything "right" are above it\r
+  //\r
+  for (LoopCount = 0; LoopCount < Count - 1;  LoopCount++)\r
+  {\r
+    //\r
+    // If the element is less than the pivot\r
+    //\r
+    if (CompareFunction ((VOID *)((UINT8 *)BufferToSort + ((LoopCount) * ElementSize)), Pivot) <= 0) {\r
+      //\r
+      // Swap\r
+      //\r
+      CopyMem (Buffer, (UINT8 *)BufferToSort + (NextSwapLocation * ElementSize), ElementSize);\r
+      CopyMem ((UINT8 *)BufferToSort + (NextSwapLocation * ElementSize), (UINT8 *)BufferToSort + ((LoopCount) * ElementSize), ElementSize);\r
+      CopyMem ((UINT8 *)BufferToSort + ((LoopCount) * ElementSize), Buffer, ElementSize);\r
+\r
+      //\r
+      // Increment NextSwapLocation\r
+      //\r
+      NextSwapLocation++;\r
+    }\r
+  }\r
+  //\r
+  // Swap pivot to it's final position (NextSwapLocaiton)\r
+  //\r
+  CopyMem (Buffer, Pivot, ElementSize);\r
+  CopyMem (Pivot, (UINT8 *)BufferToSort + (NextSwapLocation * ElementSize), ElementSize);\r
+  CopyMem ((UINT8 *)BufferToSort + (NextSwapLocation * ElementSize), Buffer, ElementSize);\r
+\r
+  //\r
+  // Now recurse on 2 paritial lists.  Neither of these will have the 'pivot' element.\r
+  // IE list is sorted left half, pivot element, sorted right half...\r
+  //\r
+  QuickSortWorker (\r
+    BufferToSort,\r
+    NextSwapLocation,\r
+    ElementSize,\r
+    CompareFunction,\r
+    Buffer\r
+    );\r
+\r
+  QuickSortWorker (\r
+    (UINT8 *)BufferToSort + (NextSwapLocation + 1) * ElementSize,\r
+    Count - NextSwapLocation - 1,\r
+    ElementSize,\r
+    CompareFunction,\r
+    Buffer\r
+    );\r
+\r
+  return;\r
+}\r
+\r
+//---------------------------------------------------------\r
+// Standard C Run-time Library Interface Wrapper\r
+//---------------------------------------------------------\r
+\r
+//\r
+// -- String Manipulation Routines --\r
+//\r
+\r
+/* Scan a string for the last occurrence of a character */\r
+char *strrchr (const char *str, int c)\r
+{\r
+  char * save;\r
+\r
+  for (save = NULL; ; ++str) {\r
+    if (*str == c) {\r
+      save = (char *)str;\r
+    }\r
+    if (*str == 0) {\r
+      return (save);\r
+    }\r
+  }\r
+}\r
+\r
+/* Read formatted data from a string */\r
+int sscanf (const char *buffer, const char *format, ...)\r
+{\r
+  //\r
+  // Null sscanf() function implementation to satisfy the linker, since\r
+  // no direct functionality logic dependency in present UEFI cases.\r
+  //\r
+  return 0;\r
+}\r
+\r
+//\r
+// -- Character Classification Routines --\r
+//\r
+\r
+/* Determines if a particular character is a decimal-digit character */\r
+int isdigit (int c)\r
+{\r
+  //\r
+  // <digit> ::= [0-9]\r
+  //\r
+  return (('0' <= (c)) && ((c) <= '9'));\r
+}\r
+\r
+/* Determine if an integer represents character that is a hex digit */\r
+int isxdigit (int c)\r
+{\r
+  //\r
+  // <hexdigit> ::= [0-9] | [a-f] | [A-F]\r
+  //\r
+  return ((('0' <= (c)) && ((c) <= '9')) ||\r
+          (('a' <= (c)) && ((c) <= 'f')) ||\r
+          (('A' <= (c)) && ((c) <= 'F')));\r
+}\r
+\r
+/* Determines if a particular character represents a space character */\r
+int isspace (int c)\r
+{\r
+  //\r
+  // <space> ::= [ ]\r
+  //\r
+  return ((c) == ' ');\r
+}\r
+\r
+/* Determine if a particular character is an alphanumeric character */\r
+int isalnum (int c)\r
+{\r
+  //\r
+  // <alnum> ::= [0-9] | [a-z] | [A-Z]\r
+  //\r
+  return ((('0' <= (c)) && ((c) <= '9')) ||\r
+          (('a' <= (c)) && ((c) <= 'z')) ||\r
+          (('A' <= (c)) && ((c) <= 'Z')));\r
+}\r
+\r
+/* Determines if a particular character is in upper case */\r
+int isupper (int c)\r
+{\r
+  //\r
+  // <uppercase letter> := [A-Z]\r
+  //\r
+  return (('A' <= (c)) && ((c) <= 'Z'));\r
+}\r
+\r
+//\r
+// -- Data Conversion Routines --\r
+//\r
+\r
+/* Convert strings to a long-integer value */\r
+long strtol (const char *nptr, char **endptr, int base)\r
+{\r
+  //\r
+  // Null strtol() function implementation to satisfy the linker, since there is\r
+  // no direct functionality logic dependency in present UEFI cases.\r
+  //\r
+  return 0;\r
+}\r
+\r
+/* Convert strings to an unsigned long-integer value */\r
+unsigned long strtoul (const char *nptr, char **endptr, int base)\r
+{\r
+  //\r
+  // Null strtoul() function implementation to satisfy the linker, since there is\r
+  // no direct functionality logic dependency in present UEFI cases.\r
+  //\r
+  return 0;\r
+}\r
+\r
+/* Convert character to lowercase */\r
+int tolower (int c)\r
+{\r
+  if (('A' <= (c)) && ((c) <= 'Z')) {\r
+    return (c - ('A' - 'a'));\r
+  }\r
+  return (c);\r
+}\r
+\r
+//\r
+// -- Searching and Sorting Routines --\r
+//\r
+\r
+/* Performs a quick sort */\r
+void qsort (void *base, size_t num, size_t width, int (*compare)(const void *, const void *))\r
+{\r
+  VOID  *Buffer;\r
+\r
+  ASSERT (base    != NULL);\r
+  ASSERT (compare != NULL);\r
+\r
+  Buffer = AllocatePool (width);\r
+  ASSERT (Buffer != NULL);\r
+\r
+  //\r
+  // Re-use PerformQuickSort() function Implementation in EDKII BaseSortLib.\r
+  //\r
+  QuickSortWorker (base, (UINTN)num, (UINTN)width, (SORT_COMPARE)compare, Buffer);\r
+\r
+  FreePool (Buffer);\r
+  return;\r
+}\r
+\r
+//\r
+// -- Process and Environment Control Routines --\r
+//\r
+\r
+/* Get a value from the current environment */\r
+char *getenv (const char *varname)\r
+{\r
+  //\r
+  // Null getenv() function implementation to satisfy the linker, since there is\r
+  // no direct functionality logic dependency in present UEFI cases.\r
+  //\r
+  return NULL;\r
+}\r
+\r
+//\r
+// -- Stream I/O Routines --\r
+//\r
+\r
+/* Write formatted output using a pointer to a list of arguments */\r
+int vfprintf (FILE *stream, const char *format, VA_LIST arg)\r
+{\r
+  return 0;\r
+}\r
+\r
+/* Write data to a stream */\r
+size_t fwrite (const void *buffer, size_t size, size_t count, FILE *stream)\r
+{\r
+  return 0;\r
+}\r
diff --git a/CryptoPkg/Library/BaseCryptLib/SysCall/HelperWrapper.c b/CryptoPkg/Library/BaseCryptLib/SysCall/HelperWrapper.c
new file mode 100644 (file)
index 0000000..bf4399c
--- /dev/null
@@ -0,0 +1,54 @@
+/** @file\r
+  Wrapper Implementation of Helper Routines produced by the C Compiler\r
+  for the OpenSSL-based Cryptographic Library.\r
+\r
+Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <OpenSslSupport.h>\r
+\r
+//---------------------------------------------------------\r
+// Helper Routines Wrapper\r
+//---------------------------------------------------------\r
+\r
+/* Divides a 64-bit signed value with a 64-bit signed value and returns\r
+   a 64-bit signed quotient and reminder */\r
+void _aulldvrm ()\r
+{\r
+  //\r
+  // Null _aulldvrm() Math function implementation to satisfy the linker, since\r
+  // there is no direct functionality logic dependency in present UEFI cases.\r
+  //\r
+  return;\r
+}\r
+\r
+\r
+/* Converts a scalar double-precision floating point value to a 32-bit integer */\r
+long _ftol2_sse (double dblSource)\r
+{\r
+  //\r
+  // OpenSSL uses this function due to using floating-point inside it.\r
+  // It is only present in 32-bit versions of the compiler.\r
+  // Null _ftol2_sse() function implementation to satisfy the linker, since\r
+  // there is no direct functionality logic dependency in present UEFI cases.\r
+  //\r
+  return 0;\r
+}\r
+\r
+/* Converts a scalar double-precision floating point value to a 32-bit integer */\r
+long _ftol2 (double dblSource)\r
+{\r
+  //\r
+  // Null _ftol2() function implementation to satisfy the linker, since\r
+  // there is no direct functionality logic dependency in present UEFI cases.\r
+  //\r
+  return 0;\r
+}\r
diff --git a/CryptoPkg/Library/BaseCryptLib/SysCall/Ia32/Alloca.S b/CryptoPkg/Library/BaseCryptLib/SysCall/Ia32/Alloca.S
new file mode 100644 (file)
index 0000000..8496833
--- /dev/null
@@ -0,0 +1,59 @@
+#------------------------------------------------------------------------------\r
+#\r
+# Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+# This program and the accompanying materials\r
+# are licensed and made available under the terms and conditions of the BSD License\r
+# which accompanies this distribution.  The full text of the license may be found at\r
+# http://opensource.org/licenses/bsd-license.php.\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+# Module Name:\r
+#\r
+#   Alloca.S\r
+#\r
+# Abstract:\r
+#\r
+#   Implementation for allocation of automatically reclaimed memory, which is\r
+#   used to allocate space off the runtime stack.\r
+#   (NOTE: There is a assumption in this code that the page size equal to 4K)\r
+#\r
+#------------------------------------------------------------------------------\r
+\r
+\r
+    .686:\r
+    .code:\r
+\r
+ASM_GLOBAL ASM_PFX(_alloca)\r
+\r
+#------------------------------------------------------------------------------\r
+#\r
+# void __cdecl _alloca (unsigned size)\r
+#\r
+#------------------------------------------------------------------------------\r
+ASM_PFX(_alloca):\r
+\r
+    pushl   %ecx\r
+    cmpl    $0x1000, %eax\r
+    leal    8(%esp), %ecx\r
+    jb      LastPage\r
+\r
+ProbePages:\r
+    subl    $0x1000, %ecx\r
+    subl    $0x1000, %eax\r
+    testl   %eax, 0(%ecx)\r
+    cmpl    $0x1000, %eax\r
+    jae     ProbePages\r
+\r
+LastPage:\r
+    subl    %eax, %ecx\r
+    movl    %esp, %eax\r
+    testl   %eax, 0(%ecx)\r
+\r
+    movl    %ecx, %esp\r
+    movl    0(%eax), %ecx\r
+    movl    4(%eax), %eax\r
+    pushl   %eax\r
+\r
+    ret\r
diff --git a/CryptoPkg/Library/BaseCryptLib/SysCall/Ia32/MathDivU64x64.S b/CryptoPkg/Library/BaseCryptLib/SysCall/Ia32/MathDivU64x64.S
new file mode 100644 (file)
index 0000000..f46d5b8
--- /dev/null
@@ -0,0 +1,83 @@
+#------------------------------------------------------------------------------\r
+#\r
+# Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+# This program and the accompanying materials\r
+# are licensed and made available under the terms and conditions of the BSD License\r
+# which accompanies this distribution.  The full text of the license may be found at\r
+# http://opensource.org/licenses/bsd-license.php.\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+# Module Name:\r
+#\r
+#   MathDivU64x64.S\r
+#\r
+# Abstract:\r
+#\r
+#   64-bit Math Worker Function.\r
+#   Divides a 64-bit unsigned value with a 64-bit unsigned value and returns\r
+#   a 64-bit unsigned result.\r
+#\r
+#------------------------------------------------------------------------------\r
+\r
+    .686:\r
+    .code:\r
+\r
+ASM_GLOBAL ASM_PFX(__udivdi3), ASM_PFX(DivU64x64Remainder)\r
+\r
+#------------------------------------------------------------------------------\r
+#\r
+# void __cdecl __udivdi3 (void)\r
+#\r
+#------------------------------------------------------------------------------\r
+ASM_PFX(__udivdi3):\r
+    # Original local stack when calling __udivdi3\r
+    #               -----------------\r
+    #               |               |\r
+    #               |---------------|\r
+    #               |               |\r
+    #               |--  Divisor  --|\r
+    #               |               |\r
+    #               |---------------|\r
+    #               |               |\r
+    #               |--  Dividend --|\r
+    #               |               |\r
+    #               |---------------|\r
+    #               |  ReturnAddr** |\r
+    #       ESP---->|---------------|\r
+    #\r
+\r
+    #\r
+    # Set up the local stack for NULL Reminder pointer\r
+    #\r
+    xorl    %eax, %eax\r
+    push    %eax\r
+\r
+    #\r
+    # Set up the local stack for Divisor parameter\r
+    #\r
+    movl    20(%esp), %eax\r
+    push    %eax\r
+    movl    20(%esp), %eax\r
+    push    %eax\r
+\r
+    #\r
+    # Set up the local stack for Dividend parameter\r
+    #\r
+    movl    20(%esp), %eax\r
+    push    %eax\r
+    movl    20(%esp), %eax\r
+    push    %eax\r
+\r
+    #\r
+    # Call native DivU64x64Remainder of BaseLib\r
+    #\r
+    jmp     ASM_PFX(DivU64x64Remainder)\r
+\r
+    #\r
+    # Adjust stack\r
+    #\r
+    addl    $20, %esp\r
+\r
+    ret     $16\r
diff --git a/CryptoPkg/Library/BaseCryptLib/SysCall/Ia32/MathDivU64x64.c b/CryptoPkg/Library/BaseCryptLib/SysCall/Ia32/MathDivU64x64.c
new file mode 100644 (file)
index 0000000..4011653
--- /dev/null
@@ -0,0 +1,88 @@
+/** @file\r
+  64-bit Math Worker Function.\r
+  The 32-bit versions of C compiler generate calls to library routines\r
+  to handle 64-bit math. These functions use non-standard calling conventions.\r
+\r
+Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <Library/BaseLib.h>\r
+\r
+\r
+/*\r
+ * Divides a 64-bit unsigned value with a 64-bit unsigned value and returns\r
+ * a 64-bit unsigned result.\r
+ */\r
+__declspec(naked) void __cdecl _aulldiv (void)\r
+{\r
+  //\r
+  // Wrapper Implementation over EDKII DivU64x64Reminder() routine\r
+  //    UINT64\r
+  //    EFIAPI\r
+  //    DivU64x64Remainder (\r
+  //      IN      UINT64     Dividend,\r
+  //      IN      UINT64     Divisor,\r
+  //      OUT     UINT64     *Remainder  OPTIONAL\r
+  //      )\r
+  //\r
+  _asm {\r
+\r
+    ; Original local stack when calling _aulldiv\r
+    ;               -----------------\r
+    ;               |               |\r
+    ;               |---------------|\r
+    ;               |               |\r
+    ;               |--  Divisor  --|\r
+    ;               |               |\r
+    ;               |---------------|\r
+    ;               |               |\r
+    ;               |--  Dividend --|\r
+    ;               |               |\r
+    ;               |---------------|\r
+    ;               |  ReturnAddr** |\r
+    ;       ESP---->|---------------|\r
+    ;\r
+\r
+    ;\r
+    ; Set up the local stack for NULL Reminder pointer\r
+    ;\r
+    xor  eax, eax\r
+    push eax\r
+\r
+    ;\r
+    ; Set up the local stack for Divisor parameter\r
+    ;\r
+    mov  eax, [esp + 20]\r
+    push eax\r
+    mov  eax, [esp + 20]\r
+    push eax\r
+\r
+    ;\r
+    ; Set up the local stack for Dividend parameter\r
+    ;\r
+    mov  eax, [esp + 20]\r
+    push eax\r
+    mov  eax, [esp + 20]\r
+    push eax\r
+\r
+    ;\r
+    ; Call native DivU64x64Remainder of BaseLib\r
+    ;\r
+    call DivU64x64Remainder\r
+\r
+    ;\r
+    ; Adjust stack\r
+    ;\r
+    add  esp, 20\r
+\r
+    ret  16\r
+  }\r
+}\r
diff --git a/CryptoPkg/Library/BaseCryptLib/SysCall/Ia32/MathLShiftS64.S b/CryptoPkg/Library/BaseCryptLib/SysCall/Ia32/MathLShiftS64.S
new file mode 100644 (file)
index 0000000..e89f553
--- /dev/null
@@ -0,0 +1,62 @@
+#------------------------------------------------------------------------------\r
+#\r
+# Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+# This program and the accompanying materials\r
+# are licensed and made available under the terms and conditions of the BSD License\r
+# which accompanies this distribution.  The full text of the license may be found at\r
+# http://opensource.org/licenses/bsd-license.php.\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+# Module Name:\r
+#\r
+#   MathLShiftS64.S\r
+#\r
+# Abstract:\r
+#\r
+#   64-bit Math Worker Function.\r
+#   Shifts a 64-bit signed value left by a certain number of bits.\r
+#\r
+#------------------------------------------------------------------------------\r
+\r
+    .686:\r
+    .code:\r
+\r
+ASM_GLOBAL ASM_PFX(__ashldi3)\r
+\r
+#------------------------------------------------------------------------------\r
+#\r
+# void __cdecl __ashldi3 (void)\r
+#\r
+#------------------------------------------------------------------------------\r
+ASM_PFX(__ashldi3):\r
+    #\r
+    # Handle shifting of 64 or more bits (return 0)\r
+    #\r
+    cmpb    $64, %cl\r
+    jae     ReturnZero\r
+\r
+    #\r
+    # Handle shifting of between 0 and 31 bits\r
+    #\r
+    cmpb    $32, %cl\r
+    jae     More32\r
+    shld    %cl, %eax, %edx\r
+    shl     %cl, %eax\r
+    ret\r
+\r
+    #\r
+    # Handle shifting of between 32 and 63 bits\r
+    #\r
+More32:\r
+    movl    %eax, %edx\r
+    xor     %eax, %eax\r
+    and     $31, %cl\r
+    shl     %cl, %edx\r
+    ret\r
+\r
+ReturnZero:\r
+    xor     %eax, %eax\r
+    xor     %edx, %edx\r
+    ret\r
diff --git a/CryptoPkg/Library/BaseCryptLib/SysCall/Ia32/MathLShiftS64.c b/CryptoPkg/Library/BaseCryptLib/SysCall/Ia32/MathLShiftS64.c
new file mode 100644 (file)
index 0000000..2ea628a
--- /dev/null
@@ -0,0 +1,54 @@
+/** @file\r
+  64-bit Math Worker Function.\r
+  The 32-bit versions of C compiler generate calls to library routines\r
+  to handle 64-bit math. These functions use non-standard calling conventions.\r
+\r
+Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+\r
+/*\r
+ * Shifts a 64-bit signed value left by a particular number of bits.\r
+ */\r
+__declspec(naked) void __cdecl _allshl (void)\r
+{\r
+  _asm {\r
+    ;\r
+    ; Handle shifting of 64 or more bits (return 0)\r
+    ;\r
+    cmp     cl, 64\r
+    jae     short ReturnZero\r
+\r
+    ;\r
+    ; Handle shifting of between 0 and 31 bits\r
+    ;\r
+    cmp     cl, 32              \r
+    jae     short More32\r
+    shld    edx, eax, cl\r
+    shl     eax, cl\r
+    ret\r
+\r
+    ;\r
+    ; Handle shifting of between 32 and 63 bits\r
+    ;\r
+More32:\r
+    mov     edx, eax\r
+    xor     eax, eax\r
+    and     cl, 31\r
+    shl     edx, cl\r
+    ret\r
+\r
+ReturnZero:\r
+    xor     eax,eax\r
+    xor     edx,edx\r
+    ret\r
+  }\r
+}\r
diff --git a/CryptoPkg/Library/BaseCryptLib/SysCall/Ia32/MathMultS64x64.S b/CryptoPkg/Library/BaseCryptLib/SysCall/Ia32/MathMultS64x64.S
new file mode 100644 (file)
index 0000000..8a5f330
--- /dev/null
@@ -0,0 +1,77 @@
+#------------------------------------------------------------------------------\r
+#\r
+# Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+# This program and the accompanying materials\r
+# are licensed and made available under the terms and conditions of the BSD License\r
+# which accompanies this distribution.  The full text of the license may be found at\r
+# http://opensource.org/licenses/bsd-license.php.\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+# Module Name:\r
+#\r
+#   MathMultS64x64.S\r
+#\r
+# Abstract:\r
+#\r
+#   64-bit Math Worker Function.\r
+#   Multiplies a 64-bit signed or unsigned value by a 64-bit signed or unsigned value\r
+#   and returns a 64-bit result\r
+#\r
+#------------------------------------------------------------------------------\r
+\r
+    .686:\r
+    .code:\r
+\r
+ASM_GLOBAL ASM_PFX(_mulll), ASM_PFX(MultS64x64)\r
+\r
+#------------------------------------------------------------------------------\r
+#\r
+# void __cdecl __mulll (void)\r
+#\r
+#------------------------------------------------------------------------------\r
+ASM_PFX(__mulll):\r
+    # Original local stack when calling __mulll\r
+    #               -----------------\r
+    #               |               |\r
+    #               |---------------|\r
+    #               |               |\r
+    #               |--Multiplier --|\r
+    #               |               |\r
+    #               |---------------|\r
+    #               |               |\r
+    #               |--Multiplicand-|\r
+    #               |               |\r
+    #               |---------------|\r
+    #               |  ReturnAddr** |\r
+    #       ESP---->|---------------|\r
+    #\r
+\r
+    #\r
+    # Set up the local stack for Multiplicand parameter\r
+    #\r
+    movl    16(%esp), %eax\r
+    push    %eax\r
+    movl    16(%esp), %eax\r
+    push    %eax\r
+\r
+    #\r
+    # Set up the local stack for Multiplier parameter\r
+    #\r
+    movl    16(%esp), %eax\r
+    push    %eax\r
+    movl    16(%esp), %eax\r
+    push    %eax\r
+\r
+    #\r
+    # Call native MulS64x64 of BaseLib\r
+    #\r
+    jmp     ASM_PFX(MultS64x64)\r
+\r
+    #\r
+    # Adjust stack\r
+    #\r
+    add     $16, %esp\r
+\r
+    ret     $16\r
diff --git a/CryptoPkg/Library/BaseCryptLib/SysCall/Ia32/MathMultS64x64.c b/CryptoPkg/Library/BaseCryptLib/SysCall/Ia32/MathMultS64x64.c
new file mode 100644 (file)
index 0000000..17a20bf
--- /dev/null
@@ -0,0 +1,79 @@
+/** @file\r
+  64-bit Math Worker Function.\r
+  The 32-bit versions of C compiler generate calls to library routines\r
+  to handle 64-bit math. These functions use non-standard calling conventions.\r
+  \r
+Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <Library/BaseLib.h>\r
+\r
+/*\r
+ * Multiplies a 64-bit signed or unsigned value by a 64-bit signed or unsigned value\r
+ * and returns a 64-bit result.\r
+ */\r
+__declspec(naked) void __cdecl _allmul (void)\r
+{\r
+  //\r
+  // Wrapper Implementation over EDKII MultS64x64() routine\r
+  //    INT64\r
+  //    EFIAPI\r
+  //    MultS64x64 (\r
+  //      IN      INT64      Multiplicand,\r
+  //      IN      INT64      Multiplier\r
+  //      )\r
+  //\r
+  _asm {\r
+    ; Original local stack when calling _allmul\r
+    ;               -----------------\r
+    ;               |               |\r
+    ;               |---------------|\r
+    ;               |               |\r
+    ;               |--Multiplier --|\r
+    ;               |               |\r
+    ;               |---------------|\r
+    ;               |               |\r
+    ;               |--Multiplicand-|\r
+    ;               |               |\r
+    ;               |---------------|\r
+    ;               |  ReturnAddr** |\r
+    ;       ESP---->|---------------|\r
+    ;\r
+\r
+    ;\r
+    ; Set up the local stack for Multiplicand parameter\r
+    ;\r
+    mov  eax, [esp + 16]\r
+    push eax\r
+    mov  eax, [esp + 16]\r
+    push eax\r
+\r
+    ;\r
+    ; Set up the local stack for Multiplier parameter\r
+    ;\r
+    mov  eax, [esp + 16]\r
+    push eax\r
+    mov  eax, [esp + 16]\r
+    push eax\r
+\r
+    ;\r
+    ; Call native MulS64x64 of BaseLib\r
+    ;\r
+    call MultS64x64\r
+\r
+    ;\r
+    ; Adjust stack\r
+    ;\r
+    add  esp, 16\r
+\r
+    ret  16\r
+  }\r
+} \r
diff --git a/CryptoPkg/Library/BaseCryptLib/SysCall/Ia32/MathRShiftU64.S b/CryptoPkg/Library/BaseCryptLib/SysCall/Ia32/MathRShiftU64.S
new file mode 100644 (file)
index 0000000..3a8a132
--- /dev/null
@@ -0,0 +1,66 @@
+#------------------------------------------------------------------------------\r
+#\r
+# Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+# This program and the accompanying materials\r
+# are licensed and made available under the terms and conditions of the BSD License\r
+# which accompanies this distribution.  The full text of the license may be found at\r
+# http://opensource.org/licenses/bsd-license.php.\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+# Module Name:\r
+#\r
+#   MathRShiftU64.S\r
+#\r
+# Abstract:\r
+#\r
+#   64-bit Math Worker Function.\r
+#   Shifts a 64-bit unsigned value right by a certain number of bits.\r
+#\r
+#------------------------------------------------------------------------------\r
+\r
+\r
+    .686:\r
+    .code:\r
+\r
+ASM_GLOBAL ASM_PFX(__ashrdi3)\r
+\r
+#------------------------------------------------------------------------------\r
+#\r
+# void __cdecl __ashrdi3 (void)\r
+#\r
+#------------------------------------------------------------------------------\r
+ASM_PFX(__ashrdi3):\r
+    #\r
+    # Checking: Only handle 64bit shifting or more\r
+    #\r
+    cmpb    $64, %cl\r
+    jae     _Exit\r
+\r
+    #\r
+    # Handle shifting between 0 and 31 bits\r
+    #\r
+    cmpb    $32, %cl\r
+    jae     More32\r
+    shrd    %cl, %edx, %eax\r
+    shr     %cl, %edx\r
+    ret\r
+\r
+    #\r
+    # Handle shifting of 32-63 bits\r
+    #\r
+More32:\r
+    movl    %edx, %eax\r
+    xor     %edx, %edx\r
+    and     $32, %cl\r
+    shr     %cl, %eax\r
+    ret\r
+\r
+    #\r
+    # Invalid number (less then 32bits), return 0\r
+    #\r
+_Exit:\r
+    xor     %eax, %eax\r
+    xor     %edx, %edx\r
+    ret\r
diff --git a/CryptoPkg/Library/BaseCryptLib/SysCall/Ia32/MathRShiftU64.c b/CryptoPkg/Library/BaseCryptLib/SysCall/Ia32/MathRShiftU64.c
new file mode 100644 (file)
index 0000000..b7224d6
--- /dev/null
@@ -0,0 +1,57 @@
+/** @file\r
+  64-bit Math Worker Function.\r
+  The 32-bit versions of C compiler generate calls to library routines\r
+  to handle 64-bit math. These functions use non-standard calling conventions.\r
+\r
+Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+\r
+/*\r
+ * Shifts a 64-bit unsigned value right by a certain number of bits.\r
+ */\r
+__declspec(naked) void __cdecl _aullshr (void)\r
+{\r
+  _asm {\r
+    ;\r
+    ; Checking: Only handle 64bit shifting or more\r
+    ;\r
+    cmp     cl, 64\r
+    jae     _Exit\r
+\r
+    ;\r
+    ; Handle shifting between 0 and 31 bits\r
+    ;\r
+    cmp     cl, 32\r
+    jae     More32\r
+    shrd    eax, edx, cl\r
+    shr     edx, cl\r
+    ret\r
+\r
+    ;\r
+    ; Handle shifting of 32-63 bits\r
+    ;\r
+More32:\r
+    mov     eax, edx\r
+    xor     edx, edx\r
+    and     cl, 31\r
+    shr     eax, cl\r
+    ret\r
+\r
+    ;\r
+    ; Invalid number (less then 32bits), return 0\r
+    ;\r
+_Exit:\r
+    xor     eax, eax\r
+    xor     edx, edx\r
+    ret\r
+  }\r
+}\r
diff --git a/CryptoPkg/Library/BaseCryptLib/SysCall/Ia32/MathReminderU64x64.S b/CryptoPkg/Library/BaseCryptLib/SysCall/Ia32/MathReminderU64x64.S
new file mode 100644 (file)
index 0000000..7c1f971
--- /dev/null
@@ -0,0 +1,89 @@
+#------------------------------------------------------------------------------\r
+#\r
+# Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+# This program and the accompanying materials\r
+# are licensed and made available under the terms and conditions of the BSD License\r
+# which accompanies this distribution.  The full text of the license may be found at\r
+# http://opensource.org/licenses/bsd-license.php.\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+# Module Name:\r
+#\r
+#   MathReminderU64x64.S\r
+#\r
+# Abstract:\r
+#\r
+#   64-bit Math Worker Function.\r
+#   Divides a 64-bit unsigned value by another 64-bit unsigned value and returns\r
+#   the 64-bit unsigned remainder\r
+#\r
+#------------------------------------------------------------------------------\r
+\r
+    .686:\r
+    .code:\r
+\r
+ASM_GLOBAL ASM_PFX(__umoddi3), ASM_PFX(DivU64x64Remainder)\r
+\r
+#------------------------------------------------------------------------------\r
+#\r
+# void __cdecl __umoddi3 (void)\r
+#\r
+#------------------------------------------------------------------------------\r
+ASM_PFX(__umoddi3):\r
+    # Original local stack when calling __umoddi3\r
+    #               -----------------\r
+    #               |               |\r
+    #               |---------------|\r
+    #               |               |\r
+    #               |--  Divisor  --|\r
+    #               |               |\r
+    #               |---------------|\r
+    #               |               |\r
+    #               |--  Dividend --|\r
+    #               |               |\r
+    #               |---------------|\r
+    #               |  ReturnAddr** |\r
+    #       ESP---->|---------------|\r
+    #\r
+\r
+    #\r
+    # Set up the local stack for Reminder pointer\r
+    #\r
+    sub     $8, %esp\r
+    push    %esp\r
+\r
+    #\r
+    # Set up the local stack for Divisor parameter\r
+    #\r
+    movl    28(%esp), %eax\r
+    push    %eax\r
+    movl    28(%esp), %eax\r
+    push    %eax\r
+\r
+    #\r
+    # Set up the local stack for Dividend parameter\r
+    #\r
+    movl    28(%esp), %eax\r
+    push    %eax\r
+    movl    28(%esp), %eax\r
+    push    %eax\r
+\r
+    #\r
+    # Call native DivU64x64Remainder of BaseLib\r
+    #\r
+    jmp     ASM_PFX(DivU64x64Remainder)\r
+\r
+    #\r
+    # Put the Reminder in EDX:EAX as return value\r
+    #\r
+    movl    20(%esp), %eax\r
+    movl    24(%esp), %edx\r
+\r
+    #\r
+    # Adjust stack\r
+    #\r
+    add     $28, %esp\r
+    \r
+    ret     $16\r
diff --git a/CryptoPkg/Library/BaseCryptLib/SysCall/Ia32/MathReminderU64x64.c b/CryptoPkg/Library/BaseCryptLib/SysCall/Ia32/MathReminderU64x64.c
new file mode 100644 (file)
index 0000000..be70770
--- /dev/null
@@ -0,0 +1,93 @@
+/** @file\r
+  64-bit Math Worker Function.\r
+  The 32-bit versions of C compiler generate calls to library routines\r
+  to handle 64-bit math. These functions use non-standard calling conventions.\r
+\r
+Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <Library/BaseLib.h>\r
+\r
+\r
+/*\r
+ * Divides a 64-bit unsigned value by another 64-bit unsigned value and returns\r
+ * the 64-bit unsigned remainder.\r
+ */\r
+__declspec(naked) void __cdecl _aullrem(void)\r
+{\r
+  //\r
+  // Wrapper Implementation over EDKII DivU64x64Remainder() routine\r
+  //    UINT64\r
+  //    EFIAPI\r
+  //    DivU64x64Remainder (\r
+  //      IN      UINT64     Dividend,\r
+  //      IN      UINT64     Divisor,\r
+  //      OUT     UINT64     *Remainder  OPTIONAL\r
+  //      )\r
+  //\r
+  _asm {\r
+    ; Original local stack when calling _aullrem\r
+    ;               -----------------\r
+    ;               |               |\r
+    ;               |---------------|\r
+    ;               |               |\r
+    ;               |--  Divisor  --|\r
+    ;               |               |\r
+    ;               |---------------|\r
+    ;               |               |\r
+    ;               |--  Dividend --|\r
+    ;               |               |\r
+    ;               |---------------|\r
+    ;               |  ReturnAddr** |\r
+    ;       ESP---->|---------------|\r
+    ;\r
+\r
+    ;\r
+    ; Set up the local stack for Reminder pointer\r
+    ;\r
+    sub  esp, 8\r
+    push esp\r
+\r
+    ;\r
+    ; Set up the local stack for Divisor parameter\r
+    ;\r
+    mov  eax, [esp + 28]\r
+    push eax\r
+    mov  eax, [esp + 28]\r
+    push eax\r
+\r
+    ;\r
+    ; Set up the local stack for Dividend parameter\r
+    ;\r
+    mov  eax, [esp + 28]\r
+    push eax\r
+    mov  eax, [esp + 28]\r
+    push eax\r
+\r
+    ;\r
+    ; Call native DivU64x64Remainder of BaseLib\r
+    ;\r
+    call DivU64x64Remainder\r
+\r
+    ;\r
+    ; Put the Reminder in EDX:EAX as return value\r
+    ;\r
+    mov  eax, [esp + 20]\r
+    mov  edx, [esp + 24]\r
+\r
+    ;\r
+    ; Adjust stack\r
+    ;\r
+    add  esp, 28\r
+\r
+    ret  16\r
+  }\r
+}\r
diff --git a/CryptoPkg/Library/BaseCryptLib/SysCall/RuntimeMemAllocation.c b/CryptoPkg/Library/BaseCryptLib/SysCall/RuntimeMemAllocation.c
new file mode 100644 (file)
index 0000000..f615ae8
--- /dev/null
@@ -0,0 +1,438 @@
+/** @file\r
+  Light-weight Memory Management Routines for OpenSSL-based Crypto\r
+  Library at Runtime Phase.\r
+\r
+Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <OpenSslSupport.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+#include <Library/UefiRuntimeLib.h>\r
+#include <Guid/EventGroup.h>\r
+\r
+//----------------------------------------------------------------\r
+// Initial version. Needs further optimizations.\r
+//----------------------------------------------------------------\r
+\r
+//\r
+// Definitions for Runtime Memory Operations\r
+//\r
+#define RT_PAGE_SIZE                0x200\r
+#define RT_PAGE_MASK                0x1FF\r
+#define RT_PAGE_SHIFT               9\r
+\r
+#define RT_SIZE_TO_PAGES(a)         (((a) >> RT_PAGE_SHIFT) + (((a) & RT_PAGE_MASK) ? 1 : 0))\r
+#define RT_PAGES_TO_SIZE(a)         ((a) << RT_PAGE_SHIFT)\r
+\r
+//\r
+// Page Flag Definitions\r
+//\r
+#define RT_PAGE_FREE                0x00000000\r
+#define RT_PAGE_USED                0x00000001\r
+\r
+#define MIN_REQUIRED_BLOCKS         24\r
+\r
+//\r
+// Memory Page Table\r
+//\r
+typedef struct {\r
+  UINTN   StartPageOffset;      // Offset of the starting page allocated.\r
+                                // Only available for USED pages.\r
+  UINT32  PageFlag;             // Page Attributes.\r
+} RT_MEMORY_PAGE_ENTRY;\r
+\r
+typedef struct {\r
+  UINTN                 PageCount;\r
+  UINTN                 LastEmptyPageOffset;\r
+  UINT8                 *DataAreaBase;         // Pointer to data Area.\r
+  RT_MEMORY_PAGE_ENTRY  Pages[1];              // Page Table Entries.\r
+} RT_MEMORY_PAGE_TABLE;\r
+\r
+//\r
+// Global Page Table for Runtime Cryptographic Provider.\r
+//\r
+RT_MEMORY_PAGE_TABLE  *mRTPageTable = NULL;\r
+\r
+//\r
+// Event for Runtime Address Conversion.\r
+//\r
+EFI_EVENT             mVirtualAddressChangeEvent;\r
+\r
+\r
+/**\r
+  Initializes pre-allocated memory pointed by ScratchBuffer for subsequent\r
+  runtime use.\r
+\r
+  @param[in, out]  ScratchBuffer      Pointer to user-supplied memory buffer.\r
+  @param[in]       ScratchBufferSize  Size of supplied buffer in bytes.\r
+\r
+  @retval EFI_SUCCESS  Successful initialization.\r
+\r
+**/\r
+EFI_STATUS\r
+InitializeScratchMemory (\r
+  IN OUT  UINT8  *ScratchBuffer,\r
+  IN      UINTN  ScratchBufferSize\r
+  )\r
+{\r
+  UINTN  Index;\r
+  UINTN  MemorySize;\r
+\r
+  //\r
+  // Parameters Checking\r
+  //\r
+  if (ScratchBuffer == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  if (ScratchBufferSize < MIN_REQUIRED_BLOCKS * 1024) {\r
+    return EFI_BUFFER_TOO_SMALL;\r
+  }\r
+\r
+  mRTPageTable = (RT_MEMORY_PAGE_TABLE *)ScratchBuffer;\r
+\r
+  //\r
+  // Initialize Internal Page Table for Memory Management\r
+  //\r
+  SetMem (mRTPageTable, ScratchBufferSize, 0xFF);\r
+  MemorySize = ScratchBufferSize - sizeof (RT_MEMORY_PAGE_TABLE) + sizeof (RT_MEMORY_PAGE_ENTRY);\r
+\r
+  mRTPageTable->PageCount           = MemorySize / (RT_PAGE_SIZE + sizeof (RT_MEMORY_PAGE_ENTRY));\r
+  mRTPageTable->LastEmptyPageOffset = 0x0;\r
+\r
+  for (Index = 0; Index < mRTPageTable->PageCount; Index++) {\r
+    mRTPageTable->Pages[Index].PageFlag        = RT_PAGE_FREE;\r
+    mRTPageTable->Pages[Index].StartPageOffset = 0;\r
+  }\r
+\r
+  mRTPageTable->DataAreaBase = ScratchBuffer + sizeof (RT_MEMORY_PAGE_TABLE) +\r
+                               (mRTPageTable->PageCount - 1) * sizeof (RT_MEMORY_PAGE_ENTRY);\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+\r
+/**\r
+  Look-up Free memory Region for object allocation.\r
+\r
+  @param[in]  AllocationSize  Bytes to be allocated.\r
+\r
+  @return  Return available page offset for object allocation.\r
+\r
+**/\r
+UINTN\r
+LookupFreeMemRegion (\r
+  IN  UINTN  AllocationSize\r
+  )\r
+{\r
+  UINTN  StartPageIndex;\r
+  UINTN  Index;\r
+  UINTN  SubIndex;\r
+  UINTN  ReqPages;\r
+\r
+  StartPageIndex = RT_SIZE_TO_PAGES (mRTPageTable->LastEmptyPageOffset);\r
+  ReqPages       = RT_SIZE_TO_PAGES (AllocationSize);\r
+\r
+  //\r
+  // Look up the free memory region with in current memory map table.\r
+  //\r
+  for (Index = StartPageIndex; Index <= (mRTPageTable->PageCount - ReqPages); ) {\r
+    //\r
+    // Check consecutive ReqPages pages.\r
+    //\r
+    for (SubIndex = 0; SubIndex < ReqPages; SubIndex++) {\r
+      if ((mRTPageTable->Pages[SubIndex + Index].PageFlag & RT_PAGE_USED) != 0) {\r
+        break;\r
+      }\r
+    }\r
+\r
+    if (SubIndex == ReqPages) {\r
+      //\r
+      // Succeed! Return the Starting Offset.\r
+      //\r
+      return RT_PAGES_TO_SIZE (Index);\r
+    }\r
+\r
+    //\r
+    // Failed! Skip current free memory pages and adjacent Used pages\r
+    //\r
+    while ((mRTPageTable->Pages[SubIndex + Index].PageFlag & RT_PAGE_USED) != 0) {\r
+      SubIndex++;\r
+    }\r
+\r
+    Index += SubIndex;\r
+  }\r
+\r
+  //\r
+  // Look up the free memory region from the beginning of the memory table\r
+  // until the StartCursorOffset\r
+  //\r
+  for (Index = 0; Index < (StartPageIndex - ReqPages); ) {\r
+    //\r
+    // Check Consecutive ReqPages Pages.\r
+    //\r
+    for (SubIndex = 0; SubIndex < ReqPages; SubIndex++) {\r
+      if ((mRTPageTable->Pages[SubIndex + Index].PageFlag & RT_PAGE_USED) != 0) {\r
+        break;\r
+      }\r
+    }\r
+\r
+    if (SubIndex == ReqPages) {\r
+      //\r
+      // Succeed! Return the Starting Offset.\r
+      //\r
+      return RT_PAGES_TO_SIZE (Index);\r
+    }\r
+\r
+    //\r
+    // Failed! Skip current adjacent Used pages\r
+    //\r
+    while ((SubIndex < (StartPageIndex - ReqPages)) &&\r
+           ((mRTPageTable->Pages[SubIndex + Index].PageFlag & RT_PAGE_USED) != 0)) {\r
+      SubIndex++;\r
+    }\r
+\r
+    Index += SubIndex;\r
+  }\r
+\r
+  //\r
+  // No availabe region for object allocation!\r
+  //\r
+  return (UINTN)(-1);\r
+}\r
+\r
+\r
+/**\r
+  Allocates a buffer at runtime phase.\r
+\r
+  @param[in]  AllocationSize    Bytes to be allocated.\r
+\r
+  @return  A pointer to the allocated buffer or NULL if allocation fails.\r
+\r
+**/\r
+VOID *\r
+RuntimeAllocateMem (\r
+  IN  UINTN  AllocationSize\r
+  )\r
+{\r
+  UINT8  *AllocPtr;\r
+  UINTN  ReqPages;\r
+  UINTN  Index;\r
+  UINTN  StartPage;\r
+  UINTN  AllocOffset;\r
+\r
+  AllocPtr = NULL;\r
+  ReqPages = 0;\r
+\r
+  //\r
+  // Look for available consecutive memory region starting from LastEmptyPageOffset.\r
+  // If no proper memory region found, look up from the beginning.\r
+  // If still not found, return NULL to indicate failed allocation.\r
+  //\r
+  AllocOffset = LookupFreeMemRegion (AllocationSize);\r
+  if (AllocOffset == (UINTN)(-1)) {\r
+    return NULL;\r
+  }\r
+\r
+  //\r
+  // Allocates consecutive memory pages with length of Size. Update the page\r
+  // table status. Returns the starting address.\r
+  //\r
+  ReqPages  = RT_SIZE_TO_PAGES (AllocationSize);\r
+  AllocPtr  = mRTPageTable->DataAreaBase + AllocOffset;\r
+  StartPage = RT_SIZE_TO_PAGES (AllocOffset);\r
+  Index     = 0;\r
+  while (Index < ReqPages) {\r
+    mRTPageTable->Pages[StartPage + Index].PageFlag       |= RT_PAGE_USED;\r
+    mRTPageTable->Pages[StartPage + Index].StartPageOffset = AllocOffset;\r
+\r
+    Index++;\r
+  }\r
+\r
+  mRTPageTable->LastEmptyPageOffset = AllocOffset + RT_PAGES_TO_SIZE (ReqPages);\r
+\r
+  ZeroMem (AllocPtr, AllocationSize);\r
+\r
+  //\r
+  // Returns a void pointer to the allocated space\r
+  //\r
+  return AllocPtr;\r
+}\r
+\r
+\r
+/**\r
+  Frees a buffer that was previously allocated at runtime phase.\r
+\r
+  @param[in]  Buffer  Pointer to the buffer to free.\r
+\r
+**/\r
+VOID\r
+RuntimeFreeMem (\r
+  IN  VOID  *Buffer\r
+  )\r
+{\r
+  UINTN  StartOffset;\r
+  UINTN  StartPageIndex;\r
+\r
+  StartOffset    = (UINTN) ((UINT8 *)Buffer - mRTPageTable->DataAreaBase);\r
+  StartPageIndex = RT_SIZE_TO_PAGES (mRTPageTable->Pages[RT_SIZE_TO_PAGES(StartOffset)].StartPageOffset);\r
+\r
+  while (StartPageIndex < mRTPageTable->PageCount) {\r
+    if (((mRTPageTable->Pages[StartPageIndex].PageFlag & RT_PAGE_USED) != 0) &&\r
+        (mRTPageTable->Pages[StartPageIndex].StartPageOffset == StartOffset)) {\r
+        //\r
+        // Free this page\r
+        //\r
+        mRTPageTable->Pages[StartPageIndex].PageFlag       &= ~RT_PAGE_USED;\r
+        mRTPageTable->Pages[StartPageIndex].PageFlag       |= RT_PAGE_FREE;\r
+        mRTPageTable->Pages[StartPageIndex].StartPageOffset = 0;\r
+\r
+        StartPageIndex++;\r
+    } else {\r
+      break;\r
+    }\r
+  }\r
+\r
+  return;\r
+}\r
+\r
+\r
+/**\r
+  Notification function of EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE.\r
+\r
+  This is a notification function registered on EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE\r
+  event. It converts a pointer to a new virtual address.\r
+\r
+  @param[in]  Event      The event whose notification function is being invoked.\r
+  @param[in]  Context    The pointer to the notification function's context.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+RuntimeCryptLibAddressChangeEvent (\r
+  IN  EFI_EVENT        Event,\r
+  IN  VOID             *Context\r
+  )\r
+{\r
+  //\r
+  // Converts a pointer for runtime memory management to a new virtual address.\r
+  //\r
+  EfiConvertPointer (0x0, (VOID **) &mRTPageTable->DataAreaBase);\r
+  EfiConvertPointer (0x0, (VOID **) &mRTPageTable);\r
+}\r
+\r
+\r
+/**\r
+  Constructor routine for runtime crypt library instance.\r
+\r
+  The constructor function pre-allocates space for runtime cryptographic operation.\r
+\r
+  @param  ImageHandle   The firmware allocated handle for the EFI image.\r
+  @param  SystemTable   A pointer to the EFI System Table.\r
+\r
+  @retval EFI_SUCCESS          The construction succeeded.\r
+  @retval EFI_OUT_OF_RESOURCE  Failed to allocate memory.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+RuntimeCryptLibConstructor (\r
+  IN EFI_HANDLE        ImageHandle,\r
+  IN EFI_SYSTEM_TABLE  *SystemTable\r
+  )\r
+{\r
+  EFI_STATUS  Status;\r
+  VOID        *Buffer;\r
+\r
+  //\r
+  // Pre-allocates runtime space for possible cryptographic operations\r
+  //\r
+  Buffer = AllocateRuntimePool (MIN_REQUIRED_BLOCKS * 1024);\r
+  Status = InitializeScratchMemory (Buffer, MIN_REQUIRED_BLOCKS * 1024);\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  //\r
+  // Create address change event\r
+  //\r
+  Status = gBS->CreateEventEx (\r
+                  EVT_NOTIFY_SIGNAL,\r
+                  TPL_NOTIFY,\r
+                  RuntimeCryptLibAddressChangeEvent,\r
+                  NULL,\r
+                  &gEfiEventVirtualAddressChangeGuid,\r
+                  &mVirtualAddressChangeEvent\r
+                  );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  return Status;\r
+}\r
+\r
+\r
+//\r
+// -- Memory-Allocation Routines Wrapper for UEFI-OpenSSL Library --\r
+//\r
+\r
+/* Allocates memory blocks */\r
+void *malloc (size_t size)\r
+{\r
+  return RuntimeAllocateMem ((UINTN)size);\r
+}\r
+\r
+/* Reallocate memory blocks */\r
+void *realloc (void *ptr, size_t size)\r
+{\r
+  VOID   *NewPtr;\r
+  UINTN  StartOffset;\r
+  UINTN  StartPageIndex;\r
+  UINTN  PageCount;\r
+\r
+  //\r
+  // Get Original Size of ptr\r
+  //\r
+  StartOffset    = (UINTN) ((UINT8 *)ptr - mRTPageTable->DataAreaBase);\r
+  StartPageIndex = RT_SIZE_TO_PAGES (mRTPageTable->Pages[RT_SIZE_TO_PAGES (StartOffset)].StartPageOffset);\r
+  PageCount      = 0;\r
+  while (StartPageIndex < mRTPageTable->PageCount) {\r
+    if (((mRTPageTable->Pages[StartPageIndex].PageFlag & RT_PAGE_USED) != 0) &&\r
+        (mRTPageTable->Pages[StartPageIndex].StartPageOffset == StartOffset)) {\r
+        StartPageIndex++;\r
+        PageCount++;\r
+    } else {\r
+      break;\r
+    }\r
+  }\r
+\r
+  if (size <= RT_PAGES_TO_SIZE (PageCount)) {\r
+    //\r
+    // Return the original pointer, if Caller try to reduce region size;\r
+    //\r
+    return ptr;\r
+  }\r
+\r
+  NewPtr = RuntimeAllocateMem ((UINTN) size);\r
+  if (NewPtr == NULL) {\r
+    return NULL;\r
+  }\r
+\r
+  CopyMem (NewPtr, ptr, RT_PAGES_TO_SIZE (PageCount));\r
+\r
+  RuntimeFreeMem (ptr);\r
+\r
+  return NewPtr;\r
+}\r
+\r
+/* Deallocates or frees a memory block */\r
+void free (void *ptr)\r
+{\r
+  RuntimeFreeMem (ptr);\r
+}\r
diff --git a/CryptoPkg/Library/BaseCryptLib/SysCall/TimerWrapper.c b/CryptoPkg/Library/BaseCryptLib/SysCall/TimerWrapper.c
new file mode 100644 (file)
index 0000000..20928e1
--- /dev/null
@@ -0,0 +1,102 @@
+/** @file\r
+  C Run-Time Libraries (CRT) Time Management Routines Wrapper Implementation\r
+  for OpenSSL-based Cryptographic Library (used in DXE & RUNTIME).\r
+\r
+Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <Uefi.h>\r
+#include <OpenSslSupport.h>\r
+#include <Library/UefiRuntimeServicesTableLib.h>\r
+\r
+//\r
+// -- Time Management Routines --\r
+//\r
+\r
+#define IsLeap(y)   (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0))\r
+#define SECSPERHOUR (60 * 60)\r
+#define SECSPERDAY  (24 * SECSPERHOUR)\r
+\r
+//\r
+//  The arrays give the cumulative number of days up to the first of the\r
+//  month number used as the index (1 -> 12) for regular and leap years.\r
+//  The value at index 13 is for the whole year.\r
+//\r
+UINTN CumulativeDays[2][14] = {\r
+  {\r
+    0,\r
+    0,\r
+    31,\r
+    31 + 28,\r
+    31 + 28 + 31,\r
+    31 + 28 + 31 + 30,\r
+    31 + 28 + 31 + 30 + 31,\r
+    31 + 28 + 31 + 30 + 31 + 30,\r
+    31 + 28 + 31 + 30 + 31 + 30 + 31,\r
+    31 + 28 + 31 + 30 + 31 + 30 + 31 + 31,\r
+    31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30,\r
+    31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31,\r
+    31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30,\r
+    31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31\r
+  },\r
+  {\r
+    0,\r
+    0,\r
+    31,\r
+    31 + 29,\r
+    31 + 29 + 31,\r
+    31 + 29 + 31 + 30,\r
+    31 + 29 + 31 + 30 + 31,\r
+    31 + 29 + 31 + 30 + 31 + 30,\r
+    31 + 29 + 31 + 30 + 31 + 30 + 31,\r
+    31 + 29 + 31 + 30 + 31 + 30 + 31 + 31,\r
+    31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30,\r
+    31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31,\r
+    31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30,\r
+    31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31 \r
+  }\r
+};\r
+\r
+/* Get the system time as seconds elapsed since midnight, January 1, 1970. */\r
+//INTN time(\r
+//  INTN *timer\r
+//  )\r
+time_t time (time_t *timer)\r
+{\r
+  EFI_TIME  Time;\r
+  UINTN     Year;\r
+\r
+  //\r
+  // Get the current time and date information\r
+  //\r
+  gRT->GetTime (&Time, NULL);\r
+\r
+  //\r
+  // Years Handling\r
+  // UTime should now be set to 00:00:00 on Jan 1 of the current year.\r
+  //\r
+  for (Year = 1970, *timer = 0; Year != Time.Year; Year++) {\r
+    *timer = *timer + (time_t)(CumulativeDays[IsLeap(Year)][13] * SECSPERDAY);\r
+  }\r
+\r
+  //\r
+  // Add in number of seconds for current Month, Day, Hour, Minute, Seconds, and TimeZone adjustment\r
+  //\r
+  *timer = *timer + \r
+           (time_t)((Time.TimeZone != EFI_UNSPECIFIED_TIMEZONE) ? (Time.TimeZone * 60) : 0) +\r
+           (time_t)(CumulativeDays[IsLeap(Time.Year)][Time.Month] * SECSPERDAY) + \r
+           (time_t)(((Time.Day > 0) ? Time.Day - 1 : 0) * SECSPERDAY) + \r
+           (time_t)(Time.Hour * SECSPERHOUR) + \r
+           (time_t)(Time.Minute * 60) + \r
+           (time_t)Time.Second;\r
+\r
+  return *timer;\r
+}\r
diff --git a/CryptoPkg/Library/BaseCryptLibRuntimeCryptProtocol/BaseCryptLibRuntimeCryptProtocol.inf b/CryptoPkg/Library/BaseCryptLibRuntimeCryptProtocol/BaseCryptLibRuntimeCryptProtocol.inf
new file mode 100644 (file)
index 0000000..0f1b0eb
--- /dev/null
@@ -0,0 +1,49 @@
+## @file\r
+#  Cryptographic Library Instance based on Runtime Crypt Protocol.\r
+#  This instance will be only used by the Authenticated Variable driver for IPF.\r
+#\r
+#  Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+#  This program and the accompanying materials\r
+#  are licensed and made available under the terms and conditions of the BSD License\r
+#  which accompanies this distribution.  The full text of the license may be found at\r
+#  http://opensource.org/licenses/bsd-license.php\r
+#  \r
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#  \r
+##\r
+\r
+[Defines]\r
+  INF_VERSION                    = 0x00010005\r
+  BASE_NAME                      = BaseCryptLibRuntimeCryptProtocol\r
+  FILE_GUID                      = BBB31581-855A-44D7-A550-8A585D9B2DE9\r
+  MODULE_TYPE                    = DXE_RUNTIME_DRIVER\r
+  VERSION_STRING                 = 1.0\r
+  LIBRARY_CLASS                  = BaseCryptLib|DXE_RUNTIME_DRIVER DXE_SAL_DRIVER\r
+  CONSTRUCTOR                    = RuntimeDxeIpfCryptLibConstructor\r
+  DESTRUCTOR                     = RuntimeDxeIpfCryptLibDestructor\r
+#\r
+# The following information is for reference only and not required by the build tools.\r
+#\r
+#  VALID_ARCHITECTURES           = IPF\r
+#\r
+\r
+[Sources]\r
+  RuntimeDxeIpfCryptLib.c\r
+\r
+[Packages]\r
+  MdePkg/MdePkg.dec\r
+  CryptoPkg/CryptoPkg.dec\r
+\r
+[LibraryClasses]\r
+  BaseLib\r
+  DebugLib\r
+\r
+[Guids]\r
+  gEfiEventVirtualAddressChangeGuid      ## CONSUMES ## Event\r
+\r
+[Protocols]\r
+  gEfiRuntimeCryptProtocolGuid           ## CONSUMES\r
+\r
+[Depex]\r
+  gEfiRuntimeCryptProtocolGuid\r
diff --git a/CryptoPkg/Library/BaseCryptLibRuntimeCryptProtocol/RuntimeDxeIpfCryptLib.c b/CryptoPkg/Library/BaseCryptLibRuntimeCryptProtocol/RuntimeDxeIpfCryptLib.c
new file mode 100644 (file)
index 0000000..7f893b9
--- /dev/null
@@ -0,0 +1,390 @@
+/** @file\r
+  Implementation of The runtime cryptographic library instance (for IPF).\r
+\r
+Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <Uefi.h>\r
+\r
+#include <Library/BaseLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+#include <Library/UefiRuntimeLib.h>\r
+\r
+#include <Protocol/RuntimeCrypt.h>\r
+\r
+#include <Guid/EventGroup.h>\r
+\r
+EFI_RUNTIME_CRYPT_PROTOCOL  *mCryptProtocol = NULL;\r
+EFI_EVENT                   mIpfCryptLibVirtualNotifyEvent;\r
+\r
+/**\r
+  Notification function of EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE, which converts\r
+  pointer to new virtual address.\r
+\r
+  @param  Event        Event whose notification function is being invoked.\r
+  @param  Context      Pointer to the notification function's context\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+IpfCryptLibAddressChangeEvent (\r
+  IN  EFI_EVENT        Event,\r
+  IN  VOID             *Context\r
+  )\r
+{\r
+  //\r
+  // Convert Address of Runtime Crypto Protocol.\r
+  //\r
+  EfiConvertPointer (0x0, (VOID **) &mCryptProtocol);\r
+}\r
+\r
+/**\r
+  Constructor of IPF Crypto Library Instance.\r
+  This function locates the Runtime Crypt Protocol and register notification\r
+  function for EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE event.\r
+\r
+  @param  ImageHandle   The firmware allocated handle for the EFI image.\r
+  @param  SystemTable   A pointer to the EFI System Table.\r
+\r
+  @retval EFI_SUCCESS   The constructor always returns EFI_SUCCESS.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+RuntimeDxeIpfCryptLibConstructor (\r
+  IN      EFI_HANDLE                ImageHandle,\r
+  IN      EFI_SYSTEM_TABLE          *SystemTable\r
+  )\r
+{\r
+  EFI_STATUS  Status;\r
+\r
+  //\r
+  // Locate Runtime Crypt Protocol Instance\r
+  //\r
+  Status = gBS->LocateProtocol (\r
+                  &gEfiRuntimeCryptProtocolGuid,\r
+                  NULL,\r
+                  (VOID**) &mCryptProtocol\r
+                  );\r
+  ASSERT_EFI_ERROR (Status);\r
+  ASSERT (mCryptProtocol != NULL);\r
+\r
+  //\r
+  // Register SetVirtualAddressMap () notify function\r
+  //\r
+  Status = gBS->CreateEventEx (\r
+                  EVT_NOTIFY_SIGNAL,\r
+                  TPL_NOTIFY,\r
+                  IpfCryptLibAddressChangeEvent,\r
+                  NULL,\r
+                  &gEfiEventVirtualAddressChangeGuid,\r
+                  &mIpfCryptLibVirtualNotifyEvent\r
+                  );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  return Status;\r
+}\r
+\r
+/**\r
+  Destructor of IPF Crypto Library Instance.\r
+\r
+  @param  ImageHandle   The firmware allocated handle for the EFI image.\r
+  @param  SystemTable   A pointer to the EFI System Table.\r
+\r
+  @retval EFI_SUCCESS   The destructor completed successfully.\r
+  @retval Other value   The destructor did not complete successfully.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+RuntimeDxeIpfCryptLibDestructor (\r
+  IN EFI_HANDLE        ImageHandle,\r
+  IN EFI_SYSTEM_TABLE  *SystemTable\r
+  )\r
+{\r
+  EFI_STATUS  Status;\r
+\r
+  //\r
+  // Close the Set Virtual Address Map event\r
+  //\r
+  Status = gBS->CloseEvent (mIpfCryptLibVirtualNotifyEvent);\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  return Status;\r
+}\r
+\r
+/**\r
+  Check whether crypto service provided by Runtime Crypt protocol is ready to use.\r
+\r
+  Crypto service is available if the call is in physical mode prior to\r
+  SetVirtualAddressMap() or virtual mode after SetVirtualAddressMap(). If either\r
+  of these two conditions are met, this routine will return TRUE; if neither of\r
+  these conditions are met, this routine will return FALSE.\r
+\r
+  @retval TRUE   The Crypto service is ready to use.\r
+  @retval FALSE  The Crypto service is not available.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+InternalIsCryptServiveAvailable (\r
+  VOID\r
+  )\r
+{\r
+  INT64    CpuMode;\r
+  BOOLEAN  GoneVirtual;\r
+\r
+  CpuMode = AsmCpuVirtual();\r
+  if (CpuMode < 0) {\r
+    //\r
+    // CPU is in mixed mode, return failing the operation gracefully.\r
+    //\r
+    return FALSE;\r
+  }\r
+\r
+  GoneVirtual = EfiGoneVirtual();\r
+\r
+  if ((CpuMode > 0) && !GoneVirtual) {\r
+    //\r
+    // CPU is in virtual mode, but SetVirtualAddressMap() has not been called,\r
+    // so return failing the operation gracefully.\r
+    //\r
+    return FALSE;\r
+  }\r
+\r
+  if ((CpuMode == 0) && GoneVirtual) {\r
+    //\r
+    // CPU is in physical mode, but SetVirtualAddressMap() has been called,\r
+    // so return failing the operation gracefully.\r
+    //\r
+    return FALSE;\r
+  }\r
+\r
+  return TRUE;\r
+}\r
+\r
+/**\r
+  Retrieves the size, in bytes, of the context buffer required for SHA-256 operations.\r
+\r
+  @return  The size, in bytes, of the context buffer required for SHA-256 operations.\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+Sha256GetContextSize (\r
+  VOID\r
+  )\r
+{\r
+  if (!InternalIsCryptServiveAvailable ()) {\r
+    return 0;\r
+  }\r
+\r
+  return mCryptProtocol->Sha256GetContextSize ();\r
+}\r
+\r
+/**\r
+  Initializes user-supplied memory pointed by Sha256Context as SHA-256 hash context for\r
+  subsequent use.\r
+\r
+  If Sha256Context is NULL, then ASSERT().\r
+\r
+  @param[in, out]  Sha256Context  Pointer to SHA-256 Context being initialized.\r
+\r
+  @retval TRUE   SHA-256 context initialization succeeded.\r
+  @retval FALSE  SHA-256 context initialization failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+Sha256Init (\r
+  IN OUT  VOID  *Sha256Context\r
+  )\r
+{\r
+  if (!InternalIsCryptServiveAvailable ()) {\r
+    return FALSE;\r
+  }\r
+\r
+  return mCryptProtocol->Sha256Init (Sha256Context);\r
+}\r
+\r
+\r
+/**\r
+  Performs SHA-256 digest on a data buffer of the specified length. This function can\r
+  be called multiple times to compute the digest of long or discontinuous data streams.\r
+\r
+  If Sha256Context is NULL, then ASSERT().\r
+\r
+  @param[in, out]  Sha256Context  Pointer to the SHA-256 context.\r
+  @param[in]       Data           Pointer to the buffer containing the data to be hashed.\r
+  @param[in]       DataLength     Length of Data buffer in bytes.\r
+\r
+  @retval TRUE   SHA-256 data digest succeeded.\r
+  @retval FALSE  Invalid SHA-256 context. After Sha256Final function has been called, the\r
+                 SHA-256 context cannot be reused.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+Sha256Update (\r
+  IN OUT  VOID        *Sha256Context,\r
+  IN      CONST VOID  *Data,\r
+  IN      UINTN       DataLength\r
+  )\r
+{\r
+  if (!InternalIsCryptServiveAvailable ()) {\r
+    return FALSE;\r
+  }\r
+\r
+  return mCryptProtocol->Sha256Update (Sha256Context, Data, DataLength);\r
+}\r
+\r
+/**\r
+  Completes SHA-256 hash computation and retrieves the digest value into the specified\r
+  memory. After this function has been called, the SHA-256 context cannot be used again.\r
+\r
+  If Sha256Context is NULL, then ASSERT().\r
+  If HashValue is NULL, then ASSERT().\r
+\r
+  @param[in, out]  Sha256Context  Pointer to SHA-256 context\r
+  @param[out]      HashValue      Pointer to a buffer that receives the SHA-256 digest\r
+                                  value (32 bytes).\r
+\r
+  @retval TRUE   SHA-256 digest computation succeeded.\r
+  @retval FALSE  SHA-256 digest computation failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+Sha256Final (\r
+  IN OUT  VOID   *Sha256Context,\r
+  OUT     UINT8  *HashValue\r
+  )\r
+{\r
+  if (!InternalIsCryptServiveAvailable ()) {\r
+    return FALSE;\r
+  }\r
+\r
+  return mCryptProtocol->Sha256Final (Sha256Context, HashValue);\r
+}\r
+\r
+/**\r
+  Allocates and Initializes one RSA Context for subsequent use.\r
+\r
+  @return  Pointer to the RSA Context that has been initialized.\r
+           If the allocations fails, RsaNew() returns NULL.\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+RsaNew (\r
+  VOID\r
+  )\r
+{\r
+  if (!InternalIsCryptServiveAvailable ()) {\r
+    return FALSE;\r
+  }\r
+\r
+  return mCryptProtocol->RsaNew ();\r
+}\r
+\r
+/**\r
+  Release the specified RSA Context.\r
+\r
+  @param[in]  RsaContext  Pointer to the RSA context to be released.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+RsaFree (\r
+  IN  VOID  *RsaContext\r
+  )\r
+{\r
+  if (!InternalIsCryptServiveAvailable ()) {\r
+    return;\r
+  }\r
+\r
+  mCryptProtocol->RsaFree (RsaContext);\r
+}\r
+\r
+/**\r
+  Sets the tag-designated RSA key component into the established RSA context from\r
+  the user-specified nonnegative integer (octet string format represented in RSA\r
+  PKCS#1).\r
+\r
+  If RsaContext is NULL, then ASSERT().\r
+\r
+  @param[in, out]  RsaContext  Pointer to RSA context being set.\r
+  @param[in]       KeyTag      Tag of RSA key component being set.\r
+  @param[in]       BigNumber   Pointer to octet integer buffer.\r
+  @param[in]       BnLength    Length of big number buffer in bytes.\r
+\r
+  @return  TRUE   RSA key component was set successfully.\r
+  @return  FALSE  Invalid RSA key component tag.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+RsaSetKey (\r
+  IN OUT VOID         *RsaContext,\r
+  IN     RSA_KEY_TAG  KeyTag,\r
+  IN     CONST UINT8  *BigNumber,\r
+  IN     UINTN        BnLength\r
+  )\r
+{\r
+  if (!InternalIsCryptServiveAvailable ()) {\r
+    return FALSE;\r
+  }\r
+\r
+  return mCryptProtocol->RsaSetKey (RsaContext, KeyTag, BigNumber, BnLength);\r
+}\r
+\r
+/**\r
+  Verifies the RSA-SSA signature with EMSA-PKCS1-v1_5 encoding scheme defined in\r
+  RSA PKCS#1.\r
+\r
+  If RsaContext is NULL, then ASSERT().\r
+  If MessageHash is NULL, then ASSERT().\r
+  If Signature is NULL, then ASSERT().\r
+  If HashLength is not equal to the size of MD5, SHA-1 or SHA-256 digest, then ASSERT().\r
+\r
+  @param[in]  RsaContext   Pointer to RSA context for signature verification.\r
+  @param[in]  MessageHash  Pointer to octet message hash to be checked.\r
+  @param[in]  HashLength   Length of the message hash in bytes.\r
+  @param[in]  Signature    Pointer to RSA PKCS1-v1_5 signature to be verified.\r
+  @param[in]  SigLength    Length of signature in bytes.\r
+\r
+  @return  TRUE   Valid signature encoded in PKCS1-v1_5.\r
+  @return  FALSE  Invalid signature or invalid RSA context.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+RsaPkcs1Verify (\r
+  IN  VOID         *RsaContext,\r
+  IN  CONST UINT8  *MessageHash,\r
+  IN  UINTN        HashLength,\r
+  IN  UINT8        *Signature,\r
+  IN  UINTN        SigLength\r
+  )\r
+{\r
+  if (!InternalIsCryptServiveAvailable ()) {\r
+    return FALSE;\r
+  }\r
+\r
+  return mCryptProtocol->RsaPkcs1Verify (\r
+                           RsaContext,\r
+                           MessageHash,\r
+                           HashLength,\r
+                           Signature,\r
+                           SigLength\r
+                           );\r
+}\r
diff --git a/CryptoPkg/Library/IntrinsicLib/CopyMem.c b/CryptoPkg/Library/IntrinsicLib/CopyMem.c
new file mode 100644 (file)
index 0000000..6cc52b2
--- /dev/null
@@ -0,0 +1,23 @@
+/** @file\r
+  Intrinsic Memory Routines Wrapper Implementation for OpenSSL-based\r
+  Cryptographic Library.\r
+\r
+Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <Base.h>\r
+#include <Library/BaseMemoryLib.h>\r
+\r
+/* Copies bytes between buffers */\r
+void * memcpy (void *dest, const void *src, unsigned int count)\r
+{\r
+  return CopyMem (dest, src, (UINTN)count);\r
+}\r
diff --git a/CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf b/CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf
new file mode 100644 (file)
index 0000000..e830c6a
--- /dev/null
@@ -0,0 +1,56 @@
+## @file\r
+#  Intrinsic Routines Wrapper Library Instance.\r
+#\r
+#  Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+#  This program and the accompanying materials\r
+#  are licensed and made available under the terms and conditions of the BSD License\r
+#  which accompanies this distribution.  The full text of the license may be found at\r
+#  http://opensource.org/licenses/bsd-license.php\r
+#  \r
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#  \r
+##\r
+\r
+[Defines]\r
+  INF_VERSION                    = 0x00010005\r
+  BASE_NAME                      = BaseIntrinsicLib\r
+  FILE_GUID                      = 63850097-3E97-4c4f-A52D-C811A0106105\r
+  MODULE_TYPE                    = BASE\r
+  VERSION_STRING                 = 1.0\r
+  LIBRARY_CLASS                  = IntrinsicLib\r
+\r
+#\r
+# The following information is for reference only and not required by the build tools.\r
+#\r
+#  VALID_ARCHITECTURES           = IA32 X64 IPF\r
+#\r
+\r
+[Sources]\r
+  MemoryIntrinsics.c\r
+\r
+[Sources.IA32]\r
+  CopyMem.c\r
+\r
+[Sources.X64]\r
+  CopyMem.c\r
+\r
+[Sources.IPF]\r
+  CopyMem.c | MSFT\r
+  CopyMem.c | INTEL\r
+#\r
+# In tools_def.txt, GCC rename symbol name memcpy to be CopyMem for IPF,\r
+# i.e. "DEFINE GCC_IPF_SYMRENAME_FLAGS     = --redefine-sym memcpy=CopyMem",\r
+# so there will be no source file CopyMem.c for GCC compiler family.\r
+#\r
+\r
+[Packages]\r
+  MdePkg/MdePkg.dec\r
+\r
+[LibraryClasses]\r
+  BaseMemoryLib\r
+\r
+[BuildOptions]\r
+  MSFT:*_*_*_CC_FLAGS  = /GL- /Oi-\r
+  INTEL:*_*_*_CC_FLAGS = /Oi-\r
+  GCC:*_*_*_CC_FLAGS   = -fno-builtin\r
diff --git a/CryptoPkg/Library/IntrinsicLib/MemoryIntrinsics.c b/CryptoPkg/Library/IntrinsicLib/MemoryIntrinsics.c
new file mode 100644 (file)
index 0000000..48e0c52
--- /dev/null
@@ -0,0 +1,27 @@
+/** @file\r
+  Intrinsic Memory Routines Wrapper Implementation for OpenSSL-based\r
+  Cryptographic Library.\r
+\r
+Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <Base.h>\r
+#include <Library/BaseMemoryLib.h>\r
+\r
+/* OpenSSL will use floating point support, and C compiler produces the _fltused\r
+   symbol by default. Simply define this symbol here to satisfy the linker. */\r
+int _fltused = 1;\r
+\r
+/* Sets buffers to a specified character */\r
+void * memset (void *dest, char ch, unsigned int count)\r
+{\r
+  return SetMem (dest, (UINTN)count, (UINT8)ch);\r
+}\r
diff --git a/CryptoPkg/Library/OpensslLib/EDKII_openssl-0.9.8l.patch b/CryptoPkg/Library/OpensslLib/EDKII_openssl-0.9.8l.patch
new file mode 100644 (file)
index 0000000..2ff6ee0
--- /dev/null
@@ -0,0 +1,92 @@
+--- crypto/bio/bss_file.c      Thu Jan 15 17:14:12 1970\r
++++ crypto/bio/bss_file.c      Thu Jan 15 17:14:12 1970\r
+@@ -421,6 +421,23 @@\r
+       return(ret);\r
+       }\r
\r
++#else\r
++\r
++BIO_METHOD *BIO_s_file(void)\r
++      {\r
++      return NULL;\r
++      }\r
++\r
++BIO *BIO_new_file(const char *filename, const char *mode)\r
++      {\r
++      return NULL;\r
++      }\r
++\r
++BIO *BIO_new_fp(FILE *stream, int close_flag)\r
++      {\r
++      return NULL;\r
++      }\r
++\r
+ #endif /* OPENSSL_NO_STDIO */\r
\r
+ #endif /* HEADER_BSS_FILE_C */\r
+--- crypto/rand/rand_egd.c     Thu Jan 15 17:14:12 1970\r
++++ crypto/rand/rand_egd.c     Thu Jan 15 17:14:12 1970\r
+@@ -95,7 +95,7 @@\r
+  *   RAND_egd() is a wrapper for RAND_egd_bytes() with numbytes=255.\r
+  */\r
\r
+-#if defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_VXWORKS) || defined(OPENSSL_SYS_NETWARE) || defined(OPENSSL_SYS_VOS)\r
++#if defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_VXWORKS) || defined(OPENSSL_SYS_NETWARE) || defined(OPENSSL_SYS_VOS) || defined(OPENSSL_SYS_UEFI)\r
+ int RAND_query_egd_bytes(const char *path, unsigned char *buf, int bytes)\r
+       {\r
+       return(-1);\r
+--- crypto/rand/rand_unix.c    Thu Jan 15 17:14:12 1970\r
++++ crypto/rand/rand_unix.c    Thu Jan 15 17:14:12 1970\r
+@@ -116,7 +116,7 @@\r
+ #include <openssl/rand.h>\r
+ #include "rand_lcl.h"\r
\r
+-#if !(defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_OS2) || defined(OPENSSL_SYS_VXWORKS) || defined(OPENSSL_SYS_NETWARE))\r
++#if !(defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_OS2) || defined(OPENSSL_SYS_VXWORKS) || defined(OPENSSL_SYS_NETWARE) || defined(OPENSSL_SYS_UEFI))\r
\r
+ #include <sys/types.h>\r
+ #include <sys/time.h>\r
+@@ -322,7 +322,7 @@\r
+ #endif /* !(defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_OS2) || defined(OPENSSL_SYS_VXWORKS) || defined(OPENSSL_SYS_NETWARE)) */\r
\r
\r
+-#if defined(OPENSSL_SYS_VXWORKS)\r
++#if defined(OPENSSL_SYS_VXWORKS) || defined(OPENSSL_SYS_UEFI)\r
+ int RAND_poll(void)\r
+       {\r
+       return 0;\r
+--- crypto/x509/x509_vfy.c     Thu Jan 15 17:14:12 1970\r
++++ crypto/x509/x509_vfy.c     Thu Jan 15 17:14:12 1970\r
+@@ -391,7 +391,12 @@\r
\r
+ static int check_chain_extensions(X509_STORE_CTX *ctx)\r
+ {\r
+-#ifdef OPENSSL_NO_CHAIN_VERIFY\r
++//#ifdef OPENSSL_NO_CHAIN_VERIFY\r
++#if defined(OPENSSL_NO_CHAIN_VERIFY) || defined(OPENSSL_SYS_UEFI)\r
++  /* \r
++    NOTE: Bypass KU Flags Checking for UEFI version. There are incorrect KU flag setting\r
++          in Authenticode Signing Certificates. \r
++  */\r
+       return 1;\r
+ #else\r
+       int i, ok=0, must_be_ca, plen = 0;\r
+@@ -904,6 +909,10 @@\r
\r
+ static int check_cert_time(X509_STORE_CTX *ctx, X509 *x)\r
+       {\r
++#if defined(OPENSSL_SYS_UEFI)\r
++  /* Bypass Certificate Time Checking for UEFI version. */\r
++  return 1;\r
++#else\r
+       time_t *ptime;\r
+       int i;\r
\r
+@@ -947,6 +956,7 @@\r
+               }\r
\r
+       return 1;\r
++#endif  \r
+       }\r
\r
+ static int internal_verify(X509_STORE_CTX *ctx)\r
diff --git a/CryptoPkg/Library/OpensslLib/Install.cmd b/CryptoPkg/Library/OpensslLib/Install.cmd
new file mode 100644 (file)
index 0000000..8dd91c0
--- /dev/null
@@ -0,0 +1,71 @@
+cd openssl-0.9.8l\r
+copy e_os2.h              ..\..\..\Include\openssl\r
+copy crypto\crypto.h  ..\..\..\Include\openssl\r
+copy crypto\tmdiff.h  ..\..\..\Include\openssl\r
+copy crypto\opensslv.h ..\..\..\Include\openssl\r
+copy crypto\opensslconf.h ..\..\..\Include\openssl\r
+copy crypto\ebcdic.h ..\..\..\Include\openssl\r
+copy crypto\symhacks.h ..\..\..\Include\openssl\r
+copy crypto\ossl_typ.h ..\..\..\Include\openssl\r
+copy crypto\md2\md2.h ..\..\..\Include\openssl\r
+copy crypto\md4\md4.h ..\..\..\Include\openssl\r
+copy crypto\md5\md5.h ..\..\..\Include\openssl\r
+copy crypto\sha\sha.h ..\..\..\Include\openssl\r
+copy crypto\hmac\hmac.h ..\..\..\Include\openssl\r
+copy crypto\ripemd\ripemd.h ..\..\..\Include\openssl\r
+copy crypto\des\des.h ..\..\..\Include\openssl\r
+copy crypto\des\des_old.h ..\..\..\Include\openssl\r
+copy crypto\rc2\rc2.h ..\..\..\Include\openssl\r
+copy crypto\rc4\rc4.h ..\..\..\Include\openssl\r
+copy crypto\idea\idea.h ..\..\..\Include\openssl\r
+copy crypto\bf\blowfish.h ..\..\..\Include\openssl\r
+copy crypto\cast\cast.h ..\..\..\Include\openssl\r
+copy crypto\aes\aes.h ..\..\..\Include\openssl\r
+copy crypto\bn\bn.h ..\..\..\Include\openssl\r
+copy crypto\rsa\rsa.h ..\..\..\Include\openssl\r
+copy crypto\dsa\dsa.h ..\..\..\Include\openssl\r
+copy crypto\dso\dso.h ..\..\..\Include\openssl\r
+copy crypto\dh\dh.h ..\..\..\Include\openssl\r
+copy crypto\ec\ec.h ..\..\..\Include\openssl\r
+copy crypto\ecdh\ecdh.h ..\..\..\Include\openssl\r
+copy crypto\ecdsa\ecdsa.h ..\..\..\Include\openssl\r
+copy crypto\buffer\buffer.h ..\..\..\Include\openssl\r
+copy crypto\bio\bio.h ..\..\..\Include\openssl\r
+copy crypto\stack\stack.h ..\..\..\Include\openssl\r
+copy crypto\stack\safestack.h ..\..\..\Include\openssl\r
+copy crypto\lhash\lhash.h ..\..\..\Include\openssl\r
+copy crypto\rand\rand.h ..\..\..\Include\openssl\r
+copy crypto\err\err.h ..\..\..\Include\openssl\r
+copy crypto\objects\objects.h ..\..\..\Include\openssl\r
+copy crypto\objects\obj_mac.h ..\..\..\Include\openssl\r
+copy crypto\evp\evp.h ..\..\..\Include\openssl\r
+copy crypto\asn1\asn1.h ..\..\..\Include\openssl\r
+copy crypto\asn1\asn1_mac.h ..\..\..\Include\openssl\r
+copy crypto\asn1\asn1t.h ..\..\..\Include\openssl\r
+copy crypto\pem\pem.h ..\..\..\Include\openssl\r
+copy crypto\pem\pem2.h ..\..\..\Include\openssl\r
+copy crypto\x509\x509.h ..\..\..\Include\openssl\r
+copy crypto\x509\x509_vfy.h ..\..\..\Include\openssl\r
+copy crypto\x509v3\x509v3.h ..\..\..\Include\openssl\r
+copy crypto\conf\conf.h ..\..\..\Include\openssl\r
+copy crypto\conf\conf_api.h ..\..\..\Include\openssl\r
+copy crypto\txt_db\txt_db.h ..\..\..\Include\openssl\r
+copy crypto\pkcs7\pkcs7.h ..\..\..\Include\openssl\r
+copy crypto\pkcs12\pkcs12.h ..\..\..\Include\openssl\r
+copy crypto\comp\comp.h ..\..\..\Include\openssl\r
+copy crypto\engine\engine.h ..\..\..\Include\openssl\r
+copy crypto\ocsp\ocsp.h ..\..\..\Include\openssl\r
+copy crypto\ui\ui.h ..\..\..\Include\openssl\r
+copy crypto\ui\ui_compat.h ..\..\..\Include\openssl\r
+copy crypto\krb5\krb5_asn.h ..\..\..\Include\openssl\r
+copy crypto\store\store.h ..\..\..\Include\openssl\r
+copy crypto\pqueue\pqueue.h ..\..\..\Include\openssl\r
+copy crypto\pqueue\pq_compat.h ..\..\..\Include\openssl\r
+copy ssl\ssl.h ..\..\..\Include\openssl\r
+copy ssl\ssl2.h ..\..\..\Include\openssl\r
+copy ssl\ssl3.h ..\..\..\Include\openssl\r
+copy ssl\ssl23.h ..\..\..\Include\openssl\r
+copy ssl\tls1.h ..\..\..\Include\openssl\r
+copy ssl\dtls1.h ..\..\..\Include\openssl\r
+copy ssl\kssl.h ..\..\..\Include\openssl\r
+cd ..
\ No newline at end of file
diff --git a/CryptoPkg/Library/OpensslLib/Install.sh b/CryptoPkg/Library/OpensslLib/Install.sh
new file mode 100644 (file)
index 0000000..43b6cb4
--- /dev/null
@@ -0,0 +1,73 @@
+#!/bin/sh\r
+
+cd openssl-0.9.8l
+cp e_os2.h ../../../Include/openssl
+cp crypto/crypto.h ../../../Include/openssl
+cp crypto/tmdiff.h ../../../Include/openssl
+cp crypto/opensslv.h ../../../Include/openssl
+cp crypto/opensslconf.h ../../../Include/openssl
+cp crypto/ebcdic.h ../../../Include/openssl
+cp crypto/symhacks.h ../../../Include/openssl
+cp crypto/ossl_typ.h ../../../Include/openssl
+cp crypto/md2/md2.h ../../../Include/openssl
+cp crypto/md4/md4.h ../../../Include/openssl
+cp crypto/md5/md5.h ../../../Include/openssl
+cp crypto/sha/sha.h ../../../Include/openssl
+cp crypto/hmac/hmac.h ../../../Include/openssl
+cp crypto/ripemd/ripemd.h ../../../Include/openssl
+cp crypto/des/des.h ../../../Include/openssl
+cp crypto/des/des_old.h ../../../Include/openssl
+cp crypto/rc2/rc2.h ../../../Include/openssl
+cp crypto/rc4/rc4.h ../../../Include/openssl
+cp crypto/idea/idea.h ../../../Include/openssl
+cp crypto/bf/blowfish.h ../../../Include/openssl
+cp crypto/cast/cast.h ../../../Include/openssl
+cp crypto/aes/aes.h ../../../Include/openssl
+cp crypto/bn/bn.h ../../../Include/openssl
+cp crypto/rsa/rsa.h ../../../Include/openssl
+cp crypto/dsa/dsa.h ../../../Include/openssl
+cp crypto/dso/dso.h ../../../Include/openssl
+cp crypto/dh/dh.h ../../../Include/openssl
+cp crypto/ec/ec.h ../../../Include/openssl
+cp crypto/ecdh/ecdh.h ../../../Include/openssl
+cp crypto/ecdsa/ecdsa.h ../../../Include/openssl
+cp crypto/buffer/buffer.h ../../../Include/openssl
+cp crypto/bio/bio.h ../../../Include/openssl
+cp crypto/stack/stack.h ../../../Include/openssl
+cp crypto/stack/safestack.h ../../../Include/openssl
+cp crypto/lhash/lhash.h ../../../Include/openssl
+cp crypto/rand/rand.h ../../../Include/openssl
+cp crypto/err/err.h ../../../Include/openssl
+cp crypto/objects/objects.h ../../../Include/openssl
+cp crypto/objects/obj_mac.h ../../../Include/openssl
+cp crypto/evp/evp.h ../../../Include/openssl
+cp crypto/asn1/asn1.h ../../../Include/openssl
+cp crypto/asn1/asn1_mac.h ../../../Include/openssl
+cp crypto/asn1/asn1t.h ../../../Include/openssl
+cp crypto/pem/pem.h ../../../Include/openssl
+cp crypto/pem/pem2.h ../../../Include/openssl
+cp crypto/x509/x509.h ../../../Include/openssl
+cp crypto/x509/x509_vfy.h ../../../Include/openssl
+cp crypto/x509v3/x509v3.h ../../../Include/openssl
+cp crypto/conf/conf.h ../../../Include/openssl
+cp crypto/conf/conf_api.h ../../../Include/openssl
+cp crypto/txt_db/txt_db.h ../../../Include/openssl
+cp crypto/pkcs7/pkcs7.h ../../../Include/openssl
+cp crypto/pkcs12/pkcs12.h ../../../Include/openssl
+cp crypto/comp/comp.h ../../../Include/openssl
+cp crypto/engine/engine.h ../../../Include/openssl
+cp crypto/ocsp/ocsp.h ../../../Include/openssl
+cp crypto/ui/ui.h ../../../Include/openssl
+cp crypto/ui/ui_compat.h ../../../Include/openssl
+cp crypto/krb5/krb5_asn.h ../../../Include/openssl
+cp crypto/store/store.h ../../../Include/openssl
+cp crypto/pqueue/pqueue.h ../../../Include/openssl
+cp crypto/pqueue/pq_compat.h ../../../Include/openssl
+cp ssl/ssl.h ../../../Include/openssl
+cp ssl/ssl2.h ../../../Include/openssl
+cp ssl/ssl3.h ../../../Include/openssl
+cp ssl/ssl23.h ../../../Include/openssl
+cp ssl/tls1.h ../../../Include/openssl
+cp ssl/dtls1.h ../../../Include/openssl
+cp ssl/kssl.h ../../../Include/openssl
+cd ..
diff --git a/CryptoPkg/Library/OpensslLib/OpensslLib.inf b/CryptoPkg/Library/OpensslLib/OpensslLib.inf
new file mode 100644 (file)
index 0000000..1e1a840
--- /dev/null
@@ -0,0 +1,579 @@
+## @file\r
+# OpenSSL Library implementation.\r
+# \r
+#  Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+#  This program and the accompanying materials\r
+#  are licensed and made available under the terms and conditions of the BSD License\r
+#  which accompanies this distribution.  The full text of the license may be found at\r
+#  http://opensource.org/licenses/bsd-license.php\r
+#  \r
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#  \r
+##\r
+\r
+[Defines]\r
+  INF_VERSION                    = 0x00010005\r
+  BASE_NAME                      = OpensslLib\r
+  FILE_GUID                      = C873A7D0-9824-409f-9B42-2C158B992E69\r
+  MODULE_TYPE                    = BASE\r
+  VERSION_STRING                 = 1.0\r
+  LIBRARY_CLASS                  = OpensslLib\r
+  OPENSSL_PATH                   = openssl-0.9.8l\r
+  OPENSSL_FLAGS                  = -DOPENSSL_SYSNAME_UWIN -DOPENSSL_SYS_UEFI -DL_ENDIAN -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -DOPENSSL_NO_CAMELLIA -DOPENSSL_NO_SEED -DOPENSSL_NO_RC5 -DOPENSSL_NO_MDC2 -DOPENSSL_NO_SOCK -DOPENSSL_NO_CMS -DOPENSSL_NO_JPAKE -DOPENSSL_NO_CAPIENG -DOPENSSL_NO_ERR -DOPENSSL_NO_KRB5 -DOPENSSL_NO_DYNAMIC_ENGINE -DGETPID_IS_MEANINGLESS -DOPENSSL_NO_STDIO -DOPENSSL_NO_FP_API -DOPENSSL_NO_DGRAM -DOPENSSL_NO_ASM\r
+  \r
+#\r
+# OPENSSL_FLAGS is set to define the following flags to be compatible with \r
+# EDK II build system and UEFI executiuon environment \r
+#\r
+#   OPENSSL_SYSNAME_UWIN\r
+#   OPENSSL_SYS_UEFI \r
+#   L_ENDIAN \r
+#   _CRT_SECURE_NO_DEPRECATE \r
+#   _CRT_NONSTDC_NO_DEPRECATE \r
+#   OPENSSL_NO_CAMELLIA \r
+#   OPENSSL_NO_SEED \r
+#   OPENSSL_NO_RC5 \r
+#   OPENSSL_NO_MDC2 \r
+#   OPENSSL_NO_SOCK \r
+#   OPENSSL_NO_CMS \r
+#   OPENSSL_NO_JPAKE \r
+#   OPENSSL_NO_CAPIENG \r
+#   OPENSSL_NO_ERR \r
+#   OPENSSL_NO_KRB5 \r
+#   OPENSSL_NO_DYNAMIC_ENGINE \r
+#   GETPID_IS_MEANINGLESS \r
+#   OPENSSL_NO_STDIO \r
+#   OPENSSL_NO_FP_API \r
+#   OPENSSL_NO_DGRAM  \r
+#   OPENSSL_NO_ASM\r
+#\r
+  \r
+#\r
+#  VALID_ARCHITECTURES           = IA32 X64 IPF\r
+#\r
+\r
+[Sources]\r
+  $(OPENSSL_PATH)/e_os.h\r
+  $(OPENSSL_PATH)/crypto/cryptlib.c\r
+  $(OPENSSL_PATH)/crypto/dyn_lck.c\r
+  $(OPENSSL_PATH)/crypto/mem.c\r
+  $(OPENSSL_PATH)/crypto/mem_clr.c\r
+  $(OPENSSL_PATH)/crypto/mem_dbg.c\r
+  $(OPENSSL_PATH)/crypto/cversion.c\r
+  $(OPENSSL_PATH)/crypto/ex_data.c\r
+\r
+  #\r
+  # Not required for UEFI.\r
+  #\r
+  # $(OPENSSL_PATH)/crypto/tmdiff.c\r
+\r
+  $(OPENSSL_PATH)/crypto/cpt_err.c\r
+  $(OPENSSL_PATH)/crypto/ebcdic.c\r
+  $(OPENSSL_PATH)/crypto/uid.c\r
+  $(OPENSSL_PATH)/crypto/o_time.c\r
+  $(OPENSSL_PATH)/crypto/o_str.c\r
+  $(OPENSSL_PATH)/crypto/o_dir.c\r
+  $(OPENSSL_PATH)/crypto/o_init.c\r
+  $(OPENSSL_PATH)/crypto/fips_err.c\r
+  $(OPENSSL_PATH)/crypto/md2/md2_dgst.c\r
+  $(OPENSSL_PATH)/crypto/md2/md2_one.c\r
+  $(OPENSSL_PATH)/crypto/md4/md4_dgst.c\r
+  $(OPENSSL_PATH)/crypto/md4/md4_one.c\r
+  $(OPENSSL_PATH)/crypto/md5/md5_dgst.c\r
+  $(OPENSSL_PATH)/crypto/md5/md5_one.c\r
+  $(OPENSSL_PATH)/crypto/sha/sha_dgst.c\r
+  $(OPENSSL_PATH)/crypto/sha/sha1dgst.c\r
+  $(OPENSSL_PATH)/crypto/sha/sha_one.c\r
+  $(OPENSSL_PATH)/crypto/sha/sha1_one.c\r
+  $(OPENSSL_PATH)/crypto/sha/sha256.c\r
+  $(OPENSSL_PATH)/crypto/sha/sha512.c\r
+  $(OPENSSL_PATH)/crypto/hmac/hmac.c\r
+  $(OPENSSL_PATH)/crypto/ripemd/rmd_dgst.c\r
+  $(OPENSSL_PATH)/crypto/ripemd/rmd_one.c\r
+  $(OPENSSL_PATH)/crypto/des/des_lib.c\r
+  $(OPENSSL_PATH)/crypto/des/set_key.c\r
+  $(OPENSSL_PATH)/crypto/des/ecb_enc.c\r
+  $(OPENSSL_PATH)/crypto/des/cbc_enc.c\r
+  $(OPENSSL_PATH)/crypto/des/ecb3_enc.c\r
+  $(OPENSSL_PATH)/crypto/des/cfb64enc.c\r
+  $(OPENSSL_PATH)/crypto/des/cfb64ede.c\r
+  $(OPENSSL_PATH)/crypto/des/cfb_enc.c\r
+  $(OPENSSL_PATH)/crypto/des/ofb64ede.c\r
+  $(OPENSSL_PATH)/crypto/des/enc_read.c\r
+  $(OPENSSL_PATH)/crypto/des/enc_writ.c\r
+  $(OPENSSL_PATH)/crypto/des/ofb64enc.c\r
+  $(OPENSSL_PATH)/crypto/des/ofb_enc.c\r
+  $(OPENSSL_PATH)/crypto/des/str2key.c\r
+  $(OPENSSL_PATH)/crypto/des/pcbc_enc.c\r
+  $(OPENSSL_PATH)/crypto/des/qud_cksm.c\r
+  $(OPENSSL_PATH)/crypto/des/rand_key.c\r
+  $(OPENSSL_PATH)/crypto/des/des_enc.c\r
+  $(OPENSSL_PATH)/crypto/des/fcrypt_b.c\r
+  $(OPENSSL_PATH)/crypto/des/fcrypt.c\r
+  $(OPENSSL_PATH)/crypto/des/xcbc_enc.c\r
+  $(OPENSSL_PATH)/crypto/des/rpc_enc.c\r
+  $(OPENSSL_PATH)/crypto/des/cbc_cksm.c\r
+  $(OPENSSL_PATH)/crypto/des/ede_cbcm_enc.c\r
+  $(OPENSSL_PATH)/crypto/des/des_old.c\r
+  $(OPENSSL_PATH)/crypto/des/des_old2.c\r
+  $(OPENSSL_PATH)/crypto/des/read2pwd.c\r
+  $(OPENSSL_PATH)/crypto/rc2/rc2_ecb.c\r
+  $(OPENSSL_PATH)/crypto/rc2/rc2_skey.c\r
+  $(OPENSSL_PATH)/crypto/rc2/rc2_cbc.c\r
+  $(OPENSSL_PATH)/crypto/rc2/rc2cfb64.c\r
+  $(OPENSSL_PATH)/crypto/rc2/rc2ofb64.c\r
+  $(OPENSSL_PATH)/crypto/rc4/rc4_enc.c\r
+  $(OPENSSL_PATH)/crypto/rc4/rc4_skey.c\r
+  $(OPENSSL_PATH)/crypto/rc4/rc4_fblk.c\r
+  $(OPENSSL_PATH)/crypto/idea/i_cbc.c\r
+  $(OPENSSL_PATH)/crypto/idea/i_cfb64.c\r
+  $(OPENSSL_PATH)/crypto/idea/i_ofb64.c\r
+  $(OPENSSL_PATH)/crypto/idea/i_ecb.c\r
+  $(OPENSSL_PATH)/crypto/idea/i_skey.c\r
+  $(OPENSSL_PATH)/crypto/bf/bf_skey.c\r
+  $(OPENSSL_PATH)/crypto/bf/bf_ecb.c\r
+  $(OPENSSL_PATH)/crypto/bf/bf_enc.c\r
+  $(OPENSSL_PATH)/crypto/bf/bf_cfb64.c\r
+  $(OPENSSL_PATH)/crypto/bf/bf_ofb64.c\r
+  $(OPENSSL_PATH)/crypto/cast/c_skey.c\r
+  $(OPENSSL_PATH)/crypto/cast/c_ecb.c\r
+  $(OPENSSL_PATH)/crypto/cast/c_enc.c\r
+  $(OPENSSL_PATH)/crypto/cast/c_cfb64.c\r
+  $(OPENSSL_PATH)/crypto/cast/c_ofb64.c\r
+  $(OPENSSL_PATH)/crypto/aes/aes_misc.c\r
+  $(OPENSSL_PATH)/crypto/aes/aes_ecb.c\r
+  $(OPENSSL_PATH)/crypto/aes/aes_cfb.c\r
+  $(OPENSSL_PATH)/crypto/aes/aes_ofb.c\r
+  $(OPENSSL_PATH)/crypto/aes/aes_ctr.c\r
+  $(OPENSSL_PATH)/crypto/aes/aes_ige.c\r
+  $(OPENSSL_PATH)/crypto/aes/aes_wrap.c\r
+  $(OPENSSL_PATH)/crypto/aes/aes_core.c\r
+  $(OPENSSL_PATH)/crypto/aes/aes_cbc.c\r
+  $(OPENSSL_PATH)/crypto/bn/bn_add.c\r
+  $(OPENSSL_PATH)/crypto/bn/bn_div.c\r
+  $(OPENSSL_PATH)/crypto/bn/bn_exp.c\r
+  $(OPENSSL_PATH)/crypto/bn/bn_lib.c\r
+  $(OPENSSL_PATH)/crypto/bn/bn_ctx.c\r
+  $(OPENSSL_PATH)/crypto/bn/bn_mul.c\r
+  $(OPENSSL_PATH)/crypto/bn/bn_mod.c\r
+  $(OPENSSL_PATH)/crypto/bn/bn_print.c\r
+  $(OPENSSL_PATH)/crypto/bn/bn_rand.c\r
+  $(OPENSSL_PATH)/crypto/bn/bn_shift.c\r
+  $(OPENSSL_PATH)/crypto/bn/bn_word.c\r
+  $(OPENSSL_PATH)/crypto/bn/bn_blind.c\r
+  $(OPENSSL_PATH)/crypto/bn/bn_kron.c\r
+  $(OPENSSL_PATH)/crypto/bn/bn_sqrt.c\r
+  $(OPENSSL_PATH)/crypto/bn/bn_gcd.c\r
+  $(OPENSSL_PATH)/crypto/bn/bn_prime.c\r
+  $(OPENSSL_PATH)/crypto/bn/bn_err.c\r
+  $(OPENSSL_PATH)/crypto/bn/bn_sqr.c\r
+  $(OPENSSL_PATH)/crypto/bn/bn_asm.c\r
+  $(OPENSSL_PATH)/crypto/bn/bn_recp.c\r
+  $(OPENSSL_PATH)/crypto/bn/bn_mont.c\r
+  $(OPENSSL_PATH)/crypto/bn/bn_mpi.c\r
+  $(OPENSSL_PATH)/crypto/bn/bn_exp2.c\r
+  $(OPENSSL_PATH)/crypto/bn/bn_gf2m.c\r
+  $(OPENSSL_PATH)/crypto/bn/bn_nist.c\r
+  $(OPENSSL_PATH)/crypto/bn/bn_depr.c\r
+  $(OPENSSL_PATH)/crypto/bn/bn_x931p.c\r
+  $(OPENSSL_PATH)/crypto/bn/bn_const.c\r
+  $(OPENSSL_PATH)/crypto/bn/bn_opt.c\r
+  $(OPENSSL_PATH)/crypto/rsa/rsa_eay.c\r
+  $(OPENSSL_PATH)/crypto/rsa/rsa_gen.c\r
+  $(OPENSSL_PATH)/crypto/rsa/rsa_lib.c\r
+  $(OPENSSL_PATH)/crypto/rsa/rsa_sign.c\r
+  $(OPENSSL_PATH)/crypto/rsa/rsa_saos.c\r
+  $(OPENSSL_PATH)/crypto/rsa/rsa_err.c\r
+  $(OPENSSL_PATH)/crypto/rsa/rsa_pk1.c\r
+  $(OPENSSL_PATH)/crypto/rsa/rsa_ssl.c\r
+  $(OPENSSL_PATH)/crypto/rsa/rsa_none.c\r
+  $(OPENSSL_PATH)/crypto/rsa/rsa_oaep.c\r
+  $(OPENSSL_PATH)/crypto/rsa/rsa_chk.c\r
+  $(OPENSSL_PATH)/crypto/rsa/rsa_null.c\r
+  $(OPENSSL_PATH)/crypto/rsa/rsa_pss.c\r
+  $(OPENSSL_PATH)/crypto/rsa/rsa_x931.c\r
+  $(OPENSSL_PATH)/crypto/rsa/rsa_x931g.c\r
+  $(OPENSSL_PATH)/crypto/rsa/rsa_asn1.c\r
+  $(OPENSSL_PATH)/crypto/rsa/rsa_depr.c\r
+  $(OPENSSL_PATH)/crypto/rsa/rsa_eng.c\r
+  $(OPENSSL_PATH)/crypto/dsa/dsa_gen.c\r
+  $(OPENSSL_PATH)/crypto/dsa/dsa_key.c\r
+  $(OPENSSL_PATH)/crypto/dsa/dsa_lib.c\r
+  $(OPENSSL_PATH)/crypto/dsa/dsa_asn1.c\r
+  $(OPENSSL_PATH)/crypto/dsa/dsa_vrf.c\r
+  $(OPENSSL_PATH)/crypto/dsa/dsa_sign.c\r
+  $(OPENSSL_PATH)/crypto/dsa/dsa_err.c\r
+  $(OPENSSL_PATH)/crypto/dsa/dsa_ossl.c\r
+  $(OPENSSL_PATH)/crypto/dsa/dsa_depr.c\r
+  $(OPENSSL_PATH)/crypto/dsa/dsa_utl.c\r
+  $(OPENSSL_PATH)/crypto/dso/dso_dl.c\r
+  $(OPENSSL_PATH)/crypto/dso/dso_dlfcn.c\r
+  $(OPENSSL_PATH)/crypto/dso/dso_err.c\r
+  $(OPENSSL_PATH)/crypto/dso/dso_lib.c\r
+  $(OPENSSL_PATH)/crypto/dso/dso_null.c\r
+  $(OPENSSL_PATH)/crypto/dso/dso_openssl.c\r
+  $(OPENSSL_PATH)/crypto/dso/dso_win32.c\r
+  $(OPENSSL_PATH)/crypto/dso/dso_vms.c\r
+  $(OPENSSL_PATH)/crypto/dh/dh_asn1.c\r
+  $(OPENSSL_PATH)/crypto/dh/dh_gen.c\r
+  $(OPENSSL_PATH)/crypto/dh/dh_key.c\r
+  $(OPENSSL_PATH)/crypto/dh/dh_lib.c\r
+  $(OPENSSL_PATH)/crypto/dh/dh_check.c\r
+  $(OPENSSL_PATH)/crypto/dh/dh_err.c\r
+  $(OPENSSL_PATH)/crypto/dh/dh_depr.c\r
+  $(OPENSSL_PATH)/crypto/ec/ec_lib.c\r
+  $(OPENSSL_PATH)/crypto/ec/ecp_smpl.c\r
+  $(OPENSSL_PATH)/crypto/ec/ecp_mont.c\r
+  $(OPENSSL_PATH)/crypto/ec/ecp_nist.c\r
+  $(OPENSSL_PATH)/crypto/ec/ec_cvt.c\r
+  $(OPENSSL_PATH)/crypto/ec/ec_mult.c\r
+  $(OPENSSL_PATH)/crypto/ec/ec_err.c\r
+  $(OPENSSL_PATH)/crypto/ec/ec_curve.c\r
+  $(OPENSSL_PATH)/crypto/ec/ec_check.c\r
+  $(OPENSSL_PATH)/crypto/ec/ec_print.c\r
+  $(OPENSSL_PATH)/crypto/ec/ec_asn1.c\r
+  $(OPENSSL_PATH)/crypto/ec/ec_key.c\r
+  $(OPENSSL_PATH)/crypto/ec/ec2_smpl.c\r
+  $(OPENSSL_PATH)/crypto/ec/ec2_mult.c\r
+  $(OPENSSL_PATH)/crypto/ecdh/ech_lib.c\r
+  $(OPENSSL_PATH)/crypto/ecdh/ech_ossl.c\r
+  $(OPENSSL_PATH)/crypto/ecdh/ech_key.c\r
+  $(OPENSSL_PATH)/crypto/ecdh/ech_err.c\r
+  $(OPENSSL_PATH)/crypto/ecdsa/ecs_lib.c\r
+  $(OPENSSL_PATH)/crypto/ecdsa/ecs_asn1.c\r
+  $(OPENSSL_PATH)/crypto/ecdsa/ecs_ossl.c\r
+  $(OPENSSL_PATH)/crypto/ecdsa/ecs_sign.c\r
+  $(OPENSSL_PATH)/crypto/ecdsa/ecs_vrf.c\r
+  $(OPENSSL_PATH)/crypto/ecdsa/ecs_err.c\r
+  $(OPENSSL_PATH)/crypto/buffer/buffer.c\r
+  $(OPENSSL_PATH)/crypto/buffer/buf_str.c\r
+  $(OPENSSL_PATH)/crypto/buffer/buf_err.c\r
+  $(OPENSSL_PATH)/crypto/bio/bio_lib.c\r
+  $(OPENSSL_PATH)/crypto/bio/bio_cb.c\r
+  $(OPENSSL_PATH)/crypto/bio/bio_err.c\r
+  $(OPENSSL_PATH)/crypto/bio/bss_mem.c\r
+  $(OPENSSL_PATH)/crypto/bio/bss_null.c\r
+  $(OPENSSL_PATH)/crypto/bio/bss_fd.c\r
+  $(OPENSSL_PATH)/crypto/bio/bss_file.c\r
+  $(OPENSSL_PATH)/crypto/bio/bf_null.c\r
+  $(OPENSSL_PATH)/crypto/bio/bf_buff.c\r
+  $(OPENSSL_PATH)/crypto/bio/b_print.c\r
+  $(OPENSSL_PATH)/crypto/bio/b_dump.c\r
+  $(OPENSSL_PATH)/crypto/bio/bf_nbio.c\r
+  $(OPENSSL_PATH)/crypto/bio/bss_log.c\r
+  $(OPENSSL_PATH)/crypto/bio/bss_bio.c\r
+  $(OPENSSL_PATH)/crypto/bio/bss_dgram.c\r
+  $(OPENSSL_PATH)/crypto/stack/stack.c\r
+  $(OPENSSL_PATH)/crypto/lhash/lhash.c\r
+  $(OPENSSL_PATH)/crypto/lhash/lh_stats.c\r
+  $(OPENSSL_PATH)/crypto/rand/md_rand.c\r
+  $(OPENSSL_PATH)/crypto/rand/randfile.c\r
+  $(OPENSSL_PATH)/crypto/rand/rand_lib.c\r
+  $(OPENSSL_PATH)/crypto/rand/rand_eng.c\r
+  $(OPENSSL_PATH)/crypto/rand/rand_err.c\r
+  $(OPENSSL_PATH)/crypto/rand/rand_egd.c\r
+  $(OPENSSL_PATH)/crypto/rand/rand_win.c\r
+  $(OPENSSL_PATH)/crypto/rand/rand_unix.c\r
+  $(OPENSSL_PATH)/crypto/rand/rand_os2.c\r
+  $(OPENSSL_PATH)/crypto/rand/rand_nw.c\r
+  $(OPENSSL_PATH)/crypto/err/err.c\r
+  $(OPENSSL_PATH)/crypto/err/err_def.c\r
+  $(OPENSSL_PATH)/crypto/err/err_all.c\r
+  $(OPENSSL_PATH)/crypto/err/err_prn.c\r
+  $(OPENSSL_PATH)/crypto/err/err_str.c\r
+  $(OPENSSL_PATH)/crypto/err/err_bio.c\r
+  $(OPENSSL_PATH)/crypto/objects/o_names.c\r
+  $(OPENSSL_PATH)/crypto/objects/obj_dat.c\r
+  $(OPENSSL_PATH)/crypto/objects/obj_lib.c\r
+  $(OPENSSL_PATH)/crypto/objects/obj_err.c\r
+  $(OPENSSL_PATH)/crypto/evp/encode.c\r
+  $(OPENSSL_PATH)/crypto/evp/digest.c\r
+  $(OPENSSL_PATH)/crypto/evp/dig_eng.c\r
+  $(OPENSSL_PATH)/crypto/evp/evp_enc.c\r
+  $(OPENSSL_PATH)/crypto/evp/evp_key.c\r
+  $(OPENSSL_PATH)/crypto/evp/evp_acnf.c\r
+  $(OPENSSL_PATH)/crypto/evp/evp_cnf.c\r
+  $(OPENSSL_PATH)/crypto/evp/e_des.c\r
+  $(OPENSSL_PATH)/crypto/evp/e_bf.c\r
+  $(OPENSSL_PATH)/crypto/evp/e_idea.c\r
+  $(OPENSSL_PATH)/crypto/evp/e_des3.c\r
+  $(OPENSSL_PATH)/crypto/evp/e_rc4.c\r
+  $(OPENSSL_PATH)/crypto/evp/e_aes.c\r
+  $(OPENSSL_PATH)/crypto/evp/names.c\r
+  $(OPENSSL_PATH)/crypto/evp/e_xcbc_d.c\r
+  $(OPENSSL_PATH)/crypto/evp/e_rc2.c\r
+  $(OPENSSL_PATH)/crypto/evp/e_cast.c\r
+  $(OPENSSL_PATH)/crypto/evp/e_rc5.c\r
+  $(OPENSSL_PATH)/crypto/evp/enc_min.c\r
+  $(OPENSSL_PATH)/crypto/evp/m_null.c\r
+  $(OPENSSL_PATH)/crypto/evp/m_md2.c\r
+  $(OPENSSL_PATH)/crypto/evp/m_md4.c\r
+  $(OPENSSL_PATH)/crypto/evp/m_md5.c\r
+  $(OPENSSL_PATH)/crypto/evp/m_sha.c\r
+  $(OPENSSL_PATH)/crypto/evp/m_sha1.c\r
+  $(OPENSSL_PATH)/crypto/evp/m_dss.c\r
+  $(OPENSSL_PATH)/crypto/evp/m_dss1.c\r
+  $(OPENSSL_PATH)/crypto/evp/m_ripemd.c\r
+  $(OPENSSL_PATH)/crypto/evp/m_ecdsa.c\r
+  $(OPENSSL_PATH)/crypto/evp/p_open.c\r
+  $(OPENSSL_PATH)/crypto/evp/p_seal.c\r
+  $(OPENSSL_PATH)/crypto/evp/p_sign.c\r
+  $(OPENSSL_PATH)/crypto/evp/p_verify.c\r
+  $(OPENSSL_PATH)/crypto/evp/p_lib.c\r
+  $(OPENSSL_PATH)/crypto/evp/p_enc.c\r
+  $(OPENSSL_PATH)/crypto/evp/p_dec.c\r
+  $(OPENSSL_PATH)/crypto/evp/bio_md.c\r
+  $(OPENSSL_PATH)/crypto/evp/bio_b64.c\r
+  $(OPENSSL_PATH)/crypto/evp/bio_enc.c\r
+  $(OPENSSL_PATH)/crypto/evp/evp_err.c\r
+  $(OPENSSL_PATH)/crypto/evp/e_null.c\r
+  $(OPENSSL_PATH)/crypto/evp/c_all.c\r
+  $(OPENSSL_PATH)/crypto/evp/c_allc.c\r
+  $(OPENSSL_PATH)/crypto/evp/c_alld.c\r
+  $(OPENSSL_PATH)/crypto/evp/evp_lib.c\r
+  $(OPENSSL_PATH)/crypto/evp/bio_ok.c\r
+  $(OPENSSL_PATH)/crypto/evp/evp_pkey.c\r
+  $(OPENSSL_PATH)/crypto/evp/evp_pbe.c\r
+  $(OPENSSL_PATH)/crypto/evp/p5_crpt.c\r
+  $(OPENSSL_PATH)/crypto/evp/p5_crpt2.c\r
+  $(OPENSSL_PATH)/crypto/evp/e_old.c\r
+  $(OPENSSL_PATH)/crypto/asn1/a_object.c\r
+  $(OPENSSL_PATH)/crypto/asn1/a_bitstr.c\r
+  $(OPENSSL_PATH)/crypto/asn1/a_utctm.c\r
+  $(OPENSSL_PATH)/crypto/asn1/a_gentm.c\r
+  $(OPENSSL_PATH)/crypto/asn1/a_time.c\r
+  $(OPENSSL_PATH)/crypto/asn1/a_int.c\r
+  $(OPENSSL_PATH)/crypto/asn1/a_octet.c\r
+  $(OPENSSL_PATH)/crypto/asn1/a_print.c\r
+  $(OPENSSL_PATH)/crypto/asn1/a_type.c\r
+  $(OPENSSL_PATH)/crypto/asn1/a_set.c\r
+  $(OPENSSL_PATH)/crypto/asn1/a_dup.c\r
+  $(OPENSSL_PATH)/crypto/asn1/a_d2i_fp.c\r
+  $(OPENSSL_PATH)/crypto/asn1/a_i2d_fp.c\r
+  $(OPENSSL_PATH)/crypto/asn1/a_enum.c\r
+  $(OPENSSL_PATH)/crypto/asn1/a_utf8.c\r
+  $(OPENSSL_PATH)/crypto/asn1/a_sign.c\r
+  $(OPENSSL_PATH)/crypto/asn1/a_digest.c\r
+  $(OPENSSL_PATH)/crypto/asn1/a_verify.c\r
+  $(OPENSSL_PATH)/crypto/asn1/a_mbstr.c\r
+  $(OPENSSL_PATH)/crypto/asn1/a_strex.c\r
+  $(OPENSSL_PATH)/crypto/asn1/x_algor.c\r
+  $(OPENSSL_PATH)/crypto/asn1/x_val.c\r
+  $(OPENSSL_PATH)/crypto/asn1/x_pubkey.c\r
+  $(OPENSSL_PATH)/crypto/asn1/x_sig.c\r
+  $(OPENSSL_PATH)/crypto/asn1/x_req.c\r
+  $(OPENSSL_PATH)/crypto/asn1/x_attrib.c\r
+  $(OPENSSL_PATH)/crypto/asn1/x_bignum.c\r
+  $(OPENSSL_PATH)/crypto/asn1/x_long.c\r
+  $(OPENSSL_PATH)/crypto/asn1/x_name.c\r
+  $(OPENSSL_PATH)/crypto/asn1/x_x509.c\r
+  $(OPENSSL_PATH)/crypto/asn1/x_x509a.c\r
+  $(OPENSSL_PATH)/crypto/asn1/x_crl.c\r
+  $(OPENSSL_PATH)/crypto/asn1/x_info.c\r
+  $(OPENSSL_PATH)/crypto/asn1/x_spki.c\r
+  $(OPENSSL_PATH)/crypto/asn1/nsseq.c\r
+  $(OPENSSL_PATH)/crypto/asn1/d2i_pu.c\r
+  $(OPENSSL_PATH)/crypto/asn1/d2i_pr.c\r
+  $(OPENSSL_PATH)/crypto/asn1/i2d_pu.c\r
+  $(OPENSSL_PATH)/crypto/asn1/i2d_pr.c\r
+  $(OPENSSL_PATH)/crypto/asn1/t_req.c\r
+  $(OPENSSL_PATH)/crypto/asn1/t_x509.c\r
+  $(OPENSSL_PATH)/crypto/asn1/t_x509a.c\r
+  $(OPENSSL_PATH)/crypto/asn1/t_crl.c\r
+  $(OPENSSL_PATH)/crypto/asn1/t_pkey.c\r
+  $(OPENSSL_PATH)/crypto/asn1/t_spki.c\r
+  $(OPENSSL_PATH)/crypto/asn1/t_bitst.c\r
+  $(OPENSSL_PATH)/crypto/asn1/tasn_new.c\r
+  $(OPENSSL_PATH)/crypto/asn1/tasn_fre.c\r
+  $(OPENSSL_PATH)/crypto/asn1/tasn_enc.c\r
+  $(OPENSSL_PATH)/crypto/asn1/tasn_dec.c\r
+  $(OPENSSL_PATH)/crypto/asn1/tasn_utl.c\r
+  $(OPENSSL_PATH)/crypto/asn1/tasn_typ.c\r
+  $(OPENSSL_PATH)/crypto/asn1/f_int.c\r
+  $(OPENSSL_PATH)/crypto/asn1/f_string.c\r
+  $(OPENSSL_PATH)/crypto/asn1/n_pkey.c\r
+  $(OPENSSL_PATH)/crypto/asn1/f_enum.c\r
+  $(OPENSSL_PATH)/crypto/asn1/a_hdr.c\r
+  $(OPENSSL_PATH)/crypto/asn1/x_pkey.c\r
+  $(OPENSSL_PATH)/crypto/asn1/a_bool.c\r
+  $(OPENSSL_PATH)/crypto/asn1/x_exten.c\r
+  $(OPENSSL_PATH)/crypto/asn1/asn_mime.c\r
+  $(OPENSSL_PATH)/crypto/asn1/asn1_gen.c\r
+  $(OPENSSL_PATH)/crypto/asn1/asn1_par.c\r
+  $(OPENSSL_PATH)/crypto/asn1/asn1_lib.c\r
+  $(OPENSSL_PATH)/crypto/asn1/asn1_err.c\r
+  $(OPENSSL_PATH)/crypto/asn1/a_meth.c\r
+  $(OPENSSL_PATH)/crypto/asn1/a_bytes.c\r
+  $(OPENSSL_PATH)/crypto/asn1/a_strnid.c\r
+  $(OPENSSL_PATH)/crypto/asn1/evp_asn1.c\r
+  $(OPENSSL_PATH)/crypto/asn1/asn_pack.c\r
+  $(OPENSSL_PATH)/crypto/asn1/p5_pbe.c\r
+  $(OPENSSL_PATH)/crypto/asn1/p5_pbev2.c\r
+  $(OPENSSL_PATH)/crypto/asn1/p8_pkey.c\r
+  $(OPENSSL_PATH)/crypto/asn1/asn_moid.c\r
+  $(OPENSSL_PATH)/crypto/pem/pem_sign.c\r
+  $(OPENSSL_PATH)/crypto/pem/pem_seal.c\r
+  $(OPENSSL_PATH)/crypto/pem/pem_info.c\r
+  $(OPENSSL_PATH)/crypto/pem/pem_lib.c\r
+  $(OPENSSL_PATH)/crypto/pem/pem_all.c\r
+  $(OPENSSL_PATH)/crypto/pem/pem_err.c\r
+  $(OPENSSL_PATH)/crypto/pem/pem_x509.c\r
+  $(OPENSSL_PATH)/crypto/pem/pem_xaux.c\r
+  $(OPENSSL_PATH)/crypto/pem/pem_oth.c\r
+  $(OPENSSL_PATH)/crypto/pem/pem_pk8.c\r
+  $(OPENSSL_PATH)/crypto/pem/pem_pkey.c\r
+  $(OPENSSL_PATH)/crypto/x509/x509_def.c\r
+  $(OPENSSL_PATH)/crypto/x509/x509_d2.c\r
+  $(OPENSSL_PATH)/crypto/x509/x509_r2x.c\r
+  $(OPENSSL_PATH)/crypto/x509/x509_cmp.c\r
+  $(OPENSSL_PATH)/crypto/x509/x509_obj.c\r
+  $(OPENSSL_PATH)/crypto/x509/x509_req.c\r
+  $(OPENSSL_PATH)/crypto/x509/x509spki.c\r
+  $(OPENSSL_PATH)/crypto/x509/x509_vfy.c\r
+  $(OPENSSL_PATH)/crypto/x509/x509_set.c\r
+  $(OPENSSL_PATH)/crypto/x509/x509cset.c\r
+  $(OPENSSL_PATH)/crypto/x509/x509rset.c\r
+  $(OPENSSL_PATH)/crypto/x509/x509_err.c\r
+  $(OPENSSL_PATH)/crypto/x509/x509name.c\r
+  $(OPENSSL_PATH)/crypto/x509/x509_v3.c\r
+  $(OPENSSL_PATH)/crypto/x509/x509_ext.c\r
+  $(OPENSSL_PATH)/crypto/x509/x509_att.c\r
+  $(OPENSSL_PATH)/crypto/x509/x509type.c\r
+  $(OPENSSL_PATH)/crypto/x509/x509_lu.c\r
+  $(OPENSSL_PATH)/crypto/x509/x_all.c\r
+  $(OPENSSL_PATH)/crypto/x509/x509_txt.c\r
+  $(OPENSSL_PATH)/crypto/x509/x509_trs.c\r
+  $(OPENSSL_PATH)/crypto/x509/by_file.c\r
+  $(OPENSSL_PATH)/crypto/x509/by_dir.c\r
+  $(OPENSSL_PATH)/crypto/x509/x509_vpm.c\r
+  $(OPENSSL_PATH)/crypto/x509v3/v3_bcons.c\r
+  $(OPENSSL_PATH)/crypto/x509v3/v3_bitst.c\r
+  $(OPENSSL_PATH)/crypto/x509v3/v3_conf.c\r
+  $(OPENSSL_PATH)/crypto/x509v3/v3_extku.c\r
+  $(OPENSSL_PATH)/crypto/x509v3/v3_ia5.c\r
+  $(OPENSSL_PATH)/crypto/x509v3/v3_lib.c\r
+  $(OPENSSL_PATH)/crypto/x509v3/v3_prn.c\r
+  $(OPENSSL_PATH)/crypto/x509v3/v3_utl.c\r
+  $(OPENSSL_PATH)/crypto/x509v3/v3err.c\r
+  $(OPENSSL_PATH)/crypto/x509v3/v3_genn.c\r
+  $(OPENSSL_PATH)/crypto/x509v3/v3_alt.c\r
+  $(OPENSSL_PATH)/crypto/x509v3/v3_skey.c\r
+  $(OPENSSL_PATH)/crypto/x509v3/v3_akey.c\r
+  $(OPENSSL_PATH)/crypto/x509v3/v3_pku.c\r
+  $(OPENSSL_PATH)/crypto/x509v3/v3_int.c\r
+  $(OPENSSL_PATH)/crypto/x509v3/v3_enum.c\r
+  $(OPENSSL_PATH)/crypto/x509v3/v3_sxnet.c\r
+  $(OPENSSL_PATH)/crypto/x509v3/v3_cpols.c\r
+  $(OPENSSL_PATH)/crypto/x509v3/v3_crld.c\r
+  $(OPENSSL_PATH)/crypto/x509v3/v3_purp.c\r
+  $(OPENSSL_PATH)/crypto/x509v3/v3_info.c\r
+  $(OPENSSL_PATH)/crypto/x509v3/v3_ocsp.c\r
+  $(OPENSSL_PATH)/crypto/x509v3/v3_akeya.c\r
+  $(OPENSSL_PATH)/crypto/x509v3/v3_pmaps.c\r
+  $(OPENSSL_PATH)/crypto/x509v3/v3_pcons.c\r
+  $(OPENSSL_PATH)/crypto/x509v3/v3_ncons.c\r
+  $(OPENSSL_PATH)/crypto/x509v3/v3_pcia.c\r
+  $(OPENSSL_PATH)/crypto/x509v3/v3_pci.c\r
+  $(OPENSSL_PATH)/crypto/x509v3/pcy_cache.c\r
+  $(OPENSSL_PATH)/crypto/x509v3/pcy_node.c\r
+  $(OPENSSL_PATH)/crypto/x509v3/pcy_data.c\r
+  $(OPENSSL_PATH)/crypto/x509v3/pcy_map.c\r
+  $(OPENSSL_PATH)/crypto/x509v3/pcy_tree.c\r
+  $(OPENSSL_PATH)/crypto/x509v3/pcy_lib.c\r
+  $(OPENSSL_PATH)/crypto/x509v3/v3_asid.c\r
+  $(OPENSSL_PATH)/crypto/x509v3/v3_addr.c\r
+  $(OPENSSL_PATH)/crypto/conf/conf_err.c\r
+  $(OPENSSL_PATH)/crypto/conf/conf_lib.c\r
+  $(OPENSSL_PATH)/crypto/conf/conf_api.c\r
+  $(OPENSSL_PATH)/crypto/conf/conf_def.c\r
+  $(OPENSSL_PATH)/crypto/conf/conf_mod.c\r
+  $(OPENSSL_PATH)/crypto/conf/conf_mall.c\r
+  $(OPENSSL_PATH)/crypto/conf/conf_sap.c\r
+  $(OPENSSL_PATH)/crypto/txt_db/txt_db.c\r
+  $(OPENSSL_PATH)/crypto/pkcs7/pk7_asn1.c\r
+  $(OPENSSL_PATH)/crypto/pkcs7/pk7_lib.c\r
+  $(OPENSSL_PATH)/crypto/pkcs7/pkcs7err.c\r
+  $(OPENSSL_PATH)/crypto/pkcs7/pk7_doit.c\r
+  $(OPENSSL_PATH)/crypto/pkcs7/pk7_smime.c\r
+  $(OPENSSL_PATH)/crypto/pkcs7/pk7_attr.c\r
+  $(OPENSSL_PATH)/crypto/pkcs7/pk7_mime.c\r
+  $(OPENSSL_PATH)/crypto/pkcs12/p12_add.c\r
+  $(OPENSSL_PATH)/crypto/pkcs12/p12_asn.c\r
+  $(OPENSSL_PATH)/crypto/pkcs12/p12_attr.c\r
+  $(OPENSSL_PATH)/crypto/pkcs12/p12_crpt.c\r
+  $(OPENSSL_PATH)/crypto/pkcs12/p12_crt.c\r
+  $(OPENSSL_PATH)/crypto/pkcs12/p12_decr.c\r
+  $(OPENSSL_PATH)/crypto/pkcs12/p12_init.c\r
+  $(OPENSSL_PATH)/crypto/pkcs12/p12_key.c\r
+  $(OPENSSL_PATH)/crypto/pkcs12/p12_kiss.c\r
+  $(OPENSSL_PATH)/crypto/pkcs12/p12_mutl.c\r
+  $(OPENSSL_PATH)/crypto/pkcs12/p12_utl.c\r
+  $(OPENSSL_PATH)/crypto/pkcs12/p12_npas.c\r
+  $(OPENSSL_PATH)/crypto/pkcs12/pk12err.c\r
+  $(OPENSSL_PATH)/crypto/pkcs12/p12_p8d.c\r
+  $(OPENSSL_PATH)/crypto/pkcs12/p12_p8e.c\r
+  $(OPENSSL_PATH)/crypto/comp/comp_lib.c\r
+  $(OPENSSL_PATH)/crypto/comp/comp_err.c\r
+  $(OPENSSL_PATH)/crypto/comp/c_rle.c\r
+  $(OPENSSL_PATH)/crypto/comp/c_zlib.c\r
+  $(OPENSSL_PATH)/crypto/engine/eng_err.c\r
+  $(OPENSSL_PATH)/crypto/engine/eng_lib.c\r
+  $(OPENSSL_PATH)/crypto/engine/eng_list.c\r
+  $(OPENSSL_PATH)/crypto/engine/eng_init.c\r
+  $(OPENSSL_PATH)/crypto/engine/eng_ctrl.c\r
+  $(OPENSSL_PATH)/crypto/engine/eng_table.c\r
+  $(OPENSSL_PATH)/crypto/engine/eng_pkey.c\r
+  $(OPENSSL_PATH)/crypto/engine/eng_fat.c\r
+  $(OPENSSL_PATH)/crypto/engine/eng_all.c\r
+  $(OPENSSL_PATH)/crypto/engine/tb_rsa.c\r
+  $(OPENSSL_PATH)/crypto/engine/tb_dsa.c\r
+  $(OPENSSL_PATH)/crypto/engine/tb_ecdsa.c\r
+  $(OPENSSL_PATH)/crypto/engine/tb_dh.c\r
+  $(OPENSSL_PATH)/crypto/engine/tb_ecdh.c\r
+  $(OPENSSL_PATH)/crypto/engine/tb_rand.c\r
+  $(OPENSSL_PATH)/crypto/engine/tb_store.c\r
+  $(OPENSSL_PATH)/crypto/engine/tb_cipher.c\r
+  $(OPENSSL_PATH)/crypto/engine/tb_digest.c\r
+  $(OPENSSL_PATH)/crypto/engine/eng_openssl.c\r
+  $(OPENSSL_PATH)/crypto/engine/eng_cnf.c\r
+  $(OPENSSL_PATH)/crypto/engine/eng_dyn.c\r
+  $(OPENSSL_PATH)/crypto/engine/eng_cryptodev.c\r
+  $(OPENSSL_PATH)/crypto/engine/eng_padlock.c\r
+  $(OPENSSL_PATH)/crypto/ocsp/ocsp_asn.c\r
+  $(OPENSSL_PATH)/crypto/ocsp/ocsp_ext.c\r
+  $(OPENSSL_PATH)/crypto/ocsp/ocsp_ht.c\r
+  $(OPENSSL_PATH)/crypto/ocsp/ocsp_lib.c\r
+  $(OPENSSL_PATH)/crypto/ocsp/ocsp_cl.c\r
+  $(OPENSSL_PATH)/crypto/ocsp/ocsp_srv.c\r
+  $(OPENSSL_PATH)/crypto/ocsp/ocsp_prn.c\r
+  $(OPENSSL_PATH)/crypto/ocsp/ocsp_vfy.c\r
+  $(OPENSSL_PATH)/crypto/ocsp/ocsp_err.c\r
+  $(OPENSSL_PATH)/crypto/ui/ui_err.c\r
+  $(OPENSSL_PATH)/crypto/ui/ui_lib.c\r
+\r
+  #\r
+  # Not required when OPENSSL_NO_STDIO is set, which is is for UEFI.\r
+  #\r
+  # $(OPENSSL_PATH)/crypto/ui/ui_openssl.c\r
+\r
+  $(OPENSSL_PATH)/crypto/ui/ui_util.c\r
+  $(OPENSSL_PATH)/crypto/ui/ui_compat.c\r
+  $(OPENSSL_PATH)/crypto/krb5/krb5_asn.c\r
+  $(OPENSSL_PATH)/crypto/store/str_err.c\r
+  $(OPENSSL_PATH)/crypto/store/str_lib.c\r
+  $(OPENSSL_PATH)/crypto/store/str_meth.c\r
+  $(OPENSSL_PATH)/crypto/store/str_mem.c\r
+  $(OPENSSL_PATH)/crypto/pqueue/pqueue.c\r
+\r
+[Packages]\r
+  MdePkg/MdePkg.dec\r
+  CryptoPkg/CryptoPkg.dec\r
+\r
+[LibraryClasses]\r
+  DebugLib\r
+\r
+[BuildOptions]\r
+   MSFT:*_*_*_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) /WX- /GL- \r
+  INTEL:*_*_*_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER -U__ICC $(OPENSSL_FLAGS) /WX- \r
+    GCC:*_*_*_CC_FLAGS = -U_WIN32 -U_WIN64 $(OPENSSL_FLAGS) -w\r
diff --git a/CryptoPkg/Library/OpensslLib/Patch-HOWTO.txt b/CryptoPkg/Library/OpensslLib/Patch-HOWTO.txt
new file mode 100644 (file)
index 0000000..c35f88d
--- /dev/null
@@ -0,0 +1,61 @@
+\r
+================================================================================\r
+                                 Introduction\r
+================================================================================\r
+  OpenSSL is a well-known open source implementation of SSL and TLS protocols.\r
+The core library implements the basic cryptographic functions and provides various\r
+utility functions. The OpenSSL library is widely used in variety of security \r
+products development as base crypto provider. (See http://www.openssl.org for more \r
+information for OpenSSL).\r
+  UEFI (Unified Extensible Firmware Interface) is a specification detailing the \r
+interfaces between OS and platform firmware. Several security features were \r
+introduced (e.g. Authenticated Variable Service, Driver Signing, etc) from UEFI \r
+2.2 (http://www.uefi.org). These security features highly depends on the \r
+cryptography. This patch will enable openssl building under UEFI environment.\r
+\r
+\r
+================================================================================\r
+                                OpenSSL-Version\r
+================================================================================\r
+  Current supported OpenSSL version for UEFI Crypto Library is 0.9.8l.\r
+    http://www.openssl.org/source/openssl-0.9.8l.tar.gz\r
+\r
+\r
+================================================================================\r
+                      HOW to Install Openssl for UEFI Building\r
+================================================================================\r
+1.  Download OpenSSL 0.9.8l from official website:\r
+       http://www.openssl.org/source/openssl-0.9.8l.tar.gz\r
+\r
+    NOTE: Some web browsers may rename the downloaded TAR file to openssl-0.9.8l.tar.tar.\r
+          When you do the download, rename the "openssl-0.9.8l.tar.tar" to\r
+          "openssl-0.9.8l.tar.gz" or rename the local downloaded file with ".tar.tar"\r
+          extension to ".tar.gz".\r
+\r
+2.  Extract TAR into CryptoPkg/Library/OpenSslLib/openssl-0.9.8l\r
+\r
+    NOTE: If you use WinZip to unpack the openssl source in Windows, please \r
+          uncheck the WinZip smart CR/LF conversion option (WINZIP: Options --> \r
+          Configuration --> Miscellaneous --> "TAR file smart CR/LF conversion").\r
+  \r
+3.  Apply this patch: EDKII_openssl-0.9.8l.patch, and make installation\r
+\r
+    For Windows Environment:\r
+    ------------------------\r
+    1) Make sure the patch utility has been installed in your machine.\r
+       Install Cygwin or get the patch utility binary from \r
+          http://gnuwin32.sourceforge.net/packages/patch.htm\r
+    2) cd $(WORKSPACE)\CryptoPkg\Library\OpensslLib\openssl-0.9.8l\r
+    3) patch -p0 -i ..\EDKII_openssl-0.9.8l.patch\r
+    4) cd ..\r
+    5) install.cmd\r
+\r
+    For Linux* Environment:\r
+    -----------------------\r
+    1) Make sure the patch utility has been installed in your machine.\r
+       Patch utility is available from http://directory.fsf.org/project/patch/\r
+    2) cd $(WORKSPACE)/CryptoPkg/Library/OpensslLib/openssl-0.9.8l\r
+    3) patch -p0 -i ../EDKII_openssl-0.9.8l.patch\r
+    4) cd ..\r
+    5) ./install.sh\r
+\r
diff --git a/CryptoPkg/Library/OpensslLib/buildinf.h b/CryptoPkg/Library/OpensslLib/buildinf.h
new file mode 100644 (file)
index 0000000..673bf78
--- /dev/null
@@ -0,0 +1,2 @@
+#define PLATFORM  "UEFI"\r
+#define DATE      "Mon Mar 8 14:17:05 PDT 2010"\r