static BOOL freerdp_peer_initialize(freerdp_peer* client) { rdpRdp* rdp = client->context->rdp; rdpSettings* settings = rdp->settings; settings->ServerMode = TRUE; settings->FrameAcknowledge = 0; settings->LocalConnection = client->local; rdp->state = CONNECTION_STATE_INITIAL; if (settings->RdpKeyFile) { settings->RdpServerRsaKey = key_new(settings->RdpKeyFile); if (!settings->RdpServerRsaKey) { WLog_ERR(TAG, "invalid RDP key file %s", settings->RdpKeyFile); return FALSE; } } else if (settings->RdpKeyContent) { settings->RdpServerRsaKey = key_new_from_content(settings->RdpKeyContent, NULL); if (!settings->RdpServerRsaKey) { WLog_ERR(TAG, "invalid RDP key content"); return FALSE; } } return TRUE; }
rdpRsaKey* key_new(const char* keyfile) { FILE* fp = NULL; INT64 length; char* buffer = NULL; rdpRsaKey* key = NULL; fp = fopen(keyfile, "rb"); if (!fp) { WLog_ERR(TAG, "unable to open RSA key file %s: %s.", keyfile, strerror(errno)); goto out_free; } if (_fseeki64(fp, 0, SEEK_END) < 0) goto out_free; if ((length = _ftelli64(fp)) < 0) goto out_free; if (_fseeki64(fp, 0, SEEK_SET) < 0) goto out_free; buffer = (char*)malloc(length + 1); if (!buffer) goto out_free; if (fread((void*) buffer, length, 1, fp) != 1) goto out_free; fclose(fp); buffer[length] = '\0'; key = key_new_from_content(buffer, keyfile); free(buffer); return key; out_free: if (fp) fclose(fp); free(buffer); return NULL; }