Advertisement
Guest User

Untitled

a guest
Jun 8th, 2014
715
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.73 KB | None | 0 0
  1. // g++ -Wall -Wextra -Wconversion -g3 -std=c++11 openssl-test.cpp -o openssl-test.exe -lssl -lcrypto
  2.  
  3. #include <iostream>
  4. using std::cout;
  5. using std::cerr;
  6. using std::endl;
  7.  
  8. #include <string>
  9. using std::string;
  10.  
  11. #include <memory>
  12. using std::unique_ptr;
  13.  
  14. #include <openssl/bn.h>
  15. #include <openssl/rsa.h>
  16. #include <openssl/evp.h>
  17. #include <openssl/err.h>
  18.  
  19. const char nz[] =
  20.     "20446702916744654562596343388758805860065209639960173505037453331270270518732245"
  21.     "08977372301204320323609709562340204469011575537734525469644875960570778896584888"
  22.     "95017468362112062706438336639499925362469853626937363871851454247879222415857219"
  23.     "92924045675229348655595626434390043002821512765630397723028023792577935108185822"
  24.     "75369257422156693093780503115582009714681996492027000881132703628678639279359312"
  25.     "17624250488602118597634417704467037220158572506211078553986931332640811506974231"
  26.     "88751482418465308470313958250757758547155699749157985955379381294962058862159085"
  27.     "915015369381046959790476428631998204940879604226680285601";
  28.  
  29. const char ez[] = "65537";
  30.  
  31. const char dz[] =
  32.     "23583109899396195101799862623499368829246520235662137651186064319555667005065389"
  33.     "11356936879137503597382515919515633242482643314423192704128296593672966061810149"
  34.     "31632061789402182278402640746140338406535182197235078430096761014345948432406842"
  35.     "76746396884059179774424728049430754391920261073195321175575450790865379829879825"
  36.     "22396626690057355718157403493216553255260857777965627529169195827622139772389760"
  37.     "13057175483467867984218114225248961766503010944557397801270779301059273764049922"
  38.     "00150833924259148778478404572782464027609558833769999511998277062853834711506435"
  39.     "61410605789710883438795588594095047409018233862167884701";
  40.  
  41. const char pz[] =
  42.     "15737705590244743839558616502896029191493197327877753279847020015603526753735923"
  43.     "90718294084119093232085749598005372477289597182368848096852332845373492076546615"
  44.     "30801859889389455120932077199406250387226339056140578989122526711937239401762061"
  45.     "949364440402067108084155200696015505170135950332209194782224750221639";
  46.  
  47. const char qz[] =
  48.     "12992175256740635899099334754006444501823007340248226099417932857332386190837921"
  49.     "12746269565434716649972371852989646481333243433270528522640603220881224011247812"
  50.     "49085873464824282666514908127141915943024862618996371026577302203267804867959037"
  51.     "802770797169483022132210859867700312376409633383772189122488119155159";
  52.  
  53. const char dmodp1z[] =
  54.     "49227606481837320706006017716613302169096929249354401671859241393391870004972220"
  55.     "28735680413269055839870281941362914961691371628021024152077883230870590287807744"
  56.     "29930898230386473286709428656763070164661176228829801375865815889453805901417866"
  57.     "2376933683632720014228880806671525788467258162275185762295508460173";
  58.  
  59. const char dmodq1z[] =
  60.     "95501022448116849078110281587424883261489167280943290677534750975651978631525094"
  61.     "58693377793498640446735285662438504904366643141183520919433056069507619439072908"
  62.     "27084374978171871336296929080814602230691019089602999501706662853078906832637851"
  63.     "45958472051553704139602453015343925544671829327400421727981791235189";
  64.  
  65. const char invqmodpz[] =
  66.     "23545019917990284444784037831882732213707743418529123971725460465297450415859883"
  67.     "70728413617913564636615863358005459444719505281341294577593327462082221309955672"
  68.     "00897700599820911444355459765155081084657241882422419679677095553363318743253968"
  69.     "76783846248039429242763646988988076187339075374375350105207330456437";
  70.  
  71. using BN_ptr = std::unique_ptr<BIGNUM, decltype(&::BN_free)>;
  72. using RSA_ptr = std::unique_ptr<RSA, decltype(&::RSA_free)>;
  73. using EVP_PKEY_ptr = std::unique_ptr<EVP_PKEY, decltype(&::EVP_PKEY_free)>;
  74. using EVP_MD_CTX_ptr = std::unique_ptr<EVP_MD_CTX, decltype(&::EVP_MD_CTX_destroy)>;
  75.  
  76. #define UNUSED(x) ((void)x)
  77.  
  78. int main(int argc, char* argv[])
  79. {
  80.     UNUSED(argc); UNUSED(argv);
  81.  
  82.     int rc;
  83.     long err;
  84.  
  85.     RSA_ptr rsa(RSA_new(), ::RSA_free);
  86.     BIGNUM *n = NULL, *e = NULL, *d = NULL, *p = NULL, *q = NULL, *dmodp1 = NULL, *dmodq1 = NULL, *invqmodp = NULL;
  87.  
  88.     rc = BN_dec2bn(&n, nz);
  89.     if(rc == 0 || n == NULL) {
  90.         cerr << "BN_dec2bn failed for n" << endl;
  91.         exit(1);
  92.     }
  93.     rsa->n = n; n = NULL;
  94.  
  95.     rc = BN_dec2bn(&e, ez);
  96.     if(rc == 0 || e == NULL) {
  97.         cerr << "BN_dec2bn failed for e" << endl;
  98.         exit(1);
  99.     }
  100.     rsa->e = e; e = NULL;
  101.  
  102.     rc = BN_dec2bn(&d, dz);
  103.     if(rc == 0 || d == NULL) {
  104.         cerr << "BN_dec2bn failed for d" << endl;
  105.         exit(1);
  106.     }
  107.     rsa->d = d; d = NULL;
  108.  
  109.     rc = BN_dec2bn(&p, pz);
  110.     if(rc == 0 || p == NULL) {
  111.         cerr << "BN_dec2bn failed for p" << endl;
  112.         exit(1);
  113.     }
  114.     rsa->p = p; p = NULL;
  115.  
  116.     rc = BN_dec2bn(&q, qz);
  117.     if(rc == 0 || q == NULL) {
  118.         cerr << "BN_dec2bn failed for q" << endl;
  119.         exit(1);
  120.     }
  121.     rsa->q = q; q = NULL;
  122.  
  123.     rc = BN_dec2bn(&dmodp1, dmodp1z);
  124.     if(rc == 0 || dmodp1 == NULL) {
  125.         cerr << "BN_dec2bn failed for dmodp1" << endl;
  126.         exit(1);
  127.     }
  128.     rsa->dmp1 = dmodp1; dmodp1 = NULL;
  129.  
  130.     rc = BN_dec2bn(&dmodq1, dmodq1z);
  131.     if(rc == 0 || dmodq1 == NULL) {
  132.         cerr << "BN_dec2bn failed for dmodq1" << endl;
  133.         exit(1);
  134.     }
  135.     rsa->dmq1 = dmodq1; dmodq1 = NULL;
  136.  
  137.     rc = BN_dec2bn(&invqmodp, invqmodpz);
  138.     if(rc == 0 || invqmodp == NULL) {
  139.         cerr << "BN_dec2bn failed for invpmodq" << endl;
  140.         exit(1);
  141.     }
  142.     rsa->iqmp = invqmodp; invqmodp = NULL;
  143.  
  144.     rc = RSA_check_key(rsa.get());
  145.     err = ERR_get_error();
  146.     if(rc != 1) {
  147.         cerr << "RSA_check_key failed, error 0x" << std::hex << err << endl;
  148.         exit(1);
  149.     }
  150.  
  151.     EVP_PKEY_ptr pkey(EVP_PKEY_new(), ::EVP_PKEY_free);
  152.    
  153.     rc = EVP_PKEY_set1_RSA(pkey.get(), rsa.get());
  154.     err = ERR_get_error();
  155.     if(rc != 1) {
  156.         cerr << "EVP_PKEY_set1_RSA failed, error 0x" << std::hex << err << endl;
  157.         exit(1);
  158.     }
  159.  
  160.     EVP_MD_CTX_ptr ctx(EVP_MD_CTX_create(), ::EVP_MD_CTX_destroy);
  161.     EVP_MD_CTX_init(ctx.get());
  162.  
  163.     const EVP_MD* md = EVP_sha256();
  164.     rc = EVP_SignInit(ctx.get(), md);
  165.     err = ERR_get_error();
  166.     if(rc != 1) {
  167.         cerr << "EVP_SignInit_ex failed, error 0x" << std::hex << err << endl;
  168.         exit(1);
  169.     }
  170.  
  171.     const char message[] = "Now is the time for all good men...";
  172.     rc = EVP_SignUpdate(ctx.get(), message, (unsigned int)sizeof(message));
  173.     err = ERR_get_error();
  174.     if(rc != 1) {
  175.         cerr << "EVP_SignUpdate failed, error 0x" << std::hex << err << endl;
  176.         exit(1);
  177.     }
  178.  
  179.     const unsigned int req = std::max(EVP_MD_size(md), EVP_PKEY_size(pkey.get()));
  180.     unique_ptr<unsigned char[]> signature(new unsigned char[req]);
  181.     unsigned int size = req;
  182.  
  183.     rc = EVP_SignFinal(ctx.get(), signature.get(), &size, pkey.get());
  184.     err = ERR_get_error();
  185.     if(rc != 1) {
  186.         cerr << "EVP_SignFinal failed, error 0x" << std::hex << err << endl;
  187.         exit(1);
  188.     }
  189.  
  190.     size = std::min(size, (unsigned int)EVP_MD_size(md));
  191.     cout << "Signature: ";
  192.  
  193.     for(unsigned i = 0; i < size; i++)
  194.         cout << std::hex << (signature[i] & 0xFF);
  195.     cout << endl;
  196.  
  197.     return 0;
  198. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement