peerplays-fc/include/fc/pke.hpp

149 lines
5.4 KiB
C++

#ifndef FC_PKE_HPP_
#define FC_PKE_HPP_
#include <fc/sha1.hpp>
#include <fc/vector.hpp>
/**
* Define common crypto methods and data types to abstract underlying implementation.
*/
namespace fc {
template<uint32_t KeySize=2048>
struct signature {
char data[KeySize/8];
template<typename T,uint32_t KS>
friend T& operator<<( T& ds, const fc::signature<KS>& sig )
{
ds.write(sig.data, KS/8 );
return ds;
}
template<typename T,uint32_t KS>
friend T& operator>>( T& ds, fc::signature<KS>& 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<char>& 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<char>& in, fc::vector<char>& out );
bool public_decrypt( const char* key, uint32_t key_size, uint32_t pe, const fc::vector<char>& in, fc::vector<char>& out );
bool private_encrypt( const fc::vector<char>& key, uint32_t key_size, uint32_t pe, const fc::vector<char>& in, fc::vector<char>& out );
bool private_decrypt( const fc::vector<char>& key, uint32_t key_size, uint32_t pe, const fc::vector<char>& in, fc::vector<char>& out );
bool generate_keys( char* pubkey, fc::vector<char>& privkey, uint32_t key_size, uint32_t pe );
template<uint32_t KeySize = 2048, uint32_t PublicExponent = 65537>
struct private_key;
template<uint32_t KeySize = 2048, uint32_t PublicExponent = 65537>
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<KeySize>& sig )const {
return verify_data( key, sizeof(key), PublicExponent, digest, sig.data );
}
bool encrypt( const fc::vector<char>& in, fc::vector<char>& out )const {
return public_encrypt( key, KeySize, PublicExponent, in, out );
}
bool decrypt( const fc::vector<char>& in, fc::vector<char>& 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<typename T,uint32_t KS, uint32_t PE>
inline friend T& operator<<( T& ds, const fc::public_key<KS,PE>& pk ) {
ds.write(pk.key, KS/8 );
return ds;
}
template<typename T,uint32_t KS, uint32_t PE>
inline friend T& operator>>( T& ds, fc::public_key<KS,PE>& pk ) {
ds.read( pk.key, KS/8 );
return ds;
}
private:
template<uint32_t KS, uint32_t PE>
friend void generate_keys( public_key<KS,PE>& pub, private_key<KS,PE>& priv );
char key[KeySize/8];
};
template<uint32_t KeySize, uint32_t PublicExponent>
struct private_key {
bool encrypt( const fc::vector<char>& in, fc::vector<char>& out )const {
return private_encrypt( key, KeySize, PublicExponent, in, out );
}
bool decrypt( const fc::vector<char>& in, fc::vector<char>& out )const {
return private_decrypt( key, KeySize, PublicExponent, in, out );
}
bool sign( const sha1& digest, signature<KeySize>& sig )const {
return sign_data( key, KeySize, PublicExponent, digest, sig.data );
}
template<typename T,uint32_t KS, uint32_t PE>
friend T& operator<<( T& ds, const fc::private_key<KS,PE>& 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<typename T,uint32_t KS, uint32_t PE>
friend T& operator>>( T& ds, fc::private_key<KS,PE>& 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<uint32_t KS, uint32_t PE>
friend void generate_keys( public_key<KS,PE>& pub, private_key<KS,PE>& priv );
fc::vector<char> key;
};
template<uint32_t KeySize, uint32_t PublicExponent>
void generate_keys( public_key<KeySize,PublicExponent>& pub, private_key<KeySize,PublicExponent>& priv ) {
generate_keys( pub.key, priv.key, KeySize, PublicExponent );
}
/*
template<uint32_t KeySize>
inline std::ostream& operator<< ( std::ostream& os, const signature<KeySize>& 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