class CryptoCore { public: CryptoCore(const std::string& pkcs11path); ~CryptoCore(); ... }
std::vector<unsigned long> enumerateDevices();
DeviceInfo getDeviceInfo(unsigned long deviceId);
struct DeviceInfo { // std::string label; // ( ) std::string serial; // std::string model; // unsigned int type; // bool isLoggedIn; // PIN- bool isPinCached; ... };
class CryptoCore { ... public: enum DeviceType { UNKNOWN, RUTOKEN_ECP, RUTOKEN_WEB, RUTOKEN_PINPAD_IN, KAZTOKEN, RUTOKEN_PINPAD_2 }; ... }
std::auto_ptr<CryptoCore> cp(new CryptoCore(pkcs11path)); std::vector<unsigned long> devices = cp->enumerateDevices(); std::cout <<"Found " << devices.size() << " devices" << std::endl; for (std::vector<unsigned long>::const_iterator it = devices.begin(); it != devices.end(); it++) { unsigned int id = *it; DeviceInfo info = cp->getDeviceInfo(id); std::cout << "Device ID: " << id << std::endl; std::cout << "\tLabel: " << info.label << std::endl; std::cout << "\tSerial: " << info.serial << std::endl; std::cout << "\tModel: " << info.model << std::endl; std::cout << "\tType: "; switch (info.type) { case 0: std::cout << "Unknown"; break; case 1: std::cout << "Rutoken ECP"; break; case 2: std::cout << "Rutoken WEB"; break; case 3: std::cout << "Rutoken PINPAD IN"; break; case 4: std::cout << "KAZTOKEN"; break; case 5: std::cout << "Rutoken PINPAD2"; break; } std::cout << std::endl; }
void login(unsigned long deviceId, const std::string& pin);
void logout(unsigned long deviceId);
DeviceInfo getDeviceInfo(unsigned long deviceId);
std::vector<std::string> enumerateKeys( unsigned long deviceId, const std::string& marker);
cp->login(id, "12345678"); std::vector<std::string> keys = cp->enumerateKeys(id, "Test marker"); if (keys.empty()) { std::cerr << "No keys were found on token" << std::endl; } else { std::cerr << "Found " << keys.size() << " key(s) on token" << std::endl; for (size_t i = 0; i < keys.size(); i++) { std::string kId = keys[i]; std::cerr << "Key with id: " << kId << " on token with label: " << cp->getKeyLabel(id, kId) << std::endl; } }
std::string generateKeyPair( unsigned long deviceId, const std::string& params, const std::string& marker, const std::map<std::string, bool>& options);
cp->login(id, "12345678"); std::map<std::string, bool> keyOptions; keyOptions["needPin"] = false; std::string keyId = cp->generateKeyPair(id, "A", "Test marker", keyOptions); std::string keyLabel; std::cerr << "Please, enter new key label: "; std::cin >> keyLabel;cp->setKeyLabel(id, keyId, keyLabel);
void deleteKeyPair(unsigned long deviceId, const std::string& keyId);
std::string importCertificate(unsigned long deviceId, const std::string& certificate, unsigned long category);
std::vector<std::string> enumerateCertificates( unsigned long deviceId, unsigned long category);
std::vector<std::string> certs = cp->enumerateCertificates(id, PKCS11_CERT_CATEGORY_USER); // get certificates info by ID if (certs.size() > 0) { std::cout << "Certificates with USER category(" << certs.size() << "): " << std::endl; for (size_t i = 0; i < certs.size(); i++) { printCertInfo(cp.get(), id, certs.at(i)); } }
CertFields parseCertificate( unsigned long deviceId, const std::string& certId);
typedef std::vector<std::map<std::string, std::string> > DnList; typedef std::map<std::string, std::vector<std::string> > ExtensionsMap; struct CertFields { DnList issuer; DnList subject; std::string serialNumber; std::string validNotBefore; std::string validNotAfter; ExtensionsMap extensions; std::string certificateText; }; void printCertInfo(CryptoCore* cp, unsigned int tokenId, std::string certId) { CertFields info = cp->parseCertificate(tokenId, certId); DnList& dn = info.issuer; std::cout << "Certificate ID: " << certId << std::endl << "\tIssuer: "; for (DnList::iterator it = dn.begin(); it != dn.end(); it++) { std::map<std::string, std::string>& rdn = *it; if (it != dn.begin()) std::cout << ", ";std::cout << rdn[ "rdn"] << "=" << rdn["value"]; } std::cout << std::endl;dn = info.subject;std::cout << "\tSubject: "; for (DnList::iterator it = dn.begin(); it != dn.end(); it++) { std::map<std::string, std::string>& rdn = *it; if (it != dn.begin()) std::cout << ", ";std::cout << rdn[ "rdn"] << "=" << rdn["value"]; } std::cout << std::endl; std::cout << "\tSerialNumber: " << info.serialNumber << std::endl; std::cout << "\tValid Not Before: " << info.validNotBefore << std::endl; std::cout << "\tValid Not After: " << info.validNotAfter << std::endl; }
std::string getCertificate(unsigned long deviceId, const std::string& certId);
-----BEGIN CERTIFICATE----- MIIBmjCCAUegAwIBAgIBATAKBgYqhQMCAgMFADBUMQswCQYDVQQGEwJSVTEPMA0G A1UEBxMGTW9zY293MSIwIAYDVQQKFBlPT08gIkdhcmFudC1QYXJrLVRlbGVjb20i MRAwDgYDVQQDEwdUZXN0IENBMB4XDTE0MTIyMjE2NTEyNVoXDTE1MTIyMjE2NTEy NVowEDEOMAwGA1UEAxMFZmZmZmYwYzAcBgYqhQMCAhMwEgYHKoUDAgIjAQYHKoUD AgIeAQNDAARADKA/O1Zw50PzMpcNkWnW39mAJcTehAhkQ2Vg7bHkIwIdf7zPe2Px HyAr6lH+stqdACK6sFYmkZ58cBjzL0WBwaNEMEIwJQYDVR0lBB4wHAYIKwYBBQUH AwIGCCsGAQUFBwMEBgYpAQEBAQIwCwYDVR0PBAQDAgKkMAwGA1UdEwEB/wQCMAAw CgYGKoUDAgIDBQADQQD5TY55KbwADGKJRK+bwCGZw24sdIyayIX5dn9hrKkNrZsW detWY3KJFylSulykS/dfJ871IT+8dXPU5A7WqG4+ -----END CERTIFICATE-----
void deleteCertificate(unsigned long deviceId, const std::string& certId);
std::string pkcs11path = "./"; cp = new CryptoCore(pkcs11path); std::vector<unsigned long> devices = cp->enumerateDevices(); std::cerr << "Found " << devices.size() << " devices" << std::endl; if (devices.empty()) { std::cerr << "Can't find any device" << std::endl; return 1; } unsigned long id = devices.front(); DeviceInfo info = cp->getDeviceInfo(id); std::cerr << "Device ID: " << id << std::endl; std::cerr << "\tLabel: " << info.label << std::endl; std::cerr << "\tSerial: " << info.serial << std::endl; std::cerr << std::endl; cp->login(id, "12345678"); std::vector<std::string> keys = cp->enumerateKeys(id, "Test marker"); if (keys.empty()) { std::cerr << "No keys were found on token" << std::endl; } else { std::cerr << "Found " << keys.size() << " key(s) on token" << std::endl; for (size_t i = 0; i < keys.size(); i++) { std::string kId = keys[i]; std::cerr << "Key with id: " << kId << " on token with label: " << cp->getKeyLabel(id, kId) << std::endl; } } std::map<std::string, bool> keyOptions; keyOptions["needPin"] = false; std::string keyId; // key generation keyId = cp->generateKeyPair(id, "A", "Test marker", keyOptions); std::string keyLabel; std::cerr << "Please, enter new key label: "; std::cin >> keyLabel; cp->setKeyLabel(id, keyId, keyLabel); std::cerr << "Creating PKCS#10 request on key with ID: " << keyId << std::endl; std::string str; std::vector<std::map<std::string, std::string> > subject; typedef std::map<std::string, std::string> RdnType; RdnType rdn; // country name for (;; ) { std::cerr << "Please, enter new request country name (2 symbol): "; std::cin >> str; if (str.length() != 2) { std::cerr << "try again" << std::endl; continue; } else { rdn["rdn"] = "countryName"; rdn["value"] = str; subject.push_back(rdn); break; } } // commonName std::cerr << "Please, enter new request commonName: "; std::cin >> str; rdn.clear(); rdn["rdn"] = "commonName"; rdn["value"] = str; subject.push_back(rdn); // stateOrProvince std::cerr << "Please, enter new request stateOrProvinceName: "; std::cin >> str; rdn.clear(); rdn["rdn"] = "stateOrProvinceName"; rdn["value"] = str; subject.push_back(rdn); // locality std::cerr << "Please, enter new request localityName: "; std::cin >> str; rdn.clear(); rdn["rdn"] = "localityName"; rdn["value"] = str; subject.push_back(rdn); // organization std::cerr << "Please, enter new request organizationName: "; std::cin >> str; rdn.clear(); rdn["rdn"] = "organizationName"; rdn["value"] = str; subject.push_back(rdn); std::cerr << "Please, enter new request organizationalUnitName: "; std::cin >> str; rdn.clear(); // organizationalUnit rdn["rdn"] = "organizationalUnitName"; rdn["value"] = str; subject.push_back(rdn); std::map<std::string, std::vector<std::string> > extensions; std::cout << "PKCS10 request: "<< std::endl<< cp->createPkcs10(id, keyId, subject, extensions, true); cp->logout(id);
std::string pkcs11path = "./"; std::auto_ptr<CryptoCore> cp(new CryptoCore(pkcs11path)); std::vector<unsigned long> devices = cp->enumerateDevices(); if (devices.empty()) { std::cout << "Can't find any device" << std::endl; return 1; } std::cout << "Found " << devices.size() << " devices" << std::endl; unsigned long id = devices.front(); DeviceInfo info = cp->getDeviceInfo(id); std::cout << "Device ID: " << id << std::endl; std::cout << "\tLabel: " << info.label << std::endl; std::cout << "\tSerial: " << info.serial << std::endl; std::cout << "\tModel: " << info.model << std::endl; cp->login(id, "12345678"); std::ifstream certFile(file, std::ios::in | std::ios::binary); std::string certBody((std::istreambuf_iterator<char>(certFile)), std::istreambuf_iterator<char>()); CertFields certInfo = cp->parseCertificateFromString(certBody); DnList& dn = certInfo.subject; std::cout << "Importing certificate: " << std::endl << "\tSubject: "; for (DnList::iterator it = dn.begin(); it != dn.end(); it++) { std::map<std::string, std::string>& rdn = *it; if (it != dn.begin()) std::cout << ", "; std::cout << rdn["rdn"] << "=" << rdn["value"]; } std::cout << std::endl; std::string certId = cp->importCertificate(id, certBody, PKCS11_CERT_CATEGORY_USER)); std::cout << "Certificate imported with ID: " << certId << std::endl;
std::string pkcs11path = "./"; cp = new CryptoCore(pkcs11path); std::vector<unsigned long> devices = cp->enumerateDevices(); std::cerr << "Found " << devices.size() << " devices" << std::endl; if (devices.empty()) { std::cerr << "Can't find any device" << std::endl; return 1; } unsigned long id = devices.front(); DeviceInfo info = cp->getDeviceInfo(id); std::cerr << "Device ID: " << id << std::endl; std::cerr << "\tLabel: " << info.label << std::endl; std::cerr << "\tSerial: " << info.serial << std::endl; std::cerr << std::endl; std::vector<std::string> certs = cp->enumerateCertificates(id, PKCS11_CERT_CATEGORY_USER); // get certificates info by ID if (certs.size() > 0) { std::cout << "Certificates with USER category(" << certs.size() << "): " << std::endl; for (size_t i = 0; i < certs.size(); i++) { printCertInfo(cp.get(), id, certs.at(i)); } } cp->login(id, "12345678"); // serverSalt - random string from server std::string authSignature = cp->authenticate(id, certs.front(), serverSalt);
std::string authenticate(unsigned long deviceId, const std::string& certId, const std::string& salt);
std::string sign(unsigned long deviceId, const std::string& certId, const std::string& data, const std::map<std::string, bool>& options);
std::string rawSign(unsigned long deviceId, const std::string& keyId, const std::string& data, const std::map<std::string, bool>& options);
std::string getPublicKeyValue(unsigned long deviceId, const std::string& keyId, const std::map<std::string, bool>& options);
std::auto_ptr<CryptoCore> cp( new CryptoCore(pkcs11path)); std::vector< unsigned long> devices = cp->enumerateDevices(); std::cerr << "Found " << devices.size() << " devices" << std::endl; unsigned long id = devices.front(); DeviceInfo info = cp->getDeviceInfo(id); std::cerr << "Device ID: " << id << std::endl; std::cerr << "\tLabel: " << info.label << std::endl; std::cerr << "\tSerial: " << info.serial << std::endl; std::cerr << "\tModel: " << info.model << std::endl; std::vector<std::string> certs = cp->enumerateCertificates(id, PKCS11_CERT_CATEGORY_USER); if(certs.size() > 0) { cp->login(id, "12345678"); std::map<std::string, bool> options; options[ "addUserCertificate"] = true; options[ "addSignTime"] = true; options[ "useHardwareHash"] = false; std::string cms = cp->sign(id, certs.front(), data, options); std::cout << "-----BEGIN CMS-----" << std::endl; std::cout << cms; std::cout << "-----END CMS-----" << std::endl; }
bool verify(unsigned long deviceId, const std::string& cms, const std::string& data, const std::vector<std::string> userCerts, const std::vector<std::string> ca, const std::vector<std::string> crl, const std::map<std::string, bool>& options)
std::string cmsEncrypt(unsigned long deviceId, const std::string& certId, const std::string& recipientCert, const std::string& data, const std::map<std::string, bool>& options);
std::string cmsDecrypt(unsigned long deviceId, const std::string& keyId, const std::string& cmsData, const std::map<std::string, bool>& options);
Source: https://habr.com/ru/post/249723/
All Articles