mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 11:27:35 +00:00
LibCrypto: Parse and store all RSA private key components
This commit is contained in:
parent
dc1180d6b2
commit
15836cc865
5 changed files with 168 additions and 73 deletions
|
@ -8,6 +8,7 @@
|
|||
#pragma once
|
||||
|
||||
#include <AK/Span.h>
|
||||
#include <LibCrypto/ASN1/DER.h>
|
||||
#include <LibCrypto/BigInt/UnsignedBigInteger.h>
|
||||
#include <LibCrypto/NumberTheory/ModularFunctions.h>
|
||||
#include <LibCrypto/PK/Code/EMSA_PSS.h>
|
||||
|
@ -36,6 +37,18 @@ public:
|
|||
size_t length() const { return m_length; }
|
||||
void set_length(size_t length) { m_length = length; }
|
||||
|
||||
ErrorOr<ByteBuffer> export_as_der() const
|
||||
{
|
||||
ASN1::Encoder encoder;
|
||||
TRY(encoder.write_constructed(ASN1::Class::Universal, ASN1::Kind::Sequence, [&]() -> ErrorOr<void> {
|
||||
TRY(encoder.write(m_modulus));
|
||||
TRY(encoder.write(m_public_exponent));
|
||||
return {};
|
||||
}));
|
||||
|
||||
return encoder.finish();
|
||||
}
|
||||
|
||||
void set(Integer n, Integer e)
|
||||
{
|
||||
m_modulus = move(n);
|
||||
|
@ -52,10 +65,28 @@ private:
|
|||
template<typename Integer = UnsignedBigInteger>
|
||||
class RSAPrivateKey {
|
||||
public:
|
||||
RSAPrivateKey(Integer n, Integer d, Integer e)
|
||||
RSAPrivateKey(Integer n, Integer d, Integer e, Integer p, Integer q)
|
||||
: m_modulus(move(n))
|
||||
, m_private_exponent(move(d))
|
||||
, m_public_exponent(move(e))
|
||||
, m_prime_1(move(p))
|
||||
, m_prime_2(move(q))
|
||||
, m_exponent_1(NumberTheory::Mod(m_private_exponent, m_prime_1.minus(1)))
|
||||
, m_exponent_2(NumberTheory::Mod(m_private_exponent, m_prime_2.minus(1)))
|
||||
, m_coefficient(NumberTheory::ModularInverse(m_prime_2, m_prime_1))
|
||||
, m_length(m_modulus.trimmed_length() * sizeof(u32))
|
||||
{
|
||||
}
|
||||
|
||||
RSAPrivateKey(Integer n, Integer d, Integer e, Integer p, Integer q, Integer dp, Integer dq, Integer qinv)
|
||||
: m_modulus(move(n))
|
||||
, m_private_exponent(move(d))
|
||||
, m_public_exponent(move(e))
|
||||
, m_prime_1(move(p))
|
||||
, m_prime_2(move(q))
|
||||
, m_exponent_1(move(dp))
|
||||
, m_exponent_2(move(dq))
|
||||
, m_coefficient(move(qinv))
|
||||
, m_length(m_modulus.trimmed_length() * sizeof(u32))
|
||||
{
|
||||
}
|
||||
|
@ -65,21 +96,41 @@ public:
|
|||
Integer const& modulus() const { return m_modulus; }
|
||||
Integer const& private_exponent() const { return m_private_exponent; }
|
||||
Integer const& public_exponent() const { return m_public_exponent; }
|
||||
Integer const& prime1() const { return m_prime_1; }
|
||||
Integer const& prime2() const { return m_prime_2; }
|
||||
Integer const& exponent1() const { return m_exponent_1; }
|
||||
Integer const& exponent2() const { return m_exponent_2; }
|
||||
Integer const& coefficient() const { return m_coefficient; }
|
||||
size_t length() const { return m_length; }
|
||||
void set_length(size_t length) { m_length = length; }
|
||||
|
||||
void set(Integer n, Integer d, Integer e)
|
||||
ErrorOr<ByteBuffer> export_as_der() const
|
||||
{
|
||||
m_modulus = move(n);
|
||||
m_private_exponent = move(d);
|
||||
m_public_exponent = move(e);
|
||||
m_length = m_modulus.trimmed_length() * sizeof(u32);
|
||||
ASN1::Encoder encoder;
|
||||
TRY(encoder.write_constructed(ASN1::Class::Universal, ASN1::Kind::Sequence, [&]() -> ErrorOr<void> {
|
||||
TRY(encoder.write(0x00u)); // version
|
||||
TRY(encoder.write(m_modulus));
|
||||
TRY(encoder.write(m_public_exponent));
|
||||
TRY(encoder.write(m_private_exponent));
|
||||
TRY(encoder.write(m_prime_1));
|
||||
TRY(encoder.write(m_prime_2));
|
||||
TRY(encoder.write(m_exponent_1));
|
||||
TRY(encoder.write(m_exponent_2));
|
||||
TRY(encoder.write(m_coefficient));
|
||||
return {};
|
||||
}));
|
||||
|
||||
return encoder.finish();
|
||||
}
|
||||
|
||||
private:
|
||||
Integer m_modulus;
|
||||
Integer m_private_exponent;
|
||||
Integer m_public_exponent;
|
||||
Integer m_prime_1;
|
||||
Integer m_prime_2;
|
||||
Integer m_exponent_1; // d mod (p-1)
|
||||
Integer m_exponent_2; // d mod (q-1)
|
||||
Integer m_coefficient; // q^-1 mod p
|
||||
size_t m_length { 0 };
|
||||
};
|
||||
|
||||
|
@ -114,20 +165,18 @@ public:
|
|||
auto n = p.multiplied_by(q);
|
||||
|
||||
auto d = NumberTheory::ModularInverse(e, lambda);
|
||||
dbgln("Your keys are Pub(n={}, e={}) and Priv(n={}, d={})", n, e, n, d);
|
||||
dbgln("Your keys are Pub(n={}, e={}) and Priv(n={}, d={}, p={}, q={})", n, e, n, d, p, q);
|
||||
RSAKeyPair<PublicKeyType, PrivateKeyType> keys {
|
||||
{ n, e },
|
||||
{ n, d, e }
|
||||
{ n, d, e, p, q }
|
||||
};
|
||||
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);
|
||||
m_private_key = { n, d, e, 0, 0, 0, 0, 0 };
|
||||
}
|
||||
|
||||
RSA(PublicKeyType& pubkey, PrivateKeyType& privkey)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue