2017-02-26 3 views
1

Ich bin eigentlich Programmierung und Ende zu Ende verschlüsselt Kalender. Dazu benutze ich cryptlib. Ich habe mehr oder weniger den Code von manual kopiert. Aber immer, wenn ich versuche, eine Wurzel ca. Es schlägt mit Fehlercode -2 bei cryptSignCert() fehl. (Was bedeutet, dass gemäß dem Handbuch ein Problem mit dem zweiten Parameter vorliegt)
Hier ist ein kleiner Code, um das Problem zu reproduzieren.
cryptlib cryptSignCert schlägt fehl

#include <iostream> 
#include <cstring> 

#include "cryptlib.h" 

/*Generating a root ca*/ 
auto genRootCA(const char* commonName,const char* keyLabel,const char* country) -> int 
{ 
    int status; 
    CRYPT_CONTEXT cryptContext; 

    cryptCreateContext(&cryptContext, CRYPT_UNUSED, CRYPT_ALGO_RSA); 
    cryptSetAttributeString(cryptContext, CRYPT_CTXINFO_LABEL, keyLabel, strlen(keyLabel)); 
    cryptGenerateKey(cryptContext); 

    CRYPT_CERTIFICATE cryptCertificate; 
    cryptCreateCert(&cryptCertificate,CRYPT_UNUSED,CRYPT_CERTTYPE_CERTIFICATE); 
    cryptSetAttributeString(cryptCertificate,CRYPT_CERTINFO_COUNTRYNAME,country,strlen(country)); 
    cryptSetAttributeString(cryptCertificate,CRYPT_CERTINFO_COMMONNAME,commonName,strlen(commonName)); 

    //Set to self-signed 
    cryptSetAttribute(cryptCertificate,CRYPT_CERTINFO_SELFSIGNED,1); 
    cryptSetAttribute(cryptCertificate,CRYPT_CERTINFO_CA,1); 

    //Sign certificate 
    status = cryptSignCert(cryptCertificate,cryptContext); //This is, what is actually not working 
    if(cryptStatusError(status)) 
    { 
     cryptDestroyContext(cryptContext); 
     cryptDestroyCert(cryptCertificate); 
     return(status); 
    } 

    //Save data to disk....(cut out) 
} 

int main() 
{ 
    cryptInit(); 
    cryptAddRandom(NULL,CRYPT_RANDOM_FASTPOLL); 
    std::cout << "Generating root ca.\n"; 
    int r = genRootCA("[email protected]","Private key","DE"); 
    std::cout << "Returned value " << r << std::endl; 
    cryptEnd(); 
} 

Vielen Dank im Voraus, David.

+0

* "Ich habe mehr oder weniger den Code aus dem Handbuch kopiert" * Was bedeutet das nun? Sollen wir Ihren Code und das Handbuch durchgehen, um Unterschiede zu erkennen? Bitte [bearbeiten] Sie Ihre Frage, um eine [mcve] zur Verfügung zu stellen. –

+0

Versuchen Sie bitte auch, einen besseren Titel zu finden. * "nicht funktioniert" * ist über die am wenigsten nützliche Problembeschreibung möglich. –

+0

Es tut mir leid, aber ich verstehe Ihren Standpunkt nicht. Ich habe noch nie cryptlib benutzt und daher keine Ahnung, wie es richtig funktionieren würde. Und wenn Sie sich das Handbuch ansehen, werden Sie feststellen, dass es keinen Code gibt, der kopiert und eingefügt werden kann. –

Antwort

1

Ich habe endlich eine Lösung für das Problem gefunden. Ich habe vergessen, den öffentlichen Schlüssel zum Zertifikat hinzuzufügen. Hier ist ein funktionierendes Beispiel Code:

Ich hoffe, das hilft anderen, die das gleiche Problem haben.