2016-05-19 8 views
0

Ich habe einige signierte Daten (getrennt in Signdata und seine Signatur [Base64 codiert]), die durch einen bereitgestellten öffentlichen Schlüssel für eine Übereinstimmung überprüft werden sollte. Die Daten werden von externen Funktionen bereitgestellt, die die Daten in einer Struktur wie der folgenden speichern.Überprüfen der Datensignatur mit öffentlichen Schlüssel mit openssl

typedef struct { 
    char * signature; 
    char * signedData; // base64 encoded --> decoding required 
} data; 

Ich bin in der Notwendigkeit es der Umwandlung in die OpenSSL Funktionen passen und davon ausgehen, gibt es einen Fehler (n) irgendwo. Es kompiliert, stürzt aber ab (SIGSEGV). Es ist eine Android-Bibliothek und ich benutze das NDK. Irgendwelche Ideen/Hinweise? Wahrscheinlich eine Art Umstellungsproblem?

// base64 Funktion Quelle: How do I base64 encode (decode) in C?

// Signatur überprüfen basierend auf http://fm4dd.com/openssl/manual-crypto/EVP_PKEY_verify.htm

size_t sdlen, siglen; 

    char *tmp = malloc(1000); 
    char *signature = malloc(1000); 
    char *signData = malloc(1000); 

    sprintf(tmp, "%s", data.signature); 
    signature = base64decode(&tmp, strlen(tmp)); 
    siglen = strlen(signature); 

    sprintf(signData, "%s", data.signedData); 
    sdlen = strlen(signData); 


    EVP_PKEY_CTX *ctx = malloc(1000); 
    unsigned char *md, *sig; 

    char publickeybase64[] = "MIIBIjANBgkqhk....."; 
    char *publickey = base64decode(&publickeybase64, strlen(publickeybase64)); 

    EVP_PKEY *verify_key = malloc(1000); 
    sprintf((char *) verify_key, "%s", publickey); 

    ctx = EVP_PKEY_CTX_new(verify_key, 0); 

    if (!ctx) { 
     printf("E1\n"); 
    } 
    if (EVP_PKEY_verify_init(ctx) <= 0) { 
     printf("E2\n"); 
    } 
    if (EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_PADDING) <= 0) { 
     printf("E3\n"); 
    } 
    if (EVP_PKEY_CTX_set_signature_md(ctx, EVP_sha256() <= 0)) { 
     printf("E4\n"); 
    } 

    int ret = EVP_PKEY_verify(ctx, signature, siglen, signData, sdlen); 

    printf("RESULTVERIFY %d \n", ret); 

    /* ret == 1 indicates success, 0 verify failure and < 0 for some 
    * other error. 
    */ 
+0

Sie müssen den Rückgabewert von 'malloc()' überprüfen. Warum passierst du auch '& publickeybase64'? BTW: 'base64' ist ziemlich einfach und es sollte 20 Minuten dauern, um eine Funktion zu schreiben. –

+0

'base64decode (& tmp, strlen (tmp))' ist falsch, da tmp bereits ein 'char *' ist. Sie möchten "tmp" als erstes Argument anstelle von "& tmp" übergeben. Dies ist die Adresse Ihres Array-Pointers, wenn Sie also innerhalb von 'base64decode' als 'data [i ++] 'dereferenzieren, erhalten Sie einen SIGSEGV. – russianfool

+0

Darüber hinaus akzeptiert 'strlen' eine mit Null beendete Zeichenkette; Da die Referenz "base64_decode" -Implementierung sie nicht beendet, könnte/würde dies zu einem anderen SIGSEGV führen. Es ist auch schlechte Form, 'strlen' aufzurufen, wenn Sie gerade eine Operation ausgeführt haben, um den Puffer zu füllen ... Sie wissen genau, wie viel Sie es gefüllt haben. Warum "sprintf" in den "tmp" -Puffer? 'base64decode' kann ohne Änderung des Anfangspuffers implementiert werden. Vergessen Sie nicht, all diese "malloc" -Puffer zu löschen. – russianfool

Antwort

0

Ich weiß nicht, was genau in „publickeybase64“ codiert wird, sondern den gesamten Prozess öffentlichen Schlüssel der Schaffung scheint mir ein bisschen komisch.

Erstens würde ich

EVP_PKEY *verify_key = malloc(1000); 

durch so etwas wie

EVP_PKEY *verify_key = malloc(sizeof(EVP_PKEY)); 

oder ersetzen, wenn Sie die neueste Version von OpenSSL verwenden,

EVP_PKEY *verify_key = EVP_PKEY_new(); 

Dann brauchen Sie ein setzen RSA-Schlüssel zum verify_key. Siehe https://www.openssl.org/docs/manmaster/crypto/EVP_PKEY_set1_RSA.html

Daher denke ich, dass Sie zuerst den RSA-Schlüssel (https://www.openssl.org/docs/manmaster/crypto/RSA_new.html) erstellen und seinen Modul und öffentlichen Exponenten festlegen müssen (siehe https://www.openssl.org/docs/manmaster/crypto/RSA_set0_key.html).

Verwandte Themen