Hi all,
I¹m try to figure out why my X509_REQ signature is always not verified. I¹m
using openssl-1.0.0 and gclib.dll provided by gemalto.

Here is my code:

    // Some declarations are omitted
    CK_BYTE data[2][1024];
    CK_ATTRIBUTE keyAttr[] = {
        {CKA_MODULUS, (void *)data[0], 1024},
        {CKA_PUBLIC_EXPONENT, (void *)data[1], 1024},
        };
    CK_MECHANISM Mechanism = { CKM_RSA_PKCS_KEY_PAIR_GEN, NULL_PTR, 0 };
    CK_MECHANISM sMechanism = { 0, NULL_PTR, 0 };
    CK_ATTRIBUTE GenPubTemplate[] = {
            {CKA_MODULUS_BITS, &mod_bits, sizeof(CK_ULONG)} ,
            {CKA_PUBLIC_EXPONENT, (char *)"\x01\x00\x01", 3} ,
            {CKA_TOKEN, &bTrue, sizeof(CK_BBOOL)} ,
            {CKA_ID, keyID, strlen(keyID)}
    };
    CK_ATTRIBUTE GenPrivTemplate[] = {
            {CKA_TOKEN, &bTrue, sizeof(CK_BBOOL)} ,
            {CKA_PRIVATE, &bTrue, sizeof(CK_BBOOL)} ,
            {CKA_SENSITIVE, &bTrue, sizeof(CK_BBOOL)} ,
            {CKA_ID, keyID, strlen(keyID)}
    };


    CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);

    // Create key pair
    if ((rv = C_GenerateKeyPair(hSession, &Mechanism, GenPubTemplate,
                4, GenPrivTemplate, 4, &hPublicKey, &hPrivateKey)) !=
CKR_OK) {
            return rv;
        }
    // Get modulus and public exponent
    if ((rv = C_GetAttributeValue(hSession, hPublicKey, keyAttr,
sizeof(keyAttr)/sizeof(CK_ATTRIBUTE))) != CKR_OK) {
        return rv;
    }

    // Setup RSA structure
    rsa = RSA_new();
    rsa->n = BN_bin2bn(data[0], keyAttr[0].ulValueLen, NULL); // MODULUS
    rsa->e = BN_bin2bn(data[1], keyAttr[1].ulValueLen, NULL); // PUBLIC
