diff options
author | lloyd <[email protected]> | 2006-09-10 05:22:51 +0000 |
---|---|---|
committer | lloyd <[email protected]> | 2006-09-10 05:22:51 +0000 |
commit | 7cc3dc61427c1f67e881afb3947c062604a86856 (patch) | |
tree | a4053c050e8433a6782e777b956cba508d0d5633 | |
parent | 0e28c141d24fe14dfacbfd42072292f348f0673c (diff) |
Check in some very preliminary code for wrapping public keys
Some fixes to the Filter code, though it is still not entirely functional.
-rw-r--r-- | misc/python/src/filter.cpp | 31 | ||||
-rw-r--r-- | misc/python/src/pk.cpp | 49 |
2 files changed, 68 insertions, 12 deletions
diff --git a/misc/python/src/filter.cpp b/misc/python/src/filter.cpp index edd282048..552b43853 100644 --- a/misc/python/src/filter.cpp +++ b/misc/python/src/filter.cpp @@ -10,10 +10,11 @@ using namespace boost::python; #include <botan/lookup.h> using namespace Botan; -class StringFilter : public Filter +class Py_Filter : public Filter { public: virtual void write_str(const std::string&) = 0; + void write(const byte data[], u32bit length) { write_str(std::string((const char*)data, length)); @@ -21,21 +22,24 @@ class StringFilter : public Filter void send_str(const std::string& str) { + printf("Py_Filter::send_str\n"); send((const byte*)str.data(), str.length()); } }; -class FilterWrapper : public StringFilter, public wrapper<StringFilter> +class FilterWrapper : public Py_Filter, public wrapper<Py_Filter> { public: void start_msg() { + printf("wrapper start_msg\n"); if(override start_msg = this->get_override("start_msg")) start_msg(); } void end_msg() { + printf("wrapper end_msg\n"); if(override end_msg = this->get_override("end_msg")) end_msg(); } @@ -45,9 +49,9 @@ class FilterWrapper : public StringFilter, public wrapper<StringFilter> virtual void write_str(const std::string& str) { + printf("wrapper write\n"); this->get_override("write")(str); } - }; Filter* return_or_raise(Filter* filter, const std::string& name) @@ -105,16 +109,16 @@ void append_filter(Pipe& pipe, std::auto_ptr<Filter> filter) filter.release(); } -void append_pyfilter(Pipe& pipe, std::auto_ptr<FilterWrapper> filter) +void prepend_filter(Pipe& pipe, std::auto_ptr<Filter> filter) { - pipe.append(filter.get()); + pipe.prepend(filter.get()); filter.release(); } -void prepend_filter(Pipe& pipe, std::auto_ptr<Filter> filter) +void do_send(std::auto_ptr<FilterWrapper> filter, const std::string& data) { - pipe.prepend(filter.get()); - filter.release(); + printf("Sending %s to %p\n", data.c_str(), filter.get()); + filter->send_str(data); } BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(rallas_ovls, read_all_as_string, 0, 1) @@ -135,13 +139,17 @@ void export_filters() // This might not work - Pipe will delete the filter, but Python // might have allocated the space with malloc() or who-knows-what -> bad - class_<FilterWrapper, std::auto_ptr<FilterWrapper>, boost::noncopyable> + class_<FilterWrapper, std::auto_ptr<FilterWrapper>, + bases<Filter>, boost::noncopyable> ("FilterObj") - .def("write", pure_virtual(&StringFilter::write_str)) - .def("send_str", &StringFilter::send_str) + .def("write", pure_virtual(&Py_Filter::write_str)) + .def("send", &do_send) .def("start_msg", &Filter::start_msg, &FilterWrapper::default_start_msg) .def("end_msg", &Filter::end_msg, &FilterWrapper::default_end_msg); + implicitly_convertible<std::auto_ptr<FilterWrapper>, + std::auto_ptr<Filter> >(); + void (Pipe::*pipe_write_str)(const std::string&) = &Pipe::write; void (Pipe::*pipe_process_str)(const std::string&) = &Pipe::process_msg; @@ -152,7 +160,6 @@ void export_filters() .add_property("default_msg", &Pipe::default_msg, &Pipe::set_default_msg) .add_property("msg_count", &Pipe::message_count) .def("append", append_filter) - .def("append", append_pyfilter) .def("prepend", prepend_filter) .def("reset", &Pipe::reset) .def("pop", &Pipe::pop) diff --git a/misc/python/src/pk.cpp b/misc/python/src/pk.cpp new file mode 100644 index 000000000..1d327c6f5 --- /dev/null +++ b/misc/python/src/pk.cpp @@ -0,0 +1,49 @@ +/************************************************* +* Boost.Python module definition * +* (C) 1999-2006 The Botan Project * +*************************************************/ + +#include <botan/rsa.h> +#include <botan/dsa.h> +#include <botan/dh.h> +#include <botan/look_pk.h> +using namespace Botan; + +#include <boost/python.hpp> +namespace python = boost::python; + +std::string DER_encode_str(const X509_PublicKey* key) + { + Pipe pipe; + X509::encode(*key, pipe, RAW_BER); + return pipe.read_all_as_string(); + } + +std::string get_oid_str(const X509_PublicKey* key) + { + try + { + return key->get_oid().as_string(); + } + catch(Lookup_Error) + { + return ""; + } + } + +X509_PublicKey* load_key_str(const std::string& file) + { + return X509::load_key(file); + } + +void export_pk() + { + python::class_<X509_PublicKey, boost::noncopyable> + ("X509_PublicKey", python::no_init) + .def("__init__", python::make_constructor(load_key_str)) + .add_property("algo", &X509_PublicKey::algo_name) + .add_property("max_input_bits", &X509_PublicKey::max_input_bits) + .add_property("oid", &get_oid_str) + .def("__str__", &X509::PEM_encode) + .def("der_encode", &DER_encode_str); + } |