mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 12:47:35 +00:00
LibCrypto: Make a better ASN.1 parser
And use it to parse RSA keys. As a bonus, this one shouldn't be reading out of bounds or messing with the stack (as much) anymore.
This commit is contained in:
parent
4d40864b9d
commit
3fe7ac0924
13 changed files with 893 additions and 624 deletions
|
@ -35,12 +35,13 @@
|
|||
|
||||
namespace Crypto {
|
||||
namespace PK {
|
||||
template<typename Integer = u64>
|
||||
template<typename Integer = UnsignedBigInteger>
|
||||
class RSAPublicKey {
|
||||
public:
|
||||
RSAPublicKey(const Integer& n, const Integer& e)
|
||||
: m_modulus(n)
|
||||
, m_public_exponent(e)
|
||||
RSAPublicKey(Integer n, Integer e)
|
||||
: m_modulus(move(n))
|
||||
, m_public_exponent(move(e))
|
||||
, m_length(m_modulus.trimmed_length() * sizeof(u32))
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -57,11 +58,11 @@ public:
|
|||
size_t length() const { return m_length; }
|
||||
void set_length(size_t length) { m_length = length; }
|
||||
|
||||
void set(const Integer& n, const Integer& e)
|
||||
void set(Integer n, Integer e)
|
||||
{
|
||||
m_modulus = n;
|
||||
m_public_exponent = e;
|
||||
m_length = (n.trimmed_length() * sizeof(u32));
|
||||
m_modulus = move(n);
|
||||
m_public_exponent = move(e);
|
||||
m_length = (m_modulus.trimmed_length() * sizeof(u32));
|
||||
}
|
||||
|
||||
private:
|
||||
|
@ -73,10 +74,11 @@ private:
|
|||
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(Integer n, Integer d, Integer e)
|
||||
: m_modulus(move(n))
|
||||
, m_private_exponent(move(d))
|
||||
, m_public_exponent(move(e))
|
||||
, m_length(m_modulus.trimmed_length() * sizeof(u32))
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -91,12 +93,12 @@ public:
|
|||
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)
|
||||
void set(Integer n, Integer d, Integer e)
|
||||
{
|
||||
m_modulus = n;
|
||||
m_private_exponent = d;
|
||||
m_public_exponent = e;
|
||||
m_length = (n.length() * sizeof(u32));
|
||||
m_modulus = move(n);
|
||||
m_private_exponent = move(d);
|
||||
m_public_exponent = move(e);
|
||||
m_length = m_modulus.trimmed_length() * sizeof(u32);
|
||||
}
|
||||
|
||||
private:
|
||||
|
@ -120,7 +122,7 @@ class RSA : public PKSystem<RSAPrivateKey<IntegerType>, RSAPublicKey<IntegerType
|
|||
public:
|
||||
using KeyPairType = RSAKeyPair<PublicKeyType, PrivateKeyType>;
|
||||
|
||||
static KeyPairType parse_rsa_key(ReadonlyBytes);
|
||||
static KeyPairType parse_rsa_key(ReadonlyBytes der);
|
||||
static KeyPairType generate_key_pair(size_t bits = 256)
|
||||
{
|
||||
IntegerType e { 65537 }; // :P
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue