2016-07-26 2 views
0

Ich habe einen Beispiel-Signatur-Generator in C, der eine Hash-Nachricht <count:mac-addr> erstellen und eine Signatur erstellen wird.RSA_sign und RSA_verify variiertes Verhalten

Wenn ich char *message = "120:08:00:27:7c:b6:18"; verwenden und signieren, wird die Signatur erfolgreich verifiziert.

Aber wenn ich

char * generate_hash() 
{ 
    xmlDoc   *document; 
    xmlNode  *root, *first_child, *node; 
    char   *filename; 
    char   *ap_count; 
    char   *ap_mac_address; 
    char   *message; 

    filename = "/license.xml"; 

    document = xmlReadFile(filename, NULL, 0); 
    root = xmlDocGetRootElement(document); 
    first_child = root->children; 
    for (node = first_child; node; node = node->next) { 
     if (strcmp((char*)node->name, "ap_count") == 0) { 
      ap_count = (char*)xmlNodeGetContent(node); 
     } 
     if (strcmp((char*)node->name, "ap_mac_address") == 0){ 
      ap_mac_address = (char*)xmlNodeGetContent(node); 
     } 
    } 
    message = (char *) malloc(strlen(ap_count)+ strlen(ap_mac_address) +1); 
    memset(message,0x0,(1 + strlen(ap_count)+ strlen(ap_mac_address))); 
    strcpy(message,ap_count); 
    strcat(message,":"); 
    strcat(message,ap_mac_address); 
    printf(" %d \n", (1 + strlen(ap_count)+ strlen(ap_mac_address))); 
    return message; 
} 

--- während Verifizieren

char* message; 
message = generate_hash(); 

ich den folgenden Funktionsaufruf bin mit der Unterschrift in beiden Fällen zu erzeugen.

if(RSA_sign(NID_sha256, (unsigned char*) message, strlen(message), 
signature, &slen, private_key) != 1) { 
    ERR_print_errors_fp(stdout); 
    return 1; 
} 

Die Signaturprüfung der Einzahler dieser Reihenfolge. Nicht sicher, was ich hier falsch mache.

Unten ist der Anruf, den ich verwende, um das gleiche zu überprüfen.

verified = RSA_verify(NID_sha256, (unsigned char*) message, 
     strlen(message), sign, file_len, public_key); 

Antwort

2
verified = RSA_verify(NID_sha256, (unsigned char*) message, 
     strlen(message), sign, file_len, public_key); 

Die Signatur könnte ein eingebettetes NULL haben. Behandeln Sie es nicht als String-Daten und verwenden Sie nicht strlen darauf.

Sie müssen einen Zeiger und eine explizite Länge verwalten.