diff --git a/Gost.h b/Gost.h index d0f63ed7..eb8e79f6 100644 --- a/Gost.h +++ b/Gost.h @@ -21,8 +21,8 @@ namespace crypto //eGOSTR3410CryptoProXchA, // 1.2.643.2.2.36.0 //eGOSTR3410CryptoProXchB, // 1.2.643.2.2.36.1 // GOST R 34.10-2012 - eGOSTR3410tc26paramSetA256, // 1.2.643.7.1.2.1.1.1 - eGOSTR3410tc26paramSetC512, // 1.2.643.7.1.2.1.2.3 + eGOSTR3410TC26A256, // 1.2.643.7.1.2.1.1.1 + eGOSTR3410TC26C512, // 1.2.643.7.1.2.1.2.3 eGOSTR3410NumParamSets }; diff --git a/Identity.cpp b/Identity.cpp index 89eb43f6..4c05be24 100644 --- a/Identity.cpp +++ b/Identity.cpp @@ -102,13 +102,20 @@ namespace data memcpy (m_StandardIdentity.signingKey + padding, signingKey, i2p::crypto::EDDSA25519_PUBLIC_KEY_LENGTH); break; } - case SIGNING_KEY_TYPE_GOSTR3410_A_GOSTR3411: - case SIGNING_KEY_TYPE_GOSTR3410_B_GOSTR3411: - case SIGNING_KEY_TYPE_GOSTR3410_C_GOSTR3411: + case SIGNING_KEY_TYPE_GOSTR3410_2001_CRYPTO_PRO_A_GOSTR3411: + case SIGNING_KEY_TYPE_GOSTR3410_2012_TC26_A_256_GOSTR3411: { - size_t padding = 128 - i2p::crypto::GOSTR3410_PUBLIC_KEY_LENGTH; // 64 = 128 - 64 + // 256 + size_t padding = 128 - i2p::crypto::GOSTR3410_256_PUBLIC_KEY_LENGTH; // 64 = 128 - 64 RAND_bytes (m_StandardIdentity.signingKey, padding); - memcpy (m_StandardIdentity.signingKey + padding, signingKey, i2p::crypto::GOSTR3410_PUBLIC_KEY_LENGTH); + memcpy (m_StandardIdentity.signingKey + padding, signingKey, i2p::crypto::GOSTR3410_256_PUBLIC_KEY_LENGTH); + break; + } + case SIGNING_KEY_TYPE_GOSTR3410_2012_TC26_C_512_GOSTR3411: + { + // 512 + // no padding, key length is 128 + memcpy (m_StandardIdentity.signingKey, signingKey, i2p::crypto::GOSTR3410_512_PUBLIC_KEY_LENGTH); break; } default: @@ -379,22 +386,22 @@ namespace data UpdateVerifier (new i2p::crypto::EDDSA25519Verifier (m_StandardIdentity.signingKey + padding)); break; } - case SIGNING_KEY_TYPE_GOSTR3410_A_GOSTR3411: + case SIGNING_KEY_TYPE_GOSTR3410_2001_CRYPTO_PRO_A_GOSTR3411: { - size_t padding = 128 - i2p::crypto::GOSTR3410_PUBLIC_KEY_LENGTH; // 64 = 128 - 64 + size_t padding = 128 - i2p::crypto::GOSTR3410_256_PUBLIC_KEY_LENGTH; // 64 = 128 - 64 UpdateVerifier (new i2p::crypto::GOSTR3410_2001_Verifier (i2p::crypto::eGOSTR3410CryptoProA, m_StandardIdentity.signingKey + padding)); break; } - case SIGNING_KEY_TYPE_GOSTR3410_B_GOSTR3411: + case SIGNING_KEY_TYPE_GOSTR3410_2012_TC26_A_256_GOSTR3411: { - size_t padding = 128 - i2p::crypto::GOSTR3410_PUBLIC_KEY_LENGTH; // 64 = 128 - 64 - UpdateVerifier (new i2p::crypto::GOSTR3410_2001_Verifier (i2p::crypto::eGOSTR3410CryptoProB, m_StandardIdentity.signingKey + padding)); + size_t padding = 128 - i2p::crypto::GOSTR3410_256_PUBLIC_KEY_LENGTH; // 64 = 128 - 64 + UpdateVerifier (new i2p::crypto::GOSTR3410_2012_256_Verifier (i2p::crypto::eGOSTR3410TC26A256, m_StandardIdentity.signingKey + padding)); break; } - case SIGNING_KEY_TYPE_GOSTR3410_C_GOSTR3411: + case SIGNING_KEY_TYPE_GOSTR3410_2012_TC26_C_512_GOSTR3411: { - size_t padding = 128 - i2p::crypto::GOSTR3410_PUBLIC_KEY_LENGTH; // 64 = 128 - 64 - UpdateVerifier (new i2p::crypto::GOSTR3410_2001_Verifier (i2p::crypto::eGOSTR3410CryptoProC, m_StandardIdentity.signingKey + padding)); + // zero padding + UpdateVerifier (new i2p::crypto::GOSTR3410_2012_512_Verifier (i2p::crypto::eGOSTR3410TC26C512, m_StandardIdentity.signingKey)); break; } default: @@ -538,14 +545,14 @@ namespace data 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)); break; - case SIGNING_KEY_TYPE_GOSTR3410_A_GOSTR3411: + case SIGNING_KEY_TYPE_GOSTR3410_2001_CRYPTO_PRO_A_GOSTR3411: m_Signer.reset (new i2p::crypto::GOSTR3410_2001_Signer (i2p::crypto::eGOSTR3410CryptoProA, m_SigningPrivateKey)); break; - case SIGNING_KEY_TYPE_GOSTR3410_B_GOSTR3411: - m_Signer.reset (new i2p::crypto::GOSTR3410_2001_Signer (i2p::crypto::eGOSTR3410CryptoProB, m_SigningPrivateKey)); + case SIGNING_KEY_TYPE_GOSTR3410_2012_TC26_A_256_GOSTR3411: + m_Signer.reset (new i2p::crypto::GOSTR3410_2012_256_Signer (i2p::crypto::eGOSTR3410TC26A256, m_SigningPrivateKey)); break; - case SIGNING_KEY_TYPE_GOSTR3410_C_GOSTR3411: - m_Signer.reset (new i2p::crypto::GOSTR3410_2001_Signer (i2p::crypto::eGOSTR3410CryptoProC, m_SigningPrivateKey)); + case SIGNING_KEY_TYPE_GOSTR3410_2012_TC26_C_512_GOSTR3411: + m_Signer.reset (new i2p::crypto::GOSTR3410_2012_512_Signer (i2p::crypto::eGOSTR3410TC26C512, m_SigningPrivateKey)); break; default: LogPrint (eLogError, "Identity: Signing key type ", (int)m_Public->GetSigningKeyType (), " is not supported"); @@ -582,14 +589,14 @@ namespace data case SIGNING_KEY_TYPE_EDDSA_SHA512_ED25519: i2p::crypto::CreateEDDSA25519RandomKeys (keys.m_SigningPrivateKey, signingPublicKey); break; - case SIGNING_KEY_TYPE_GOSTR3410_A_GOSTR3411: + case SIGNING_KEY_TYPE_GOSTR3410_2001_CRYPTO_PRO_A_GOSTR3411: i2p::crypto::CreateGOSTR3410RandomKeys (i2p::crypto::eGOSTR3410CryptoProA, keys.m_SigningPrivateKey, signingPublicKey); break; - case SIGNING_KEY_TYPE_GOSTR3410_B_GOSTR3411: - i2p::crypto::CreateGOSTR3410RandomKeys (i2p::crypto::eGOSTR3410CryptoProB, keys.m_SigningPrivateKey, signingPublicKey); + case SIGNING_KEY_TYPE_GOSTR3410_2012_TC26_A_256_GOSTR3411: + i2p::crypto::CreateGOSTR3410RandomKeys (i2p::crypto::eGOSTR3410TC26A256, keys.m_SigningPrivateKey, signingPublicKey); break; - case SIGNING_KEY_TYPE_GOSTR3410_C_GOSTR3411: - i2p::crypto::CreateGOSTR3410RandomKeys (i2p::crypto::eGOSTR3410CryptoProC, keys.m_SigningPrivateKey, signingPublicKey); + case SIGNING_KEY_TYPE_GOSTR3410_2012_TC26_C_512_GOSTR3411: + i2p::crypto::CreateGOSTR3410RandomKeys (i2p::crypto::eGOSTR3410TC26C512, keys.m_SigningPrivateKey, signingPublicKey); break; default: LogPrint (eLogError, "Identity: Signing key type ", (int)type, " is not supported. Create DSA-SHA1"); diff --git a/Identity.h b/Identity.h index 479fd5d1..5751d567 100644 --- a/Identity.h +++ b/Identity.h @@ -61,9 +61,9 @@ namespace data const uint16_t SIGNING_KEY_TYPE_RSA_SHA512_4096 = 6; const uint16_t SIGNING_KEY_TYPE_EDDSA_SHA512_ED25519 = 7; // following signature type should never appear in netid=2 - const uint16_t SIGNING_KEY_TYPE_GOSTR3410_A_GOSTR3411 = 65280; // approved by FSB - const uint16_t SIGNING_KEY_TYPE_GOSTR3410_B_GOSTR3411 = 65281; - const uint16_t SIGNING_KEY_TYPE_GOSTR3410_C_GOSTR3411 = 65282; + const uint16_t SIGNING_KEY_TYPE_GOSTR3410_2001_CRYPTO_PRO_A_GOSTR3411 = 65280; // approved by FSB + const uint16_t SIGNING_KEY_TYPE_GOSTR3410_2012_TC26_A_256_GOSTR3411 = 65281; + const uint16_t SIGNING_KEY_TYPE_GOSTR3410_2012_TC26_C_512_GOSTR3411 = 65282; typedef uint16_t SigningKeyType; typedef uint16_t CryptoKeyType; diff --git a/Signature.h b/Signature.h index c76d15a3..9a8bbb06 100644 --- a/Signature.h +++ b/Signature.h @@ -472,22 +472,25 @@ namespace crypto SHA512 (buf, len, digest); // TODO: implement GOST R 34.11 - 2012 } - enum { hashLen = 32 }; + enum { hashLen = 64 }; }; // ГОСТ Р 34.10 - const size_t GOSTR3410_PUBLIC_KEY_LENGTH = 64; - const size_t GOSTR3410_SIGNATURE_LENGTH = 64; + const size_t GOSTR3410_256_PUBLIC_KEY_LENGTH = 64; + const size_t GOSTR3410_512_PUBLIC_KEY_LENGTH = 128; template class GOSTR3410Verifier: public Verifier { public: - GOSTR3410Verifier (GOSTR3410ParamSet paramSet, const uint8_t * signingKey) + enum { keyLen = Hash::hashLen }; + + GOSTR3410Verifier (GOSTR3410ParamSet paramSet, const uint8_t * signingKey): + m_ParamSet (paramSet) { - BIGNUM * x = BN_bin2bn (signingKey, GOSTR3410_PUBLIC_KEY_LENGTH/2, NULL); - BIGNUM * y = BN_bin2bn (signingKey + GOSTR3410_PUBLIC_KEY_LENGTH/2, GOSTR3410_PUBLIC_KEY_LENGTH/2, NULL); + BIGNUM * x = BN_bin2bn (signingKey, GetPublicKeyLen ()/2, NULL); + BIGNUM * y = BN_bin2bn (signingKey + GetPublicKeyLen ()/2, GetPublicKeyLen ()/2, NULL); m_PublicKey = GetGOSTR3410Curve (m_ParamSet)->CreatePoint (x, y); BN_free (x); BN_free (y); } @@ -497,16 +500,16 @@ namespace crypto { uint8_t digest[Hash::hashLen]; Hash::CalculateHash (buf, len, digest); - BIGNUM * d = BN_bin2bn (digest, 32, nullptr); + BIGNUM * d = BN_bin2bn (digest, Hash::hashLen, nullptr); BIGNUM * r = BN_bin2bn (signature, GetSignatureLen ()/2, NULL); BIGNUM * s = BN_bin2bn (signature + GetSignatureLen ()/2, GetSignatureLen ()/2, NULL); bool ret = GetGOSTR3410Curve (m_ParamSet)->Verify (m_PublicKey, d, r, s); BN_free (d); BN_free (r); BN_free (s); return ret; } - - size_t GetPublicKeyLen () const { return GOSTR3410_PUBLIC_KEY_LENGTH; } - size_t GetSignatureLen () const { return GOSTR3410_SIGNATURE_LENGTH; } + + size_t GetPublicKeyLen () const { return keyLen*2; } + size_t GetSignatureLen () const { return keyLen*2; } private: @@ -519,10 +522,12 @@ namespace crypto { public: + enum { keyLen = Hash::hashLen }; + GOSTR3410Signer (GOSTR3410ParamSet paramSet, const uint8_t * signingPrivateKey): m_ParamSet (paramSet) { - m_PrivateKey = BN_bin2bn (signingPrivateKey, GOSTR3410_PUBLIC_KEY_LENGTH/2, nullptr); + m_PrivateKey = BN_bin2bn (signingPrivateKey, keyLen, nullptr); } ~GOSTR3410Signer () { BN_free (m_PrivateKey); } @@ -533,8 +538,8 @@ namespace crypto BIGNUM * d = BN_bin2bn (digest, 32, nullptr); BIGNUM * r = BN_new (), * s = BN_new (); GetGOSTR3410Curve (m_ParamSet)->Sign (m_PrivateKey, d, r, s); - bn2buf (r, signature, GOSTR3410_SIGNATURE_LENGTH/2); - bn2buf (s, signature + GOSTR3410_SIGNATURE_LENGTH/2, GOSTR3410_SIGNATURE_LENGTH/2); + bn2buf (r, signature, keyLen); + bn2buf (s, signature + keyLen, keyLen); BN_free (d); BN_free (r); BN_free (s); } @@ -563,6 +568,10 @@ namespace crypto typedef GOSTR3410Verifier GOSTR3410_2001_Verifier; typedef GOSTR3410Signer GOSTR3410_2001_Signer; + typedef GOSTR3410Verifier GOSTR3410_2012_256_Verifier; + typedef GOSTR3410Signer GOSTR3410_2012_256_Signer; + typedef GOSTR3410Verifier GOSTR3410_2012_512_Verifier; + typedef GOSTR3410Signer GOSTR3410_2012_512_Signer; } }