mirror of
				https://github.com/PurpleI2P/i2pd.git
				synced 2025-11-04 08:30:46 +00:00 
			
		
		
		
	removed RSA signatures completly
This commit is contained in:
		
							parent
							
								
									c8f4ace5c4
								
							
						
					
					
						commit
						358cdcf4c4
					
				
					 3 changed files with 8 additions and 144 deletions
				
			
		| 
						 | 
				
			
			@ -72,29 +72,10 @@ namespace data
 | 
			
		|||
					break;
 | 
			
		||||
				}
 | 
			
		||||
				case SIGNING_KEY_TYPE_RSA_SHA256_2048:
 | 
			
		||||
				{
 | 
			
		||||
					memcpy (m_StandardIdentity.signingKey, signingKey, 128);
 | 
			
		||||
					excessLen = i2p::crypto::RSASHA2562048_KEY_LENGTH - 128; // 128 = 256 - 128
 | 
			
		||||
					excessBuf = new uint8_t[excessLen];
 | 
			
		||||
					memcpy (excessBuf, signingKey + 128, excessLen);
 | 
			
		||||
					break;
 | 
			
		||||
				}
 | 
			
		||||
				case SIGNING_KEY_TYPE_RSA_SHA384_3072:
 | 
			
		||||
				{
 | 
			
		||||
					memcpy (m_StandardIdentity.signingKey, signingKey, 128);
 | 
			
		||||
					excessLen = i2p::crypto::RSASHA3843072_KEY_LENGTH - 128; // 256 = 384 - 128
 | 
			
		||||
					excessBuf = new uint8_t[excessLen];
 | 
			
		||||
					memcpy (excessBuf, signingKey + 128, excessLen);
 | 
			
		||||
					break;
 | 
			
		||||
				}
 | 
			
		||||
				case SIGNING_KEY_TYPE_RSA_SHA512_4096:
 | 
			
		||||
				{
 | 
			
		||||
					memcpy (m_StandardIdentity.signingKey, signingKey, 128);
 | 
			
		||||
					excessLen = i2p::crypto::RSASHA5124096_KEY_LENGTH - 128; // 384 = 512 - 128
 | 
			
		||||
					excessBuf = new uint8_t[excessLen];
 | 
			
		||||
					memcpy (excessBuf, signingKey + 128, excessLen);
 | 
			
		||||
					break;
 | 
			
		||||
				}
 | 
			
		||||
					LogPrint (eLogError, "Identity: RSA signing key type ", (int)type, " is not supported");
 | 
			
		||||
				break;
 | 
			
		||||
				case SIGNING_KEY_TYPE_EDDSA_SHA512_ED25519:
 | 
			
		||||
				{
 | 
			
		||||
					size_t padding = 128 - i2p::crypto::EDDSA25519_PUBLIC_KEY_LENGTH; // 96 = 128 - 32
 | 
			
		||||
| 
						 | 
				
			
			@ -368,32 +349,10 @@ namespace data
 | 
			
		|||
				break;
 | 
			
		||||
			}
 | 
			
		||||
			case SIGNING_KEY_TYPE_RSA_SHA256_2048:
 | 
			
		||||
			{
 | 
			
		||||
				uint8_t signingKey[i2p::crypto::RSASHA2562048_KEY_LENGTH];
 | 
			
		||||
				memcpy (signingKey, m_StandardIdentity.signingKey, 128);
 | 
			
		||||
				size_t excessLen = i2p::crypto::RSASHA2562048_KEY_LENGTH - 128; // 128 = 256- 128
 | 
			
		||||
				memcpy (signingKey + 128, m_ExtendedBuffer + 4, excessLen); // right after signing and crypto key types
 | 
			
		||||
				UpdateVerifier (new i2p::crypto:: RSASHA2562048Verifier (signingKey));
 | 
			
		||||
				break;
 | 
			
		||||
			}
 | 
			
		||||
			case SIGNING_KEY_TYPE_RSA_SHA384_3072:
 | 
			
		||||
			{
 | 
			
		||||
				uint8_t signingKey[i2p::crypto::RSASHA3843072_KEY_LENGTH];
 | 
			
		||||
				memcpy (signingKey, m_StandardIdentity.signingKey, 128);
 | 
			
		||||
				size_t excessLen = i2p::crypto::RSASHA3843072_KEY_LENGTH - 128; // 256 = 384- 128
 | 
			
		||||
				memcpy (signingKey + 128, m_ExtendedBuffer + 4, excessLen); // right after signing and crypto key types
 | 
			
		||||
				UpdateVerifier (new i2p::crypto:: RSASHA3843072Verifier (signingKey));
 | 
			
		||||
				break;
 | 
			
		||||
			}
 | 
			
		||||
			case SIGNING_KEY_TYPE_RSA_SHA512_4096:
 | 
			
		||||
			{
 | 
			
		||||
				uint8_t signingKey[i2p::crypto::RSASHA5124096_KEY_LENGTH];
 | 
			
		||||
				memcpy (signingKey, m_StandardIdentity.signingKey, 128);
 | 
			
		||||
				size_t excessLen = i2p::crypto::RSASHA5124096_KEY_LENGTH - 128; // 384 = 512- 128
 | 
			
		||||
				memcpy (signingKey + 128, m_ExtendedBuffer + 4, excessLen); // right after signing and crypto key types
 | 
			
		||||
				UpdateVerifier (new i2p::crypto:: RSASHA5124096Verifier (signingKey));
 | 
			
		||||
				break;
 | 
			
		||||
			}
 | 
			
		||||
				LogPrint (eLogError, "Identity: RSA signing key type ", (int)keyType, " is not supported");
 | 
			
		||||
			break;
 | 
			
		||||
			case SIGNING_KEY_TYPE_EDDSA_SHA512_ED25519:
 | 
			
		||||
			{
 | 
			
		||||
				size_t padding =  128 - i2p::crypto::EDDSA25519_PUBLIC_KEY_LENGTH; // 96 = 128 - 32
 | 
			
		||||
| 
						 | 
				
			
			@ -564,13 +523,9 @@ namespace data
 | 
			
		|||
				m_Signer.reset (new i2p::crypto::ECDSAP521Signer (m_SigningPrivateKey));
 | 
			
		||||
			break;
 | 
			
		||||
			case SIGNING_KEY_TYPE_RSA_SHA256_2048:
 | 
			
		||||
				m_Signer.reset (new i2p::crypto::RSASHA2562048Signer (m_SigningPrivateKey));
 | 
			
		||||
			break;
 | 
			
		||||
			case SIGNING_KEY_TYPE_RSA_SHA384_3072:
 | 
			
		||||
				m_Signer.reset (new i2p::crypto::RSASHA3843072Signer (m_SigningPrivateKey));
 | 
			
		||||
			break;
 | 
			
		||||
			case SIGNING_KEY_TYPE_RSA_SHA512_4096:
 | 
			
		||||
				m_Signer.reset (new i2p::crypto::RSASHA5124096Signer (m_SigningPrivateKey));
 | 
			
		||||
				LogPrint (eLogError, "Identity: RSA signing key type ", (int)m_Public->GetSigningKeyType (), " is not supported");
 | 
			
		||||
			break;
 | 
			
		||||
			case SIGNING_KEY_TYPE_EDDSA_SHA512_ED25519:
 | 
			
		||||
				m_Signer.reset (new i2p::crypto::EDDSA25519Signer (m_SigningPrivateKey, m_Public->GetStandardIdentity ().certificate - i2p::crypto::EDDSA25519_PUBLIC_KEY_LENGTH));
 | 
			
		||||
| 
						 | 
				
			
			@ -642,7 +597,7 @@ namespace data
 | 
			
		|||
				case SIGNING_KEY_TYPE_RSA_SHA256_2048:
 | 
			
		||||
				case SIGNING_KEY_TYPE_RSA_SHA384_3072:
 | 
			
		||||
				case SIGNING_KEY_TYPE_RSA_SHA512_4096:
 | 
			
		||||
					LogPrint (eLogWarning, "Identity: RSA signature type is not supported. Create EdDSA");
 | 
			
		||||
					LogPrint (eLogWarning, "Identity: RSA signature type is not supported. Creating EdDSA");
 | 
			
		||||
				// no break here
 | 
			
		||||
				case SIGNING_KEY_TYPE_EDDSA_SHA512_ED25519:
 | 
			
		||||
					i2p::crypto::CreateEDDSA25519RandomKeys (keys.m_SigningPrivateKey, signingPublicKey);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -219,7 +219,7 @@ namespace data
 | 
			
		|||
						BN_CTX * bnctx = BN_CTX_new ();
 | 
			
		||||
						BIGNUM * s = BN_new (), * n = BN_new ();
 | 
			
		||||
						BN_bin2bn (signature, signatureLength, s);
 | 
			
		||||
						BN_bin2bn (it->second, i2p::crypto::RSASHA5124096_KEY_LENGTH, n);
 | 
			
		||||
						BN_bin2bn (it->second, 512, n); // RSA 4096 assumed
 | 
			
		||||
						BN_mod_exp (s, s, i2p::crypto::GetRSAE (), n, bnctx); // s = s^e mod n
 | 
			
		||||
						uint8_t * enSigBuf = new uint8_t[signatureLength];
 | 
			
		||||
						i2p::crypto::bn2buf (s, enSigBuf, signatureLength);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,7 +6,6 @@
 | 
			
		|||
#include <openssl/dsa.h>
 | 
			
		||||
#include <openssl/ec.h>
 | 
			
		||||
#include <openssl/ecdsa.h>
 | 
			
		||||
#include <openssl/rsa.h>
 | 
			
		||||
#include <openssl/evp.h>
 | 
			
		||||
#include "Crypto.h"
 | 
			
		||||
#include "Ed25519.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -149,6 +148,7 @@ namespace crypto
 | 
			
		|||
		enum { hashLen = 64 };
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	// EcDSA
 | 
			
		||||
	template<typename Hash, int curve, size_t keyLen>
 | 
			
		||||
	class ECDSAVerifier: public Verifier
 | 
			
		||||
	{
 | 
			
		||||
| 
						 | 
				
			
			@ -269,97 +269,6 @@ namespace crypto
 | 
			
		|||
		CreateECDSARandomKeys (NID_secp521r1, ECDSAP521_KEY_LENGTH, signingPrivateKey, signingPublicKey);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
// RSA
 | 
			
		||||
	template<typename Hash, int type, size_t keyLen>
 | 
			
		||||
	class RSAVerifier: public Verifier
 | 
			
		||||
	{
 | 
			
		||||
		public:
 | 
			
		||||
 | 
			
		||||
			RSAVerifier (const uint8_t * signingKey)
 | 
			
		||||
			{
 | 
			
		||||
				m_PublicKey = RSA_new ();
 | 
			
		||||
				RSA_set0_key (m_PublicKey, BN_bin2bn (signingKey, keyLen, NULL) /* n */ , BN_dup (GetRSAE ()) /* d */, NULL);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			~RSAVerifier ()
 | 
			
		||||
			{
 | 
			
		||||
				RSA_free (m_PublicKey);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			bool Verify (const uint8_t * buf, size_t len, const uint8_t * signature) const
 | 
			
		||||
			{
 | 
			
		||||
				uint8_t digest[Hash::hashLen];
 | 
			
		||||
				Hash::CalculateHash (buf, len, digest);
 | 
			
		||||
				return RSA_verify (type, digest, Hash::hashLen, signature, GetSignatureLen (), m_PublicKey);
 | 
			
		||||
			}
 | 
			
		||||
			size_t GetPublicKeyLen () const { return keyLen; }
 | 
			
		||||
			size_t GetSignatureLen () const { return keyLen; }
 | 
			
		||||
			size_t GetPrivateKeyLen () const { return GetSignatureLen ()*2; };
 | 
			
		||||
 | 
			
		||||
		private:
 | 
			
		||||
 | 
			
		||||
			RSA * m_PublicKey;
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	template<typename Hash, int type, size_t keyLen>
 | 
			
		||||
	class RSASigner: public Signer
 | 
			
		||||
	{
 | 
			
		||||
		public:
 | 
			
		||||
 | 
			
		||||
			RSASigner (const uint8_t * signingPrivateKey)
 | 
			
		||||
			{
 | 
			
		||||
				m_PrivateKey = RSA_new ();
 | 
			
		||||
				RSA_set0_key (m_PrivateKey, BN_bin2bn (signingPrivateKey, keyLen, NULL), /* n */
 | 
			
		||||
					BN_dup (GetRSAE ()) /* e */, BN_bin2bn (signingPrivateKey + keyLen, keyLen, NULL) /* d */);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			~RSASigner ()
 | 
			
		||||
			{
 | 
			
		||||
				RSA_free (m_PrivateKey);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			void Sign (const uint8_t * buf, int len, uint8_t * signature) const
 | 
			
		||||
			{
 | 
			
		||||
				uint8_t digest[Hash::hashLen];
 | 
			
		||||
				Hash::CalculateHash (buf, len, digest);
 | 
			
		||||
				unsigned int signatureLen = keyLen;
 | 
			
		||||
				RSA_sign (type, digest, Hash::hashLen, signature, &signatureLen, m_PrivateKey);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		private:
 | 
			
		||||
 | 
			
		||||
			RSA * m_PrivateKey;
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	inline void CreateRSARandomKeys (size_t publicKeyLen, uint8_t * signingPrivateKey, uint8_t * signingPublicKey)
 | 
			
		||||
	{
 | 
			
		||||
		RSA * rsa = RSA_new ();
 | 
			
		||||
		BIGNUM * e = BN_dup (GetRSAE ()); // make it non-const
 | 
			
		||||
		RSA_generate_key_ex (rsa, publicKeyLen*8, e, NULL);
 | 
			
		||||
		const BIGNUM * n, * d, * e1;
 | 
			
		||||
		RSA_get0_key (rsa, &n, &e1, &d);
 | 
			
		||||
		bn2buf (n, signingPrivateKey, publicKeyLen);
 | 
			
		||||
		bn2buf (d, signingPrivateKey + publicKeyLen, publicKeyLen);
 | 
			
		||||
		bn2buf (n, signingPublicKey, publicKeyLen);
 | 
			
		||||
		BN_free (e); // this e is not assigned to rsa->e
 | 
			
		||||
		RSA_free (rsa);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
//  RSA_SHA256_2048
 | 
			
		||||
	const size_t RSASHA2562048_KEY_LENGTH = 256;
 | 
			
		||||
	typedef RSAVerifier<SHA256Hash, NID_sha256, RSASHA2562048_KEY_LENGTH> RSASHA2562048Verifier;
 | 
			
		||||
	typedef RSASigner<SHA256Hash, NID_sha256, RSASHA2562048_KEY_LENGTH> RSASHA2562048Signer;
 | 
			
		||||
 | 
			
		||||
//  RSA_SHA384_3072
 | 
			
		||||
	const size_t RSASHA3843072_KEY_LENGTH = 384;
 | 
			
		||||
	typedef RSAVerifier<SHA384Hash, NID_sha384, RSASHA3843072_KEY_LENGTH> RSASHA3843072Verifier;
 | 
			
		||||
	typedef RSASigner<SHA384Hash, NID_sha384, RSASHA3843072_KEY_LENGTH> RSASHA3843072Signer;
 | 
			
		||||
 | 
			
		||||
//  RSA_SHA512_4096
 | 
			
		||||
	const size_t RSASHA5124096_KEY_LENGTH = 512;
 | 
			
		||||
	typedef RSAVerifier<SHA512Hash, NID_sha512, RSASHA5124096_KEY_LENGTH> RSASHA5124096Verifier;
 | 
			
		||||
	typedef RSASigner<SHA512Hash, NID_sha512, RSASHA5124096_KEY_LENGTH> RSASHA5124096Signer;
 | 
			
		||||
 | 
			
		||||
	// EdDSA
 | 
			
		||||
	class EDDSA25519Verifier: public Verifier
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue