Я следую той же структуре void X509Certificate :: BERDecode (BufferedTransformation & bt) от https://github.com/noloader/cryptopp-pem/blob/master/x509cert.cpp
Я изменил этот BERDecodeSubjectPublicKeyInfo () ниже. Но я не могу загрузить spki в RSA :: PublicKey , он всегда вызывает исключение нарушения доступа. Может кто поможет? Причина загрузки в PublicKey, чтобы я мог выполнять проверку, например m_uPtrSubjectPublicKey-> Validate (rnd, 2);
void BERDecodeSubjectPublicKeyInfo(CryptoPP::BufferedTransformation& bt, CryptoPP::OID& algo, CryptoPP::SecByteBlock& pubKey)
{
using namespace CryptoPP;
// SEQUENCE { //TBS Cert (bt)
// SEQUENCE { //SPKI
// SEQUENCE { //Algo Identifier
// OBJECT IDENTIFIER algorithm
// parameters ANY DEFINED BY algorithm OPTIONAL
// }
// BIT STRING //Signature
// }
// }
BERSequenceDecoder spki(bt); //subject public key info (spki)
//I am trying to load SPKI into RSA::PublicKey here but throws exception of access violation!!
std::unique_ptr<CryptoPP::RSA::PublicKey> m_uPtrSubjectPublicKey;
m_uPtrSubjectPublicKey->Load(spki);
//Store SPKI into DER stream variable
ByteQueue m_DERSPKI;
DERSequenceEncoder spkiEncoder(m_DERSPKI); //Encoding to DER Stream
spki.CopyTo(spkiEncoder);
spkiEncoder.MessageEnd();
BERDecodeSignatureAlgorithm(spki, algo);
BERDecodeSignature(spki, pubKey);
//spki.MessageEnd();
spki.SkipAll();
std::unique_ptr<CryptoPP::RSA::PublicKey> myPublicKey;
myPublicKey->Load(m_DERSPKI); //Try again using DER stream, always throws exception!!!
//How to take spki info from cert to RSA::PublicKey object?
}
Вместо того, чтобы использовать UniquePtr для обертывания моего RSA publicKey, я использую его напрямую, и это нормально . Не знаю почему, но это работает, если использовать метод ниже:
CryptoPP::RSA::PublicKey myPublicKey;
myPublicKey.Load(m_DERSPKI);
AutoSeededRandomPool rnd;
bool validated = myPublicKey.Validate(rnd, 2); //validated gets True