Coverage Report

Created: 2020-05-23 13:54

/src/botan/src/lib/pubkey/x509_key.cpp
Line
Count
Source (jump to first uncovered line)
1
/*
2
* X.509 Public Key
3
* (C) 1999-2010 Jack Lloyd
4
*
5
* Botan is released under the Simplified BSD License (see license.txt)
6
*/
7
8
#include <botan/x509_key.h>
9
#include <botan/data_src.h>
10
#include <botan/ber_dec.h>
11
#include <botan/pem.h>
12
#include <botan/alg_id.h>
13
#include <botan/pk_algs.h>
14
15
namespace Botan {
16
17
namespace X509 {
18
19
std::vector<uint8_t> BER_encode(const Public_Key& key)
20
0
   {
21
0
   // keeping it around for compat
22
0
   return key.subject_public_key();
23
0
   }
24
25
/*
26
* PEM encode a X.509 public key
27
*/
28
std::string PEM_encode(const Public_Key& key)
29
0
   {
30
0
   return PEM_Code::encode(key.subject_public_key(),
31
0
                           "PUBLIC KEY");
32
0
   }
33
34
/*
35
* Extract a public key and return it
36
*/
37
Public_Key* load_key(DataSource& source)
38
9.27k
   {
39
9.27k
   try {
40
9.27k
      AlgorithmIdentifier alg_id;
41
9.27k
      std::vector<uint8_t> key_bits;
42
9.27k
43
9.27k
      if(ASN1::maybe_BER(source) && !PEM_Code::matches(source))
44
9.27k
         {
45
9.27k
         BER_Decoder(source)
46
9.27k
            .start_cons(SEQUENCE)
47
9.27k
            .decode(alg_id)
48
9.27k
            .decode(key_bits, BIT_STRING)
49
9.27k
         .end_cons();
50
9.27k
         }
51
0
      else
52
0
         {
53
0
         DataSource_Memory ber(
54
0
            PEM_Code::decode_check_label(source, "PUBLIC KEY")
55
0
            );
56
0
57
0
         BER_Decoder(ber)
58
0
            .start_cons(SEQUENCE)
59
0
            .decode(alg_id)
60
0
            .decode(key_bits, BIT_STRING)
61
0
         .end_cons();
62
0
         }
63
9.27k
64
9.27k
      if(key_bits.empty())
65
5
         throw Decoding_Error("X.509 public key decoding");
66
9.27k
67
9.27k
      return load_public_key(alg_id, key_bits).release();
68
9.27k
      }
69
1.26k
   catch(Decoding_Error& e)
70
1.26k
      {
71
1.26k
      throw Decoding_Error("X.509 public key decoding", e);
72
1.26k
      }
73
9.27k
   }
74
75
#if defined(BOTAN_TARGET_OS_HAS_FILESYSTEM)
76
/*
77
* Extract a public key and return it
78
*/
79
Public_Key* load_key(const std::string& fsname)
80
0
   {
81
0
   DataSource_Stream source(fsname, true);
82
0
   return X509::load_key(source);
83
0
   }
84
#endif
85
86
/*
87
* Extract a public key and return it
88
*/
89
Public_Key* load_key(const std::vector<uint8_t>& mem)
90
9.27k
   {
91
9.27k
   DataSource_Memory source(mem);
92
9.27k
   return X509::load_key(source);
93
9.27k
   }
94
95
/*
96
* Make a copy of this public key
97
*/
98
Public_Key* copy_key(const Public_Key& key)
99
0
   {
100
0
   DataSource_Memory source(PEM_encode(key));
101
0
   return X509::load_key(source);
102
0
   }
103
104
}
105
106
}