aboutsummaryrefslogtreecommitdiffstats
path: root/src/cms/cms_dec.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/cms/cms_dec.cpp')
-rw-r--r--src/cms/cms_dec.cpp123
1 files changed, 123 insertions, 0 deletions
diff --git a/src/cms/cms_dec.cpp b/src/cms/cms_dec.cpp
new file mode 100644
index 000000000..edd1cd489
--- /dev/null
+++ b/src/cms/cms_dec.cpp
@@ -0,0 +1,123 @@
+/*************************************************
+* CMS Decoding Source File *
+* (C) 1999-2007 Jack Lloyd *
+*************************************************/
+
+#include <botan/cms_dec.h>
+#include <botan/ber_dec.h>
+#include <botan/asn1_int.h>
+#include <botan/oids.h>
+#include <botan/pem.h>
+
+namespace Botan {
+
+/*************************************************
+* CMS_Decoder Constructor *
+*************************************************/
+CMS_Decoder::CMS_Decoder(DataSource& in, const X509_Store& x509store,
+ User_Interface& ui_ref, PKCS8_PrivateKey* key) :
+ ui(ui_ref), store(x509store)
+ {
+ status = GOOD;
+
+ add_key(key);
+
+ if(ASN1::maybe_BER(in) && !PEM_Code::matches(in))
+ initial_read(in);
+ else
+ {
+ DataSource_Memory ber(PEM_Code::decode_check_label(in, "PKCS7"));
+ initial_read(ber);
+ }
+ }
+
+/*************************************************
+* Read the outermost ContentInfo *
+*************************************************/
+void CMS_Decoder::initial_read(DataSource& in)
+ {
+ // FIXME...
+
+ /*
+ BER_Decoder decoder(in);
+ BER_Decoder content_info = decoder.start_cons(SEQUENCE);
+
+ content_info.decode(next_type);
+
+
+ BER_Decoder content_type = BER::get_subsequence(content_info, ASN1_Tag(0));
+ data = content_type.get_remaining();
+ */
+
+ decode_layer();
+ }
+
+/*************************************************
+* Add another private key to use *
+*************************************************/
+void CMS_Decoder::add_key(PKCS8_PrivateKey* key)
+ {
+ if(!key)
+ return;
+
+ for(u32bit j = 0; j != keys.size(); j++)
+ if(keys[j]->key_id() == key->key_id())
+ return;
+
+ keys.push_back(key);
+ }
+
+/*************************************************
+* Return the status information *
+*************************************************/
+CMS_Decoder::Status CMS_Decoder::layer_status() const
+ {
+ return status;
+ }
+
+/*************************************************
+* Return the final data content *
+*************************************************/
+std::string CMS_Decoder::get_data() const
+ {
+ if(layer_type() != DATA)
+ throw Invalid_State("CMS: Cannot retrieve data from non-DATA layer");
+ return std::string((const char*)data.begin(), data.size());
+ }
+
+/*************************************************
+* Return the content type of this layer *
+*************************************************/
+CMS_Decoder::Content_Type CMS_Decoder::layer_type() const
+ {
+ if(type == OIDS::lookup("CMS.DataContent")) return DATA;
+ if(type == OIDS::lookup("CMS.EnvelopedData")) return ENVELOPED;
+ if(type == OIDS::lookup("CMS.CompressedData")) return COMPRESSED;
+ if(type == OIDS::lookup("CMS.SignedData")) return SIGNED;
+ if(type == OIDS::lookup("CMS.AuthenticatedData")) return AUTHENTICATED;
+ if(type == OIDS::lookup("CMS.DigestedData")) return DIGESTED;
+ return UNKNOWN;
+ }
+
+/*************************************************
+* Return some information about this layer *
+*************************************************/
+std::string CMS_Decoder::layer_info() const
+ {
+ return info;
+ }
+
+/*************************************************
+* Return some information about this layer *
+*************************************************/
+void CMS_Decoder::read_econtent(BER_Decoder& decoder)
+ {
+ BER_Decoder econtent_info = decoder.start_cons(SEQUENCE);
+ econtent_info.decode(next_type);
+
+ // FIXME
+ //BER_Decoder econtent = BER::get_subsequence(econtent_info, ASN1_Tag(0));
+ //econtent.decode(data, OCTET_STRING);
+ }
+
+}