Home | History | Annotate | Download | only in Cryptest
      1 /** @file
      2   Application for Hash Primitives Validation.
      3 
      4 Copyright (c) 2010 - 2016, Intel Corporation. All rights reserved.<BR>
      5 This program and the accompanying materials
      6 are licensed and made available under the terms and conditions of the BSD License
      7 which accompanies this distribution.  The full text of the license may be found at
      8 http://opensource.org/licenses/bsd-license.php
      9 
     10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     12 
     13 **/
     14 
     15 #include "Cryptest.h"
     16 
     17 //
     18 // Max Known Digest Size is SHA512 Output (64 bytes) by far
     19 //
     20 #define MAX_DIGEST_SIZE    64
     21 
     22 //
     23 // Message string for digest validation
     24 //
     25 GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 *HashData = "abc";
     26 
     27 //
     28 // Result for MD4("abc"). (From "A.5 Test suite" of IETF RFC1320)
     29 //
     30 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Md4Digest[MD4_DIGEST_SIZE] = {
     31   0xa4, 0x48, 0x01, 0x7a, 0xaf, 0x21, 0xd8, 0x52, 0x5f, 0xc1, 0x0a, 0xe8, 0x7a, 0xa6, 0x72, 0x9d
     32   };
     33 
     34 //
     35 // Result for MD5("abc"). (From "A.5 Test suite" of IETF RFC1321)
     36 //
     37 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Md5Digest[MD5_DIGEST_SIZE] = {
     38   0x90, 0x01, 0x50, 0x98, 0x3c, 0xd2, 0x4f, 0xb0, 0xd6, 0x96, 0x3f, 0x7d, 0x28, 0xe1, 0x7f, 0x72
     39   };
     40 
     41 //
     42 // Result for SHA-1("abc"). (From "A.1 SHA-1 Example" of NIST FIPS 180-2)
     43 //
     44 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Sha1Digest[SHA1_DIGEST_SIZE] = {
     45   0xa9, 0x99, 0x3e, 0x36, 0x47, 0x06, 0x81, 0x6a, 0xba, 0x3e, 0x25, 0x71, 0x78, 0x50, 0xc2, 0x6c,
     46   0x9c, 0xd0, 0xd8, 0x9d
     47   };
     48 
     49 //
     50 // Result for SHA-256("abc"). (From "B.1 SHA-256 Example" of NIST FIPS 180-2)
     51 //
     52 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Sha256Digest[SHA256_DIGEST_SIZE] = {
     53   0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea, 0x41, 0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23,
     54   0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c, 0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad
     55   };
     56 
     57 //
     58 // Result for SHA-384("abc"). (From "D.1 SHA-384 Example" of NIST FIPS 180-2)
     59 //
     60 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Sha384Digest[SHA384_DIGEST_SIZE] = {
     61   0xcb, 0x00, 0x75, 0x3f, 0x45, 0xa3, 0x5e, 0x8b, 0xb5, 0xa0, 0x3d, 0x69, 0x9a, 0xc6, 0x50, 0x07,
     62   0x27, 0x2c, 0x32, 0xab, 0x0e, 0xde, 0xd1, 0x63, 0x1a, 0x8b, 0x60, 0x5a, 0x43, 0xff, 0x5b, 0xed,
     63   0x80, 0x86, 0x07, 0x2b, 0xa1, 0xe7, 0xcc, 0x23, 0x58, 0xba, 0xec, 0xa1, 0x34, 0xc8, 0x25, 0xa7
     64   };
     65 
     66 //
     67 // Result for SHA-512("abc"). (From "C.1 SHA-512 Example" of NIST FIPS 180-2)
     68 //
     69 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Sha512Digest[SHA512_DIGEST_SIZE] = {
     70   0xdd, 0xaf, 0x35, 0xa1, 0x93, 0x61, 0x7a, 0xba, 0xcc, 0x41, 0x73, 0x49, 0xae, 0x20, 0x41, 0x31,
     71   0x12, 0xe6, 0xfa, 0x4e, 0x89, 0xa9, 0x7e, 0xa2, 0x0a, 0x9e, 0xee, 0xe6, 0x4b, 0x55, 0xd3, 0x9a,
     72   0x21, 0x92, 0x99, 0x2a, 0x27, 0x4f, 0xc1, 0xa8, 0x36, 0xba, 0x3c, 0x23, 0xa3, 0xfe, 0xeb, 0xbd,
     73   0x45, 0x4d, 0x44, 0x23, 0x64, 0x3c, 0xe8, 0x0e, 0x2a, 0x9a, 0xc9, 0x4f, 0xa5, 0x4c, 0xa4, 0x9f
     74   };
     75 
     76 /**
     77   Validate UEFI-OpenSSL Digest Interfaces.
     78 
     79   @retval  EFI_SUCCESS  Validation succeeded.
     80   @retval  EFI_ABORTED  Validation failed.
     81 
     82 **/
     83 EFI_STATUS
     84 ValidateCryptDigest (
     85   VOID
     86   )
     87 {
     88   UINTN    CtxSize;
     89   VOID     *HashCtx;
     90   UINTN    DataSize;
     91   UINT8    Digest[MAX_DIGEST_SIZE];
     92   BOOLEAN  Status;
     93 
     94   Print (L" UEFI-OpenSSL Hash Engine Testing:\n");
     95   DataSize = AsciiStrLen (HashData);
     96 
     97   Print (L"- MD4:    ");
     98 
     99   //
    100   // MD4 Digest Validation
    101   //
    102   ZeroMem (Digest, MAX_DIGEST_SIZE);
    103   CtxSize = Md4GetContextSize ();
    104   HashCtx = AllocatePool (CtxSize);
    105 
    106   Print (L"Init... ");
    107   Status  = Md4Init (HashCtx);
    108   if (!Status) {
    109     Print (L"[Fail]");
    110     return EFI_ABORTED;
    111   }
    112 
    113   Print (L"Update... ");
    114   Status  = Md4Update (HashCtx, HashData, DataSize);
    115   if (!Status) {
    116     Print (L"[Fail]");
    117     return EFI_ABORTED;
    118   }
    119 
    120   Print (L"Finalize... ");
    121   Status  = Md4Final (HashCtx, Digest);
    122   if (!Status) {
    123     Print (L"[Fail]");
    124     return EFI_ABORTED;
    125   }
    126 
    127   FreePool (HashCtx);
    128 
    129   Print (L"Check Value... ");
    130   if (CompareMem (Digest, Md4Digest, MD4_DIGEST_SIZE) != 0) {
    131     Print (L"[Fail]");
    132     return EFI_ABORTED;
    133   }
    134 
    135   Print (L"HashAll... ");
    136   ZeroMem (Digest, MD5_DIGEST_SIZE);
    137   Status  = Md4HashAll (HashData, DataSize, Digest);
    138   if (!Status) {
    139     Print (L"[Fail]");
    140     return EFI_ABORTED;
    141   }
    142   if (CompareMem (Digest, Md4Digest, MD4_DIGEST_SIZE) != 0) {
    143     Print (L"[Fail]");
    144     return EFI_ABORTED;
    145   }
    146 
    147   Print (L"[Pass]\n");
    148 
    149   Print (L"- MD5:    ");
    150 
    151   //
    152   // MD5 Digest Validation
    153   //
    154   ZeroMem (Digest, MAX_DIGEST_SIZE);
    155   CtxSize = Md5GetContextSize ();
    156   HashCtx = AllocatePool (CtxSize);
    157 
    158   Print (L"Init... ");
    159   Status  = Md5Init (HashCtx);
    160   if (!Status) {
    161     Print (L"[Fail]");
    162     return EFI_ABORTED;
    163   }
    164 
    165   Print (L"Update... ");
    166   Status  = Md5Update (HashCtx, HashData, DataSize);
    167   if (!Status) {
    168     Print (L"[Fail]");
    169     return EFI_ABORTED;
    170   }
    171 
    172   Print (L"Finalize... ");
    173   Status  = Md5Final (HashCtx, Digest);
    174   if (!Status) {
    175     Print (L"[Fail]");
    176     return EFI_ABORTED;
    177   }
    178 
    179   FreePool (HashCtx);
    180 
    181   Print (L"Check Value... ");
    182   if (CompareMem (Digest, Md5Digest, MD5_DIGEST_SIZE) != 0) {
    183     Print (L"[Fail]");
    184     return EFI_ABORTED;
    185   }
    186 
    187   Print (L"HashAll... ");
    188   ZeroMem (Digest, MD5_DIGEST_SIZE);
    189   Status  = Md5HashAll (HashData, DataSize, Digest);
    190   if (!Status) {
    191     Print (L"[Fail]");
    192     return EFI_ABORTED;
    193   }
    194   if (CompareMem (Digest, Md5Digest, MD5_DIGEST_SIZE) != 0) {
    195     Print (L"[Fail]");
    196     return EFI_ABORTED;
    197   }
    198 
    199   Print (L"[Pass]\n");
    200 
    201   Print (L"- SHA1:   ");
    202 
    203   //
    204   // SHA-1 Digest Validation
    205   //
    206   ZeroMem (Digest, MAX_DIGEST_SIZE);
    207   CtxSize = Sha1GetContextSize ();
    208   HashCtx = AllocatePool (CtxSize);
    209 
    210   Print (L"Init... ");
    211   Status  = Sha1Init (HashCtx);
    212   if (!Status) {
    213     Print (L"[Fail]");
    214     return EFI_ABORTED;
    215   }
    216 
    217   Print (L"Update... ");
    218   Status  = Sha1Update (HashCtx, HashData, DataSize);
    219   if (!Status) {
    220     Print (L"[Fail]");
    221     return EFI_ABORTED;
    222   }
    223 
    224   Print (L"Finalize... ");
    225   Status  = Sha1Final (HashCtx, Digest);
    226   if (!Status) {
    227     Print (L"[Fail]");
    228     return EFI_ABORTED;
    229   }
    230 
    231   FreePool (HashCtx);
    232 
    233   Print (L"Check Value... ");
    234   if (CompareMem (Digest, Sha1Digest, SHA1_DIGEST_SIZE) != 0) {
    235     Print (L"[Fail]");
    236     return EFI_ABORTED;
    237   }
    238 
    239   Print (L"HashAll... ");
    240   ZeroMem (Digest, SHA1_DIGEST_SIZE);
    241   Status  = Sha1HashAll (HashData, DataSize, Digest);
    242   if (!Status) {
    243     Print (L"[Fail]");
    244     return EFI_ABORTED;
    245   }
    246   if (CompareMem (Digest, Sha1Digest, SHA1_DIGEST_SIZE) != 0) {
    247     Print (L"[Fail]");
    248     return EFI_ABORTED;
    249   }
    250 
    251   Print (L"[Pass]\n");
    252 
    253   Print (L"- SHA256: ");
    254 
    255   //
    256   // SHA256 Digest Validation
    257   //
    258   ZeroMem (Digest, MAX_DIGEST_SIZE);
    259   CtxSize = Sha256GetContextSize ();
    260   HashCtx = AllocatePool (CtxSize);
    261 
    262   Print (L"Init... ");
    263   Status  = Sha256Init (HashCtx);
    264   if (!Status) {
    265     Print (L"[Fail]");
    266     return EFI_ABORTED;
    267   }
    268 
    269   Print (L"Update... ");
    270   Status  = Sha256Update (HashCtx, HashData, DataSize);
    271   if (!Status) {
    272     Print (L"[Fail]");
    273     return EFI_ABORTED;
    274   }
    275 
    276   Print (L"Finalize... ");
    277   Status  = Sha256Final (HashCtx, Digest);
    278   if (!Status) {
    279     Print (L"[Fail]");
    280     return EFI_ABORTED;
    281   }
    282 
    283   FreePool (HashCtx);
    284 
    285   Print (L"Check Value... ");
    286   if (CompareMem (Digest, Sha256Digest, SHA256_DIGEST_SIZE) != 0) {
    287     Print (L"[Fail]");
    288     return EFI_ABORTED;
    289   }
    290 
    291   Print (L"HashAll... ");
    292   ZeroMem (Digest, SHA256_DIGEST_SIZE);
    293   Status  = Sha256HashAll (HashData, DataSize, Digest);
    294   if (!Status) {
    295     Print (L"[Fail]");
    296     return EFI_ABORTED;
    297   }
    298   if (CompareMem (Digest, Sha256Digest, SHA256_DIGEST_SIZE) != 0) {
    299     Print (L"[Fail]");
    300     return EFI_ABORTED;
    301   }
    302 
    303   Print (L"[Pass]\n");
    304 
    305   Print (L"- SHA384: ");
    306 
    307   //
    308   // SHA384 Digest Validation
    309   //
    310   ZeroMem (Digest, MAX_DIGEST_SIZE);
    311   CtxSize = Sha384GetContextSize ();
    312   HashCtx = AllocatePool (CtxSize);
    313 
    314   Print (L"Init... ");
    315   Status  = Sha384Init (HashCtx);
    316   if (!Status) {
    317     Print (L"[Fail]");
    318     return EFI_ABORTED;
    319   }
    320 
    321   Print (L"Update... ");
    322   Status  = Sha384Update (HashCtx, HashData, DataSize);
    323   if (!Status) {
    324     Print (L"[Fail]");
    325     return EFI_ABORTED;
    326   }
    327 
    328   Print (L"Finalize... ");
    329   Status  = Sha384Final (HashCtx, Digest);
    330   if (!Status) {
    331     Print (L"[Fail]");
    332     return EFI_ABORTED;
    333   }
    334 
    335   FreePool (HashCtx);
    336 
    337   Print (L"Check Value... ");
    338   if (CompareMem (Digest, Sha384Digest, SHA384_DIGEST_SIZE) != 0) {
    339     Print (L"[Fail]");
    340     return EFI_ABORTED;
    341   }
    342 
    343   Print (L"HashAll... ");
    344   ZeroMem (Digest, SHA384_DIGEST_SIZE);
    345   Status  = Sha384HashAll (HashData, DataSize, Digest);
    346   if (!Status) {
    347     Print (L"[Fail]");
    348     return EFI_ABORTED;
    349   }
    350   if (CompareMem (Digest, Sha384Digest, SHA384_DIGEST_SIZE) != 0) {
    351     Print (L"[Fail]");
    352     return EFI_ABORTED;
    353   }
    354 
    355   Print (L"[Pass]\n");
    356 
    357   Print (L"- SHA512: ");
    358 
    359   //
    360   // SHA512 Digest Validation
    361   //
    362   ZeroMem (Digest, MAX_DIGEST_SIZE);
    363   CtxSize = Sha512GetContextSize ();
    364   HashCtx = AllocatePool (CtxSize);
    365 
    366   Print (L"Init... ");
    367   Status  = Sha512Init (HashCtx);
    368   if (!Status) {
    369     Print (L"[Fail]");
    370     return EFI_ABORTED;
    371   }
    372 
    373   Print (L"Update... ");
    374   Status  = Sha512Update (HashCtx, HashData, DataSize);
    375   if (!Status) {
    376     Print (L"[Fail]");
    377     return EFI_ABORTED;
    378   }
    379 
    380   Print (L"Finalize... ");
    381   Status  = Sha512Final (HashCtx, Digest);
    382   if (!Status) {
    383     Print (L"[Fail]");
    384     return EFI_ABORTED;
    385   }
    386 
    387   FreePool (HashCtx);
    388 
    389   Print (L"Check Value... ");
    390   if (CompareMem (Digest, Sha512Digest, SHA512_DIGEST_SIZE) != 0) {
    391     Print (L"[Fail]");
    392     return EFI_ABORTED;
    393   }
    394 
    395   Print (L"HashAll... ");
    396   ZeroMem (Digest, SHA512_DIGEST_SIZE);
    397   Status  = Sha512HashAll (HashData, DataSize, Digest);
    398   if (!Status) {
    399     Print (L"[Fail]");
    400     return EFI_ABORTED;
    401   }
    402   if (CompareMem (Digest, Sha512Digest, SHA512_DIGEST_SIZE) != 0) {
    403     Print (L"[Fail]");
    404     return EFI_ABORTED;
    405   }
    406 
    407   Print (L"[Pass]\n");
    408 
    409   return EFI_SUCCESS;
    410 }
    411