aboutsummaryrefslogtreecommitdiffstats
path: root/checks/keywrap.cpp
blob: a7dcbfe750fbbcd98f5e4e6da374b2569d1f2a5f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include "tests.h"

#include <botan/libstate.h>
#include <botan/hex.h>

#if defined(BOTAN_HAS_RFC3394_KEYWRAP)
  #include <botan/rfc3394.h>
#endif

#include <iostream>

using namespace Botan;

namespace {

size_t keywrap_test(const char* key_str,
                    const char* expected_str,
                    const char* kek_str)
   {
   size_t fail = 0;

#if defined(BOTAN_HAS_RFC3394_KEYWRAP)
   try
      {
      SymmetricKey key(key_str);
      SymmetricKey expected(expected_str);
      SymmetricKey kek(kek_str);

      Algorithm_Factory& af = global_state().algorithm_factory();

      secure_vector<byte> enc = rfc3394_keywrap(key.bits_of(), kek, af);

      if(enc != expected.bits_of())
         {
         std::cout << "NIST key wrap encryption failure: "
                   << hex_encode(enc) << " != " << hex_encode(expected.bits_of()) << "\n";
         fail++;
         }

      secure_vector<byte> dec = rfc3394_keyunwrap(expected.bits_of(), kek, af);

      if(dec != key.bits_of())
         {
         std::cout << "NIST key wrap decryption failure: "
                   << hex_encode(dec) << " != " << hex_encode(key.bits_of()) << "\n";
         fail++;
         }
      }
   catch(std::exception& e)
      {
      std::cout << e.what() << "\n";
      fail++;
      }
#endif

   return fail;
   }

}

size_t test_keywrap()
   {
   size_t fails = 0;

   fails += keywrap_test("00112233445566778899AABBCCDDEEFF",
                         "1FA68B0A8112B447AEF34BD8FB5A7B829D3E862371D2CFE5",
                         "000102030405060708090A0B0C0D0E0F");

   fails += keywrap_test("00112233445566778899AABBCCDDEEFF",
                         "96778B25AE6CA435F92B5B97C050AED2468AB8A17AD84E5D",
                         "000102030405060708090A0B0C0D0E0F1011121314151617");

   fails += keywrap_test("00112233445566778899AABBCCDDEEFF",
                         "64E8C3F9CE0F5BA263E9777905818A2A93C8191E7D6E8AE7",
                         "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F");

   fails += keywrap_test("00112233445566778899AABBCCDDEEFF0001020304050607",
                         "031D33264E15D33268F24EC260743EDCE1C6C7DDEE725A936BA814915C6762D2",
                         "000102030405060708090A0B0C0D0E0F1011121314151617");

   fails += keywrap_test("00112233445566778899AABBCCDDEEFF0001020304050607",
                         "A8F9BC1612C68B3FF6E6F4FBE30E71E4769C8B80A32CB8958CD5D17D6B254DA1",
                         "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F");

   fails += keywrap_test("00112233445566778899AABBCCDDEEFF000102030405060708090A0B0C0D0E0F",
                         "28C9F404C4B810F4CBCCB35CFB87F8263F5786E2D80ED326CBC7F0E71A99F43BFB988B9B7A02DD21",
                         "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F");

   return fails;
   }