mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-01-22 04:04:16 +00:00
removed RSA signatures completly
This commit is contained in:
parent
c8f4ace5c4
commit
358cdcf4c4
@ -72,29 +72,10 @@ namespace data
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SIGNING_KEY_TYPE_RSA_SHA256_2048:
|
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:
|
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:
|
case SIGNING_KEY_TYPE_RSA_SHA512_4096:
|
||||||
{
|
LogPrint (eLogError, "Identity: RSA signing key type ", (int)type, " is not supported");
|
||||||
memcpy (m_StandardIdentity.signingKey, signingKey, 128);
|
break;
|
||||||
excessLen = i2p::crypto::RSASHA5124096_KEY_LENGTH - 128; // 384 = 512 - 128
|
|
||||||
excessBuf = new uint8_t[excessLen];
|
|
||||||
memcpy (excessBuf, signingKey + 128, excessLen);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case SIGNING_KEY_TYPE_EDDSA_SHA512_ED25519:
|
case SIGNING_KEY_TYPE_EDDSA_SHA512_ED25519:
|
||||||
{
|
{
|
||||||
size_t padding = 128 - i2p::crypto::EDDSA25519_PUBLIC_KEY_LENGTH; // 96 = 128 - 32
|
size_t padding = 128 - i2p::crypto::EDDSA25519_PUBLIC_KEY_LENGTH; // 96 = 128 - 32
|
||||||
@ -368,32 +349,10 @@ namespace data
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SIGNING_KEY_TYPE_RSA_SHA256_2048:
|
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:
|
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:
|
case SIGNING_KEY_TYPE_RSA_SHA512_4096:
|
||||||
{
|
LogPrint (eLogError, "Identity: RSA signing key type ", (int)keyType, " is not supported");
|
||||||
uint8_t signingKey[i2p::crypto::RSASHA5124096_KEY_LENGTH];
|
break;
|
||||||
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;
|
|
||||||
}
|
|
||||||
case SIGNING_KEY_TYPE_EDDSA_SHA512_ED25519:
|
case SIGNING_KEY_TYPE_EDDSA_SHA512_ED25519:
|
||||||
{
|
{
|
||||||
size_t padding = 128 - i2p::crypto::EDDSA25519_PUBLIC_KEY_LENGTH; // 96 = 128 - 32
|
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));
|
m_Signer.reset (new i2p::crypto::ECDSAP521Signer (m_SigningPrivateKey));
|
||||||
break;
|
break;
|
||||||
case SIGNING_KEY_TYPE_RSA_SHA256_2048:
|
case SIGNING_KEY_TYPE_RSA_SHA256_2048:
|
||||||
m_Signer.reset (new i2p::crypto::RSASHA2562048Signer (m_SigningPrivateKey));
|
|
||||||
break;
|
|
||||||
case SIGNING_KEY_TYPE_RSA_SHA384_3072:
|
case SIGNING_KEY_TYPE_RSA_SHA384_3072:
|
||||||
m_Signer.reset (new i2p::crypto::RSASHA3843072Signer (m_SigningPrivateKey));
|
|
||||||
break;
|
|
||||||
case SIGNING_KEY_TYPE_RSA_SHA512_4096:
|
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;
|
break;
|
||||||
case SIGNING_KEY_TYPE_EDDSA_SHA512_ED25519:
|
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));
|
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_SHA256_2048:
|
||||||
case SIGNING_KEY_TYPE_RSA_SHA384_3072:
|
case SIGNING_KEY_TYPE_RSA_SHA384_3072:
|
||||||
case SIGNING_KEY_TYPE_RSA_SHA512_4096:
|
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
|
// no break here
|
||||||
case SIGNING_KEY_TYPE_EDDSA_SHA512_ED25519:
|
case SIGNING_KEY_TYPE_EDDSA_SHA512_ED25519:
|
||||||
i2p::crypto::CreateEDDSA25519RandomKeys (keys.m_SigningPrivateKey, signingPublicKey);
|
i2p::crypto::CreateEDDSA25519RandomKeys (keys.m_SigningPrivateKey, signingPublicKey);
|
||||||
|
@ -219,7 +219,7 @@ namespace data
|
|||||||
BN_CTX * bnctx = BN_CTX_new ();
|
BN_CTX * bnctx = BN_CTX_new ();
|
||||||
BIGNUM * s = BN_new (), * n = BN_new ();
|
BIGNUM * s = BN_new (), * n = BN_new ();
|
||||||
BN_bin2bn (signature, signatureLength, s);
|
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
|
BN_mod_exp (s, s, i2p::crypto::GetRSAE (), n, bnctx); // s = s^e mod n
|
||||||
uint8_t * enSigBuf = new uint8_t[signatureLength];
|
uint8_t * enSigBuf = new uint8_t[signatureLength];
|
||||||
i2p::crypto::bn2buf (s, enSigBuf, signatureLength);
|
i2p::crypto::bn2buf (s, enSigBuf, signatureLength);
|
||||||
|
@ -6,7 +6,6 @@
|
|||||||
#include <openssl/dsa.h>
|
#include <openssl/dsa.h>
|
||||||
#include <openssl/ec.h>
|
#include <openssl/ec.h>
|
||||||
#include <openssl/ecdsa.h>
|
#include <openssl/ecdsa.h>
|
||||||
#include <openssl/rsa.h>
|
|
||||||
#include <openssl/evp.h>
|
#include <openssl/evp.h>
|
||||||
#include "Crypto.h"
|
#include "Crypto.h"
|
||||||
#include "Ed25519.h"
|
#include "Ed25519.h"
|
||||||
@ -149,6 +148,7 @@ namespace crypto
|
|||||||
enum { hashLen = 64 };
|
enum { hashLen = 64 };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// EcDSA
|
||||||
template<typename Hash, int curve, size_t keyLen>
|
template<typename Hash, int curve, size_t keyLen>
|
||||||
class ECDSAVerifier: public Verifier
|
class ECDSAVerifier: public Verifier
|
||||||
{
|
{
|
||||||
@ -269,97 +269,6 @@ namespace crypto
|
|||||||
CreateECDSARandomKeys (NID_secp521r1, ECDSAP521_KEY_LENGTH, signingPrivateKey, signingPublicKey);
|
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
|
// EdDSA
|
||||||
class EDDSA25519Verifier: public Verifier
|
class EDDSA25519Verifier: public Verifier
|
||||||
|
Loading…
x
Reference in New Issue
Block a user