#ifndef FC_PKE_HPP_ #define FC_PKE_HPP_ #include #include /** * Define common crypto methods and data types to abstract underlying implementation. */ namespace fc { template struct signature { char data[KeySize/8]; template friend T& operator<<( T& ds, const fc::signature& sig ) { ds.write(sig.data, KS/8 ); return ds; } template friend T& operator>>( T& ds, fc::signature& sig ) { ds.read(sig.data, KS/8 ); return ds; } bool operator != ( const signature& s )const { return memcmp( s.data, data, sizeof(data) ) != 0; } bool operator == ( const signature& s )const { return memcmp( s.data, data, sizeof(data) ) == 0; } }; bool verify_data( const char* key, uint32_t key_size, uint32_t pe, const sha1& hc, const char* sig ); bool sign_data( const fc::vector& key, uint32_t key_size, uint32_t pe, const sha1& hc, char* sig ); bool public_encrypt( const char* key, uint32_t key_size, uint32_t pe, const fc::vector& in, fc::vector& out ); bool public_decrypt( const char* key, uint32_t key_size, uint32_t pe, const fc::vector& in, fc::vector& out ); bool private_encrypt( const fc::vector& key, uint32_t key_size, uint32_t pe, const fc::vector& in, fc::vector& out ); bool private_decrypt( const fc::vector& key, uint32_t key_size, uint32_t pe, const fc::vector& in, fc::vector& out ); bool generate_keys( char* pubkey, fc::vector& privkey, uint32_t key_size, uint32_t pe ); template struct private_key; template struct public_key { public_key() { memset( key, 0, sizeof(key) ); } public_key( const public_key& pk ) { memcpy( key, pk.key, sizeof(key) ); } bool verify( const sha1& digest, const signature& sig )const { return verify_data( key, sizeof(key), PublicExponent, digest, sig.data ); } bool encrypt( const fc::vector& in, fc::vector& out )const { return public_encrypt( key, KeySize, PublicExponent, in, out ); } bool decrypt( const fc::vector& in, fc::vector& out )const { return public_decrypt( key, KeySize, PublicExponent, in, out ); } public_key& operator = ( const public_key& pk ) { memcpy( key, pk.key, sizeof(key) ); return *this; } bool operator == ( const public_key& pk )const { return 0 == memcmp( key, pk.key, sizeof(key) ); } bool operator != ( const public_key& pk )const { return 0 != memcmp( key, pk.key, sizeof(key) ); } bool operator > ( const public_key& pk )const { return memcmp( key, pk.key, sizeof(key) ) > 0; } bool operator < ( const public_key& pk )const { return memcmp( key, pk.key, sizeof(key) ) < 0; } template inline friend T& operator<<( T& ds, const fc::public_key& pk ) { ds.write(pk.key, KS/8 ); return ds; } template inline friend T& operator>>( T& ds, fc::public_key& pk ) { ds.read( pk.key, KS/8 ); return ds; } private: template friend void generate_keys( public_key& pub, private_key& priv ); char key[KeySize/8]; }; template struct private_key { bool encrypt( const fc::vector& in, fc::vector& out )const { return private_encrypt( key, KeySize, PublicExponent, in, out ); } bool decrypt( const fc::vector& in, fc::vector& out )const { return private_decrypt( key, KeySize, PublicExponent, in, out ); } bool sign( const sha1& digest, signature& sig )const { return sign_data( key, KeySize, PublicExponent, digest, sig.data ); } template friend T& operator<<( T& ds, const fc::private_key& pk ) { uint16_t s = pk.key.size(); ds.write( (const char*)&s, sizeof(s) ); ds.write( pk.key.data(), pk.key.size() ); return ds; } template friend T& operator>>( T& ds, fc::private_key& pk ) { uint16_t s; ds.read((char*)&s,sizeof(s) ); pk.key.resize(s); ds.read( pk.key.data(), pk.key.size() ); return ds; } private: template friend void generate_keys( public_key& pub, private_key& priv ); fc::vector key; }; template void generate_keys( public_key& pub, private_key& priv ) { generate_keys( pub.key, priv.key, KeySize, PublicExponent ); } /* template inline std::ostream& operator<< ( std::ostream& os, const signature& s ) { for( uint32_t i = 0; i < KeySize; ++i ) os << std::hex << int(s.data[i]) << ' '; return os; } */ typedef public_key<> public_key_t; typedef private_key<> private_key_t; typedef signature<> signature_t; } // namespace fc #endif