2017-02-26 2 views
1

Je suis en train de programmer et de bout en bout le calendrier crypté. Pour cela j'utilise cryptlib. J'ai plus ou moins copié le code du manual. Mais toujours, quand j'essaye de générer une racine ca. Il échoue avec le code d'erreur -2 sur cryptSignCert(). (Ce qui signifie, selon le manuel, qu'il y a un problème avec le deuxième paramètre)
Voici un petit code pour reproduire le problème.
cryptlib cryptSignCert échoue

#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(); 
} 

Merci à l'avance, David.

+0

* "J'ai plus ou moins copié le code du manuel" * Qu'est-ce que cela signifie? Sommes-nous censés passer en revue votre code et le manuel pour repérer les différences? S'il vous plaît [modifier] votre question pour fournir un [mcve]. –

+0

Aussi, essayez de trouver un meilleur titre. * "ne fonctionne pas" * concerne la description de problème la moins utile possible. –

+0

Je suis désolé mais je ne vois pas ce que vous voulez dire. Je n'ai jamais utilisé cryptlib auparavant et donc aucune idée de comment cela fonctionnerait correctement. Et si vous regardez le manuel, vous remarquerez, qu'il n'y a pas de code qui, peut être copié et collé. –

Répondre

1

J'ai enfin trouvé une solution au problème. J'ai oublié d'ajouter la clé publique au certificat. Voici un exemple de code de travail:

#include <iostream> 
#include <cstring> 

#include "cryptlib.h" 

/* generating the root ca */ 
auto genRootCA(const char* commonName,const char* keyLabel, const char* country,const char* path, const char* password) -> 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); 

    /* Add the public key */ 
    status = cryptSetAttribute(cryptCertificate, 
    CRYPT_CERTINFO_SUBJECTPUBLICKEYINFO, cryptContext); 

    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); //Works now 
    if(cryptStatusError(status)) 
    { 
     cryptDestroyContext(cryptContext); 
     cryptDestroyCert(cryptCertificate); 
     return(status); 
    } 

    //Saving data to disk (cut out) 

    return CRYPT_OK; 
} 

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

J'espère que cela aide les autres qui ont le même problème.