aboutsummaryrefslogtreecommitdiffstats
path: root/src/extra_tests/fuzzers/jigs/pkcs1.cpp
blob: 889308f0e9c51ac7e3d5f35d611430ab166dd61c (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
/*
* (C) 2015,2016 Jack Lloyd
*
* Botan is released under the Simplified BSD License (see license.txt)
*/
#include "driver.h"

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

secure_vector<byte> simple_pkcs1_unpad(const byte in[], size_t len)
   {
   if(len < 10)
      throw Botan::Decoding_Error("bad len");

   if(in[0] != 2)
      throw Botan::Decoding_Error("bad field");

   for(size_t i = 1; i < len; ++i)
      {
      if(in[i] == 0)
         {
         if(i < 9)
            throw Botan::Decoding_Error("insufficient padding bytes");
         return secure_vector<byte>(in + i + 1, in + len);
         }
      }

   throw Botan::Decoding_Error("delim not found");
   }

void fuzz(const uint8_t in[], size_t len)
   {
   static EME_PKCS1v15 pkcs1;

   secure_vector<byte> lib_result, ref_result;
   bool lib_rejected = false, ref_rejected = false;

   try
      {
      byte valid_mask = 0;
      secure_vector<byte> decoded = ((EME*)&pkcs1)->unpad(valid_mask, in, len);

      if(valid_mask == 0)
         lib_rejected = false;
      else if(valid_mask == 0xFF)
         lib_rejected = true;
      else
         abort();
      }
   catch(Botan::Decoding_Error&) { lib_rejected = true; }

   try
      {
      ref_result = simple_pkcs1_unpad(in, len);
      }
   catch(Botan::Decoding_Error&) { ref_rejected = true; }

   FUZZER_ASSERT_EQUAL(lib_rejected, ref_rejected);

   if(lib_result != ref_result)
      {
      std::cerr << hex_encode(lib_result) << " != ref \n"
                << hex_encode(ref_result) << std::endl;
      abort();
      }

   }