EXPONENT

    // Create X509 request for CSR
    req = X509_REQ_new();
    pkey = EVP_PKEY_new();

    EVP_PKEY_assign_RSA(pkey, rsa );

    X509_REQ_set_pubkey(req, pkey);

    // Setup subject
    name = X509_REQ_get_subject_name(req);

    X509_NAME_add_entry_by_txt(name, "C", MBSTRING_ASC, "IT", -1, -1, 0);
    X509_NAME_add_entry_by_txt(name, "O", MBSTRING_ASC, "Organization", -1,
-1, 0);
    X509_NAME_add_entry_by_txt(name, "OU", MBSTRING_ASC, "Organization
Unit", -1, -1, 0);
    X509_NAME_add_entry_by_txt(name, "CN", MBSTRING_ASC, "Common Name", -1,
-1, 0);

    // Prepare the digest
    digest=EVP_sha1();

    inl=i2d_X509_REQ_INFO(req->req_info,NULL);
    buf_in=(unsigned char *)MEMORY_ALLOC(inl);
    p = buf_in;
    i2d_X509_REQ_INFO(req->req_info,&buf_in);

    outl=EVP_PKEY_size(pkey);

    // Create message digest
    EVP_MD_CTX_init(&ctx);
    EVP_DigestInit(&ctx,digest);
    EVP_DigestUpdate(&ctx,p,inl)
    EVP_DigestFinal(&ctx,m,&m_len);

    // Sign the digest with the private key using pkcs11 functions
    sMechanism.mechanism = CKM_SHA1_RSA_PKCS;
    if ((rv = (C_SignInit(hSession, &sMechanism, hPrivateKey))) != CKR_OK) {
        return rv;
    }
    if ((rv = (C_Sign(hSession, m, m_len, buf_out, &outl))) != CKR_OK) {
        return rv;
    }

    MEMORY_FREE(p);

    // Setup request signature data
    req->sig_alg->algorithm= OBJ_nid2obj(digest->pkey_type);
    req->signature->data=buf_out;
    req->signature->length=outl;

    // Print formatted request to stdout
    X509_REQ_print_fp(stdout, req);

    // Print CSR in PEM format
    fp = fopen("c:\\cert.csr", "w");
    PEM_write_X509_REQ(fp, req);
    fclose(fp);


³Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: C=IT, O=Organization, OU=Organization Unit, CN=Common Name
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (512 bit)
                Modulus:
                    00:bc:f3:d2:65:6a:9d:5a:fe:c1:9e:5b:a3:ed:b2:
                    40:94:ae:db:b7:83:ce:eb:eb:3f:9c:27:75:9a:fe:
                    b9:5c:43:01:2c:36:22:d4:3a:d3:bb:79:f6:18:1c:
                    cb:3b:14:04:4e:ce:3b:99:6e:e8:cb:ad:04:55:ba:
                    d8:c4:b6:f8:d1
                Exponent: 65537 (0x10001)
        Attributes:
            a0:00
    Signature Algorithm: sha1WithRSAEncryption
        17:0a:b0:13:7e:b5:1a:d9:da:f6:76:91:b5:9d:40:91:01:7f:
        57:e4:7d:16:16:a5:da:b3:18:a7:9f:6e:cf:c9:88:70:ca:45:
        44:d7:4b:72:f2:21:ac:55:1c:5a:3d:97:24:63:69:92:4d:cd:
        33:03:2a:2f:a1:34:63:2f:82:ea²


But if i run openssl req ­verify ­text ­modulus ­in c:\cert-csr I receive:

verify failure
3020:error:04077068:rsa routines:RSA_verify:bad
signature:.\crypto\rsa\rsa_sign.c:255:
3020:error:0D0C5006:asn1 encoding routines:ASN1_item_verify:EVP
lib:.\crypto\asn1\a_verify.c:173:
Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: C=IT, O=Organization, OU=Organization Unit, CN=Common Name
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (512 bit)
                Modulus (512 bit):
                    00:bc:f3:d2:65:6a:9d:5a:fe:c1:9e:5b:a3:ed:b2:
                    40:94:ae:db:b7:83:ce:eb:eb:3f:9c:27:75:9a:fe:
                    b9:5c:43:01:2c:36:22:d4:3a:d3:bb:79:f6:18:1c:
                    cb:3b:14:04:4e:ce:3b:99:6e:e8:cb:ad:04:55:ba:
                    d8:c4:b6:f8:d1
                Exponent: 65537 (0x10001)
        Attributes:
            a0:00
    Signature Algorithm: sha1WithRSAEncryption
        17:0a:b0:13:7e:b5:1a:d9:da:f6:76:91:b5:9d:40:91:01:7f:
        57:e4:7d:16:16:a5:da:b3:18:a7:9f:6e:cf:c9:88:70:ca:45:
        44:d7:4b:72:f2:21:ac:55:1c:5a:3d:97:24:63:69:92:4d:cd:
        33:03:2a:2f:a1:34:63:2f:82:ea
Modulus=BCF3D2656A9D5AFEC19E5BA3EDB24094AEDBB783CEEBEB3F9C27759AFEB95C43012C
3622D43AD3BB79F6181CCB3B14044ECE3B996EE8CBAD
0455BAD8C4B6F8D1
-----BEGIN CERTIFICATE REQUEST-----
MIIBDTCBugIAMFYxCzAJBgNVBAYTAklUMRUwEwYDVQQKEwxPcmdhbml6YXRpb24x
GjAYBgNVBAsTEU9yZ2FuaXphdGlvbiBVbml0MRQwEgYDVQQDEwtDb21tb24gTmFt
ZTBcMA0GCSqGSIb3DQEBAQUAA0sAMEgCQQC889Jlap1a/sGeW6PtskCUrtu3g87r
6z+cJ3Wa/rlcQwEsNiLUOtO7efYYHMs7FAROzjuZbujLrQRVutjEtvjRAgMBAAGg
ADALBgkqhkiG9w0BAQUDQQEXCrATfrUa2dr2dpG1nUCRAX9X5H0WFqXasxinn27P
yYhwykVE10ty8iGsVRxaPZckY2mSTc0zAyovoTRjL4Lq
-----END CERTIFICATE REQUEST-----


Can someone help me ? Thanks in advance !

Reply via email to