From 7cc3dc61427c1f67e881afb3947c062604a86856 Mon Sep 17 00:00:00 2001 From: lloyd Date: Sun, 10 Sep 2006 05:22:51 +0000 Subject: Check in some very preliminary code for wrapping public keys Some fixes to the Filter code, though it is still not entirely functional. --- misc/python/src/filter.cpp | 31 +++++++++++++++++------------ misc/python/src/pk.cpp | 49 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 12 deletions(-) create mode 100644 misc/python/src/pk.cpp (limited to 'misc/python/src') 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 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 +class FilterWrapper : public Py_Filter, public wrapper { 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 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.release(); } -void append_pyfilter(Pipe& pipe, std::auto_ptr filter) +void prepend_filter(Pipe& pipe, std::auto_ptr filter) { - pipe.append(filter.get()); + pipe.prepend(filter.get()); filter.release(); } -void prepend_filter(Pipe& pipe, std::auto_ptr filter) +void do_send(std::auto_ptr 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_, boost::noncopyable> + class_, + bases, 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 >(); + 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 +#include +#include +#include +using namespace Botan; + +#include +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", 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); + } -- cgit v1.2.3