Hi @lukaszadrapa,
I have created a CA self-signed certificate through which I need to build an application where i need to verify the signature of the certificate by its public key.
This is my application code, and I'm facing a verification failed error code:
int main(void) {
/* ==========================================================
* 1. Initialize environment and hardware security module
* ========================================================== */
WaitForHSEFWInitToFinish();
/*Key Handle for ECC key pair in NVM Catalog*/
hseKeyHandle_t g2b_keyPairHandler = GET_KEY_HANDLE(HSE_KEY_CATALOG_ID_NVM,
0, 0);
/*Key Handle for Public Key in RAM catalog*/
hseKeyHandle_t g2b_keyPubHandler = GET_KEY_HANDLE(HSE_KEY_CATALOG_ID_RAM, 0,
0);
/*Formats the Key catalogs */
g2b_HSE_Status = FormatKeyCatalogs(g2b_nvmKeyCatalog_rsa,
g2b_ramKeyCatalog_rsa);
/*Initializes the Key Allocator Driver for Hanfdling Keys in the framework*/
g2b_HSE_Status = HKF_Init(g2b_nvmKeyCatalog_rsa, g2b_ramKeyCatalog_rsa);
/* ==========================================================
* 2. Load the CA certificate (in PEM format)
* ========================================================== */
static const char *ca_pem =
"-----BEGIN CERTIFICATE-----\r\n"
"MIIDhDCCAmygAwIBAgIINYKWbrYzIuEwDQYJKoZIhvcNAQELBQAwSDELMAkGA1UE\r\n"
"BhMCSU4xJzAlBgNVBAoTHkdldHRvYnl0ZSBUZWNobm9sb2dpZXMgUHZ0IEx0ZDEQ\r\n"
"MA4GA1UEAwwHUm9vdF9DQTAeFw0yNTEwMjgxMTQ0MDBaFw0zNTEwMjgxMTQ0MDBa\r\n"
"MEgxCzAJBgNVBAYTAklOMScwJQYDVQQKEx5HZXR0b2J5dGUgVGVjaG5vbG9naWVz\r\n"
"IFB2dCBMdGQxEDAOBgNVBAMMB1Jvb3RfQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IB\r\n"
"DwAwggEKAoIBAQC5+qqEb+wIDQTG7mgAAgXdH9eM1PjuR34e4qDZDTW7aRukWt0I\r\n"
"Whwef6NbfXV51N/CI+4+446sND4jW8Y4tK8h7i+QJBaTx3sdDyBO3JNthpp/uUtt\r\n"
"+2EUGJP8tKNiP1GhhAjjCMmHwrY3kqyAzXKiCdRFGnWOdQvae6QfgTogDGoXwfEj\r\n"
"IGRfOAXZYOLo/+PTm7AZvF+eWSGnXV3mnvP0FimE/NhBdJwL3T8AoxaMW+jNWRTf\r\n"
"XV5NAZili62U7Va/BdGSw3Vrbf70O3S7nbnQWmHJTKrZT8CjUft2fVXpsNWJ+lAp\r\n"
"cWqRrOtY5Ux5sO2ke5l52vXVrWckwSHESCCjAgMBAAGjcjBwMA8GA1UdEwEB/wQF\r\n"
"MAMBAf8wHQYDVR0OBBYEFOaB3KdlqOw1UgifcfwjaAQmyoHjMAsGA1UdDwQEAwIB\r\n"
"BjARBglghkgBhvhCAQEEBAMCAAcwHgYJYIZIAYb4QgENBBEWD3hjYSBjZXJ0aWZp\r\n"
"Y2F0ZTANBgkqhkiG9w0BAQsFAAOCAQEAtkNO6oP39gHMzH6Zz53dOs6zqJbrZFab\r\n"
"w1ekLN30hwAbC9v32zp9Elq1zFnZRQAeILOYTpeR2ejD2PgpZATeYhH9w93OgDgx\r\n"
"/CWtDQAcYN/kOvIzAaFGBY3+QoRsOTzggLNNehhO4ZhevBjRS6QWsJDY1RaAp8ss\r\n"
"9QWJnuYtkfUAtfqDD3jGC3VsE9h5dBQn4JG0REeC7go6S7D+ofzzgBDbK/gwdFcr\r\n"
"YnS4e9Mse0D1RQjFEaEKibB0hX7L3uEAzVIDCS2lD/0jzwCLxQ1xhFooVzv5Tb4k\r\n"
"nRr+v8ht/baCu3vtZEeGxM8/IeP3ttjavdNnb/IiCS2nVgj/YfzNDw==\r\n"
"-----END CERTIFICATE-----\r\n";
pem_cert_to_der(ca_pem, &ca_der, &ca_der_len);
/* ==========================================================
* 3. Parse the CA certificate to extract important fields
* ========================================================== */
int rc = simple_x509_parse_der(ca_der, ca_der_len, &c);
if (rc) {
/* If this fails, the certificate is malformed or unsupported. */
}
/* ==========================================================
* 4. Locate critical ASN.1 slices for verification
* ========================================================== */
if (simple_x509_locate_core(ca_der, ca_der_len, &tbs, &tbs_len, &sig_oid,
&sig_oid_len, &sig, &sig_len) != SX_OK) {
printf("Locate core failed\n");
return -1;
}
/* ==========================================================
* 5. Extract the CA's own public key (SPKI bits -> N, E)
* ========================================================== */
simple_x509_locate_spki_bits(ca_der, ca_der_len, &spki_bits, &spki_len);
rsa_pub_init(&ca_pub);
/* ==========================================================
* 6. Map signatureAlgorithm OID → RSA + SHA256 scheme
* ========================================================== */
sig_params_t scheme = map_sig_oid(sig_oid, sig_oid_len);
g2b_HSE_Status = HashReq(HSE_ACCESS_MODE_ONE_PASS, 0U, 1U,
HSE_HASH_ALGO_SHA2_256, 0U, (uint32_t) tbs_len, tbs, &hash_len, hash,
txOptions, HSE_SGT_OPTION_NONE);
uint16_t modulus_len = ca_pub.N_len * 8;
uint16_t exponent_len = ca_pub.E_len;
g2b_HSE_Status = LoadRsaPublicKey(&g2b_keyPubHandler, 0U, modulus_len,
ca_pub.N, exponent_len, ca_pub.E);
g2b_HSE_Status = RsaPkcs1v15VerSrv(g2b_keyPubHandler, HSE_HASH_ALGO_SHA2_256,
(uint32_t) tbs_len, tbs, FALSE, HSE_SGT_OPTION_NONE,
(uint32_t) &sig_len, sig);
rsa_pub_free(&ca_pub);
/* Demo end: stay alive*/
for (;;) {
}
/* Unreachable */
/* return 0; */
}