Botan 2.19.1
Crypto and TLS for C&
x509_key.cpp
Go to the documentation of this file.
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/asn1_obj.h>
13#include <botan/pk_algs.h>
14
15namespace Botan {
16
17namespace X509 {
18
19std::vector<uint8_t> BER_encode(const Public_Key& key)
20 {
21 // keeping it around for compat
22 return key.subject_public_key();
23 }
24
25/*
26* PEM encode a X.509 public key
27*/
28std::string PEM_encode(const Public_Key& key)
29 {
31 "PUBLIC KEY");
32 }
33
34/*
35* Extract a public key and return it
36*/
38 {
39 try {
41 std::vector<uint8_t> key_bits;
42
43 if(ASN1::maybe_BER(source) && !PEM_Code::matches(source))
44 {
45 BER_Decoder(source)
47 .decode(alg_id)
48 .decode(key_bits, BIT_STRING)
49 .end_cons();
50 }
51 else
52 {
54 PEM_Code::decode_check_label(source, "PUBLIC KEY")
55 );
56
57 BER_Decoder(ber)
59 .decode(alg_id)
60 .decode(key_bits, BIT_STRING)
61 .end_cons();
62 }
63
64 if(key_bits.empty())
65 throw Decoding_Error("X.509 public key decoding");
66
67 return load_public_key(alg_id, key_bits).release();
68 }
69 catch(Decoding_Error& e)
70 {
71 throw Decoding_Error("X.509 public key decoding", e);
72 }
73 }
74
75#if defined(BOTAN_TARGET_OS_HAS_FILESYSTEM)
76/*
77* Extract a public key and return it
78*/
79Public_Key* load_key(const std::string& fsname)
80 {
81 DataSource_Stream source(fsname, true);
82 return X509::load_key(source);
83 }
84#endif
85
86/*
87* Extract a public key and return it
88*/
89Public_Key* load_key(const std::vector<uint8_t>& mem)
90 {
91 DataSource_Memory source(mem);
92 return X509::load_key(source);
93 }
94
95/*
96* Make a copy of this public key
97*/
99 {
100 DataSource_Memory source(PEM_encode(key));
101 return X509::load_key(source);
102 }
103
104}
105
106}
BER_Decoder start_cons(ASN1_Tag type_tag, ASN1_Tag class_tag=UNIVERSAL)
Definition: ber_dec.cpp:290
BER_Decoder & decode(bool &out)
Definition: ber_dec.h:170
BER_Decoder & end_cons()
Definition: ber_dec.cpp:300
std::vector< uint8_t > subject_public_key() const
Definition: pk_keys.cpp:38
bool maybe_BER(DataSource &source)
Definition: asn1_obj.cpp:222
std::string encode(const uint8_t der[], size_t length, const std::string &label, size_t width)
Definition: pem.cpp:43
bool matches(DataSource &source, const std::string &extra, size_t search_range)
Definition: pem.cpp:142
secure_vector< uint8_t > decode_check_label(DataSource &source, const std::string &label_want)
Definition: pem.cpp:54
Public_Key * copy_key(const Public_Key &key)
Definition: x509_key.cpp:98
std::vector< uint8_t > BER_encode(const Public_Key &key)
Definition: x509_key.cpp:19
Public_Key * load_key(DataSource &source)
Definition: x509_key.cpp:37
std::string PEM_encode(const Public_Key &key)
Definition: x509_key.cpp:28
Definition: alg_id.cpp:13
@ BIT_STRING
Definition: asn1_obj.h:37
@ SEQUENCE
Definition: asn1_obj.h:42
std::unique_ptr< Public_Key > load_public_key(const AlgorithmIdentifier &alg_id, const std::vector< uint8_t > &key_bits)
Definition: pk_algs.cpp:82