Загрузка SPKI в RSA :: publicKey всегда выдает исключение с нарушением доступа - PullRequest
0 голосов
/ 27 мая 2020

Я следую той же структуре 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
...