void LoadKey(const char* file, RSA::PrivateKey& key) { ByteQueue q; FileSource KeyFile(file, true, new Base64Decoder()); KeyFile.TransferTo(q); key.BERDecodePrivateKey(q,false,0); // last 2 params unused }
static bool DecodeFromFile(const char* filename, RSA::PrivateKey& key) { try { ByteQueue queue; FileSource file(filename, true); file.TransferTo(queue); queue.MessageEnd(); key.BERDecodePrivateKey(queue, false, queue.MaxRetrievable()); return key.Validate(rng, 3); } catch (...) { return false; } }
extern "C" int rsa_pss_sign(const char *key_file, const unsigned char *msg, int len, unsigned char *sig_buf, unsigned char *modulus_buf) { try { AutoSeededRandomPool rng; FileSource file(key_file, true); RSA::PrivateKey key; ByteQueue bq; // Load the key file.TransferTo(bq); bq.MessageEnd(); key.BERDecodePrivateKey(bq, false, bq.MaxRetrievable()); // Write the modulus Integer mod = key.GetModulus(); // error check if (mod.ByteCount() != RCM_RSA_MODULUS_SIZE) throw std::length_error("incorrect rsa key modulus length"); for (int i = 0; i < mod.ByteCount(); i++) modulus_buf[i] = mod.GetByte(i); // Sign the message RSASS<PSS, SHA256>::Signer signer(key); size_t length = signer.MaxSignatureLength(); SecByteBlock signature(length); length = signer.SignMessage(rng, msg, len, signature); // Copy in reverse order for (int i = 0; i < length; i++) sig_buf[length - i - 1] = signature[i]; } catch(const CryptoPP::Exception& e) { cerr << e.what() << endl; return 1; } catch(std::length_error& le) { cerr << "Error: " << le.what() << endl; return 1; } return 0; }
extern "C" int rsa_pss_sign_file(const char *key_file, const char *msg_file, unsigned char *sig_buf) { try { AutoSeededRandomPool rng; FileSource file(key_file, true); RSA::PrivateKey key; ByteQueue bq; // Load the key file.TransferTo(bq); bq.MessageEnd(); key.BERDecodePrivateKey(bq, false, bq.MaxRetrievable()); // Sign the message RSASS<PSS, SHA256>::Signer signer(key); string signature; FileSource src(msg_file, true, new SignerFilter(rng, signer, new StringSink(signature))); int length = signature.length(); // error check if (length != RCM_RSA_SIG_SIZE) throw std::length_error("incorrect rsa key length"); // Copy in reverse order for (int i = 0; i < length; i++) sig_buf[length - i - 1] = signature[i]; } catch(const CryptoPP::Exception& e) { cerr << e.what() << endl; return 1; } catch(std::length_error& le) { cerr << "Error: " << le.what() << endl; return 1; } return 0; }