@ -1,5 +1,6 @@
# include <string.h>
# include <string.h>
# include "Log.h"
# include "Log.h"
# include "Gost.h"
# include "CryptoKey.h"
# include "CryptoKey.h"
namespace i2p
namespace i2p
@ -65,7 +66,7 @@ namespace crypto
{
{
if ( m_Curve & & m_PrivateKey )
if ( m_Curve & & m_PrivateKey )
return ECIESDecrypt ( m_Curve , m_PrivateKey , encrypted , data , ctx ) ;
return ECIESDecrypt ( m_Curve , m_PrivateKey , encrypted , data , ctx ) ;
return false ; ;
return false ;
}
}
void CreateECIESP256RandomKeys ( uint8_t * priv , uint8_t * pub )
void CreateECIESP256RandomKeys ( uint8_t * priv , uint8_t * pub )
@ -86,6 +87,65 @@ namespace crypto
BN_free ( x ) ; BN_free ( y ) ;
BN_free ( x ) ; BN_free ( y ) ;
EC_GROUP_free ( curve ) ;
EC_GROUP_free ( curve ) ;
}
}
ECIESGOSTR3410Encryptor : : ECIESGOSTR3410Encryptor ( const uint8_t * pub )
{
auto & curve = GetGOSTR3410Curve ( eGOSTR3410CryptoProA ) ;
m_PublicKey = EC_POINT_new ( curve - > GetGroup ( ) ) ;
BIGNUM * x = BN_bin2bn ( pub , 32 , nullptr ) ;
BIGNUM * y = BN_bin2bn ( pub + 32 , 32 , nullptr ) ;
if ( ! EC_POINT_set_affine_coordinates_GFp ( curve - > GetGroup ( ) , m_PublicKey , x , y , nullptr ) )
LogPrint ( eLogError , " ECICS GOST R 34.10 invalid public key " ) ;
BN_free ( x ) ; BN_free ( y ) ;
}
ECIESGOSTR3410Encryptor : : ~ ECIESGOSTR3410Encryptor ( )
{
if ( m_PublicKey ) EC_POINT_free ( m_PublicKey ) ;
}
void ECIESGOSTR3410Encryptor : : Encrypt ( const uint8_t * data , uint8_t * encrypted , BN_CTX * ctx )
{
if ( m_PublicKey )
ECIESEncrypt ( GetGOSTR3410Curve ( eGOSTR3410CryptoProA ) - > GetGroup ( ) , m_PublicKey , data , encrypted , ctx ) ;
}
ECIESGOSTR3410Decryptor : : ECIESGOSTR3410Decryptor ( const uint8_t * priv )
{
m_PrivateKey = BN_bin2bn ( priv , 32 , nullptr ) ;
}
ECIESGOSTR3410Decryptor : : ~ ECIESGOSTR3410Decryptor ( )
{
if ( m_PrivateKey ) BN_free ( m_PrivateKey ) ;
}
bool ECIESGOSTR3410Decryptor : : Decrypt ( const uint8_t * encrypted , uint8_t * data , BN_CTX * ctx )
{
if ( m_PrivateKey )
return ECIESDecrypt ( GetGOSTR3410Curve ( eGOSTR3410CryptoProA ) - > GetGroup ( ) , m_PrivateKey , encrypted , data , ctx ) ;
return false ;
}
void CreateECIESGOSTR3410RandomKeys ( uint8_t * priv , uint8_t * pub )
{
auto & curve = GetGOSTR3410Curve ( eGOSTR3410CryptoProA ) ;
EC_POINT * p = nullptr ;
BIGNUM * key = nullptr ;
GenerateECIESKeyPair ( curve - > GetGroup ( ) , key , p ) ;
bn2buf ( key , priv , 32 ) ;
RAND_bytes ( priv + 32 , 224 ) ;
BN_free ( key ) ;
BIGNUM * x = BN_new ( ) , * y = BN_new ( ) ;
EC_POINT_get_affine_coordinates_GFp ( curve - > GetGroup ( ) , p , x , y , NULL ) ;
bn2buf ( x , pub , 32 ) ;
bn2buf ( y , pub + 32 , 32 ) ;
RAND_bytes ( priv + 64 , 192 ) ;
EC_POINT_free ( p ) ;
BN_free ( x ) ; BN_free ( y ) ;
}
}
}
}
}