2017-06-14 2 views
0

Ich versuche Funktion zu implementieren OpenSSL, zu unterschreiben Dateien mit und ich brauchePolsterung und Salz zu aktivieren. Meine Signaturfunktion ist wie folgt:aktivieren Polsterung und Salz

unsigned char * sign(EVP_PKEY * pkey, const EVP_MD * htype, char * data, int data_len, int * sig_len) 
{ 
    EVP_MD_CTX  md_ctx; 
    unsigned char *sig = malloc(EVP_PKEY_size(pkey)); 


    *sig_len = EVP_PKEY_size(pkey); 

    EVP_SignInit (&md_ctx, htype); 
    EVP_SignUpdate (&md_ctx, data, data_len); 

    if (EVP_SignFinal (&md_ctx, sig, sig_len, pkey) != 1) 
    { 
     free(sig); 
     sig = 0; 
     *sig_len = 0; 

     ERR_print_errors_fp(stderr); 
    } 

    return sig; 
} 

Gibt es ein Beispiel für das Hinzufügen von Füllmaterial und Salz? Hat jemand eine Idee, die zur Lösung dieses Problems beitragen kann?

+0

Siehe auch [EVP Signing and Verifying] (https://wiki.openssl.org/index.php/EVP_Signing_and_Verifying) im OpenSSL-Wiki. – jww

+0

Eine Signatur erfordert kein Salz als Eingabe. PSS ist nicht deterministisch, also erfordert es zufällige Werte zu betreiben, ist das was du meinst? Padding wird vor der modularen Potenzierung für RSA ausgeführt, es ist nicht etwas, das Sie kodieren müssen. Sowohl die Randomisierung als auch das Padding werden * intern * vom Signaturalgorithmus durchgeführt. Für mich ist völlig unklar, was Sie erreichen wollen, aber vielleicht liegt das an [dem XY-Problem] (https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). –

+0

Hallo Maarten, Danke für Ihre Antwort. Mir war [das XY-Problem] nicht bekannt (https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Mein Problem X ist, dass ich RSA-Signatur mit Padding und Salz implementieren möchte. Meine Lösung Y ist der Code, den ich gepostet habe, der nur RSA implementiert (ohne Padding und Salz). Wie Sie gesagt haben, "padding wird intern vom Signaturalgorithmus durchgeführt", also habe ich nach den Optionen gesucht, die übergeben werden, so dass der RSA mit dem Padding und dem Salz berechnet wird. Ich habe gerade die Lösung gefunden und werde sie veröffentlichen. – user2427860

Antwort

0

Ich habe gerade die Lösung in der OpenSSL-Forum:

unsigned char * signData(EVP_PKEY * pkey, const EVP_MD * htype, char * data, int data_len, int * sig_len, int padding, int salt) 
{ 
    unsigned int signature_l; 
    unsigned char signature[512]; 
    int res; 
    EVP_MD_CTX* verif_ctx = EVP_MD_CTX_create(); 
    EVP_MD_CTX* md_ctx = EVP_MD_CTX_create(); 
    EVP_PKEY_CTX* keygen_ctx = EVP_PKEY_CTX_new(pkey, NULL); 
    /* signing */ 
    if (EVP_DigestSignInit(md_ctx, &keygen_ctx, EVP_sha512(), NULL, pkey)<1) 
     return 0; 
    if (EVP_PKEY_CTX_set_rsa_padding(keygen_ctx, padding)<1) 
     return 0; 
    if (EVP_PKEY_CTX_set_rsa_pss_saltlen(keygen_ctx, salt)<1) 
     return 0; 
    signature_l = EVP_PKEY_size(pkey); 

    if (EVP_DigestSignUpdate(md_ctx, data, data_len)<1) return 0; 
    if (EVP_DigestSignFinal(md_ctx, signature, &signature_l)<1) return 0; 
    /* verifying */  
    if (EVP_DigestVerifyInit(verif_ctx, &keygen_ctx, EVP_sha512(), NULL, pkey)<1) 
     return 0; 
    if (EVP_PKEY_CTX_set_rsa_padding(verif_ctx->pctx, padding)<1) 
     return 0; 
    if (EVP_PKEY_CTX_set_rsa_pss_saltlen(verif_ctx->pctx, salt)<1) 
     return 0; 
    if (EVP_DigestVerifyUpdate(verif_ctx, data, data_len)<1) 
     return 0; 
    res = EVP_DigestVerifyFinal(verif_ctx, signature, signature_l); 
    switch(res) 
    { 
    case 1:printf("sig checks out!\n"); 
     break; 
    case 0:printf("nope nope nope.\n"); break; 
    default: return 0; 
    } 
    return signature; 
} 

Hoffnung dies jemand in der Zukunft helfen könnte!