diff options
Diffstat (limited to 'Libraries/LibCrypto/PK/RSA.h')
-rw-r--r-- | Libraries/LibCrypto/PK/RSA.h | 392 |
1 files changed, 196 insertions, 196 deletions
diff --git a/Libraries/LibCrypto/PK/RSA.h b/Libraries/LibCrypto/PK/RSA.h index ece8a5aa00..b0fcdba160 100644 --- a/Libraries/LibCrypto/PK/RSA.h +++ b/Libraries/LibCrypto/PK/RSA.h @@ -34,201 +34,201 @@ namespace Crypto { namespace PK { - template <typename Integer = u64> - class RSAPublicKey { - public: - RSAPublicKey(const Integer& n, const Integer& e) - : m_modulus(n) - , m_public_exponent(e) - { - } - - RSAPublicKey() - : m_modulus(0) - , m_public_exponent(0) - { - } - - //--stuff it should do - - const Integer& modulus() const { return m_modulus; } - const Integer& public_exponent() const { return m_public_exponent; } - size_t length() const { return m_length; } - void set_length(size_t length) { m_length = length; } - - void set(const Integer& n, const Integer& e) - { - m_modulus = n; - m_public_exponent = e; - m_length = (n.trimmed_length() * sizeof(u32)); - } - - private: - Integer m_modulus; - Integer m_public_exponent; - size_t m_length { 0 }; - }; - - template <typename Integer = UnsignedBigInteger> - class RSAPrivateKey { - public: - RSAPrivateKey(const Integer& n, const Integer& d, const Integer& e) - : m_modulus(n) - , m_private_exponent(d) - , m_public_exponent(e) - { - } - - RSAPrivateKey() - { - } - - //--stuff it should do - const Integer& modulus() const { return m_modulus; } - const Integer& private_exponent() const { return m_private_exponent; } - const Integer& public_exponent() const { return m_public_exponent; } - size_t length() const { return m_length; } - void set_length(size_t length) { m_length = length; } - - void set(const Integer& n, const Integer& d, const Integer& e) - { - m_modulus = n; - m_private_exponent = d; - m_public_exponent = e; - m_length = (n.length() * sizeof(u32)); - } - - private: - Integer m_modulus; - Integer m_private_exponent; - Integer m_public_exponent; - size_t m_length { 0 }; - }; - - template <typename PubKey, typename PrivKey> - struct RSAKeyPair { - PubKey public_key; - PrivKey private_key; - }; - - using IntegerType = UnsignedBigInteger; - class RSA : public PKSystem<RSAPrivateKey<IntegerType>, RSAPublicKey<IntegerType>> { - template <typename T> - friend class RSA_EMSA_PSS; - - public: - using KeyPairType = RSAKeyPair<PublicKeyType, PrivateKeyType>; - - static KeyPairType parse_rsa_key(const ByteBuffer&); - static KeyPairType generate_key_pair(size_t bits = 256) - { - IntegerType e { 65537 }; // :P - IntegerType p, q; - IntegerType lambda; - - do { - p = NumberTheory::random_big_prime(bits / 2); - q = NumberTheory::random_big_prime(bits / 2); - lambda = NumberTheory::LCM(p.sub(1), q.sub(1)); - dbg() << "checking combination p=" << p << ", q=" << q << ", lambda=" << lambda.length(); - } while (!(NumberTheory::GCD(e, lambda) == 1)); - - auto n = p.multiply(q); - - auto d = NumberTheory::ModularInverse(e, lambda); - dbg() << "Your keys are Pub{n=" << n << ", e=" << e << "} and Priv{n=" << n << ", d=" << d << "}"; - RSAKeyPair<PublicKeyType, PrivateKeyType> keys { - { n, e }, - { n, d, e } - }; - keys.public_key.set_length(bits / 2 / 8); - keys.private_key.set_length(bits / 2 / 8); - return keys; - } - - RSA(IntegerType n, IntegerType d, IntegerType e) - { - m_public_key.set(n, e); - m_private_key.set(n, d, e); - } - - RSA(PublicKeyType& pubkey, PrivateKeyType& privkey) - : PKSystem<RSAPrivateKey<IntegerType>, RSAPublicKey<IntegerType>>(pubkey, privkey) - { - } - - RSA(const ByteBuffer& publicKeyPEM, const ByteBuffer& privateKeyPEM) - { - import_public_key(publicKeyPEM); - import_private_key(privateKeyPEM); - } - - RSA(const StringView& privKeyPEM) - { - import_private_key(ByteBuffer::wrap(privKeyPEM.characters_without_null_termination(), privKeyPEM.length())); - m_public_key.set(m_private_key.modulus(), m_private_key.public_exponent()); - } - - // create our own keys - RSA() - { - auto pair = generate_key_pair(); - m_public_key = pair.public_key; - m_private_key = pair.private_key; - } - - virtual void encrypt(const ByteBuffer& in, ByteBuffer& out) override; - virtual void decrypt(const ByteBuffer& in, ByteBuffer& out) override; - - virtual void sign(const ByteBuffer& in, ByteBuffer& out) override; - virtual void verify(const ByteBuffer& in, ByteBuffer& out) override; - - virtual String class_name() const override { return "RSA"; } - - virtual size_t output_size() const override { return m_public_key.length(); } - - void import_public_key(const ByteBuffer& buffer, bool pem = true); - void import_private_key(const ByteBuffer& buffer, bool pem = true); - - const PrivateKeyType& private_key() const { return m_private_key; } - const PublicKeyType& public_key() const { return m_public_key; } - }; - - template <typename HashFunction> - class RSA_EMSA_PSS { - public: - RSA_EMSA_PSS(RSA& rsa) - : m_rsa(rsa) - { - } - - void sign(const ByteBuffer& in, ByteBuffer& out); - VerificationConsistency verify(const ByteBuffer& in); - - private: - EMSA_PSS<HashFunction, HashFunction::DigestSize> m_emsa_pss; - RSA m_rsa; - }; - - class RSA_PKCS1_EME : public RSA { - public: - // forward all constructions to RSA - template <typename... Args> - RSA_PKCS1_EME(Args... args) - : RSA(args...) - { - } - - ~RSA_PKCS1_EME() {} - - virtual void encrypt(const ByteBuffer& in, ByteBuffer& out) override; - virtual void decrypt(const ByteBuffer& in, ByteBuffer& out) override; - - virtual void sign(const ByteBuffer&, ByteBuffer&) override; - virtual void verify(const ByteBuffer&, ByteBuffer&) override; - - virtual String class_name() const override { return "RSA_PKCS1-EME"; } - virtual size_t output_size() const override { return m_public_key.length(); } - }; +template<typename Integer = u64> +class RSAPublicKey { +public: + RSAPublicKey(const Integer& n, const Integer& e) + : m_modulus(n) + , m_public_exponent(e) + { + } + + RSAPublicKey() + : m_modulus(0) + , m_public_exponent(0) + { + } + + //--stuff it should do + + const Integer& modulus() const { return m_modulus; } + const Integer& public_exponent() const { return m_public_exponent; } + size_t length() const { return m_length; } + void set_length(size_t length) { m_length = length; } + + void set(const Integer& n, const Integer& e) + { + m_modulus = n; + m_public_exponent = e; + m_length = (n.trimmed_length() * sizeof(u32)); + } + +private: + Integer m_modulus; + Integer m_public_exponent; + size_t m_length { 0 }; +}; + +template<typename Integer = UnsignedBigInteger> +class RSAPrivateKey { +public: + RSAPrivateKey(const Integer& n, const Integer& d, const Integer& e) + : m_modulus(n) + , m_private_exponent(d) + , m_public_exponent(e) + { + } + + RSAPrivateKey() + { + } + + //--stuff it should do + const Integer& modulus() const { return m_modulus; } + const Integer& private_exponent() const { return m_private_exponent; } + const Integer& public_exponent() const { return m_public_exponent; } + size_t length() const { return m_length; } + void set_length(size_t length) { m_length = length; } + + void set(const Integer& n, const Integer& d, const Integer& e) + { + m_modulus = n; + m_private_exponent = d; + m_public_exponent = e; + m_length = (n.length() * sizeof(u32)); + } + +private: + Integer m_modulus; + Integer m_private_exponent; + Integer m_public_exponent; + size_t m_length { 0 }; +}; + +template<typename PubKey, typename PrivKey> +struct RSAKeyPair { + PubKey public_key; + PrivKey private_key; +}; + +using IntegerType = UnsignedBigInteger; +class RSA : public PKSystem<RSAPrivateKey<IntegerType>, RSAPublicKey<IntegerType>> { + template<typename T> + friend class RSA_EMSA_PSS; + +public: + using KeyPairType = RSAKeyPair<PublicKeyType, PrivateKeyType>; + + static KeyPairType parse_rsa_key(const ByteBuffer&); + static KeyPairType generate_key_pair(size_t bits = 256) + { + IntegerType e { 65537 }; // :P + IntegerType p, q; + IntegerType lambda; + + do { + p = NumberTheory::random_big_prime(bits / 2); + q = NumberTheory::random_big_prime(bits / 2); + lambda = NumberTheory::LCM(p.sub(1), q.sub(1)); + dbg() << "checking combination p=" << p << ", q=" << q << ", lambda=" << lambda.length(); + } while (!(NumberTheory::GCD(e, lambda) == 1)); + + auto n = p.multiply(q); + + auto d = NumberTheory::ModularInverse(e, lambda); + dbg() << "Your keys are Pub{n=" << n << ", e=" << e << "} and Priv{n=" << n << ", d=" << d << "}"; + RSAKeyPair<PublicKeyType, PrivateKeyType> keys { + { n, e }, + { n, d, e } + }; + keys.public_key.set_length(bits / 2 / 8); + keys.private_key.set_length(bits / 2 / 8); + return keys; + } + + RSA(IntegerType n, IntegerType d, IntegerType e) + { + m_public_key.set(n, e); + m_private_key.set(n, d, e); + } + + RSA(PublicKeyType& pubkey, PrivateKeyType& privkey) + : PKSystem<RSAPrivateKey<IntegerType>, RSAPublicKey<IntegerType>>(pubkey, privkey) + { + } + + RSA(const ByteBuffer& publicKeyPEM, const ByteBuffer& privateKeyPEM) + { + import_public_key(publicKeyPEM); + import_private_key(privateKeyPEM); + } + + RSA(const StringView& privKeyPEM) + { + import_private_key(ByteBuffer::wrap(privKeyPEM.characters_without_null_termination(), privKeyPEM.length())); + m_public_key.set(m_private_key.modulus(), m_private_key.public_exponent()); + } + + // create our own keys + RSA() + { + auto pair = generate_key_pair(); + m_public_key = pair.public_key; + m_private_key = pair.private_key; + } + + virtual void encrypt(const ByteBuffer& in, ByteBuffer& out) override; + virtual void decrypt(const ByteBuffer& in, ByteBuffer& out) override; + + virtual void sign(const ByteBuffer& in, ByteBuffer& out) override; + virtual void verify(const ByteBuffer& in, ByteBuffer& out) override; + + virtual String class_name() const override { return "RSA"; } + + virtual size_t output_size() const override { return m_public_key.length(); } + + void import_public_key(const ByteBuffer& buffer, bool pem = true); + void import_private_key(const ByteBuffer& buffer, bool pem = true); + + const PrivateKeyType& private_key() const { return m_private_key; } + const PublicKeyType& public_key() const { return m_public_key; } +}; + +template<typename HashFunction> +class RSA_EMSA_PSS { +public: + RSA_EMSA_PSS(RSA& rsa) + : m_rsa(rsa) + { + } + + void sign(const ByteBuffer& in, ByteBuffer& out); + VerificationConsistency verify(const ByteBuffer& in); + +private: + EMSA_PSS<HashFunction, HashFunction::DigestSize> m_emsa_pss; + RSA m_rsa; +}; + +class RSA_PKCS1_EME : public RSA { +public: + // forward all constructions to RSA + template<typename... Args> + RSA_PKCS1_EME(Args... args) + : RSA(args...) + { + } + + ~RSA_PKCS1_EME() {} + + virtual void encrypt(const ByteBuffer& in, ByteBuffer& out) override; + virtual void decrypt(const ByteBuffer& in, ByteBuffer& out) override; + + virtual void sign(const ByteBuffer&, ByteBuffer&) override; + virtual void verify(const ByteBuffer&, ByteBuffer&) override; + + virtual String class_name() const override { return "RSA_PKCS1-EME"; } + virtual size_t output_size() const override { return m_public_key.length(); } +}; } } |