void signature_verify( const string & account_num, string & signature){ RSA::PublicKey publicKey; string recovered, message; // Load public key CryptoPP::ByteQueue bytes; FileSource file("pubkey.txt", true, new Base64Decoder); file.TransferTo(bytes); bytes.MessageEnd(); publicKey.Load(bytes); // Verify and Recover RSASS<PSSR, SHA1>::Verifier verifier(publicKey); StringSource(signature, true, new SignatureVerificationFilter( verifier, new StringSink(recovered), SignatureVerificationFilter::THROW_EXCEPTION | SignatureVerificationFilter::PUT_MESSAGE ) // SignatureVerificationFilter ); // StringSource assert(account_num == recovered); cout << "Verified signature on message" << endl; cout << "Message: " << "'" << recovered << "'" << endl; }
void LoadKey(const string& filename, RSA::PublicKey& PublicKey) { // DER Encode Key - X.509 key format PublicKey.Load( FileSource(filename.c_str(), true, NULL, true /*binary*/).Ref() ); }
void loadRSAPubKey(RSA::PublicKey& key, const char* filename){ ByteQueue byte; FileSource file(filename, true, new Base64Decoder); file.TransferTo(byte); byte.MessageEnd(); key.Load(byte); }
bool CheckSignature(const std::string& pubKey, const std::string& message, const std::string& signature) { RSA::PublicKey publicKey; publicKey.Load(StringSource(pubKey, true).Ref()); RSASSA_PKCS1v15_SHA_Verifier verifier(publicKey); try { StringSource(message+signature, true, new SignatureVerificationFilter( verifier, NULL, SignatureVerificationFilter::THROW_EXCEPTION)); return true; } catch (const std::exception&) { return false; } }
CryptoPP::RSA::PublicKey cKeysStorage::loadPubFile(std::string pPubKey) { std::string fileName(pPubKey); //fileName += ".pub"; std::cout << "Public key file: " << fileName << std::endl; /*std::string line; std::ifstream input(fileName); for (int i = 0; i < 3; i++) { input >> line; //std::cout << line << " "; input >> line; //std::cout << line << std::endl; } std::cout << "Load rsa data" << std::endl; input >> line; // END */ // load rsa data //char byte; //from .pub to tmp /*std::ofstream tmpFile("tmp", std::ios::trunc); while (!input.eof()) { input >> std::noskipws >> byte; std::cout << byte; tmpFile << byte; } tmpFile.close();*/ //Read public key CryptoPP::ByteQueue bytes; FileSource file(fileName.c_str(), true, new Base64Decoder); file.TransferTo(bytes); bytes.MessageEnd(); RSA::PublicKey pubKey; pubKey.Load(bytes); std::cout << "end of loadPubFile" << std::endl; return pubKey; }
int VerifyLicense(string signedTxt, string sigIn, string pubKeyEnc) { //Read public key CryptoPP::ByteQueue bytes; StringSource file(pubKeyEnc, true, new Base64Decoder); file.TransferTo(bytes); bytes.MessageEnd(); RSA::PublicKey pubKey; pubKey.Load(bytes); RSASSA_PKCS1v15_SHA_Verifier verifier(pubKey); //Read signed message CryptoPP::ByteQueue sig; StringSource sigFile(sigIn, true, new Base64Decoder); string sigStr; StringSink sigStrSink(sigStr); sigFile.TransferTo(sigStrSink); string combined(signedTxt); combined.append(sigStr); //Verify signature try { StringSource(combined, true, new SignatureVerificationFilter( verifier, NULL, SignatureVerificationFilter::THROW_EXCEPTION ) ); } catch(SignatureVerificationFilter::SignatureVerificationFailed &err) { cout << err.what() << endl; return 0; } return 1; }
void Verify(){ //Read public key CryptoPP::ByteQueue bytes; FileSource file("pubkey.txt", true, new Base64Decoder); file.TransferTo(bytes); bytes.MessageEnd(); RSA::PublicKey pubKey; pubKey.Load(bytes); RSASSA_PKCS1v15_SHA_Verifier verifier(pubKey); //Read signed message string signedTxt; FileSource("message.dat", true, new StringSink(signedTxt)); //c string sig; FileSource("cipher.dat", true, new StringSink(sig)); //m string combined(signedTxt); combined.append(sig); //Verify signature try { StringSource(combined, true, new SignatureVerificationFilter( verifier, NULL, SignatureVerificationFilter::THROW_EXCEPTION ) ); // cout << "Signature OK" << endl; } catch(SignatureVerificationFilter::SignatureVerificationFailed &err) { cout << err.what() << endl; } }
std::string EncryptAsymmetrical(const std::string& pubKey, const std::string& data) { assert(!data.empty()); string result; AutoSeededRandomPool rng; RSA::PublicKey publicKey; publicKey.Load(StringSource(pubKey, true).Ref()); RSAES_OAEP_SHA_Encryptor e(publicKey); result.resize(2); *(ui16*)result.data() = 0; for (size_t i = 0; i <= (data.size() - 1) / MAX_DATA_SIZE; ++i) { string currData = data.substr(i * MAX_DATA_SIZE, MAX_DATA_SIZE); string currResult; StringSource ss(currData, true, new PK_EncryptorFilter(rng, e, new StringSink(currResult))); result.resize(result.size() + 2); (*(ui16*)(result.data() + result.size() - 2)) = currResult.size(); (*(ui16*)(result.data()))++; result += currResult; } assert(!result.empty()); return result; }
bool Validator::verifySignature(const uint8_t* buf, const size_t size, const Signature& sig, const v1::PublicKey& key) { try { using namespace CryptoPP; switch (sig.getType()) { case tlv::SignatureSha256WithRsa: { if (key.getKeyType() != KeyType::RSA) return false; RSA::PublicKey publicKey; ByteQueue queue; queue.Put(reinterpret_cast<const byte*>(key.get().buf()), key.get().size()); publicKey.Load(queue); RSASS<PKCS1v15, SHA256>::Verifier verifier(publicKey); return verifier.VerifyMessage(buf, size, sig.getValue().value(), sig.getValue().value_size()); } case tlv::SignatureSha256WithEcdsa: { if (key.getKeyType() != KeyType::EC) return false; ECDSA<ECP, SHA256>::PublicKey publicKey; ByteQueue queue; queue.Put(reinterpret_cast<const byte*>(key.get().buf()), key.get().size()); publicKey.Load(queue); ECDSA<ECP, SHA256>::Verifier verifier(publicKey); uint32_t length = 0; StringSource src(key.get().buf(), key.get().size(), true); BERSequenceDecoder subjectPublicKeyInfo(src); { BERSequenceDecoder algorithmInfo(subjectPublicKeyInfo); { Oid algorithm; algorithm.decode(algorithmInfo); Oid curveId; curveId.decode(algorithmInfo); if (curveId == SECP256R1) length = 256; else if (curveId == SECP384R1) length = 384; else return false; } } switch (length) { case 256: { uint8_t buffer[64]; size_t usedSize = DSAConvertSignatureFormat(buffer, sizeof(buffer), DSA_P1363, sig.getValue().value(), sig.getValue().value_size(), DSA_DER); return verifier.VerifyMessage(buf, size, buffer, usedSize); } case 384: { uint8_t buffer[96]; size_t usedSize = DSAConvertSignatureFormat(buffer, sizeof(buffer), DSA_P1363, sig.getValue().value(), sig.getValue().value_size(), DSA_DER); return verifier.VerifyMessage(buf, size, buffer, usedSize); } default: return false; } } default: // Unsupported sig type return false; } } catch (const CryptoPP::Exception& e) { return false; } }