PKIError GenerateCAKeyPair (ByteArray *caPrivateKey, ByteArray *caPublicKey) { FUNCTION_INIT(); CHECK_NULL(caPrivateKey, ISSUER_NULL_PASSED); CHECK_NULL(caPrivateKey->data, ISSUER_NULL_PASSED); CHECK_NULL(caPublicKey, ISSUER_NULL_PASSED); CHECK_NULL(caPublicKey->data, ISSUER_NULL_PASSED); CHECK_COND(uECC_make_key(caPublicKey->data, caPrivateKey->data), ISSUER_MAKE_KEY_ERROR); caPublicKey->len = PUBLIC_KEY_SIZE; caPrivateKey->len = PRIVATE_KEY_SIZE; CHECK_CALL(InitCKMInfo); CHECK_CALL(SetCAPrivateKey, caPrivateKey); CHECK_CALL(SetCAPublicKey, caPublicKey); CHECK_CALL(SaveCKMInfo); FUNCTION_CLEAR(); }
static PKIError InitCA() { FUNCTION_INIT(); if (IsCKMInfoFileExists()) { CHECK_CALL(InitCKMInfo); } else { ByteArray rootName = BYTE_ARRAY_INITIALIZER; ByteArray CAPubKey = BYTE_ARRAY_INITIALIZER; ByteArray CAPrivKey = BYTE_ARRAY_INITIALIZER; ByteArray rootCert = BYTE_ARRAY_INITIALIZER; uint8_t rootCertData[ISSUER_MAX_CERT_SIZE]; uint8_t CAPubKeyData[PUBLIC_KEY_SIZE]; uint8_t CAPrivKeyData[PRIVATE_KEY_SIZE]; const char rootNameStr[] = "Sample_Root"; CAPubKey.data = CAPubKeyData; CAPubKey.len = PUBLIC_KEY_SIZE; CAPrivKey.data = CAPrivKeyData; CAPrivKey.len = PRIVATE_KEY_SIZE; rootCert.data = rootCertData; rootCert.len = ISSUER_MAX_CERT_SIZE; rootName.data = (uint8_t *)rootNameStr; rootName.len = strlen(rootNameStr); CHECK_CALL(SetRootName, rootName); CHECK_CALL(GenerateCAKeyPair, &CAPrivKey, &CAPubKey); CHECK_CALL(SetSerialNumber, 1); CHECK_CALL(CKMIssueRootCertificate, NULL, NULL, &rootCert); CHECK_CALL(SetCACertificate, &rootCert); } FUNCTION_CLEAR(); }