Botan  1.11.15
Functions
Botan::PEM_Code Namespace Reference

Functions

secure_vector< bytedecode (DataSource &source, std::string &label)
secure_vector< bytedecode (const std::string &pem, std::string &label)
secure_vector< bytedecode_check_label (DataSource &source, const std::string &label_want)
secure_vector< bytedecode_check_label (const std::string &pem, const std::string &label_want)
std::string encode (const byte der[], size_t length, const std::string &label, size_t width)
std::string encode (const std::vector< byte > &data, const std::string &label, size_t line_width=64)
std::string encode (const secure_vector< byte > &data, const std::string &label, size_t line_width=64)
bool matches (DataSource &source, const std::string &extra, size_t search_range)

Function Documentation

BOTAN_DLL secure_vector< byte > Botan::PEM_Code::decode ( DataSource &  pem,
std::string &  label 
)

Decode PEM data

Parameters:
pema datasource containing PEM encoded data
labelis set to the PEM label found for later inspection

Definition at line 47 of file pem.cpp.

References Botan::Pipe::end_msg(), Botan::Pipe::read_all(), Botan::DataSource::read_byte(), Botan::Pipe::start_msg(), and Botan::Pipe::write().

Referenced by decode(), decode_check_label(), and Botan::DL_Group::PEM_decode().

   {
   const size_t RANDOM_CHAR_LIMIT = 8;

   const std::string PEM_HEADER1 = "-----BEGIN ";
   const std::string PEM_HEADER2 = "-----";
   size_t position = 0;

   while(position != PEM_HEADER1.length())
      {
      byte b;
      if(!source.read_byte(b))
         throw Decoding_Error("PEM: No PEM header found");
      if(b == PEM_HEADER1[position])
         ++position;
      else if(position >= RANDOM_CHAR_LIMIT)
         throw Decoding_Error("PEM: Malformed PEM header");
      else
         position = 0;
      }
   position = 0;
   while(position != PEM_HEADER2.length())
      {
      byte b;
      if(!source.read_byte(b))
         throw Decoding_Error("PEM: No PEM header found");
      if(b == PEM_HEADER2[position])
         ++position;
      else if(position)
         throw Decoding_Error("PEM: Malformed PEM header");

      if(position == 0)
         label += static_cast<char>(b);
      }

   Pipe base64(new Base64_Decoder);
   base64.start_msg();

   const std::string PEM_TRAILER = "-----END " + label + "-----";
   position = 0;
   while(position != PEM_TRAILER.length())
      {
      byte b;
      if(!source.read_byte(b))
         throw Decoding_Error("PEM: No PEM trailer found");
      if(b == PEM_TRAILER[position])
         ++position;
      else if(position)
         throw Decoding_Error("PEM: Malformed PEM trailer");

      if(position == 0)
         base64.write(b);
      }
   base64.end_msg();
   return base64.read_all();
   }
BOTAN_DLL secure_vector< byte > Botan::PEM_Code::decode ( const std::string &  pem,
std::string &  label 
)

Decode PEM data

Parameters:
pema string containing PEM encoded data
labelis set to the PEM label found for later inspection

Definition at line 111 of file pem.cpp.

References decode().

   {
   DataSource_Memory src(pem);
   return decode(src, label);
   }
BOTAN_DLL secure_vector< byte > Botan::PEM_Code::decode_check_label ( DataSource &  pem,
const std::string &  label 
)

Decode PEM data

Parameters:
pema datasource containing PEM encoded data
labelis what we expect the label to be

Definition at line 33 of file pem.cpp.

References decode().

Referenced by decode_check_label(), Botan::CryptoBox::decrypt(), Botan::EC_Group::EC_Group(), Botan::X509::load_key(), Botan::PKCS10_Request::raw_public_key(), and Botan::TLS::Session::Session().

   {
   std::string label_got;
   secure_vector<byte> ber = decode(source, label_got);
   if(label_got != label_want)
      throw Decoding_Error("PEM: Label mismatch, wanted " + label_want +
                           ", got " + label_got);
   return ber;
   }
BOTAN_DLL secure_vector< byte > Botan::PEM_Code::decode_check_label ( const std::string &  pem,
const std::string &  label 
)

Decode PEM data

Parameters:
pema string containing PEM encoded data
labelis what we expect the label to be

Definition at line 104 of file pem.cpp.

References decode_check_label().

   {
   DataSource_Memory src(pem);
   return decode_check_label(src, label_want);
   }
BOTAN_DLL std::string Botan::PEM_Code::encode ( const byte  data[],
size_t  data_len,
const std::string &  label,
size_t  line_width = 64 
)

Encode some binary data in PEM format

Definition at line 19 of file pem.cpp.

References Botan::Pipe::process_msg(), and Botan::Pipe::read_all_as_string().

Referenced by Botan::X509::BER_encode(), Botan::PKCS8::BER_encode(), Botan::X509::create_cert_req(), Botan::CRL_Entry::decode_from(), encode(), Botan::DER_Encoder::encode_list(), Botan::DER_Encoder::encode_optional(), Botan::CryptoBox::encrypt(), Botan::X942_PRF::kdf(), Botan::X509_CA::make_cert(), Botan::X509::PEM_encode(), Botan::DL_Group::PEM_encode(), Botan::EC_Group::PEM_encode(), Botan::X509_Object::PEM_encode(), Botan::TLS::Session::PEM_encode(), Botan::PKCS8::PEM_encode(), Botan::McEliece_PrivateKey::pkcs8_private_key(), and Botan::McEliece_PublicKey::x509_subject_public_key().

   {
   const std::string PEM_HEADER = "-----BEGIN " + label + "-----\n";
   const std::string PEM_TRAILER = "-----END " + label + "-----\n";

   Pipe pipe(new Base64_Encoder(true, width));
   pipe.process_msg(der, length);
   return (PEM_HEADER + pipe.read_all_as_string() + PEM_TRAILER);
   }
std::string Botan::PEM_Code::encode ( const std::vector< byte > &  data,
const std::string &  label,
size_t  line_width = 64 
) [inline]

Encode some binary data in PEM format

Definition at line 28 of file pem.h.

References encode().

   {
   return encode(&data[0], data.size(), label, line_width);
   }
std::string Botan::PEM_Code::encode ( const secure_vector< byte > &  data,
const std::string &  label,
size_t  line_width = 64 
) [inline]

Encode some binary data in PEM format

Definition at line 38 of file pem.h.

References encode().

   {
   return encode(&data[0], data.size(), label, line_width);
   }
BOTAN_DLL bool Botan::PEM_Code::matches ( DataSource &  source,
const std::string &  extra = "",
size_t  search_range = 4096 
)

Heuristic test for PEM data.

Definition at line 120 of file pem.cpp.

References Botan::DataSource::peek().

Referenced by Botan::X509::load_key().

   {
   const std::string PEM_HEADER = "-----BEGIN " + extra;

   secure_vector<byte> search_buf(search_range);
   size_t got = source.peek(&search_buf[0], search_buf.size(), 0);

   if(got < PEM_HEADER.length())
      return false;

   size_t index = 0;

   for(size_t j = 0; j != got; ++j)
      {
      if(search_buf[j] == PEM_HEADER[index])
         ++index;
      else
         index = 0;
      if(index == PEM_HEADER.size())
         return true;
      }
   return false;
   }