mirror of
https://github.com/gnif/LookingGlass.git
synced 2024-11-24 14:27:20 +00:00
[client] moved spice into a seperate repository
This commit is contained in:
parent
0ca760fad6
commit
0b7f422d5d
5
.gitmodules
vendored
5
.gitmodules
vendored
@ -1,3 +1,6 @@
|
|||||||
[submodule "LGMP"]
|
[submodule "LGMP"]
|
||||||
path = LGMP
|
path = repos/LGMP
|
||||||
url = https://github.com/gnif/LGMP.git
|
url = https://github.com/gnif/LGMP.git
|
||||||
|
[submodule "repos/PureSpice"]
|
||||||
|
path = repos/PureSpice
|
||||||
|
url = https://github.com/gnif/PureSpice
|
||||||
|
@ -53,7 +53,7 @@ set(SOURCES
|
|||||||
)
|
)
|
||||||
|
|
||||||
add_subdirectory("${PROJECT_TOP}/common" "${CMAKE_BINARY_DIR}/common")
|
add_subdirectory("${PROJECT_TOP}/common" "${CMAKE_BINARY_DIR}/common")
|
||||||
add_subdirectory("${PROJECT_TOP}/LGMP/lgmp" "${CMAKE_BINARY_DIR}/lgmp" )
|
add_subdirectory("${PROJECT_TOP}/repos/LGMP/lgmp" "${CMAKE_BINARY_DIR}/lgmp" )
|
||||||
add_subdirectory(platform)
|
add_subdirectory(platform)
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
|
@ -89,9 +89,9 @@ set(SOURCES
|
|||||||
)
|
)
|
||||||
|
|
||||||
add_subdirectory("${PROJECT_TOP}/common" "${CMAKE_BINARY_DIR}/common" )
|
add_subdirectory("${PROJECT_TOP}/common" "${CMAKE_BINARY_DIR}/common" )
|
||||||
add_subdirectory("${PROJECT_TOP}/LGMP/lgmp" "${CMAKE_BINARY_DIR}/lgmp" )
|
add_subdirectory("${PROJECT_TOP}/repos/LGMP/lgmp" "${CMAKE_BINARY_DIR}/LGMP" )
|
||||||
|
add_subdirectory("${PROJECT_TOP}/repos/PureSpice" "${CMAKE_BINARY_DIR}/PureSpice")
|
||||||
|
|
||||||
add_subdirectory(spice)
|
|
||||||
add_subdirectory(renderers)
|
add_subdirectory(renderers)
|
||||||
add_subdirectory(clipboards)
|
add_subdirectory(clipboards)
|
||||||
add_subdirectory(fonts)
|
add_subdirectory(fonts)
|
||||||
@ -103,7 +103,7 @@ target_link_libraries(looking-glass-client
|
|||||||
${EXE_FLAGS}
|
${EXE_FLAGS}
|
||||||
lg_common
|
lg_common
|
||||||
lgmp
|
lgmp
|
||||||
spice
|
purespice
|
||||||
renderers
|
renderers
|
||||||
clipboards
|
clipboards
|
||||||
fonts
|
fonts
|
||||||
|
@ -1,32 +0,0 @@
|
|||||||
cmake_minimum_required(VERSION 3.0)
|
|
||||||
project(spice LANGUAGES C)
|
|
||||||
set(CMAKE_C_STANDARD 11)
|
|
||||||
|
|
||||||
find_package(PkgConfig)
|
|
||||||
pkg_check_modules(SPICE_PKGCONFIG REQUIRED
|
|
||||||
spice-protocol
|
|
||||||
nettle
|
|
||||||
hogweed
|
|
||||||
)
|
|
||||||
|
|
||||||
add_definitions(-D USE_NETTLE)
|
|
||||||
|
|
||||||
add_library(spice STATIC
|
|
||||||
src/spice.c
|
|
||||||
src/rsa.c
|
|
||||||
)
|
|
||||||
|
|
||||||
target_link_libraries(spice
|
|
||||||
lg_common
|
|
||||||
${SPICE_PKGCONFIG_LIBRARIES}
|
|
||||||
gmp
|
|
||||||
)
|
|
||||||
|
|
||||||
target_include_directories(spice
|
|
||||||
PUBLIC
|
|
||||||
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
|
|
||||||
$<INSTALL_INTERFACE:include>
|
|
||||||
PRIVATE
|
|
||||||
src
|
|
||||||
${SPICE_PKGCONFIG_INCLUDE_DIRS}
|
|
||||||
)
|
|
@ -1,64 +0,0 @@
|
|||||||
/*
|
|
||||||
Looking Glass - KVM FrameRelay (KVMFR) Client
|
|
||||||
Copyright (C) 2017-2019 Geoffrey McRae <geoff@hostfission.com>
|
|
||||||
https://looking-glass.hostfission.com
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it under
|
|
||||||
the terms of the GNU General Public License as published by the Free Software
|
|
||||||
Foundation; either version 2 of the License, or (at your option) any later
|
|
||||||
version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
|
||||||
PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along with
|
|
||||||
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
|
||||||
Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
typedef enum SpiceDataType
|
|
||||||
{
|
|
||||||
SPICE_DATA_TEXT,
|
|
||||||
SPICE_DATA_PNG,
|
|
||||||
SPICE_DATA_BMP,
|
|
||||||
SPICE_DATA_TIFF,
|
|
||||||
SPICE_DATA_JPEG,
|
|
||||||
|
|
||||||
SPICE_DATA_NONE
|
|
||||||
}
|
|
||||||
SpiceDataType;
|
|
||||||
|
|
||||||
typedef void (*SpiceClipboardNotice )(const SpiceDataType type);
|
|
||||||
typedef void (*SpiceClipboardData )(const SpiceDataType type, uint8_t * buffer, uint32_t size);
|
|
||||||
typedef void (*SpiceClipboardRelease)();
|
|
||||||
typedef void (*SpiceClipboardRequest)(const SpiceDataType type);
|
|
||||||
|
|
||||||
bool spice_connect(const char * host, const unsigned short port, const char * password);
|
|
||||||
void spice_disconnect();
|
|
||||||
bool spice_process(int timeout);
|
|
||||||
bool spice_ready();
|
|
||||||
|
|
||||||
bool spice_key_down (uint32_t code);
|
|
||||||
bool spice_key_up (uint32_t code);
|
|
||||||
bool spice_mouse_mode (bool server);
|
|
||||||
bool spice_mouse_position(uint32_t x, uint32_t y);
|
|
||||||
bool spice_mouse_motion ( int32_t x, int32_t y);
|
|
||||||
bool spice_mouse_press (uint32_t button);
|
|
||||||
bool spice_mouse_release (uint32_t button);
|
|
||||||
|
|
||||||
bool spice_clipboard_request(SpiceDataType type);
|
|
||||||
bool spice_clipboard_grab (SpiceDataType type);
|
|
||||||
bool spice_clipboard_release();
|
|
||||||
bool spice_clipboard_data (SpiceDataType type, uint8_t * data, size_t size);
|
|
||||||
|
|
||||||
/* events */
|
|
||||||
bool spice_set_clipboard_cb(
|
|
||||||
SpiceClipboardNotice cbNoticeFn,
|
|
||||||
SpiceClipboardData cbDataFn,
|
|
||||||
SpiceClipboardRelease cbReleaseFn,
|
|
||||||
SpiceClipboardRequest cbRequestFn);
|
|
@ -1,146 +0,0 @@
|
|||||||
/*
|
|
||||||
Looking Glass - KVM FrameRelay (KVMFR) Client
|
|
||||||
Copyright (C) 2017-2019 Geoffrey McRae <geoff@hostfission.com>
|
|
||||||
https://looking-glass.hostfission.com
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it under
|
|
||||||
the terms of the GNU General Public License as published by the Free Software
|
|
||||||
Foundation; either version 2 of the License, or (at your option) any later
|
|
||||||
version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
|
||||||
PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along with
|
|
||||||
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
|
||||||
Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#pragma pack(push,1)
|
|
||||||
|
|
||||||
typedef struct SpicePoint16
|
|
||||||
{
|
|
||||||
int16_t x, y;
|
|
||||||
}
|
|
||||||
SpicePoint16;
|
|
||||||
|
|
||||||
typedef struct SpiceMsgMainInit
|
|
||||||
{
|
|
||||||
uint32_t session_id;
|
|
||||||
uint32_t display_channels_hint;
|
|
||||||
uint32_t supported_mouse_modes;
|
|
||||||
uint32_t current_mouse_mode;
|
|
||||||
uint32_t agent_connected;
|
|
||||||
uint32_t agent_tokens;
|
|
||||||
uint32_t multi_media_time;
|
|
||||||
uint32_t ram_hint;
|
|
||||||
}
|
|
||||||
SpiceMsgMainInit;
|
|
||||||
|
|
||||||
typedef struct SpiceChannelID
|
|
||||||
{
|
|
||||||
uint8_t type;
|
|
||||||
uint8_t channel_id;
|
|
||||||
}
|
|
||||||
SpiceChannelID;
|
|
||||||
|
|
||||||
typedef struct SpiceMsgMainChannelsList
|
|
||||||
{
|
|
||||||
uint32_t num_of_channels;
|
|
||||||
//SpiceChannelID channels[num_of_channels]
|
|
||||||
}
|
|
||||||
SpiceMainChannelsList;
|
|
||||||
|
|
||||||
typedef struct SpiceMsgcMainMouseModeRequest
|
|
||||||
{
|
|
||||||
uint16_t mouse_mode;
|
|
||||||
}
|
|
||||||
SpiceMsgcMainMouseModeRequest;
|
|
||||||
|
|
||||||
typedef struct SpiceMsgPing
|
|
||||||
{
|
|
||||||
uint32_t id;
|
|
||||||
uint64_t timestamp;
|
|
||||||
}
|
|
||||||
SpiceMsgPing,
|
|
||||||
SpiceMsgcPong;
|
|
||||||
|
|
||||||
typedef struct SpiceMsgSetAck
|
|
||||||
{
|
|
||||||
uint32_t generation;
|
|
||||||
uint32_t window;
|
|
||||||
}
|
|
||||||
SpiceMsgSetAck;
|
|
||||||
|
|
||||||
typedef struct SpiceMsgcAckSync
|
|
||||||
{
|
|
||||||
uint32_t generation;
|
|
||||||
}
|
|
||||||
SpiceMsgcAckSync;
|
|
||||||
|
|
||||||
typedef struct SpiceMsgNotify
|
|
||||||
{
|
|
||||||
uint64_t time_stamp;
|
|
||||||
uint32_t severity;
|
|
||||||
uint32_t visibility;
|
|
||||||
uint32_t what;
|
|
||||||
uint32_t message_len;
|
|
||||||
//char message[message_len+1]
|
|
||||||
}
|
|
||||||
SpiceMsgNotify;
|
|
||||||
|
|
||||||
typedef struct SpiceMsgInputsInit
|
|
||||||
{
|
|
||||||
uint16_t modifiers;
|
|
||||||
}
|
|
||||||
SpiceMsgInputsInit,
|
|
||||||
SpiceMsgInputsKeyModifiers,
|
|
||||||
SpiceMsgcInputsKeyModifiers;
|
|
||||||
|
|
||||||
typedef struct SpiceMsgcKeyDown
|
|
||||||
{
|
|
||||||
uint32_t code;
|
|
||||||
}
|
|
||||||
SpiceMsgcKeyDown,
|
|
||||||
SpiceMsgcKeyUp;
|
|
||||||
|
|
||||||
typedef struct SpiceMsgcMousePosition
|
|
||||||
{
|
|
||||||
uint32_t x;
|
|
||||||
uint32_t y;
|
|
||||||
uint16_t button_state;
|
|
||||||
uint8_t display_id;
|
|
||||||
}
|
|
||||||
SpiceMsgcMousePosition;
|
|
||||||
|
|
||||||
typedef struct SpiceMsgcMouseMotion
|
|
||||||
{
|
|
||||||
int32_t x;
|
|
||||||
int32_t y;
|
|
||||||
uint16_t button_state;
|
|
||||||
}
|
|
||||||
SpiceMsgcMouseMotion;
|
|
||||||
|
|
||||||
typedef struct SpiceMsgcMousePress
|
|
||||||
{
|
|
||||||
uint8_t button;
|
|
||||||
uint16_t button_state;
|
|
||||||
}
|
|
||||||
SpiceMsgcMousePress,
|
|
||||||
SpiceMsgcMouseRelease;
|
|
||||||
|
|
||||||
|
|
||||||
// spice is missing these defines, the offical reference library incorrectly uses the VD defines
|
|
||||||
#define COMMON_CAPS_BYTES (((SPICE_COMMON_CAP_MINI_HEADER + 32) / 8) & ~3)
|
|
||||||
#define COMMON_SET_CAPABILITY(caps, index) \
|
|
||||||
{ (caps)[(index) / 32] |= (1 << ((index) % 32)); }
|
|
||||||
|
|
||||||
#define MAIN_CAPS_BYTES (((SPICE_MAIN_CAP_SEAMLESS_MIGRATE + 32) / 8) & ~3)
|
|
||||||
#define MAIN_SET_CAPABILITY(caps, index) \
|
|
||||||
{ (caps)[(index) / 32] |= (1 << ((index) % 32)); }
|
|
||||||
|
|
||||||
|
|
||||||
#pragma pack(pop)
|
|
@ -1,227 +0,0 @@
|
|||||||
/*
|
|
||||||
Looking Glass - KVM FrameRelay (KVMFR) Client
|
|
||||||
Copyright (C) 2017-2019 Geoffrey McRae <geoff@hostfission.com>
|
|
||||||
https://looking-glass.hostfission.com
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it under
|
|
||||||
the terms of the GNU General Public License as published by the Free Software
|
|
||||||
Foundation; either version 2 of the License, or (at your option) any later
|
|
||||||
version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
|
||||||
PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along with
|
|
||||||
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
|
||||||
Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "rsa.h"
|
|
||||||
#include "common/debug.h"
|
|
||||||
|
|
||||||
#include <spice/protocol.h>
|
|
||||||
#include <malloc.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#if defined(USE_OPENSSL) && defined(USE_NETTLE)
|
|
||||||
#error "USE_OPENSSL and USE_NETTLE are both defined"
|
|
||||||
#elif !defined(USE_OPENSSL) && !defined(USE_NETTLE)
|
|
||||||
#error "One of USE_OPENSSL or USE_NETTLE must be defined"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(USE_OPENSSL)
|
|
||||||
#include <openssl/rsa.h>
|
|
||||||
#include <openssl/evp.h>
|
|
||||||
#include <openssl/x509.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(USE_NETTLE)
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <nettle/asn1.h>
|
|
||||||
#include <nettle/sha1.h>
|
|
||||||
#include <nettle/rsa.h>
|
|
||||||
#include <nettle/bignum.h>
|
|
||||||
#include <gmp.h>
|
|
||||||
|
|
||||||
#define SHA1_HASH_LEN 20
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(USE_NETTLE)
|
|
||||||
/* the below OAEP implementation is derived from the FreeTDS project */
|
|
||||||
static void memxor(uint8_t * a, const uint8_t * b, const unsigned int len)
|
|
||||||
{
|
|
||||||
for(unsigned int i = 0; i < len; ++i)
|
|
||||||
a[i] = a[i] ^ b[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
static void sha1(uint8_t * hash, const uint8_t *data, unsigned int len)
|
|
||||||
{
|
|
||||||
struct sha1_ctx ctx;
|
|
||||||
|
|
||||||
sha1_init(&ctx);
|
|
||||||
sha1_update(&ctx, len, data);
|
|
||||||
sha1_digest(&ctx, SHA1_HASH_LEN, hash);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void oaep_mask(uint8_t * dest, size_t dest_len, const uint8_t * mask, size_t mask_len)
|
|
||||||
{
|
|
||||||
uint8_t hash[SHA1_HASH_LEN];
|
|
||||||
uint8_t seed[mask_len + 4 ];
|
|
||||||
memcpy(seed, mask, mask_len);
|
|
||||||
|
|
||||||
for(unsigned int n = 0;; ++n)
|
|
||||||
{
|
|
||||||
(seed+mask_len)[0] = n >> 24;
|
|
||||||
(seed+mask_len)[1] = n >> 16;
|
|
||||||
(seed+mask_len)[2] = n >> 8;
|
|
||||||
(seed+mask_len)[3] = n >> 0;
|
|
||||||
|
|
||||||
sha1(hash, seed, sizeof(seed));
|
|
||||||
if (dest_len <= SHA1_HASH_LEN)
|
|
||||||
{
|
|
||||||
memxor(dest, hash, dest_len);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
memxor(dest, hash, SHA1_HASH_LEN);
|
|
||||||
dest += SHA1_HASH_LEN;
|
|
||||||
dest_len -= SHA1_HASH_LEN;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool oaep_pad(mpz_t m, unsigned int key_size, const uint8_t * message, unsigned int len)
|
|
||||||
{
|
|
||||||
if (len + SHA1_HASH_LEN * 2 + 2 > key_size)
|
|
||||||
{
|
|
||||||
DEBUG_ERROR("Message too long");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
uint8_t all[1];
|
|
||||||
uint8_t ros[SHA1_HASH_LEN];
|
|
||||||
uint8_t db [key_size - SHA1_HASH_LEN - 1];
|
|
||||||
} em;
|
|
||||||
|
|
||||||
memset(&em, 0, sizeof(em));
|
|
||||||
sha1(em.db, (uint8_t *)"", 0);
|
|
||||||
em.all[key_size - len - 1] = 0x1;
|
|
||||||
memcpy(em.all + (key_size - len), message, len);
|
|
||||||
|
|
||||||
/* we are not too worried about randomness since we are just making a local
|
|
||||||
* connection, should anyone use this code outside of LookingGlass please be
|
|
||||||
* sure to use something better such as `gnutls_rnd` */
|
|
||||||
for(int i = 0; i < SHA1_HASH_LEN; ++i)
|
|
||||||
em.ros[i] = rand() % 255;
|
|
||||||
|
|
||||||
const int db_len = key_size - SHA1_HASH_LEN - 1;
|
|
||||||
oaep_mask(em.db , db_len , em.ros, SHA1_HASH_LEN);
|
|
||||||
oaep_mask(em.ros, SHA1_HASH_LEN, em.db , db_len );
|
|
||||||
|
|
||||||
nettle_mpz_set_str_256_u(m, key_size, em.all);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
bool spice_rsa_encrypt_password(uint8_t * pub_key, char * password, struct spice_password * result)
|
|
||||||
{
|
|
||||||
result->size = 0;
|
|
||||||
result->data = NULL;
|
|
||||||
|
|
||||||
#if defined(USE_OPENSSL)
|
|
||||||
BIO *bioKey = BIO_new(BIO_s_mem());
|
|
||||||
if (!bioKey)
|
|
||||||
{
|
|
||||||
DEBUG_ERROR("failed to allocate bioKey");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
BIO_write(bioKey, pub_key, SPICE_TICKET_PUBKEY_BYTES);
|
|
||||||
EVP_PKEY *rsaKey = d2i_PUBKEY_bio(bioKey, NULL);
|
|
||||||
RSA *rsa = EVP_PKEY_get1_RSA(rsaKey);
|
|
||||||
|
|
||||||
result->size = RSA_size(rsa);
|
|
||||||
result->data = (char *)malloc(result->size);
|
|
||||||
|
|
||||||
if (RSA_public_encrypt(
|
|
||||||
strlen(password) + 1,
|
|
||||||
(uint8_t*)password,
|
|
||||||
(uint8_t*)result->data,
|
|
||||||
rsa,
|
|
||||||
RSA_PKCS1_OAEP_PADDING
|
|
||||||
) <= 0)
|
|
||||||
{
|
|
||||||
free(result->data);
|
|
||||||
result->size = 0;
|
|
||||||
result->data = NULL;
|
|
||||||
|
|
||||||
DEBUG_ERROR("rsa public encrypt failed");
|
|
||||||
EVP_PKEY_free(rsaKey);
|
|
||||||
BIO_free(bioKey);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
EVP_PKEY_free(rsaKey);
|
|
||||||
BIO_free(bioKey);
|
|
||||||
return true;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(USE_NETTLE)
|
|
||||||
struct asn1_der_iterator der;
|
|
||||||
struct asn1_der_iterator j;
|
|
||||||
struct rsa_public_key pub;
|
|
||||||
|
|
||||||
if (asn1_der_iterator_first(&der, SPICE_TICKET_PUBKEY_BYTES, pub_key) == ASN1_ITERATOR_CONSTRUCTED
|
|
||||||
&& der.type == ASN1_SEQUENCE
|
|
||||||
&& asn1_der_decode_constructed_last(&der) == ASN1_ITERATOR_CONSTRUCTED
|
|
||||||
&& der.type == ASN1_SEQUENCE
|
|
||||||
&& asn1_der_decode_constructed(&der, &j) == ASN1_ITERATOR_PRIMITIVE
|
|
||||||
&& j.type == ASN1_IDENTIFIER
|
|
||||||
&& asn1_der_iterator_next(&der) == ASN1_ITERATOR_PRIMITIVE
|
|
||||||
&& der.type == ASN1_BITSTRING
|
|
||||||
&& asn1_der_decode_bitstring_last(&der))
|
|
||||||
{
|
|
||||||
if (j.length != 9)
|
|
||||||
{
|
|
||||||
DEBUG_ERROR("Invalid key, not RSA");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (asn1_der_iterator_next(&j) == ASN1_ITERATOR_PRIMITIVE
|
|
||||||
&& j.type == ASN1_NULL
|
|
||||||
&& j.length == 0
|
|
||||||
&& asn1_der_iterator_next(&j) == ASN1_ITERATOR_END)
|
|
||||||
{
|
|
||||||
rsa_public_key_init(&pub);
|
|
||||||
if (!rsa_public_key_from_der_iterator(&pub, 0, &der))
|
|
||||||
{
|
|
||||||
DEBUG_ERROR("Unable to load public key from DER iterator");
|
|
||||||
rsa_public_key_clear(&pub);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mpz_t p;
|
|
||||||
mpz_init(p);
|
|
||||||
oaep_pad(p, pub.size, (uint8_t *)password, strlen(password)+1);
|
|
||||||
mpz_powm(p, p, pub.e, pub.n);
|
|
||||||
|
|
||||||
result->size = pub.size;
|
|
||||||
result->data = malloc(pub.size);
|
|
||||||
nettle_mpz_get_str_256(pub.size, (uint8_t *)result->data, p);
|
|
||||||
|
|
||||||
rsa_public_key_clear(&pub);
|
|
||||||
mpz_clear(p);
|
|
||||||
return true;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void spice_rsa_free_password(struct spice_password * pass)
|
|
||||||
{
|
|
||||||
free(pass->data);
|
|
||||||
pass->size = 0;
|
|
||||||
pass->data = NULL;
|
|
||||||
}
|
|
@ -1,30 +0,0 @@
|
|||||||
/*
|
|
||||||
Looking Glass - KVM FrameRelay (KVMFR) Client
|
|
||||||
Copyright (C) 2017-2019 Geoffrey McRae <geoff@hostfission.com>
|
|
||||||
https://looking-glass.hostfission.com
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it under
|
|
||||||
the terms of the GNU General Public License as published by the Free Software
|
|
||||||
Foundation; either version 2 of the License, or (at your option) any later
|
|
||||||
version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
|
||||||
PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along with
|
|
||||||
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
|
||||||
Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
struct spice_password
|
|
||||||
{
|
|
||||||
char * data;
|
|
||||||
unsigned int size;
|
|
||||||
};
|
|
||||||
|
|
||||||
bool spice_rsa_encrypt_password(uint8_t * pub_key, char * password, struct spice_password * result);
|
|
||||||
void spice_rsa_free_password(struct spice_password * pass);
|
|
File diff suppressed because it is too large
Load Diff
@ -60,7 +60,7 @@ set(SOURCES
|
|||||||
)
|
)
|
||||||
|
|
||||||
add_subdirectory("${PROJECT_TOP}/common" "${CMAKE_BINARY_DIR}/common")
|
add_subdirectory("${PROJECT_TOP}/common" "${CMAKE_BINARY_DIR}/common")
|
||||||
add_subdirectory("${PROJECT_TOP}/LGMP/lgmp" "${CMAKE_BINARY_DIR}/lgmp")
|
add_subdirectory("${PROJECT_TOP}/repos/LGMP/lgmp" "${CMAKE_BINARY_DIR}/lgmp" )
|
||||||
|
|
||||||
add_library(looking-glass-obs SHARED ${SOURCES})
|
add_library(looking-glass-obs SHARED ${SOURCES})
|
||||||
target_link_libraries(looking-glass-obs
|
target_link_libraries(looking-glass-obs
|
||||||
|
1
repos/PureSpice
Submodule
1
repos/PureSpice
Submodule
@ -0,0 +1 @@
|
|||||||
|
Subproject commit ca4d61aa15bfc3781f25f364fba9b4fd0bf3fbf4
|
Loading…
Reference in New Issue
Block a user