libfreerdp-core: started licensing module

This commit is contained in:
Marc-André Moreau 2011-07-11 20:46:03 -04:00
parent 297334bae2
commit d797e7ce92
9 changed files with 444 additions and 13 deletions

View File

@ -36,11 +36,15 @@ set(LIBFREERDP_CORE_SRCS
credssp.h
ntlmssp.c
ntlmssp.h
license.c
license.h
security.c
security.h
settings.c
connection.c
connection.h
redirection.c
redirection.h
rdp.c
rdp.h
per.c

240
libfreerdp-core/license.c Normal file
View File

@ -0,0 +1,240 @@
/**
* FreeRDP: A Remote Desktop Protocol Client
* RDP Licensing
*
* Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "license.h"
/**
* Receive an RDP licensing packet.\n
* @msdn{cc240479}
* @param rdp RDP module
* @param s stream
* @param sec_flags security flags
*/
void license_recv(rdpLicense* license, STREAM* s, uint16 sec_flags)
{
uint8 flags;
uint8 bMsgType;
uint16 wMsgSize;
printf("SEC_LICENSE_PKT\n");
/* preamble (4 bytes) */
stream_read_uint8(s, bMsgType); /* bMsgType (1 byte) */
stream_read_uint8(s, flags); /* flags (1 byte) */
stream_read_uint16(s, wMsgSize); /* wMsgSize (2 bytes) */
printf("bMsgType:%X, flags:%X, wMsgSize:%02x\n", bMsgType, flags, wMsgSize);
switch (bMsgType)
{
case LICENSE_REQUEST:
license_read_license_request_packet(license, s);
break;
case PLATFORM_CHALLENGE:
license_read_platform_challenge_packet(license, s);
break;
case NEW_LICENSE:
license_read_new_license_packet(license, s);
break;
case UPGRADE_LICENSE:
license_read_upgrade_license_packet(license, s);
break;
case ERROR_ALERT:
license_read_error_alert_packet(license, s);
break;
default:
printf("invalid bMsgType:%d\n", bMsgType);
break;
}
}
/**
* Read PRODUCT_INFO.\n
* @param s stream
* @param productInfo product information
*/
void license_read_product_info(STREAM* s, PRODUCT_INFO* productInfo)
{
stream_read_uint32(s, productInfo->dwVersion); /* dwVersion (4 bytes) */
stream_read_uint32(s, productInfo->cbCompanyName); /* cbCompanyName (4 bytes) */
productInfo->pbCompanyName = (uint8*) xmalloc(productInfo->cbCompanyName);
stream_read(s, productInfo->pbCompanyName, productInfo->cbCompanyName);
stream_read_uint32(s, productInfo->cbProductId); /* cbProductId (4 bytes) */
productInfo->pbProductId = (uint8*) xmalloc(productInfo->cbProductId);
stream_read(s, productInfo->pbProductId, productInfo->cbProductId);
}
void license_read_binary_blob(STREAM* s, LICENSE_BLOB* blob)
{
uint16 wBlobType;
stream_read_uint16(s, wBlobType); /* wBlobType (2 bytes) */
if (blob->type != wBlobType && blob->type != 0)
{
printf("license binary blob type does not match expected type.\n");
return;
}
blob->type = wBlobType;
stream_read_uint16(s, blob->length); /* wBlobLen (2 bytes) */
blob->data = (uint8*) xmalloc(blob->length);
stream_read(s, blob->data, blob->length); /* blobData */
}
void license_read_scope_list(STREAM* s, SCOPE_LIST* scopeList)
{
int i;
uint32 scopeCount;
stream_read_uint32(s, scopeCount); /* ScopeCount (4 bytes) */
scopeList->count = scopeCount;
scopeList->array = (LICENSE_BLOB*) xmalloc(sizeof(LICENSE_BLOB) * scopeCount);
/* ScopeArray */
for (i = 0; i < scopeCount; i++)
{
scopeList->array[i].type = BB_SCOPE_BLOB;
license_read_binary_blob(s, &scopeList->array[i]);
}
}
/**
* Read a LICENSE_REQUEST packet.\n
* @msdn{cc241914}
* @param rdp RDP module
* @param s stream
*/
void license_read_license_request_packet(rdpLicense* license, STREAM* s)
{
printf("LICENSE_REQUEST\n");
/* ServerRandom (32 bytes) */
stream_read(s, license->server_random, 32);
/* ProductInfo */
license_read_product_info(s, &(license->product_info));
/* KeyExchangeList */
license_read_binary_blob(s, &(license->key_exchange_list));
/* ServerCertificate */
license_read_binary_blob(s, &(license->server_certificate));
/* ScopeList */
license_read_scope_list(s, &(license->scope_list));
}
/**
* Read a PLATFORM_CHALLENGE packet.\n
* @msdn{cc241921}
* @param rdp RDP module
* @param s stream
*/
void license_read_platform_challenge_packet(rdpLicense* license, STREAM* s)
{
}
/**
* Read a NEW_LICENSE packet.\n
* @msdn{cc241926}
* @param rdp RDP module
* @param s stream
*/
void license_read_new_license_packet(rdpLicense* license, STREAM* s)
{
}
/**
* Read an UPGRADE_LICENSE packet.\n
* @msdn{cc241924}
* @param rdp RDP module
* @param s stream
*/
void license_read_upgrade_license_packet(rdpLicense* license, STREAM* s)
{
}
/**
* Read an ERROR_ALERT packet.\n
* @msdn{cc240482}
* @param rdp RDP module
* @param s stream
*/
void license_read_error_alert_packet(rdpLicense* license, STREAM* s)
{
}
/**
* Instantiate new license module.
* @return new license module
*/
rdpLicense* license_new()
{
rdpLicense* license;
license = (rdpLicense*) xzalloc(sizeof(rdpLicense));
if (license != NULL)
{
license->key_exchange_list.type = BB_KEY_EXCHG_ALG_BLOB;
license->server_certificate.type = BB_CERTIFICATE_BLOB;
}
return license;
}
/**
* Free license module.
* @param license license module to be freed
*/
void license_free(rdpLicense* license)
{
if (license != NULL)
{
xfree(license);
}
}

108
libfreerdp-core/license.h Normal file
View File

@ -0,0 +1,108 @@
/**
* FreeRDP: A Remote Desktop Protocol Client
* RDP Licensing
*
* Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef __LICENSE_H
#define __LICENSE_H
typedef struct rdp_license rdpLicense;
#include "rdp.h"
#include <freerdp/freerdp.h>
#include <freerdp/utils/stream.h>
/* Licensing Packet Types */
#define LICENSE_REQUEST 0x01
#define PLATFORM_CHALLENGE 0x02
#define NEW_LICENSE 0x03
#define UPGRADE_LICENSE 0x04
#define LICENSE_INFO 0x12
#define NEW_LICENSE_REQUEST 0x13
#define PLATFORM_CHALLENGE_RESPONSE 0x15
#define ERROR_ALERT 0xFF
#define LICENSE_PKT_CS_MASK (LICENSE_INFO | NEW_LICENSE_REQUEST | PLATFORM_CHALLENGE_RESPONSE | ERROR_ALERT)
#define LICENSE_PKT_SC_MASK (LICENSE_REQUEST | PLATFORM_CHALLENGE | NEW_LICENSE | UPGRADE_LICENSE | ERROR_ALERT)
#define LICENSE_PKT_MASK (LICENSE_PKT_CS_MASK | LICENSE_PKT_SC_MASK)
/* Licensing Preamble Flags */
#define PREAMBLE_VERSION_2_0 0x02
#define PREAMBLE_VERSION_3_0 0x03
#define LicenseProtocolVersionMask 0x0F
#define EXTENDED_ERROR_MSG_SUPPORTED 0x80
/* Licensing Binary Blob Types */
#define BB_DATA_BLOB 0x0001
#define BB_RANDOM_BLOB 0x0002
#define BB_CERTIFICATE_BLOB 0x0003
#define BB_ERROR_BLOB 0x0004
#define BB_ENCRYPTED_DATA_BLOB 0x0009
#define BB_KEY_EXCHG_ALG_BLOB 0x000D
#define BB_SCOPE_BLOB 0x000E
#define BB_CLIENT_USER_NAME_BLOB 0x000F
#define BB_CLIENT_MACHINE_NAME_BLOB 0x0010
#define KEY_EXCHANGE_ALG_RSA 0x00000001
typedef struct
{
uint32 dwVersion;
uint32 cbCompanyName;
uint8* pbCompanyName;
uint32 cbProductId;
uint8* pbProductId;
} PRODUCT_INFO;
typedef struct
{
uint16 type;
uint16 length;
uint8* data;
} LICENSE_BLOB;
typedef struct
{
uint32 count;
LICENSE_BLOB* array;
} SCOPE_LIST;
struct rdp_license
{
uint8 server_random[32];
PRODUCT_INFO product_info;
LICENSE_BLOB key_exchange_list;
LICENSE_BLOB server_certificate;
SCOPE_LIST scope_list;
};
void license_recv(rdpLicense* license, STREAM* s, uint16 sec_flags);
void license_read_product_info(STREAM* s, PRODUCT_INFO* productInfo);
void license_read_binary_blob(STREAM* s, LICENSE_BLOB* blob);
void license_read_license_request_packet(rdpLicense* license, STREAM* s);
void license_read_platform_challenge_packet(rdpLicense* license, STREAM* s);
void license_read_new_license_packet(rdpLicense* license, STREAM* s);
void license_read_upgrade_license_packet(rdpLicense* license, STREAM* s);
void license_read_error_alert_packet(rdpLicense* license, STREAM* s);
rdpLicense* license_new();
void license_free(rdpLicense* license);
#endif /* __LICENSE_H */

View File

@ -47,6 +47,12 @@ void rdp_write_security_header(STREAM* s, uint16 flags)
stream_write_uint16(s, 0); /* flagsHi (unused) */
}
/**
* Initialize an RDP packet stream.\n
* @param rdp rdp module
* @return
*/
STREAM* rdp_send_stream_init(rdpRdp* rdp)
{
STREAM* s;
@ -55,6 +61,12 @@ STREAM* rdp_send_stream_init(rdpRdp* rdp)
return s;
}
/**
* Send an RDP packet.\n
* @param rdp RDP module
* @param s stream
*/
void rdp_send(rdpRdp* rdp, STREAM* s)
{
int length;
@ -73,6 +85,11 @@ void rdp_send(rdpRdp* rdp, STREAM* s)
transport_write(rdp->transport, s);
}
/**
* Receive an RDP packet.\n
* @param rdp RDP module
*/
void rdp_recv(rdpRdp* rdp)
{
STREAM* s;
@ -101,11 +118,11 @@ void rdp_recv(rdpRdp* rdp)
switch (sec_flags & SEC_PKT_MASK)
{
case SEC_LICENSE_PKT:
security_read_license_packet(s, sec_flags);
license_recv(rdp->license, s, sec_flags);
break;
case SEC_REDIRECTION_PKT:
security_read_redirection_packet(s, sec_flags);
rdp_read_redirection_packet(rdp, s, sec_flags);
break;
default:
@ -130,6 +147,7 @@ rdpRdp* rdp_new()
{
rdp->settings = settings_new();
rdp->transport = transport_new(rdp->settings);
rdp->license = license_new(rdp->license);
rdp->nego = nego_new(rdp->transport);
rdp->mcs = mcs_new(rdp->transport);
}
@ -139,7 +157,7 @@ rdpRdp* rdp_new()
/**
* Free RDP module.
* @param RDP connect module to be freed
* @param rdp RDP module to be freed
*/
void rdp_free(rdpRdp* rdp)
@ -147,6 +165,9 @@ void rdp_free(rdpRdp* rdp)
if (rdp != NULL)
{
settings_free(rdp->settings);
transport_free(rdp->transport);
license_free(rdp->license);
mcs_free(rdp->mcs);
xfree(rdp);
}
}

View File

@ -26,6 +26,7 @@ typedef struct rdp_rdp rdpRdp;
#include "tpkt.h"
#include "tpdu.h"
#include "nego.h"
#include "license.h"
#include "security.h"
#include "transport.h"
#include "connection.h"
@ -56,6 +57,7 @@ struct rdp_rdp
{
struct rdp_mcs* mcs;
struct rdp_nego* nego;
struct rdp_license* license;
struct rdp_settings* settings;
struct rdp_transport* transport;
};

View File

@ -0,0 +1,33 @@
/**
* FreeRDP: A Remote Desktop Protocol Client
* RDP Server Redirection
*
* Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "redirection.h"
/**
* Read an RDP Server Redirection Packet.\n
* @msdn{ee441959}
* @param rdp RDP module
* @param s stream
* @param sec_flags security flags
*/
void rdp_read_redirection_packet(rdpRdp* rdp, STREAM* s, uint16 sec_flags)
{
printf("SEC_REDIRECTION_PKT\n");
}

View File

@ -0,0 +1,30 @@
/**
* FreeRDP: A Remote Desktop Protocol Client
* RDP Server Redirection
*
* Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef __REDIRECTION_H
#define __REDIRECTION_H
#include "rdp.h"
#include <freerdp/freerdp.h>
#include <freerdp/utils/stream.h>
void rdp_read_redirection_packet(rdpRdp* rdp, STREAM* s, uint16 sec_flags);
#endif /* __REDIRECTION_H */

View File

@ -19,12 +19,4 @@
#include "security.h"
void security_read_license_packet(STREAM* s, uint16 sec_flags)
{
printf("SEC_LICENSE_PKT\n");
}
void security_read_redirection_packet(STREAM* s, uint16 sec_flags)
{
printf("SEC_REDIRECTION_PKT\n");
}

View File

@ -20,10 +20,11 @@
#ifndef __SECURITY_H
#define __SECURITY_H
#include "rdp.h"
#include <freerdp/freerdp.h>
#include <freerdp/utils/stream.h>
void security_read_license_packet(STREAM* s, uint16 sec_flags);
void security_read_redirection_packet(STREAM* s, uint16 sec_flags);
#endif /* __SECURITY_H */