libfreerdp-utils: datablob->blob
This commit is contained in:
parent
d8ce866c92
commit
9f48b605ea
@ -1,6 +1,6 @@
|
||||
/**
|
||||
* FreeRDP: A Remote Desktop Protocol Client
|
||||
* DATABLOB Utils
|
||||
* BLOB Utils
|
||||
*
|
||||
* Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
|
||||
*
|
||||
@ -17,17 +17,17 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef __DATABLOB_UTILS_H
|
||||
#define __DATABLOB_UTILS_H
|
||||
#ifndef __BLOB_UTILS_H
|
||||
#define __BLOB_UTILS_H
|
||||
|
||||
struct _DATABLOB
|
||||
struct rdp_blob
|
||||
{
|
||||
void* data;
|
||||
int length;
|
||||
};
|
||||
typedef struct _DATABLOB DATABLOB;
|
||||
typedef struct rdp_blob BLOB;
|
||||
|
||||
void datablob_alloc(DATABLOB *datablob, int length);
|
||||
void datablob_free(DATABLOB *datablob);
|
||||
void freerdp_blob_alloc(BLOB* blob, int length);
|
||||
void freerdp_blob_free(BLOB* blob);
|
||||
|
||||
#endif /* __DATABLOB_UTILS_H */
|
||||
#endif /* __BLOB_UTILS_H */
|
@ -126,7 +126,7 @@ int credssp_authenticate(rdpCredssp *credssp)
|
||||
s->p = s->data = credssp->negoToken.data;
|
||||
ntlmssp_recv(ntlmssp, s);
|
||||
|
||||
datablob_free(&credssp->negoToken);
|
||||
freerdp_blob_free(&credssp->negoToken);
|
||||
|
||||
/* NTLMSSP AUTHENTICATE MESSAGE */
|
||||
s->p = s->data = negoTokenBuffer;
|
||||
@ -148,8 +148,8 @@ int credssp_authenticate(rdpCredssp *credssp)
|
||||
return 0; /* DO NOT SEND CREDENTIALS! */
|
||||
}
|
||||
|
||||
datablob_free(&credssp->negoToken);
|
||||
datablob_free(&credssp->pubKeyAuth);
|
||||
freerdp_blob_free(&credssp->negoToken);
|
||||
freerdp_blob_free(&credssp->pubKeyAuth);
|
||||
|
||||
/* Send encrypted credentials */
|
||||
credssp_encode_ts_credentials(credssp);
|
||||
@ -167,14 +167,14 @@ int credssp_authenticate(rdpCredssp *credssp)
|
||||
* @param s
|
||||
*/
|
||||
|
||||
void credssp_encrypt_public_key(rdpCredssp *credssp, DATABLOB *d)
|
||||
void credssp_encrypt_public_key(rdpCredssp* credssp, BLOB* d)
|
||||
{
|
||||
uint8 *p;
|
||||
uint8 signature[16];
|
||||
DATABLOB encrypted_public_key;
|
||||
BLOB encrypted_public_key;
|
||||
NTLMSSP *ntlmssp = credssp->ntlmssp;
|
||||
|
||||
datablob_alloc(d, credssp->public_key.length + 16);
|
||||
freerdp_blob_alloc(d, credssp->public_key.length + 16);
|
||||
ntlmssp_encrypt_message(ntlmssp, &credssp->public_key, &encrypted_public_key, signature);
|
||||
|
||||
#ifdef WITH_DEBUG_NLA
|
||||
@ -195,7 +195,7 @@ void credssp_encrypt_public_key(rdpCredssp *credssp, DATABLOB *d)
|
||||
memcpy(p, signature, 16); /* Message Signature */
|
||||
memcpy(&p[16], encrypted_public_key.data, encrypted_public_key.length); /* Encrypted Public Key */
|
||||
|
||||
datablob_free(&encrypted_public_key);
|
||||
freerdp_blob_free(&encrypted_public_key);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -205,12 +205,12 @@ void credssp_encrypt_public_key(rdpCredssp *credssp, DATABLOB *d)
|
||||
* @return 1 if verification is successful, 0 otherwise
|
||||
*/
|
||||
|
||||
int credssp_verify_public_key(rdpCredssp *credssp, DATABLOB *d)
|
||||
int credssp_verify_public_key(rdpCredssp* credssp, BLOB* d)
|
||||
{
|
||||
uint8 *p1, *p2;
|
||||
uint8 *signature;
|
||||
DATABLOB public_key;
|
||||
DATABLOB encrypted_public_key;
|
||||
BLOB public_key;
|
||||
BLOB encrypted_public_key;
|
||||
|
||||
signature = d->data;
|
||||
encrypted_public_key.data = (void*) (signature + 16);
|
||||
@ -230,7 +230,7 @@ int credssp_verify_public_key(rdpCredssp *credssp, DATABLOB *d)
|
||||
}
|
||||
|
||||
p2[0]++;
|
||||
datablob_free(&public_key);
|
||||
freerdp_blob_free(&public_key);
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -240,14 +240,14 @@ int credssp_verify_public_key(rdpCredssp *credssp, DATABLOB *d)
|
||||
* @param s
|
||||
*/
|
||||
|
||||
void credssp_encrypt_ts_credentials(rdpCredssp *credssp, DATABLOB *d)
|
||||
void credssp_encrypt_ts_credentials(rdpCredssp* credssp, BLOB* d)
|
||||
{
|
||||
uint8 *p;
|
||||
uint8 signature[16];
|
||||
DATABLOB encrypted_ts_credentials;
|
||||
BLOB encrypted_ts_credentials;
|
||||
NTLMSSP *ntlmssp = credssp->ntlmssp;
|
||||
|
||||
datablob_alloc(d, credssp->ts_credentials.length + 16);
|
||||
freerdp_blob_alloc(d, credssp->ts_credentials.length + 16);
|
||||
ntlmssp_encrypt_message(ntlmssp, &credssp->ts_credentials, &encrypted_ts_credentials, signature);
|
||||
|
||||
#ifdef WITH_DEBUG_NLA
|
||||
@ -268,7 +268,7 @@ void credssp_encrypt_ts_credentials(rdpCredssp *credssp, DATABLOB *d)
|
||||
memcpy(p, signature, 16); /* Message Signature */
|
||||
memcpy(&p[16], encrypted_ts_credentials.data, encrypted_ts_credentials.length); /* Encrypted TSCredentials */
|
||||
|
||||
datablob_free(&encrypted_ts_credentials);
|
||||
freerdp_blob_free(&encrypted_ts_credentials);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -281,7 +281,7 @@ void credssp_encode_ts_credentials(rdpCredssp *credssp)
|
||||
asn_enc_rval_t enc_rval;
|
||||
TSCredentials_t *ts_credentials;
|
||||
TSPasswordCreds_t *ts_passwoFRDP_creds;
|
||||
DATABLOB ts_passwoFRDP_creds_buffer = { 0 };
|
||||
BLOB ts_passwoFRDP_creds_buffer = { 0 };
|
||||
|
||||
ts_credentials = calloc(1, sizeof(TSCredentials_t));
|
||||
ts_credentials->credType = 1; /* TSPasswordCreds */
|
||||
@ -305,7 +305,7 @@ void credssp_encode_ts_credentials(rdpCredssp *credssp)
|
||||
|
||||
if (enc_rval.encoded != -1)
|
||||
{
|
||||
datablob_alloc(&ts_passwoFRDP_creds_buffer, enc_rval.encoded);
|
||||
freerdp_blob_alloc(&ts_passwoFRDP_creds_buffer, enc_rval.encoded);
|
||||
|
||||
enc_rval = der_encode_to_buffer(&asn_DEF_TSPasswordCreds, ts_passwoFRDP_creds,
|
||||
ts_passwoFRDP_creds_buffer.data, ts_passwoFRDP_creds_buffer.length);
|
||||
@ -319,13 +319,13 @@ void credssp_encode_ts_credentials(rdpCredssp *credssp)
|
||||
|
||||
if (enc_rval.encoded != -1)
|
||||
{
|
||||
datablob_alloc(&credssp->ts_credentials, enc_rval.encoded);
|
||||
freerdp_blob_alloc(&credssp->ts_credentials, enc_rval.encoded);
|
||||
|
||||
enc_rval = der_encode_to_buffer(&asn_DEF_TSCredentials, ts_credentials,
|
||||
credssp->ts_credentials.data, credssp->ts_credentials.length);
|
||||
}
|
||||
|
||||
datablob_free(&ts_passwoFRDP_creds_buffer);
|
||||
freerdp_blob_free(&ts_passwoFRDP_creds_buffer);
|
||||
free(ts_credentials);
|
||||
free(ts_passwoFRDP_creds);
|
||||
}
|
||||
@ -338,7 +338,7 @@ void credssp_encode_ts_credentials(rdpCredssp *credssp)
|
||||
* @param authInfo
|
||||
*/
|
||||
|
||||
void credssp_send(rdpCredssp *credssp, DATABLOB *negoToken, DATABLOB *pubKeyAuth, DATABLOB *authInfo)
|
||||
void credssp_send(rdpCredssp* credssp, BLOB* negoToken, BLOB* pubKeyAuth, BLOB* authInfo)
|
||||
{
|
||||
TSRequest_t *ts_request;
|
||||
OCTET_STRING_t *nego_token;
|
||||
@ -403,7 +403,7 @@ void credssp_send(rdpCredssp *credssp, DATABLOB *negoToken, DATABLOB *pubKeyAuth
|
||||
* @return
|
||||
*/
|
||||
|
||||
int credssp_recv(rdpCredssp *credssp, DATABLOB *negoToken, DATABLOB *pubKeyAuth, DATABLOB *authInfo)
|
||||
int credssp_recv(rdpCredssp* credssp, BLOB* negoToken, BLOB* pubKeyAuth, BLOB* authInfo)
|
||||
{
|
||||
int bytes_read;
|
||||
int size = 2048;
|
||||
@ -425,14 +425,14 @@ int credssp_recv(rdpCredssp *credssp, DATABLOB *negoToken, DATABLOB *pubKeyAuth,
|
||||
{
|
||||
if (ts_request->negoTokens->list.count > 0)
|
||||
{
|
||||
datablob_alloc(negoToken, ts_request->negoTokens->list.array[0]->negoToken.size);
|
||||
freerdp_blob_alloc(negoToken, ts_request->negoTokens->list.array[0]->negoToken.size);
|
||||
memcpy(negoToken->data, ts_request->negoTokens->list.array[0]->negoToken.buf, negoToken->length);
|
||||
}
|
||||
}
|
||||
|
||||
if (ts_request->pubKeyAuth != NULL)
|
||||
{
|
||||
datablob_alloc(pubKeyAuth, ts_request->pubKeyAuth->size);
|
||||
freerdp_blob_alloc(pubKeyAuth, ts_request->pubKeyAuth->size);
|
||||
memcpy(pubKeyAuth->data, ts_request->pubKeyAuth->buf, pubKeyAuth->length);
|
||||
}
|
||||
|
||||
@ -497,14 +497,15 @@ credssp_new(rdpTransport * transport)
|
||||
{
|
||||
rdpCredssp* self;
|
||||
|
||||
self = (rdpCredssp *) xmalloc(sizeof(rdpCredssp));
|
||||
self = (rdpCredssp*) xzalloc(sizeof(rdpCredssp));
|
||||
|
||||
if (self != NULL)
|
||||
{
|
||||
memset(self, 0, sizeof(rdpCredssp));
|
||||
self->transport = transport;
|
||||
self->send_seq_num = 0;
|
||||
self->ntlmssp = ntlmssp_new();
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
@ -518,8 +519,8 @@ credssp_free(rdpCredssp * credssp)
|
||||
{
|
||||
if (credssp != NULL)
|
||||
{
|
||||
datablob_free(&credssp->public_key);
|
||||
datablob_free(&credssp->ts_credentials);
|
||||
freerdp_blob_free(&credssp->public_key);
|
||||
freerdp_blob_free(&credssp->ts_credentials);
|
||||
|
||||
ntlmssp_free(credssp->ntlmssp);
|
||||
xfree(credssp);
|
||||
|
@ -24,21 +24,21 @@
|
||||
#include "crypto.h"
|
||||
#include "transport.h"
|
||||
#include <freerdp/settings.h>
|
||||
#include <freerdp/utils/blob.h>
|
||||
#include <freerdp/utils/memory.h>
|
||||
#include <freerdp/utils/stream.h>
|
||||
#include <freerdp/utils/hexdump.h>
|
||||
#include <freerdp/utils/datablob.h>
|
||||
|
||||
#include "ntlmssp.h"
|
||||
|
||||
struct rdp_credssp
|
||||
{
|
||||
DATABLOB negoToken;
|
||||
DATABLOB pubKeyAuth;
|
||||
DATABLOB authInfo;
|
||||
BLOB negoToken;
|
||||
BLOB pubKeyAuth;
|
||||
BLOB authInfo;
|
||||
int send_seq_num;
|
||||
DATABLOB public_key;
|
||||
DATABLOB ts_credentials;
|
||||
BLOB public_key;
|
||||
BLOB ts_credentials;
|
||||
CryptoRc4 rc4_seal_state;
|
||||
struct _NTLMSSP *ntlmssp;
|
||||
struct rdp_transport * transport;
|
||||
@ -47,12 +47,12 @@ typedef struct rdp_credssp rdpCredssp;
|
||||
|
||||
int credssp_authenticate(rdpCredssp* credssp);
|
||||
|
||||
void credssp_send(rdpCredssp *credssp, DATABLOB *negoToken, DATABLOB *pubKeyAuth, DATABLOB *authInfo);
|
||||
int credssp_recv(rdpCredssp *credssp, DATABLOB *negoToken, DATABLOB *pubKeyAuth, DATABLOB *authInfo);
|
||||
void credssp_send(rdpCredssp* credssp, BLOB* negoToken, BLOB* pubKeyAuth, BLOB* authInfo);
|
||||
int credssp_recv(rdpCredssp* credssp, BLOB* negoToken, BLOB* pubKeyAuth, BLOB* authInfo);
|
||||
|
||||
void credssp_encrypt_public_key(rdpCredssp *credssp, DATABLOB *d);
|
||||
void credssp_encrypt_ts_credentials(rdpCredssp *credssp, DATABLOB *d);
|
||||
int credssp_verify_public_key(rdpCredssp *credssp, DATABLOB *d);
|
||||
void credssp_encrypt_public_key(rdpCredssp* credssp, BLOB* d);
|
||||
void credssp_encrypt_ts_credentials(rdpCredssp* credssp, BLOB* d);
|
||||
int credssp_verify_public_key(rdpCredssp* credssp, BLOB* d);
|
||||
void credssp_encode_ts_credentials(rdpCredssp* credssp);
|
||||
|
||||
void credssp_current_time(uint8* timestamp);
|
||||
|
@ -91,7 +91,7 @@ boolean crypto_cert_verify(CryptoCert server_cert, CryptoCert cacert)
|
||||
return True; /* FIXME: do the actual verification */
|
||||
}
|
||||
|
||||
boolean crypto_cert_get_public_key(CryptoCert cert, DATABLOB* public_key)
|
||||
boolean crypto_cert_get_public_key(CryptoCert cert, BLOB* public_key)
|
||||
{
|
||||
uint8* p;
|
||||
int length;
|
||||
@ -116,7 +116,7 @@ boolean crypto_cert_get_public_key(CryptoCert cert, DATABLOB* public_key)
|
||||
goto exit;
|
||||
}
|
||||
|
||||
datablob_alloc(public_key, length);
|
||||
freerdp_blob_alloc(public_key, length);
|
||||
p = (unsigned char*) public_key->data;
|
||||
i2d_PublicKey(pkey, &p);
|
||||
|
||||
|
@ -36,8 +36,8 @@
|
||||
#endif
|
||||
|
||||
#include <freerdp/freerdp.h>
|
||||
#include <freerdp/utils/blob.h>
|
||||
#include <freerdp/utils/memory.h>
|
||||
#include <freerdp/utils/datablob.h>
|
||||
|
||||
struct crypto_sha1_struct
|
||||
{
|
||||
@ -78,7 +78,7 @@ typedef struct crypto_cert_struct* CryptoCert;
|
||||
CryptoCert crypto_cert_read(uint8* data, uint32 length);
|
||||
void crypto_cert_free(CryptoCert cert);
|
||||
boolean crypto_cert_verify(CryptoCert server_cert, CryptoCert cacert);
|
||||
boolean crypto_cert_get_public_key(CryptoCert cert, DATABLOB* public_key);
|
||||
boolean crypto_cert_get_public_key(CryptoCert cert, BLOB* public_key);
|
||||
|
||||
void crypto_nonce(uint8* nonce, int size);
|
||||
|
||||
|
@ -94,7 +94,7 @@ const char server_seal_magic[] = "session key to server-to-client sealing key ma
|
||||
|
||||
void ntlmssp_set_username(NTLMSSP* ntlmssp, char* username)
|
||||
{
|
||||
datablob_free(&ntlmssp->username);
|
||||
freerdp_blob_free(&ntlmssp->username);
|
||||
|
||||
if (username != NULL)
|
||||
{
|
||||
@ -110,7 +110,7 @@ void ntlmssp_set_username(NTLMSSP *ntlmssp, char* username)
|
||||
|
||||
void ntlmssp_set_domain(NTLMSSP* ntlmssp, char* domain)
|
||||
{
|
||||
datablob_free(&ntlmssp->domain);
|
||||
freerdp_blob_free(&ntlmssp->domain);
|
||||
|
||||
if (domain != NULL)
|
||||
{
|
||||
@ -126,7 +126,7 @@ void ntlmssp_set_domain(NTLMSSP *ntlmssp, char* domain)
|
||||
|
||||
void ntlmssp_set_password(NTLMSSP* ntlmssp, char* password)
|
||||
{
|
||||
datablob_free(&ntlmssp->password);
|
||||
freerdp_blob_free(&ntlmssp->password);
|
||||
|
||||
if (password != NULL)
|
||||
{
|
||||
@ -215,7 +215,7 @@ void ntlmssp_generate_timestamp(NTLMSSP *ntlmssp)
|
||||
* @param signing_key Destination signing key
|
||||
*/
|
||||
|
||||
void ntlmssp_generate_signing_key(uint8* exported_session_key, DATABLOB *sign_magic, uint8* signing_key)
|
||||
void ntlmssp_generate_signing_key(uint8* exported_session_key, BLOB* sign_magic, uint8* signing_key)
|
||||
{
|
||||
int length;
|
||||
uint8* value;
|
||||
@ -243,7 +243,7 @@ void ntlmssp_generate_signing_key(uint8* exported_session_key, DATABLOB *sign_ma
|
||||
|
||||
void ntlmssp_generate_client_signing_key(NTLMSSP* ntlmssp)
|
||||
{
|
||||
DATABLOB sign_magic;
|
||||
BLOB sign_magic;
|
||||
sign_magic.data = (void*) client_sign_magic;
|
||||
sign_magic.length = sizeof(client_sign_magic);
|
||||
ntlmssp_generate_signing_key(ntlmssp->exported_session_key, &sign_magic, ntlmssp->client_signing_key);
|
||||
@ -257,7 +257,7 @@ void ntlmssp_generate_client_signing_key(NTLMSSP *ntlmssp)
|
||||
|
||||
void ntlmssp_generate_server_signing_key(NTLMSSP* ntlmssp)
|
||||
{
|
||||
DATABLOB sign_magic;
|
||||
BLOB sign_magic;
|
||||
sign_magic.data = (void*) server_sign_magic;
|
||||
sign_magic.length = sizeof(server_sign_magic);
|
||||
ntlmssp_generate_signing_key(ntlmssp->exported_session_key, &sign_magic, ntlmssp->server_signing_key);
|
||||
@ -271,13 +271,13 @@ void ntlmssp_generate_server_signing_key(NTLMSSP *ntlmssp)
|
||||
* @param sealing_key Destination sealing key
|
||||
*/
|
||||
|
||||
void ntlmssp_generate_sealing_key(uint8* exported_session_key, DATABLOB *seal_magic, uint8* sealing_key)
|
||||
void ntlmssp_generate_sealing_key(uint8* exported_session_key, BLOB* seal_magic, uint8* sealing_key)
|
||||
{
|
||||
uint8* p;
|
||||
CryptoMd5 md5;
|
||||
DATABLOB blob;
|
||||
BLOB blob;
|
||||
|
||||
datablob_alloc(&blob, 16 + seal_magic->length);
|
||||
freerdp_blob_alloc(&blob, 16 + seal_magic->length);
|
||||
p = (uint8*) blob.data;
|
||||
|
||||
/* Concatenate ExportedSessionKey with seal magic */
|
||||
@ -288,7 +288,7 @@ void ntlmssp_generate_sealing_key(uint8* exported_session_key, DATABLOB *seal_ma
|
||||
crypto_md5_update(md5, blob.data, blob.length);
|
||||
crypto_md5_final(md5, sealing_key);
|
||||
|
||||
datablob_free(&blob);
|
||||
freerdp_blob_free(&blob);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -299,7 +299,7 @@ void ntlmssp_generate_sealing_key(uint8* exported_session_key, DATABLOB *seal_ma
|
||||
|
||||
void ntlmssp_generate_client_sealing_key(NTLMSSP* ntlmssp)
|
||||
{
|
||||
DATABLOB seal_magic;
|
||||
BLOB seal_magic;
|
||||
seal_magic.data = (void*) client_seal_magic;
|
||||
seal_magic.length = sizeof(client_seal_magic);
|
||||
ntlmssp_generate_signing_key(ntlmssp->exported_session_key, &seal_magic, ntlmssp->client_sealing_key);
|
||||
@ -313,7 +313,7 @@ void ntlmssp_generate_client_sealing_key(NTLMSSP *ntlmssp)
|
||||
|
||||
void ntlmssp_generate_server_sealing_key(NTLMSSP* ntlmssp)
|
||||
{
|
||||
DATABLOB seal_magic;
|
||||
BLOB seal_magic;
|
||||
seal_magic.data = (void*) server_seal_magic;
|
||||
seal_magic.length = sizeof(server_seal_magic);
|
||||
ntlmssp_generate_signing_key(ntlmssp->exported_session_key, &seal_magic, ntlmssp->server_sealing_key);
|
||||
@ -420,7 +420,7 @@ void ntlmssp_compute_lm_hash(char* password, char* hash)
|
||||
DES_ecb_encrypt((const_DES_cblock*) lm_magic, (DES_cblock*)&hash[8], &ks, DES_ENCRYPT);
|
||||
}
|
||||
|
||||
void ntlmssp_compute_ntlm_hash(DATABLOB* password, char* hash)
|
||||
void ntlmssp_compute_ntlm_hash(BLOB* password, char* hash)
|
||||
{
|
||||
/* NTLMv1("password") = 8846F7EAEE8FB117AD06BDD830B7586C */
|
||||
|
||||
@ -438,10 +438,10 @@ void ntlmssp_compute_ntlm_hash(DATABLOB* password, char* hash)
|
||||
void ntlmssp_compute_ntlm_v2_hash(NTLMSSP* ntlmssp, char* hash)
|
||||
{
|
||||
char* p;
|
||||
DATABLOB blob;
|
||||
BLOB blob;
|
||||
char ntlm_hash[16];
|
||||
|
||||
datablob_alloc(&blob, ntlmssp->username.length + ntlmssp->domain.length);
|
||||
freerdp_blob_alloc(&blob, ntlmssp->username.length + ntlmssp->domain.length);
|
||||
p = (char*) blob.data;
|
||||
|
||||
/* First, compute the NTLMv1 hash of the password */
|
||||
@ -456,7 +456,7 @@ void ntlmssp_compute_ntlm_v2_hash(NTLMSSP *ntlmssp, char* hash)
|
||||
/* Compute the HMAC-MD5 hash of the above value using the NTLMv1 hash as the key, the result is the NTLMv2 hash */
|
||||
HMAC(EVP_md5(), (void*) ntlm_hash, 16, blob.data, blob.length, (void*) hash, NULL);
|
||||
|
||||
datablob_free(&blob);
|
||||
freerdp_blob_free(&blob);
|
||||
}
|
||||
|
||||
void ntlmssp_compute_lm_response(char* password, char* challenge, char* response)
|
||||
@ -500,7 +500,7 @@ void ntlmssp_compute_lm_v2_response(NTLMSSP *ntlmssp)
|
||||
memcpy(value, ntlmssp->server_challenge, 8);
|
||||
memcpy(&value[8], ntlmssp->client_challenge, 8);
|
||||
|
||||
datablob_alloc(&ntlmssp->lm_challenge_response, 24);
|
||||
freerdp_blob_alloc(&ntlmssp->lm_challenge_response, 24);
|
||||
response = (char*) ntlmssp->lm_challenge_response.data;
|
||||
|
||||
/* Compute the HMAC-MD5 hash of the resulting value using the NTLMv2 hash as the key */
|
||||
@ -522,10 +522,10 @@ void ntlmssp_compute_ntlm_v2_response(NTLMSSP *ntlmssp)
|
||||
uint8* blob;
|
||||
uint8 ntlm_v2_hash[16];
|
||||
uint8 nt_proof_str[16];
|
||||
DATABLOB ntlm_v2_temp;
|
||||
DATABLOB ntlm_v2_temp_chal;
|
||||
BLOB ntlm_v2_temp;
|
||||
BLOB ntlm_v2_temp_chal;
|
||||
|
||||
datablob_alloc(&ntlm_v2_temp, ntlmssp->target_info.length + 28);
|
||||
freerdp_blob_alloc(&ntlm_v2_temp, ntlmssp->target_info.length + 28);
|
||||
|
||||
memset(ntlm_v2_temp.data, '\0', ntlm_v2_temp.length);
|
||||
blob = (uint8*) ntlm_v2_temp.data;
|
||||
@ -568,7 +568,7 @@ void ntlmssp_compute_ntlm_v2_response(NTLMSSP *ntlmssp)
|
||||
#endif
|
||||
|
||||
/* Concatenate server challenge with temp */
|
||||
datablob_alloc(&ntlm_v2_temp_chal, ntlm_v2_temp.length + 8);
|
||||
freerdp_blob_alloc(&ntlm_v2_temp_chal, ntlm_v2_temp.length + 8);
|
||||
blob = (uint8*) ntlm_v2_temp_chal.data;
|
||||
memcpy(blob, ntlmssp->server_challenge, 8);
|
||||
memcpy(&blob[8], ntlm_v2_temp.data, ntlm_v2_temp.length);
|
||||
@ -577,7 +577,7 @@ void ntlmssp_compute_ntlm_v2_response(NTLMSSP *ntlmssp)
|
||||
ntlm_v2_temp_chal.length, (void*) nt_proof_str, NULL);
|
||||
|
||||
/* NtChallengeResponse, Concatenate NTProofStr with temp */
|
||||
datablob_alloc(&ntlmssp->nt_challenge_response, ntlm_v2_temp.length + 16);
|
||||
freerdp_blob_alloc(&ntlmssp->nt_challenge_response, ntlm_v2_temp.length + 16);
|
||||
blob = (uint8*) ntlmssp->nt_challenge_response.data;
|
||||
memcpy(blob, nt_proof_str, 16);
|
||||
memcpy(&blob[16], ntlm_v2_temp.data, ntlm_v2_temp.length);
|
||||
@ -586,8 +586,8 @@ void ntlmssp_compute_ntlm_v2_response(NTLMSSP *ntlmssp)
|
||||
HMAC(EVP_md5(), (void*) ntlm_v2_hash, 16,
|
||||
(void*) nt_proof_str, 16, (void*) ntlmssp->session_base_key, NULL);
|
||||
|
||||
datablob_free(&ntlm_v2_temp);
|
||||
datablob_free(&ntlm_v2_temp_chal);
|
||||
freerdp_blob_free(&ntlm_v2_temp);
|
||||
freerdp_blob_free(&ntlm_v2_temp_chal);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -744,7 +744,7 @@ static void ntlmssp_output_restriction_encoding(NTLMSSP *ntlmssp)
|
||||
void ntlmssp_populate_av_pairs(NTLMSSP* ntlmssp)
|
||||
{
|
||||
STREAM* s;
|
||||
DATABLOB target_info;
|
||||
BLOB target_info;
|
||||
AV_PAIRS *av_pairs = ntlmssp->av_pairs;
|
||||
|
||||
/* MsvAvFlags */
|
||||
@ -758,7 +758,7 @@ void ntlmssp_populate_av_pairs(NTLMSSP *ntlmssp)
|
||||
s->p = s->data;
|
||||
|
||||
ntlmssp_output_av_pairs(ntlmssp, s);
|
||||
datablob_alloc(&target_info, s->p - s->data);
|
||||
freerdp_blob_alloc(&target_info, s->p - s->data);
|
||||
memcpy(target_info.data, s->data, target_info.length);
|
||||
|
||||
ntlmssp->target_info.data = target_info.data;
|
||||
@ -1035,7 +1035,7 @@ void ntlmssp_compute_message_integrity_check(NTLMSSP *ntlmssp)
|
||||
* @param[out] signature destination signature
|
||||
*/
|
||||
|
||||
void ntlmssp_encrypt_message(NTLMSSP *ntlmssp, DATABLOB *msg, DATABLOB *encrypted_msg, uint8* signature)
|
||||
void ntlmssp_encrypt_message(NTLMSSP* ntlmssp, BLOB* msg, BLOB* encrypted_msg, uint8* signature)
|
||||
{
|
||||
HMAC_CTX hmac_ctx;
|
||||
uint8 digest[16];
|
||||
@ -1050,7 +1050,7 @@ void ntlmssp_encrypt_message(NTLMSSP *ntlmssp, DATABLOB *msg, DATABLOB *encrypte
|
||||
HMAC_Final(&hmac_ctx, digest, NULL);
|
||||
|
||||
/* Allocate space for encrypted message */
|
||||
datablob_alloc(encrypted_msg, msg->length);
|
||||
freerdp_blob_alloc(encrypted_msg, msg->length);
|
||||
|
||||
/* Encrypt message using with RC4 */
|
||||
crypto_rc4(ntlmssp->send_rc4_seal, msg->length, msg->data, encrypted_msg->data);
|
||||
@ -1079,7 +1079,7 @@ void ntlmssp_encrypt_message(NTLMSSP *ntlmssp, DATABLOB *msg, DATABLOB *encrypte
|
||||
* @return
|
||||
*/
|
||||
|
||||
int ntlmssp_decrypt_message(NTLMSSP *ntlmssp, DATABLOB *encrypted_msg, DATABLOB *msg, uint8* signature)
|
||||
int ntlmssp_decrypt_message(NTLMSSP* ntlmssp, BLOB* encrypted_msg, BLOB* msg, uint8* signature)
|
||||
{
|
||||
HMAC_CTX hmac_ctx;
|
||||
uint8 digest[16];
|
||||
@ -1088,7 +1088,7 @@ int ntlmssp_decrypt_message(NTLMSSP *ntlmssp, DATABLOB *encrypted_msg, DATABLOB
|
||||
uint8 expected_signature[16];
|
||||
|
||||
/* Allocate space for encrypted message */
|
||||
datablob_alloc(msg, encrypted_msg->length);
|
||||
freerdp_blob_alloc(msg, encrypted_msg->length);
|
||||
|
||||
/* Encrypt message using with RC4 */
|
||||
crypto_rc4(ntlmssp->recv_rc4_seal, encrypted_msg->length, encrypted_msg->data, msg->data);
|
||||
@ -1190,7 +1190,7 @@ void ntlmssp_send_negotiate_message(NTLMSSP *ntlmssp, STREAM* s)
|
||||
}
|
||||
|
||||
length = s->p - s->data;
|
||||
datablob_alloc(&ntlmssp->negotiate_message, length);
|
||||
freerdp_blob_alloc(&ntlmssp->negotiate_message, length);
|
||||
memcpy(ntlmssp->negotiate_message.data, s->data, length);
|
||||
|
||||
#ifdef WITH_DEBUG_NLA
|
||||
@ -1256,7 +1256,7 @@ void ntlmssp_recv_challenge_message(NTLMSSP *ntlmssp, STREAM* s)
|
||||
if (targetNameLen > 0)
|
||||
{
|
||||
p = start_offset + targetNameBufferOffset;
|
||||
datablob_alloc(&ntlmssp->target_name, targetNameLen);
|
||||
freerdp_blob_alloc(&ntlmssp->target_name, targetNameLen);
|
||||
memcpy(ntlmssp->target_name.data, p, targetNameLen);
|
||||
|
||||
#ifdef WITH_DEBUG_NLA
|
||||
@ -1269,7 +1269,7 @@ void ntlmssp_recv_challenge_message(NTLMSSP *ntlmssp, STREAM* s)
|
||||
if (targetInfoLen > 0)
|
||||
{
|
||||
p = start_offset + targetInfoBufferOffset;
|
||||
datablob_alloc(&ntlmssp->target_info, targetInfoLen);
|
||||
freerdp_blob_alloc(&ntlmssp->target_info, targetInfoLen);
|
||||
memcpy(ntlmssp->target_info.data, p, targetInfoLen);
|
||||
|
||||
#ifdef WITH_DEBUG_NLA
|
||||
@ -1287,7 +1287,7 @@ void ntlmssp_recv_challenge_message(NTLMSSP *ntlmssp, STREAM* s)
|
||||
|
||||
length = (payload_offset - start_offset) + targetNameLen + targetInfoLen;
|
||||
|
||||
datablob_alloc(&ntlmssp->challenge_message, length);
|
||||
freerdp_blob_alloc(&ntlmssp->challenge_message, length);
|
||||
memcpy(ntlmssp->challenge_message.data, start_offset, length);
|
||||
|
||||
#ifdef WITH_DEBUG_NLA
|
||||
@ -1579,7 +1579,7 @@ void ntlmssp_send_authenticate_message(NTLMSSP *ntlmssp, STREAM* s)
|
||||
#endif
|
||||
|
||||
length = s->p - s->data;
|
||||
datablob_alloc(&ntlmssp->authenticate_message, length);
|
||||
freerdp_blob_alloc(&ntlmssp->authenticate_message, length);
|
||||
memcpy(ntlmssp->authenticate_message.data, s->data, length);
|
||||
|
||||
if (ntlmssp->ntlm_v2)
|
||||
@ -1679,21 +1679,21 @@ void ntlmssp_init(NTLMSSP *ntlmssp)
|
||||
|
||||
void ntlmssp_uninit(NTLMSSP* ntlmssp)
|
||||
{
|
||||
datablob_free(&ntlmssp->username);
|
||||
datablob_free(&ntlmssp->password);
|
||||
datablob_free(&ntlmssp->domain);
|
||||
freerdp_blob_free(&ntlmssp->username);
|
||||
freerdp_blob_free(&ntlmssp->password);
|
||||
freerdp_blob_free(&ntlmssp->domain);
|
||||
|
||||
datablob_free(&ntlmssp->spn);
|
||||
datablob_free(&ntlmssp->workstation);
|
||||
datablob_free(&ntlmssp->target_info);
|
||||
datablob_free(&ntlmssp->target_name);
|
||||
freerdp_blob_free(&ntlmssp->spn);
|
||||
freerdp_blob_free(&ntlmssp->workstation);
|
||||
freerdp_blob_free(&ntlmssp->target_info);
|
||||
freerdp_blob_free(&ntlmssp->target_name);
|
||||
|
||||
datablob_free(&ntlmssp->negotiate_message);
|
||||
datablob_free(&ntlmssp->challenge_message);
|
||||
datablob_free(&ntlmssp->authenticate_message);
|
||||
freerdp_blob_free(&ntlmssp->negotiate_message);
|
||||
freerdp_blob_free(&ntlmssp->challenge_message);
|
||||
freerdp_blob_free(&ntlmssp->authenticate_message);
|
||||
|
||||
datablob_free(&ntlmssp->lm_challenge_response);
|
||||
datablob_free(&ntlmssp->nt_challenge_response);
|
||||
freerdp_blob_free(&ntlmssp->lm_challenge_response);
|
||||
freerdp_blob_free(&ntlmssp->nt_challenge_response);
|
||||
|
||||
ntlmssp_free_av_pairs(ntlmssp);
|
||||
freerdp_uniconv_free(ntlmssp->uniconv);
|
||||
|
@ -23,9 +23,9 @@
|
||||
#include "credssp.h"
|
||||
|
||||
#include <freerdp/freerdp.h>
|
||||
#include <freerdp/utils/blob.h>
|
||||
#include <freerdp/utils/debug.h>
|
||||
#include <freerdp/utils/unicode.h>
|
||||
#include <freerdp/utils/datablob.h>
|
||||
|
||||
struct _AV_PAIR
|
||||
{
|
||||
@ -78,13 +78,13 @@ typedef enum _NTLMSSP_STATE NTLMSSP_STATE;
|
||||
struct _NTLMSSP
|
||||
{
|
||||
NTLMSSP_STATE state;
|
||||
DATABLOB password;
|
||||
DATABLOB username;
|
||||
DATABLOB domain;
|
||||
DATABLOB workstation;
|
||||
DATABLOB target_info;
|
||||
DATABLOB target_name;
|
||||
DATABLOB spn;
|
||||
BLOB password;
|
||||
BLOB username;
|
||||
BLOB domain;
|
||||
BLOB workstation;
|
||||
BLOB target_info;
|
||||
BLOB target_name;
|
||||
BLOB spn;
|
||||
UNICONV *uniconv;
|
||||
uint32 negotiate_flags;
|
||||
uint8 timestamp[8];
|
||||
@ -100,11 +100,11 @@ struct _NTLMSSP
|
||||
uint8 server_signing_key[16];
|
||||
uint8 server_sealing_key[16];
|
||||
uint8 message_integrity_check[16];
|
||||
DATABLOB nt_challenge_response;
|
||||
DATABLOB lm_challenge_response;
|
||||
DATABLOB negotiate_message;
|
||||
DATABLOB challenge_message;
|
||||
DATABLOB authenticate_message;
|
||||
BLOB nt_challenge_response;
|
||||
BLOB lm_challenge_response;
|
||||
BLOB negotiate_message;
|
||||
BLOB challenge_message;
|
||||
BLOB authenticate_message;
|
||||
CryptoRc4 send_rc4_seal;
|
||||
CryptoRc4 recv_rc4_seal;
|
||||
AV_PAIRS *av_pairs;
|
||||
@ -132,7 +132,7 @@ void ntlmssp_generate_server_sealing_key(NTLMSSP *ntlmssp);
|
||||
void ntlmssp_init_rc4_seal_states(NTLMSSP* ntlmssp);
|
||||
|
||||
void ntlmssp_compute_lm_hash(char* password, char* hash);
|
||||
void ntlmssp_compute_ntlm_hash(DATABLOB* password, char* hash);
|
||||
void ntlmssp_compute_ntlm_hash(BLOB* password, char* hash);
|
||||
void ntlmssp_compute_ntlm_v2_hash(NTLMSSP* ntlmssp, char* hash);
|
||||
|
||||
void ntlmssp_compute_lm_response(char* password, char* challenge, char* response);
|
||||
@ -146,8 +146,8 @@ void ntlmssp_free_av_pairs(NTLMSSP *ntlmssp);
|
||||
|
||||
void ntlmssp_compute_message_integrity_check(NTLMSSP* ntlmssp);
|
||||
|
||||
void ntlmssp_encrypt_message(NTLMSSP *ntlmssp, DATABLOB *msg, DATABLOB *encrypted_msg, uint8* signature);
|
||||
int ntlmssp_decrypt_message(NTLMSSP *ntlmssp, DATABLOB *encrypted_msg, DATABLOB *msg, uint8* signature);
|
||||
void ntlmssp_encrypt_message(NTLMSSP* ntlmssp, BLOB* msg, BLOB* encrypted_msg, uint8* signature);
|
||||
int ntlmssp_decrypt_message(NTLMSSP* ntlmssp, BLOB* encrypted_msg, BLOB* msg, uint8* signature);
|
||||
|
||||
int ntlmssp_recv(NTLMSSP* ntlmssp, STREAM* s);
|
||||
int ntlmssp_send(NTLMSSP* ntlmssp, STREAM* s);
|
||||
|
@ -18,7 +18,7 @@
|
||||
# limitations under the License.
|
||||
|
||||
set(FREERDP_UTILS_SRCS
|
||||
datablob.c
|
||||
blob.c
|
||||
hexdump.c
|
||||
memory.c
|
||||
semaphore.c
|
||||
|
@ -1,6 +1,6 @@
|
||||
/**
|
||||
* FreeRDP: A Remote Desktop Protocol Client
|
||||
* DATABLOB Utils
|
||||
* BLOB Utils
|
||||
*
|
||||
* Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
|
||||
*
|
||||
@ -19,29 +19,29 @@
|
||||
|
||||
#include <freerdp/utils/memory.h>
|
||||
|
||||
#include <freerdp/utils/datablob.h>
|
||||
#include <freerdp/utils/blob.h>
|
||||
|
||||
/**
|
||||
* Allocate memory for data blob.
|
||||
* @param datablob datablob structure
|
||||
* @param blob blob structure
|
||||
* @param length memory length
|
||||
*/
|
||||
|
||||
void datablob_alloc(DATABLOB *datablob, int length)
|
||||
void freerdp_blob_alloc(BLOB* blob, int length)
|
||||
{
|
||||
datablob->data = xmalloc(length);
|
||||
datablob->length = length;
|
||||
blob->data = xmalloc(length);
|
||||
blob->length = length;
|
||||
}
|
||||
|
||||
/**
|
||||
* Free memory allocated for data blob.
|
||||
* @param datablob
|
||||
* @param blob
|
||||
*/
|
||||
|
||||
void datablob_free(DATABLOB *datablob)
|
||||
void freerdp_blob_free(BLOB* blob)
|
||||
{
|
||||
if (datablob->data)
|
||||
xfree(datablob->data);
|
||||
if (blob->data)
|
||||
xfree(blob->data);
|
||||
|
||||
datablob->length = 0;
|
||||
blob->length = 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user