2017-12-07 2 views
0

Bisher habe ich gesehen zwei verschiedene Ansätze zur RSA Unterzeichnung mit OpenSSL:
Mit EVP_PKEY_signUnterschied zwischen EVP_PKEY_sign und EVP_DigestSignInit?

ctx = EVP_PKEY_CTX_new(signing_key, NULL /* no engine */); 
if (!ctx) 
    /* Error occurred */ 
if (EVP_PKEY_sign_init(ctx) <= 0) 
    /* Error */ 
if (EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_PADDING) <= 0) 
    /* Error */ 
if (EVP_PKEY_CTX_set_signature_md(ctx, EVP_sha256()) <= 0) 
    /* Error */ 

/* Determine buffer length */ 
if (EVP_PKEY_sign(ctx, NULL, &siglen, md, mdlen) <= 0) 

Mit EVP_DigestSignInit:

if(1 != EVP_DigestSignInit(mdctx, NULL, EVP_sha256(), NULL, key)) 
      goto err; 
if(1 != EVP_DigestSignUpdate(mdctx, msg, strlen(msg))) 
      goto err; 
if(1 != EVP_DigestSignFinal(mdctx, NULL, slen)) 
      goto err; 
if(!(*sig = OPENSSL_malloc(sizeof(unsigned char) * (*slen)))) 
      goto err; 
if(1 != EVP_DigestSignFinal(mdctx, *sig, slen)) 
      goto err; 

Sind diese nur zwei verschiedene Arten zu tun das gleiche?

Antwort

2

Oh. Es gibt einen ziemlich großen Unterschied.

EVP_PKEY_sign() hasht die zu signierenden Daten nicht und wird daher normalerweise zum Signieren von Digests verwendet. siehe für beliebige Nachrichten Unterzeichnung des EVP_DigestSignInit (3)

Per https://wiki.openssl.org/index.php/Manual:EVP_PKEY_sign(3)

So EVP_PKEY_sign ist sehr wahrscheinlich, dass unter der Haube verwendet in EVP_Digest SignInit und ist für Anwendungen gedacht, bei denen der Anrufer manuell den Block formatiert wird unterschrieben sein.

+0

auch trotz vorheriger EVP_PKEY_CTX_set_signature_md Aufruf? – olegst

+1

Ich kann im Moment nicht testen, aber Sie könnten versuchen, EVP_PKEY_sign zu viele Daten (zB 4000 Bytes) zu übergeben und sehen, ob es es verarbeiten wird ... und wenn ja, entschlüsselt RSA das Ergebnis als RAW und überprüft die Struktur um sicherzustellen, dass Teile nicht ignoriert wurden. – lockcmpxchg8b