00001
#ifndef CRYPTOPP_RSA_H
00002
#define CRYPTOPP_RSA_H
00003
00004
00005
00006
00007
00008
00009
#include "pkcspad.h"
00010
#include "oaep.h"
00011
#include "integer.h"
00012
#include "asn.h"
00013
00014 NAMESPACE_BEGIN(CryptoPP)
00015
00016
00017 class
RSAFunction : public
TrapdoorFunction, public
X509PublicKey
00018 {
00019
typedef RSAFunction ThisClass;
00020
00021
public:
00022
void Initialize(
const Integer &n,
const Integer &e)
00023 {m_n = n; m_e = e;}
00024
00025
00026
OID GetAlgorithmID()
const;
00027
void BERDecodeKey(
BufferedTransformation &bt);
00028
void DEREncodeKey(
BufferedTransformation &bt)
const;
00029
00030
00031
bool Validate(
RandomNumberGenerator &rng,
unsigned int level)
const;
00032
bool GetVoidValue(
const char *name,
const std::type_info &valueType,
void *pValue)
const;
00033
void AssignFrom(
const NameValuePairs &source);
00034
00035
00036
Integer ApplyFunction(
const Integer &x)
const;
00037
Integer PreimageBound()
const {
return m_n;}
00038
Integer ImageBound()
const {
return m_n;}
00039
00040
00041
const Integer & GetModulus()
const {
return m_n;}
00042
const Integer & GetPublicExponent()
const {
return m_e;}
00043
00044
void SetModulus(
const Integer &n) {m_n = n;}
00045
void SetPublicExponent(
const Integer &e) {m_e = e;}
00046
00047
protected:
00048
Integer m_n, m_e;
00049 };
00050
00051
00052 class InvertibleRSAFunction :
public RSAFunction,
public TrapdoorFunctionInverse,
public PKCS8PrivateKey
00053 {
00054
typedef InvertibleRSAFunction ThisClass;
00055
00056
public:
00057
void Initialize(
RandomNumberGenerator &rng,
unsigned int modulusBits,
const Integer &e = 17);
00058
void Initialize(
const Integer &n,
const Integer &e,
const Integer &d,
const Integer &p,
const Integer &q,
const Integer &dp,
const Integer &dq,
const Integer &u)
00059 {m_n = n; m_e = e; m_d = d; m_p = p; m_q = q; m_dp = dp; m_dq = dq; m_u = u;}
00060
00061
void Initialize(
const Integer &n,
const Integer &e,
const Integer &d);
00062
00063
00064 void BERDecode(
BufferedTransformation &bt)
00065 {PKCS8PrivateKey::BERDecode(bt);}
00066 void DEREncode(
BufferedTransformation &bt)
const
00067
{PKCS8PrivateKey::DEREncode(bt);}
00068
void BERDecodeKey(
BufferedTransformation &bt);
00069
void DEREncodeKey(
BufferedTransformation &bt)
const;
00070
00071
00072
Integer CalculateInverse(
RandomNumberGenerator &rng,
const Integer &x)
const;
00073
00074
00075
bool Validate(
RandomNumberGenerator &rng,
unsigned int level)
const;
00076
00077
void GenerateRandom(
RandomNumberGenerator &rng,
const NameValuePairs &alg);
00078
bool GetVoidValue(
const char *name,
const std::type_info &valueType,
void *pValue)
const;
00079
void AssignFrom(
const NameValuePairs &source);
00080
00081
00082
const Integer& GetPrime1()
const {
return m_p;}
00083
const Integer& GetPrime2()
const {
return m_q;}
00084
const Integer& GetPrivateExponent()
const {
return m_d;}
00085
const Integer& GetModPrime1PrivateExponent()
const {
return m_dp;}
00086
const Integer& GetModPrime2PrivateExponent()
const {
return m_dq;}
00087
const Integer& GetMultiplicativeInverseOfPrime2ModPrime1()
const {
return m_u;}
00088
00089
void SetPrime1(
const Integer &p) {m_p = p;}
00090
void SetPrime2(
const Integer &q) {m_q = q;}
00091
void SetPrivateExponent(
const Integer &d) {m_d = d;}
00092
void SetModPrime1PrivateExponent(
const Integer &dp) {m_dp = dp;}
00093
void SetModPrime2PrivateExponent(
const Integer &dq) {m_dq = dq;}
00094
void SetMultiplicativeInverseOfPrime2ModPrime1(
const Integer &u) {m_u = u;}
00095
00096
protected:
00097
virtual void DEREncodeOptionalAttributes(
BufferedTransformation &bt)
const {}
00098
virtual void BERDecodeOptionalAttributes(
BufferedTransformation &bt) {}
00099
00100
Integer m_d, m_p, m_q, m_dp, m_dq, m_u;
00101 };
00102
00103
00104 struct RSA
00105 {
00106
static std::string StaticAlgorithmName() {
return "RSA";}
00107
typedef RSAFunction PublicKey;
00108
typedef InvertibleRSAFunction PrivateKey;
00109 };
00110
00111
00112 template <
class STANDARD>
00113
struct RSAES :
public TF_ES<STANDARD, RSA>
00114 {
00115 };
00116
00117
00118
00119 template <
class STANDARD,
class H>
00120
struct RSASS :
public TF_SS<STANDARD, H, RSA>
00121 {
00122 };
00123
00124
00125
typedef RSAES<PKCS1v15>::Decryptor
RSAES_PKCS1v15_Decryptor;
00126
typedef RSAES<PKCS1v15>::Encryptor
RSAES_PKCS1v15_Encryptor;
00127
00128
typedef RSAES<OAEP<SHA> >::Decryptor
RSAES_OAEP_SHA_Decryptor;
00129
typedef RSAES<OAEP<SHA> >::Encryptor
RSAES_OAEP_SHA_Encryptor;
00130
00131
00132
typedef RSASS<PKCS1v15, SHA>::Signer
RSASSA_PKCS1v15_SHA_Signer;
00133
typedef RSASS<PKCS1v15, SHA>::Verifier
RSASSA_PKCS1v15_SHA_Verifier;
00134
00135
typedef RSASS<PKCS1v15, MD2>::Signer
RSASSA_PKCS1v15_MD2_Signer;
00136
typedef RSASS<PKCS1v15, MD2>::Verifier
RSASSA_PKCS1v15_MD2_Verifier;
00137
00138
typedef RSASS<PKCS1v15, MD5>::Signer
RSASSA_PKCS1v15_MD5_Signer;
00139
typedef RSASS<PKCS1v15, MD5>::Verifier
RSASSA_PKCS1v15_MD5_Verifier;
00140
00141 NAMESPACE_END
00142
00143
#endif