mirror of
https://github.com/moonlight-stream/moonlight-ios.git
synced 2026-02-16 10:31:02 +00:00
121 lines
2.9 KiB
C
121 lines
2.9 KiB
C
|
|
#include "mkcert.h"
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
#include <openssl/pem.h>
|
|
#include <openssl/conf.h>
|
|
#include <openssl/pkcs12.h>
|
|
|
|
#ifndef OPENSSL_NO_ENGINE
|
|
#include <openssl/engine.h>
|
|
#endif
|
|
|
|
static const int NUM_BITS = 2048;
|
|
static const int SERIAL = 0;
|
|
static const int NUM_YEARS = 10;
|
|
|
|
int mkcert(X509 **x509p, EVP_PKEY **pkeyp, int bits, int serial, int years);
|
|
int add_ext(X509 *cert, int nid, char *value);
|
|
|
|
struct CertKeyPair generateCertKeyPair(void) {
|
|
BIO *bio_err;
|
|
X509 *x509 = NULL;
|
|
EVP_PKEY *pkey = NULL;
|
|
PKCS12 *p12 = NULL;
|
|
|
|
CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);
|
|
bio_err = BIO_new_fp(stderr, BIO_NOCLOSE);
|
|
|
|
SSLeay_add_all_algorithms();
|
|
ERR_load_crypto_strings();
|
|
|
|
mkcert(&x509, &pkey, NUM_BITS, SERIAL, NUM_YEARS);
|
|
|
|
p12 = PKCS12_create("limelight", "GameStream", pkey, x509, NULL, 0, 0, 0, 0, 0);
|
|
if (p12 == NULL) {
|
|
printf("Error generating a valid PKCS12 certificate.\n");
|
|
}
|
|
|
|
// Debug Print statements
|
|
//RSA_print_fp(stdout, pkey->pkey.rsa, 0);
|
|
//X509_print_fp(stdout, x509);
|
|
//PEM_write_PUBKEY(stdout, pkey);
|
|
//PEM_write_PrivateKey(stdout, pkey, NULL, NULL, 0, NULL, NULL);
|
|
//PEM_write_X509(stdout, x509);
|
|
|
|
#ifndef OPENSSL_NO_ENGINE
|
|
ENGINE_cleanup();
|
|
#endif
|
|
CRYPTO_cleanup_all_ex_data();
|
|
|
|
CRYPTO_mem_leaks(bio_err);
|
|
BIO_free(bio_err);
|
|
|
|
return (CertKeyPair){x509, pkey, p12};
|
|
}
|
|
|
|
void freeCertKeyPair(struct CertKeyPair certKeyPair) {
|
|
X509_free(certKeyPair.x509);
|
|
EVP_PKEY_free(certKeyPair.pkey);
|
|
PKCS12_free(certKeyPair.p12);
|
|
}
|
|
|
|
int mkcert(X509 **x509p, EVP_PKEY **pkeyp, int bits, int serial, int years) {
|
|
X509 *x;
|
|
EVP_PKEY *pk;
|
|
RSA *rsa;
|
|
X509_NAME *name = NULL;
|
|
|
|
if (*pkeyp == NULL) {
|
|
if ((pk=EVP_PKEY_new()) == NULL) {
|
|
return(0);
|
|
}
|
|
} else {
|
|
pk = *pkeyp;
|
|
}
|
|
|
|
if (*x509p == NULL) {
|
|
if ((x = X509_new()) == NULL) {
|
|
goto err;
|
|
}
|
|
} else {
|
|
x = *x509p;
|
|
}
|
|
|
|
rsa = RSA_generate_key(bits, RSA_F4, NULL, NULL);
|
|
if (!EVP_PKEY_assign_RSA(pk, rsa)) {
|
|
goto err;
|
|
}
|
|
|
|
X509_set_version(x, 2);
|
|
ASN1_INTEGER_set(X509_get_serialNumber(x), serial);
|
|
X509_gmtime_adj(X509_get_notBefore(x), 0);
|
|
X509_gmtime_adj(X509_get_notAfter(x), (long)60*60*24*365*years);
|
|
X509_set_pubkey(x, pk);
|
|
|
|
name = X509_get_subject_name(x);
|
|
|
|
/* This function creates and adds the entry, working out the
|
|
* correct string type and performing checks on its length.
|
|
*/
|
|
X509_NAME_add_entry_by_txt(name,"CN", MBSTRING_ASC, (unsigned char*)"NVIDIA GameStream Client", -1, -1, 0);
|
|
|
|
/* Its self signed so set the issuer name to be the same as the
|
|
* subject.
|
|
*/
|
|
X509_set_issuer_name(x, name);
|
|
|
|
if (!X509_sign(x, pk, EVP_sha256())) {
|
|
goto err;
|
|
}
|
|
|
|
*x509p = x;
|
|
*pkeyp = pk;
|
|
|
|
return(1);
|
|
err:
|
|
return(0);
|
|
}
|