Libgamestream doesn't print to console

This commit is contained in:
Iwan Timmer 2015-07-23 13:06:47 +02:00
parent 06265eddad
commit 6c087f40dc
6 changed files with 37 additions and 63 deletions

View File

@ -47,6 +47,8 @@ static X509 *cert;
static char cert_hex[4096]; static char cert_hex[4096];
static EVP_PKEY *privateKey; static EVP_PKEY *privateKey;
const char* gs_error;
static int load_unique_id(const char* keyDirectory) { static int load_unique_id(const char* keyDirectory) {
char uniqueFilePath[4096]; char uniqueFilePath[4096];
sprintf(uniqueFilePath, "%s/%s", keyDirectory, UNIQUE_FILE_NAME); sprintf(uniqueFilePath, "%s/%s", keyDirectory, UNIQUE_FILE_NAME);
@ -94,12 +96,12 @@ static int load_cert(const char* keyDirectory) {
} }
if (fd == NULL) { if (fd == NULL) {
fprintf(stderr, "Can't open certificate file\n"); gs_error = "Can't open certificate file";
return GS_FAILED; return GS_FAILED;
} }
if (!(cert = PEM_read_X509(fd, NULL, NULL, NULL))) { if (!(cert = PEM_read_X509(fd, NULL, NULL, NULL))) {
fprintf(stderr, "Error loading cert into memory.\n"); gs_error = "Error loading cert into memory";
return GS_FAILED; return GS_FAILED;
} }
@ -117,7 +119,7 @@ static int load_cert(const char* keyDirectory) {
fd = fopen(keyFilePath, "r"); fd = fopen(keyFilePath, "r");
if (fd == NULL) { if (fd == NULL) {
fprintf(stderr, "Error loading key into memory.\n"); gs_error = "Error loading key into memory";
return GS_FAILED; return GS_FAILED;
} }
@ -194,66 +196,38 @@ static int sign_it(const char *msg, size_t mlen, unsigned char **sig, size_t *sl
*slen = 0; *slen = 0;
EVP_MD_CTX *ctx = EVP_MD_CTX_create(); EVP_MD_CTX *ctx = EVP_MD_CTX_create();
if (ctx == NULL) { if (ctx == NULL)
fprintf(stderr, "EVP_MD_CTX_create failed, error 0x%lx\n", ERR_get_error()); return GS_FAILED;
return -1;
}
const EVP_MD *md = EVP_get_digestbyname("SHA256"); const EVP_MD *md = EVP_get_digestbyname("SHA256");
if (md == NULL) { if (md == NULL)
fprintf(stderr, "EVP_get_digestbyname failed, error 0x%lx\n", ERR_get_error());
goto cleanup; goto cleanup;
}
int rc = EVP_DigestInit_ex(ctx, md, NULL); int rc = EVP_DigestInit_ex(ctx, md, NULL);
if (rc != 1) { if (rc != 1)
fprintf(stderr, "EVP_DigestInit_ex failed, error 0x%lx\n", ERR_get_error());
goto cleanup; goto cleanup;
}
rc = EVP_DigestSignInit(ctx, NULL, md, NULL, pkey); rc = EVP_DigestSignInit(ctx, NULL, md, NULL, pkey);
if (rc != 1) { if (rc != 1)
fprintf(stderr, "EVP_DigestSignInit failed, error 0x%lx\n", ERR_get_error());
goto cleanup; goto cleanup;
}
rc = EVP_DigestSignUpdate(ctx, msg, mlen); rc = EVP_DigestSignUpdate(ctx, msg, mlen);
if (rc != 1) { if (rc != 1)
fprintf(stderr, "EVP_DigestSignUpdate failed, error 0x%lx\n", ERR_get_error());
goto cleanup; goto cleanup;
}
size_t req = 0; size_t req = 0;
rc = EVP_DigestSignFinal(ctx, NULL, &req); rc = EVP_DigestSignFinal(ctx, NULL, &req);
if (rc != 1) { if (rc != 1 || !(req > 0))
fprintf(stderr, "EVP_DigestSignFinal failed (1), error 0x%lx\n", ERR_get_error());
goto cleanup; goto cleanup;
}
if (!(req > 0)) {
fprintf(stderr, "EVP_DigestSignFinal failed (2), error 0x%lx\n", ERR_get_error());
goto cleanup;
}
*sig = OPENSSL_malloc(req); *sig = OPENSSL_malloc(req);
if (*sig == NULL) { if (*sig == NULL)
fprintf(stderr, "OPENSSL_malloc failed, error 0x%lx\n", ERR_get_error());
goto cleanup; goto cleanup;
}
*slen = req; *slen = req;
rc = EVP_DigestSignFinal(ctx, *sig, slen); rc = EVP_DigestSignFinal(ctx, *sig, slen);
if (rc != 1) { if (rc != 1 || req != *slen)
fprintf(stderr, "EVP_DigestSignFinal failed (3), return code %d, error 0x%lx\n", rc,
ERR_get_error());
goto cleanup; goto cleanup;
}
if (req != *slen) {
fprintf(stderr, "EVP_DigestSignFinal failed, mismatched signature sizes %ld, %ld\n",
req, *slen);
goto cleanup;
}
result = GS_OK; result = GS_OK;
@ -269,17 +243,15 @@ int gs_pair(PSERVER_DATA server, char* pin) {
char url[4096]; char url[4096];
if (server->paired) { if (server->paired) {
fprintf(stderr, "Already paired\n"); gs_error = "Already paired";
return GS_WRONG_STATE; return GS_WRONG_STATE;
} }
if (server->currentGame != 0) { if (server->currentGame != 0) {
fprintf(stderr, "The computer is currently in a game. You must close the game before pairing.\n"); gs_error = "The computer is currently in a game. You must close the game before pairing";
return GS_WRONG_STATE; return GS_WRONG_STATE;
} }
printf("Please enter the following PIN on the target PC: %s\n", pin);
unsigned char salt_data[16]; unsigned char salt_data[16];
char salt_hex[33]; char salt_hex[33];
RAND_bytes(salt_data, 16); RAND_bytes(salt_data, 16);
@ -357,7 +329,7 @@ int gs_pair(PSERVER_DATA server, char* pin) {
unsigned char *signature = NULL; unsigned char *signature = NULL;
size_t s_len; size_t s_len;
if (sign_it(client_secret_data, 16, &signature, &s_len, privateKey) != GS_OK) { if (sign_it(client_secret_data, 16, &signature, &s_len, privateKey) != GS_OK) {
fprintf(stderr, "Failed to sign data\n"); gs_error = "Failed to sign data";
ret = GS_FAILED; ret = GS_FAILED;
goto cleanup; goto cleanup;
} }

View File

@ -17,6 +17,8 @@
* along with Moonlight; if not, see <http://www.gnu.org/licenses/>. * along with Moonlight; if not, see <http://www.gnu.org/licenses/>.
*/ */
#include "errors.h"
#include <avahi-client/client.h> #include <avahi-client/client.h>
#include <avahi-client/lookup.h> #include <avahi-client/lookup.h>
@ -33,7 +35,7 @@ static AvahiSimplePoll *simple_poll = NULL;
static void client_callback(AvahiClient *c, AvahiClientState state, void *userdata) { static void client_callback(AvahiClient *c, AvahiClientState state, void *userdata) {
if (state == AVAHI_CLIENT_FAILURE) { if (state == AVAHI_CLIENT_FAILURE) {
fprintf(stderr, "Server connection failure: %s\n", avahi_strerror(avahi_client_errno(c))); gs_error = "Server connection failure";
avahi_simple_poll_quit(simple_poll); avahi_simple_poll_quit(simple_poll);
} }
} }
@ -58,12 +60,12 @@ static void browse_callback(AvahiServiceBrowser *b, AvahiIfIndex interface, Avah
switch (event) { switch (event) {
case AVAHI_BROWSER_FAILURE: case AVAHI_BROWSER_FAILURE:
fprintf(stderr, "(Discover) %s\n", avahi_strerror(avahi_client_errno(avahi_service_browser_get_client(b)))); gs_error = "Server browser failure";
avahi_simple_poll_quit(simple_poll); avahi_simple_poll_quit(simple_poll);
break; break;
case AVAHI_BROWSER_NEW: case AVAHI_BROWSER_NEW:
if (!(avahi_service_resolver_new(c, interface, protocol, name, type, domain, AVAHI_PROTO_UNSPEC, 0, resolve_callback, userdata))) if (!(avahi_service_resolver_new(c, interface, protocol, name, type, domain, AVAHI_PROTO_UNSPEC, 0, resolve_callback, userdata)))
fprintf(stderr, "Failed to resolve service '%s': %s\n", name, avahi_strerror(avahi_client_errno(c))); gs_error = "Failed to resolve service";
break; break;
case AVAHI_BROWSER_REMOVE: case AVAHI_BROWSER_REMOVE:
@ -76,19 +78,19 @@ void gs_discover_server(char* dest) {
AvahiServiceBrowser *sb = NULL; AvahiServiceBrowser *sb = NULL;
if (!(simple_poll = avahi_simple_poll_new())) { if (!(simple_poll = avahi_simple_poll_new())) {
fprintf(stderr, "Failed to create simple poll object.\n"); gs_error = "Failed to create simple poll object";
goto cleanup; goto cleanup;
} }
int error; int error;
client = avahi_client_new(avahi_simple_poll_get(simple_poll), 0, client_callback, NULL, &error); client = avahi_client_new(avahi_simple_poll_get(simple_poll), 0, client_callback, NULL, &error);
if (!client) { if (!client) {
fprintf(stderr, "Failed to create client: %s\n", avahi_strerror(error)); gs_error = "Failed to create client";
goto cleanup; goto cleanup;
} }
if (!(sb = avahi_service_browser_new(client, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, "_nvstream._tcp", NULL, 0, browse_callback, dest))) { if (!(sb = avahi_service_browser_new(client, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, "_nvstream._tcp", NULL, 0, browse_callback, dest))) {
fprintf(stderr, "Failed to create service browser: %s\n", avahi_strerror(avahi_client_errno(client))); gs_error = "Failed to create service browser";
goto cleanup; goto cleanup;
} }

View File

@ -25,3 +25,5 @@
#define GS_INVALID -3 #define GS_INVALID -3
#define GS_WRONG_STATE -4 #define GS_WRONG_STATE -4
#define GS_IO_ERROR -5 #define GS_IO_ERROR -5
const char* gs_error;

View File

@ -48,9 +48,6 @@ CERT_KEY_PAIR mkcert_generate() {
mkcert(&x509, &pkey, NUM_BITS, SERIAL, NUM_YEARS); mkcert(&x509, &pkey, NUM_BITS, SERIAL, NUM_YEARS);
p12 = PKCS12_create("limelight", "GameStream", pkey, x509, NULL, 0, 0, 0, 0, 0); p12 = PKCS12_create("limelight", "GameStream", pkey, x509, NULL, 0, 0, 0, 0, 0);
if (p12 == NULL) {
fprintf(stderr, "Error generating a valid PKCS12 certificate.\n");
}
#ifndef OPENSSL_NO_ENGINE #ifndef OPENSSL_NO_ENGINE
ENGINE_cleanup(); ENGINE_cleanup();

View File

@ -46,10 +46,8 @@ static void XMLCALL _xml_start_applist_element(void *userData, const char *name,
struct xml_query *search = (struct xml_query*) userData; struct xml_query *search = (struct xml_query*) userData;
if (strcmp("App", name) == 0) { if (strcmp("App", name) == 0) {
PAPP_LIST app = malloc(sizeof(APP_LIST)); PAPP_LIST app = malloc(sizeof(APP_LIST));
if (app == NULL) { if (app == NULL)
fprintf(stderr, "Not enough memory\n");
return; return;
}
app->next = (PAPP_LIST) search->data; app->next = (PAPP_LIST) search->data;
search->data = app; search->data = app;
@ -81,10 +79,8 @@ static void XMLCALL _xml_write_data(void *userData, const XML_Char *s, int len)
struct xml_query *search = (struct xml_query*) userData; struct xml_query *search = (struct xml_query*) userData;
if (search->start > 0) { if (search->start > 0) {
search->memory = realloc(search->memory, search->size + len + 1); search->memory = realloc(search->memory, search->size + len + 1);
if(search->memory == NULL) { if(search->memory == NULL)
fprintf(stderr, "Not enough memory\n");
return; return;
}
memcpy(&(search->memory[search->size]), s, len); memcpy(&(search->memory[search->size]), s, len);
search->size += len; search->size += len;
@ -104,7 +100,7 @@ int xml_search(char* data, size_t len, char* node, char** result) {
XML_SetCharacterDataHandler(parser, _xml_write_data); XML_SetCharacterDataHandler(parser, _xml_write_data);
if (! XML_Parse(parser, data, len, 1)) { if (! XML_Parse(parser, data, len, 1)) {
int code = XML_GetErrorCode(parser); int code = XML_GetErrorCode(parser);
fprintf(stderr, "XML Error: %s\n", XML_ErrorString(code)); gs_error = XML_ErrorString(code);
free(search.memory); free(search.memory);
return GS_INVALID; return GS_INVALID;
} else if (search.memory == NULL) } else if (search.memory == NULL)
@ -127,7 +123,7 @@ int xml_applist(char* data, size_t len, PAPP_LIST app_list) {
XML_SetCharacterDataHandler(parser, _xml_write_data); XML_SetCharacterDataHandler(parser, _xml_write_data);
if (! XML_Parse(parser, data, len, 1)) { if (! XML_Parse(parser, data, len, 1)) {
int code = XML_GetErrorCode(parser); int code = XML_GetErrorCode(parser);
fprintf(stderr, "XML Error %s\n", XML_ErrorString(code)); gs_error = XML_ErrorString(code);
return GS_INVALID; return GS_INVALID;
} }
app_list = (PAPP_LIST) query.data; app_list = (PAPP_LIST) query.data;

View File

@ -304,7 +304,12 @@ int main(int argc, char* argv[]) {
} else if (strcmp("pair", action) == 0) { } else if (strcmp("pair", action) == 0) {
char pin[5]; char pin[5];
sprintf(pin, "%d%d%d%d", (int)random() % 10, (int)random() % 10, (int)random() % 10, (int)random() % 10); sprintf(pin, "%d%d%d%d", (int)random() % 10, (int)random() % 10, (int)random() % 10, (int)random() % 10);
gs_pair(server, &pin[0]); printf("Please enter the following PIN on the target PC: %s\n", pin);
if (gs_pair(server, &pin[0]) != GS_OK) {
fprintf("Failed to pair to server: %s\n", gs_error);
} else {
printf("Succesfully paired\n");
}
} else if (strcmp("quit", action) == 0) { } else if (strcmp("quit", action) == 0) {
pair_check(server); pair_check(server);
gs_quit_app(server); gs_quit_app(server);