void MoonlightInstance::MakeCert(int32_t callbackId, pp::VarArray args) { pp::VarDictionary ret; ret.Set("callbackId", pp::Var(callbackId)); ret.Set("type", pp::Var("resolve")); pp::VarDictionary retData; CERT_KEY_PAIR certKeyPair = mkcert_generate(); BIO* bio = BIO_new(BIO_s_mem()); PEM_write_bio_X509(bio, certKeyPair.x509); BUF_MEM *mem = NULL; BIO_get_mem_ptr(bio, &mem); std::string cert(mem->data, mem->length); BIO_free(bio); BIO* biokey = BIO_new(BIO_s_mem()); PEM_write_bio_PrivateKey(biokey, certKeyPair.pkey, NULL, NULL, 0, NULL, NULL); BIO_get_mem_ptr(biokey, &mem); std::string pkey(mem->data, mem->length); BIO_free(biokey); retData.Set("privateKey", pkey.c_str()); retData.Set("cert", cert.c_str()); ret.Set("ret", retData); PostMessage(ret); }
static int load_cert(const char* keyDirectory) { char certificateFilePath[4096]; sprintf(certificateFilePath, "%s/%s", keyDirectory, CERTIFICATE_FILE_NAME); char keyFilePath[4096]; sprintf(&keyFilePath[0], "%s/%s", keyDirectory, KEY_FILE_NAME); FILE *fd = fopen(certificateFilePath, "r"); if (fd == NULL) { printf("Generating certificate..."); CERT_KEY_PAIR cert = mkcert_generate(); printf("done\n"); char p12FilePath[4096]; sprintf(p12FilePath, "%s/%s", keyDirectory, P12_FILE_NAME); mkcert_save(certificateFilePath, p12FilePath, keyFilePath, cert); mkcert_free(cert); fd = fopen(certificateFilePath, "r"); } if (fd == NULL) { gs_error = "Can't open certificate file"; return GS_FAILED; } if (!(cert = PEM_read_X509(fd, NULL, NULL, NULL))) { gs_error = "Error loading cert into memory"; return GS_FAILED; } rewind(fd); int c; int length = 0; while ((c = fgetc(fd)) != EOF) { sprintf(cert_hex + length, "%02x", c); length += 2; } cert_hex[length] = 0; fclose(fd); fd = fopen(keyFilePath, "r"); if (fd == NULL) { gs_error = "Error loading key into memory"; return GS_FAILED; } PEM_read_PrivateKey(fd, &privateKey, NULL, NULL); fclose(fd); return GS_OK; }