1 #ifndef __OPKELE_UTIL_INTERNAL_H
2 #define __OPKELE_UTIL_INTERNAL_H
3 
4 #include <openssl/bn.h>
5 #include <openssl/dh.h>
6 #include <opkele/types.h>
7 
8 namespace opkele {
9     namespace util {
10 
11 	/**
12 	 * Convenience class encapsulating SSL BIGNUM object for the purpose of
13 	 * automatical freeing.
14 	 */
15 	class bignum_t {
16 	    public:
17 		BIGNUM *_bn;
18 
bignum_t()19 		bignum_t() : _bn(0) { }
bignum_t(BIGNUM * bn)20 		bignum_t(BIGNUM *bn) : _bn(bn) { }
throw()21 		~bignum_t() throw() { if(_bn) BN_free(_bn); }
22 
23 		bignum_t& operator=(BIGNUM *bn) { if(_bn) BN_free(_bn); _bn = bn; return *this; }
24 
25 		operator const BIGNUM*(void) const { return _bn; }
26 		operator BIGNUM*(void) { return _bn; }
27 	};
28 	/**
29 	 * Convenience clas encapsulating SSL DH object for the purpose of
30 	 * automatic freeing.
31 	 */
32 	class dh_t {
33 	    public:
34 		DH *_dh;
35 
dh_t()36 		dh_t() : _dh(0) { }
dh_t(DH * dh)37 		dh_t(DH *dh) : _dh(dh) { }
throw()38 		~dh_t() throw() { if(_dh) DH_free(_dh); }
39 
40 		dh_t& operator=(DH *dh) { if(_dh) DH_free(_dh); _dh = dh; return *this; }
41 
42 		operator const DH*(void) const { return _dh; }
43 		operator DH*(void) { return _dh; }
44 
45 		DH* operator->() { return _dh; }
46 		const DH* operator->() const { return _dh; }
47 	};
48 
49 	/**
50 	 * Convert base64-encoded SSL BIGNUM to internal representation.
51 	 * @param b64 base64-encoded number
52 	 * @return SSL BIGNUM
53 	 * @throw failed_conversion in case of error
54 	 */
55 	BIGNUM *base64_to_bignum(const string& b64);
56 	/**
57 	 * Convert decimal representation to SSL BIGNUM.
58 	 * @param dec decimal representation
59 	 * @return resulting BIGNUM
60 	 * @throw failed_conversion in case of error
61 	 */
62 	BIGNUM *dec_to_bignum(const string& dec);
63 	/**
64 	 * Convert SSL BIGNUM data to base64 encoded string.
65 	 * @param bn BIGNUM
66 	 * @return base64encoded string
67 	 */
68 	string bignum_to_base64(const BIGNUM *bn);
69 
70 	string abi_demangle(const char* mn);
71 
72 	class change_mode_message_proxy : public basic_openid_message {
73 	    public:
74 		const basic_openid_message& x;
75 		const string& mode;
76 
change_mode_message_proxy(const basic_openid_message & xx,const string & m)77 		change_mode_message_proxy(const basic_openid_message& xx,const string& m) : x(xx), mode(m) { }
78 
has_field(const string & n)79 		bool has_field(const string& n) const { return x.has_field(n); }
get_field(const string & n)80 		const string& get_field(const string& n) const {
81 		    return (n=="mode")?mode:x.get_field(n); }
has_ns(const string & uri)82 		bool has_ns(const string& uri) const {return x.has_ns(uri); }
get_ns(const string & uri)83 		string get_ns(const string& uri) const { return x.get_ns(uri); }
fields_begin()84 		fields_iterator fields_begin() const {
85 		    return x.fields_begin(); }
fields_end()86 		fields_iterator fields_end() const {
87 		    return x.fields_end(); }
88 	};
89 
90     }
91 }
92 
93 #endif /* __OPKELE_UTIL_INTERNAL_H */
94