Example #1
0
int
xrdpvr_set_geometry(void *channel, int stream_id, int xpos, int ypos,
                    int width, int height)
{
    STREAM  *s;
    char    *cptr;
    int     rv;
    int     len;

    printf("xrdpvr_set_geometry: entered; x=%d y=%d\n", xpos, ypos);

    stream_new(s, MAX_PDU_SIZE);

    stream_ins_u32_le(s, 0); /* number of bytes to follow */
    stream_ins_u32_le(s, CMD_SET_GEOMETRY);
    stream_ins_u32_le(s, stream_id);
    stream_ins_u32_le(s, xpos);
    stream_ins_u32_le(s, ypos);
    stream_ins_u32_le(s, width);
    stream_ins_u32_le(s, height);

    /* insert number of bytes in stream */
    len = stream_length(s) - 4;
    cptr = s->p;
    s->p = s->data;
    stream_ins_u32_le(s, len);
    s->p = cptr;

    /* write data to virtual channel */
    rv = xrdpvr_write_to_client(channel, s);
    stream_free(s);
    return rv;
}
Example #2
0
void
bgp_zebra_init (void)
{
  /* Set default values. */
  zclient = zclient_new ();
  zclient_init (zclient, ZEBRA_ROUTE_BGP);
  zclient->router_id_update = bgp_router_id_update;
  zclient->interface_add = bgp_interface_add;
  zclient->interface_delete = bgp_interface_delete;
  zclient->interface_address_add = bgp_interface_address_add;
  zclient->interface_address_delete = bgp_interface_address_delete;
  zclient->ipv4_route_add = zebra_read_ipv4;
  zclient->ipv4_route_delete = zebra_read_ipv4;
  zclient->interface_up = bgp_interface_up;
  zclient->interface_down = bgp_interface_down;
#ifdef HAVE_IPV6
  zclient->ipv6_route_add = zebra_read_ipv6;
  zclient->ipv6_route_delete = zebra_read_ipv6;
#endif /* HAVE_IPV6 */

  /* Interface related init. */
  if_init ();

  bgp_nexthop_buf = stream_new(BGP_NEXTHOP_BUF_SIZE);
}
Example #3
0
tbool rpch_in_send_ping(rdpRpch* rpch)
{
	STREAM* pdu = stream_new(20);

	uint8 rpc_vers = 0x05;
	uint8 rpc_vers_minor = 0x00;
	uint8 ptype = PTYPE_RTS;
	uint8 pfc_flags = PFC_FIRST_FRAG | PFC_LAST_FRAG;
	uint32 packet_drep = 0x00000010;
	uint16 frag_length = 56;
	uint16 auth_length = 0;
	uint32 call_id = 0x00000000;
	uint16 flags = 0x0001;
	uint16 num_commands = 0x0000;

	stream_write_uint8(pdu, rpc_vers);
	stream_write_uint8(pdu, rpc_vers_minor);
	stream_write_uint8(pdu, ptype);
	stream_write_uint8(pdu, pfc_flags);
	stream_write_uint32(pdu, packet_drep);
	stream_write_uint16(pdu, frag_length);
	stream_write_uint16(pdu, auth_length);
	stream_write_uint32(pdu, call_id);
	stream_write_uint16(pdu, flags);
	stream_write_uint16(pdu, num_commands);

	rpch_in_write(rpch, pdu->data, pdu->p - pdu->data);

	stream_free(pdu);

	return true;
}
Example #4
0
BOOL certificate_read_server_certificate(rdpCertificate* certificate, BYTE* server_cert, int length)
{
	STREAM* s;
	UINT32 dwVersion;

	if (length < 1)
	{
		DEBUG_CERTIFICATE("null server certificate\n");
		return FALSE;
	}

	s = stream_new(0);
	stream_attach(s, server_cert, length);

	stream_read_UINT32(s, dwVersion); /* dwVersion (4 bytes) */

	switch (dwVersion & CERT_CHAIN_VERSION_MASK)
	{
		case CERT_CHAIN_VERSION_1:
			certificate_read_server_proprietary_certificate(certificate, s);
			break;

		case CERT_CHAIN_VERSION_2:
			certificate_read_server_x509_certificate_chain(certificate, s);
			break;

		default:
			printf("invalid certificate chain version:%d\n", dwVersion & CERT_CHAIN_VERSION_MASK);
			break;
	}

	free(s);
	return TRUE;
}
Example #5
0
// Wrap streams in Ruby objects
VALUE streams_to_ruby_array(VALUE self, AVFormatContext * format) {
	VALUE streams = rb_ary_new();

	unsigned i = 0;
	for(; i < format->nb_streams; ++i) {
		switch (format->streams[i]->codec->codec_type) {
			case AVMEDIA_TYPE_VIDEO: {
				// Video stream
				rb_ary_push(streams, video_stream_new(self, format->streams[i]));
				break;
			}
			case AVMEDIA_TYPE_AUDIO: {
				// Audio stream
				rb_ary_push(streams, audio_stream_new(self, format->streams[i]));
				break;
			}
			default: {
				// All other streams
				rb_ary_push(streams, stream_new(self, format->streams[i]));
				break;
			}
		}
	}

	return streams;
}
Example #6
0
static int drdynvc_process_capability_request(drdynvcPlugin* drdynvc, int Sp, int cbChId, STREAM* s)
{
	STREAM* data_out;
	int error;

	DEBUG_DVC("Sp=%d cbChId=%d", Sp, cbChId);
	stream_seek(s, 1); /* pad */
	stream_read_UINT16(s, drdynvc->version);

	if (drdynvc->version == 2)
	{
		stream_read_UINT16(s, drdynvc->PriorityCharge0);
		stream_read_UINT16(s, drdynvc->PriorityCharge1);
		stream_read_UINT16(s, drdynvc->PriorityCharge2);
		stream_read_UINT16(s, drdynvc->PriorityCharge3);
	}

	data_out = stream_new(4);
	stream_write_UINT16(data_out, 0x0050); /* Cmd+Sp+cbChId+Pad. Note: MSTSC sends 0x005c */
	stream_write_UINT16(data_out, drdynvc->version);
	error = svc_plugin_send((rdpSvcPlugin*) drdynvc, data_out);

	if (error != CHANNEL_RC_OK)
	{
		DEBUG_WARN("VirtualChannelWrite failed %d", error);
		return 1;
	}

	drdynvc->channel_error = error;

	return 0;
}
Example #7
0
int credssp_authenticate(rdpCredssp* credssp)
{
    NTLMSSP* ntlmssp = credssp->ntlmssp;
    STREAM* s = stream_new(0);
    uint8* negoTokenBuffer = (uint8*) xmalloc(2048);

    if (credssp_ntlmssp_init(credssp) == 0)
        return 0;

    if (credssp_get_public_key(credssp) == 0)
        return 0;

    /* NTLMSSP NEGOTIATE MESSAGE */
    s->p = s->data = negoTokenBuffer;
    ntlmssp_send(ntlmssp, s);
    credssp->negoToken.data = s->data;
    credssp->negoToken.length = s->p - s->data;
    credssp_send(credssp, &credssp->negoToken, NULL, NULL);

    /* NTLMSSP CHALLENGE MESSAGE */
    if (credssp_recv(credssp, &credssp->negoToken, NULL, NULL) < 0)
        return -1;

    s->p = s->data = credssp->negoToken.data;
    ntlmssp_recv(ntlmssp, s);

    freerdp_blob_free(&credssp->negoToken);

    /* NTLMSSP AUTHENTICATE MESSAGE */
    s->p = s->data = negoTokenBuffer;
    ntlmssp_send(ntlmssp, s);

    /* The last NTLMSSP message is sent with the encrypted public key */
    credssp->negoToken.data = s->data;
    credssp->negoToken.length = s->p - s->data;
    credssp_encrypt_public_key(credssp, &credssp->pubKeyAuth);
    credssp_send(credssp, &credssp->negoToken, NULL, &credssp->pubKeyAuth);

    /* Encrypted Public Key +1 */
    if (credssp_recv(credssp, &credssp->negoToken, NULL, &credssp->pubKeyAuth) < 0)
        return -1;

    if (credssp_verify_public_key(credssp, &credssp->pubKeyAuth) == 0)
    {
        /* Failed to verify server public key echo */
        return 0; /* DO NOT SEND CREDENTIALS! */
    }

    freerdp_blob_free(&credssp->negoToken);
    freerdp_blob_free(&credssp->pubKeyAuth);

    /* Send encrypted credentials */
    credssp_encode_ts_credentials(credssp);
    credssp_encrypt_ts_credentials(credssp, &credssp->authInfo);
    credssp_send(credssp, NULL, &credssp->authInfo, NULL);

    xfree(s);

    return 1;
}
Example #8
0
boolean rts_send_keep_alive_pdu(rdpRpc* rpc)
{
	STREAM* s;
	RTS_PDU_HEADER header;

	header.rpc_vers = 5;
	header.rpc_vers_minor = 0;
	header.ptype = PTYPE_RTS;
	header.pfc_flags = PFC_FIRST_FRAG | PFC_LAST_FRAG;
	header.packed_drep[0] = 0x10;
	header.packed_drep[1] = 0x00;
	header.packed_drep[2] = 0x00;
	header.packed_drep[3] = 0x00;
	header.frag_length = 28;
	header.auth_length = 0;
	header.call_id = 0;
	header.flags = 2;
	header.numberOfCommands = 1;

	DEBUG_RPC("Sending Keep-Alive RTS PDU");

	s = stream_new(header.frag_length);
	rts_pdu_header_write(s, &header); /* RTS Header (20 bytes) */
	rts_client_keepalive_command_write(s, 0x00007530); /* ClientKeepalive (8 bytes) */
	stream_seal(s);

	rpc_in_write(rpc, s->data, s->size);

	stream_free(s);

	return true;
}
Example #9
0
KrbAPREQ* krb_apreq_new(KRB_CONTEXT* krb_ctx, Ticket* ticket, Authenticator* krb_auth)
{
	KrbAPREQ* krb_apreq;
	STREAM* as;
	rdpBlob msg;
	rdpBlob* encmsg;
	uint32 len;

	as = stream_new(1024);
	stream_seek(as, 1023);

	krb_apreq = xnew(KrbAPREQ);
	krb_apreq->pvno = KRB_VERSION;
	krb_apreq->type = KRB_TAG_APREQ;
	krb_apreq->ap_options = 0x00000000 | 0x00000000 | 0x00000000; /* Reserved (bit 31), Use session Key (bit 30), Mututal Required (bit 29) */
	krb_apreq->ticket = ticket;

	if (krb_auth != NULL)
	{
		len = krb_encode_authenticator(as, krb_auth);
		msg.data = as->p;
		msg.length = len;
		encmsg = crypto_kdcmsg_encrypt(&msg, krb_ctx->askey, 7); /* RFC4757 section 3 for msgtype (T=7) */
		krb_apreq->enc_auth.enctype = krb_ctx->askey->enctype;
		krb_apreq->enc_auth.kvno = -1;
		krb_apreq->enc_auth.encblob.data = encmsg->data;
		krb_apreq->enc_auth.encblob.length =  encmsg->length;
		xfree(encmsg);
	}
	
	stream_free(as);
	
	return krb_apreq;
}
Example #10
0
/* Finish initializing a session from a connection, or kills it if the
 * connection shows and error. Returns <0 if the connection was killed.
 */
static int conn_complete_session(struct connection *conn)
{
	struct task *task = conn->owner;
	struct session *sess = task->context;
	struct stream *strm;

	if (conn->flags & CO_FL_ERROR)
		goto fail;

	/* we want the connection handler to notify the stream interface about updates. */
	conn->flags |= CO_FL_WAKE_DATA;

	/* if logs require transport layer information, note it on the connection */
	if (sess->fe->to_log & LW_XPRT)
		conn->flags |= CO_FL_XPRT_TRACKED;

	session_count_new(sess);
	task->process = sess->listener->handler;
	strm = stream_new(sess, task, &conn->obj_type);
	if (!strm)
		goto fail;

	strm->target        = sess->listener->default_target;
	strm->req.analysers = sess->listener->analysers;
	conn->flags &= ~CO_FL_INIT_DATA;

	return 0;

 fail:
	session_kill_embryonic(sess);
	return -1;
}
Example #11
0
void test_ber_write_length(void)
{
	STREAM *s1, *s2;

	s1 = stream_new(sizeof(ber_length_expected_1));
	s2 = stream_new(sizeof(ber_length_expected_2));

	ber_write_length(s1, 64);
	ASSERT_STREAM(s1, (uint8*) ber_length_expected_1, sizeof(ber_length_expected_1));

	ber_write_length(s2, 404);
	ASSERT_STREAM(s2, (uint8*) ber_length_expected_2, sizeof(ber_length_expected_2));

	stream_free(s1);
	stream_free(s2);
}
Example #12
0
s32 ldp_accept(struct thread * t)
{
	s32 fd ;
	union sockunion su ;
	struct ldp_peer * peer ;
	s32 sock = THREAD_FD(t);
	struct ldp * ldp = THREAD_ARG(t);
	
	ldp->t_accept = NULL ;
	THREAD_READ_ON(master, ldp->t_accept, ldp_accept, ldp, sock);

	fd = sockunion_accept(sock, &su);
	if( fd <= 0 ) 
		return -1 ;

	peer = ldp_peer_new();
	if( NULL == peer )
	{
		close(fd);
		return -1 ;
	}
	
	peer->state = ACCEPT_PEER ;
	peer->fd = fd ;
	peer->ldp = ldp;
	peer->transport = su.sin.sin_addr.s_addr;
	peer->input = stream_new(LDP_MAX_PDU_LEN);
	
	listnode_add(ldp->accepts, peer);

	LDP_FSM_EVENT(peer, ConnectSuccess);

	return 0 ;
}
Example #13
0
/**
 * set video format
 *
 * @param  channel    opaque handle returned by WTSVirtualChannelOpenEx
 * @param  stream_id  unique identification number for this stream
 *
 * @return  0 on success, -1 on error
 *****************************************************************************/
int
xrdpvr_set_video_format(void *channel, uint32_t stream_id, int format,
                        int width, int height)
{
    STREAM  *s;
    char    *cptr;
    int     rv;
    int     len;

    width = (width + 15) & ~15;
    stream_new(s, MAX_PDU_SIZE);
    stream_ins_u32_le(s, 0); /* number of bytes to follow */
    stream_ins_u32_le(s, CMD_SET_VIDEO_FORMAT);
    stream_ins_u32_le(s, stream_id);
    stream_ins_u32_le(s, format);
    stream_ins_u32_le(s, width);
    stream_ins_u32_le(s, height);

    /* insert number of bytes in stream */
    len = stream_length(s) - 4;
    cptr = s->p;
    s->p = s->data;
    stream_ins_u32_le(s, len);
    s->p = cptr;

    /* write data to virtual channel */
    rv = xrdpvr_write_to_client(channel, s);
    stream_free(s);
    return rv;
}
Example #14
0
/**
 * send audio data to client
 *
 * @param  channel    opaque handle returned by WTSVirtualChannelOpenEx
 * @param  stream_id  unique identification number for this stream
 * @param  data_len   number of bytes to send
 * @param  data       audio data to send
 *
 * @return  0 on success, -1 on error
 *****************************************************************************/
int
xrdpvr_send_audio_data(void *channel, uint32_t stream_id, uint32_t data_len,
                       uint8_t *data)
{
    STREAM  *s;
    char    *cptr;
    int     rv;
    int     len;

    //printf("xrdpvr_send_audio_data:\n");
    stream_new(s, MAX_PDU_SIZE + data_len);

    stream_ins_u32_le(s, 0); /* number of bytes to follow */
    stream_ins_u32_le(s, CMD_SEND_AUDIO_DATA);
    stream_ins_u32_le(s, stream_id);
    stream_ins_u32_le(s, data_len);
    stream_ins_byte_array(s, data, data_len);

    /* insert number of bytes in stream */
    len = stream_length(s) - 4;
    cptr = s->p;
    s->p = s->data;
    stream_ins_u32_le(s, len);
    s->p = cptr;

    /* write data to virtual channel */
    rv = xrdpvr_write_to_client(channel, s);
    stream_free(s);

    return rv;
}
Example #15
0
void test_decode(void)
{
	RFX_CONTEXT* context;
	uint8 decode_buffer[4096 * 3];
	STREAM* s;

	s = stream_new(sizeof(y_data) + sizeof(cb_data) + sizeof(cr_data));
	stream_write(s, y_data, sizeof(y_data));
	stream_write(s, cb_data, sizeof(cb_data));
	stream_write(s, cr_data, sizeof(cr_data));
	stream_set_pos(s, 0);

	context = rfx_context_new();
	context->mode = RLGR3;
	rfx_context_set_pixel_format(context, RFX_PIXEL_FORMAT_RGB);
	rfx_decode_rgb(context, s,
		sizeof(y_data), test_quantization_values,
		sizeof(cb_data), test_quantization_values,
		sizeof(cr_data), test_quantization_values,
		decode_buffer);
	rfx_context_free(context);
	stream_free(s);

	dump_ppm_image(decode_buffer);
}
Example #16
0
BOOL rts_send_ping_pdu(rdpRpc* rpc)
{
	STREAM* s;
	RTS_PDU_HEADER header;

	header.rpc_vers = 5;
	header.rpc_vers_minor = 0;
	header.ptype = PTYPE_RTS;
	header.pfc_flags = PFC_FIRST_FRAG | PFC_LAST_FRAG;
	header.packed_drep[0] = 0x10;
	header.packed_drep[1] = 0x00;
	header.packed_drep[2] = 0x00;
	header.packed_drep[3] = 0x00;
	header.frag_length = 20;
	header.auth_length = 0;
	header.call_id = 0;
	header.flags = 1;
	header.numberOfCommands = 0;

	DEBUG_RPC("Sending Ping RTS PDU");

	s = stream_new(header.frag_length);
	rts_pdu_header_write(s, &header); /* RTS Header (20 bytes) */
	stream_seal(s);

	rpc_in_write(rpc, s->data, s->size);

	stream_free(s);

	return TRUE;
}
Example #17
0
File: nla.c Project: 4hosi/FreeRDP
void credssp_read_ts_credentials(rdpCredssp* credssp, PSecBuffer ts_credentials)
{
	STREAM* s;
	int length;
	int ts_password_creds_length;

	s = stream_new(0);
	stream_attach(s, ts_credentials->pvBuffer, ts_credentials->cbBuffer);

	/* TSCredentials (SEQUENCE) */
	ber_read_sequence_tag(s, &length);

	/* [0] credType (INTEGER) */
	ber_read_contextual_tag(s, 0, &length, TRUE);
	ber_read_integer(s, NULL);

	/* [1] credentials (OCTET STRING) */
	ber_read_contextual_tag(s, 1, &length, TRUE);
	ber_read_octet_string_tag(s, &ts_password_creds_length);

	credssp_read_ts_password_creds(credssp, s);

	stream_detach(s);
	stream_free(s);
}
Example #18
0
void test_nsc_encode(void)
{
	int i;
	uint8* rgb_data;
	STREAM* enc_stream;
	NSC_CONTEXT* context;

	rgb_data = (uint8 *) malloc(64 * 64 * 3);
	for (i = 0; i < 64; i++)
		memcpy(rgb_data + i * 64 * 3, rgb_scanline_data, 64 * 3);

	context = nsc_context_new();
	nsc_context_set_cpu_opt(context, CPU_SSE2);
	nsc_context_set_pixel_format(context, RDP_PIXEL_FORMAT_R8G8B8);

	enc_stream = stream_new(65536);
	stream_clear(enc_stream);

	for (i = 0; i < 30000; i++)
	{
		stream_set_pos(enc_stream, 0);
		nsc_compose_message(context, enc_stream, rgb_data, 64, 64, 64 * 3);
	}
	/*freerdp_hexdump(stream_get_head(enc_stream), stream_get_length(enc_stream));*/
	nsc_process_message(context, 32, 64, 64, stream_get_head(enc_stream), stream_get_length(enc_stream));
	/*freerdp_hexdump(context->bmpdata, 64 * 64 * 4);*/
	stream_free(enc_stream);

	nsc_context_free(context);
}
Example #19
0
static void skel_process_receive(rdpSvcPlugin* plugin, STREAM* data_in)
{
	skelPlugin* skel = (skelPlugin*)plugin;
	STREAM* data_out;
	int bytes;

	printf("skel_process_receive:\n");

	if (skel == NULL)
	{
		printf("skel_process_receive: skel is nil\n");
		return;
	}

	/* process data in(from server) here */
	/* here we just send the same data back */

	bytes = stream_get_size(data_in);
	printf("skel_process_receive: got bytes %d\n", bytes);
	if (bytes > 0)
	{
		data_out = stream_new(bytes);
		stream_copy(data_out, data_in, bytes);
		/* svc_plugin_send takes ownership of data_out, that is why
		   we do not free it */

		bytes = stream_get_length(data_in);
		printf("skel_process_receive: sending bytes %d\n", bytes);

		svc_plugin_send(plugin, data_out);
	}

	stream_free(data_in);
}
Example #20
0
static void sample_process_receive(rdpSvcPlugin* plugin, wStream* data_in)
{
	int bytes;
	wStream* data_out;
	samplePlugin* sample = (samplePlugin*) plugin;

	fprintf(stderr, "sample_process_receive:\n");

	if (!sample)
	{
		fprintf(stderr, "sample_process_receive: sample is nil\n");
		return;
	}

	/* process data in (from server) here */
	/* here we just send the same data back */

	bytes = stream_get_size(data_in);
	fprintf(stderr, "sample_process_receive: got bytes %d\n", bytes);

	if (bytes > 0)
	{
		data_out = stream_new(bytes);
		stream_copy(data_out, data_in, bytes);
		/* svc_plugin_send takes ownership of data_out, that is why
		   we do not free it */

		bytes = stream_get_length(data_in);
		fprintf(stderr, "sample_process_receive: sending bytes %d\n", bytes);

		svc_plugin_send(plugin, data_out);
	}

	stream_free(data_in);
}
Example #21
0
void test_nsc_encode(void)
{
	int i;
	BYTE* rgb_data;
	wStream* enc_stream;
	NSC_CONTEXT* context;

	rgb_data = (BYTE *) malloc(64 * 64 * 3);
	for (i = 0; i < 64; i++)
		memcpy(rgb_data + i * 64 * 3, rgb_scanline_data, 64 * 3);

	context = nsc_context_new();
	nsc_context_set_pixel_format(context, RDP_PIXEL_FORMAT_R8G8B8);

	enc_stream = stream_new(65536);
	stream_clear(enc_stream);

	for (i = 0; i < 30000; i++)
	{
		Stream_SetPosition(enc_stream, 0);
		nsc_compose_message(context, enc_stream, rgb_data, 64, 64, 64 * 3);
	}
	/*winpr_HexDump(Stream_Buffer(enc_stream), Stream_GetPosition(enc_stream));*/
	nsc_process_message(context, 32, 64, 64, Stream_Buffer(enc_stream), Stream_GetPosition(enc_stream));
	/*winpr_HexDump(context->bmpdata, 64 * 64 * 4);*/
	stream_free(enc_stream);

	nsc_context_free(context);
}
Example #22
0
int
main (void)
{
  struct stream *s;
  
  s = stream_new (1024);
  
  stream_putc (s, ham);
  stream_putw (s, ham);
  stream_putl (s, ham);
  stream_putq (s, ham);
  
  print_stream (s);
  
  stream_resize (s, stream_get_endp (s));
  
  print_stream (s);
  
  printf ("c: 0x%hhx\n", stream_getc (s));
  printf ("w: 0x%hx\n", stream_getw (s));
  printf ("l: 0x%x\n", stream_getl (s));
  printf ("q: 0x%" PRIu64 "\n", stream_getq (s));
  
  return 0;
}
Example #23
0
static void rdpdr_send_client_name_request(rdpdrPlugin* rdpdr)
{
	char* s;
	STREAM* data_out;
	UNICONV* uniconv;
	size_t computerNameLenW;

	uniconv = freerdp_uniconv_new();

	if (!rdpdr->computerName[0])
		gethostname(rdpdr->computerName, sizeof(rdpdr->computerName) - 1);

	s = freerdp_uniconv_out(uniconv, rdpdr->computerName, &computerNameLenW);
	data_out = stream_new(16 + computerNameLenW + 2);

	stream_write_uint16(data_out, RDPDR_CTYP_CORE);
	stream_write_uint16(data_out, PAKID_CORE_CLIENT_NAME);

	stream_write_uint32(data_out, 1); /* unicodeFlag, 0 for ASCII and 1 for Unicode */
	stream_write_uint32(data_out, 0); /* codePage, must be set to zero */
	stream_write_uint32(data_out, computerNameLenW + 2); /* computerNameLen, including null terminator */
	stream_write(data_out, s, computerNameLenW);
	stream_write_uint16(data_out, 0); /* null terminator */

	xfree(s);
	freerdp_uniconv_free(uniconv);

	svc_plugin_send((rdpSvcPlugin*) rdpdr, data_out);
}
Example #24
0
STREAM* rail_pdu_init(int length)
{
	STREAM* s;
	s = stream_new(length + RAIL_PDU_HEADER_LENGTH);
	stream_seek(s, RAIL_PDU_HEADER_LENGTH);
	return s;
}
Example #25
0
static void svc_plugin_process_received(rdpSvcPlugin* plugin, void* pData, uint32 dataLength,
	uint32 totalLength, uint32 dataFlags)
{
	STREAM* data_in;

	if (dataFlags & CHANNEL_FLAG_FIRST)
	{
		if (plugin->priv->data_in != NULL)
			stream_free(plugin->priv->data_in);
		plugin->priv->data_in = stream_new(totalLength);
	}

	data_in = plugin->priv->data_in;
	stream_check_size(data_in, dataLength);
	stream_write(data_in, pData, dataLength);

	if (dataFlags & CHANNEL_FLAG_LAST)
	{
		if (stream_get_size(data_in) != stream_get_length(data_in))
		{
			printf("svc_plugin_process_received: read error\n");
		}
		/* the stream ownership is passed to the callback who is responsible for freeing it. */
		plugin->priv->data_in = NULL;
		stream_set_pos(data_in, 0);
		plugin->receive_callback(plugin, data_in);
	}
}
Example #26
0
boolean certificate_read_server_certificate(rdpCertificate* certificate, uint8* server_cert, int length)
{
    STREAM* s;
    uint32 dwVersion;

    s = stream_new(0);
    s->p = s->data = server_cert;

    if (length < 1)
    {
        printf("null server certificate\n");
        return False;
    }

    stream_read_uint32(s, dwVersion); /* dwVersion (4 bytes) */

    switch (dwVersion & CERT_CHAIN_VERSION_MASK)
    {
    case CERT_CHAIN_VERSION_1:
        certificate_read_server_proprietary_certificate(certificate, s);
        break;

    case CERT_CHAIN_VERSION_2:
        certificate_read_server_x509_certificate_chain(certificate, s);
        break;

    default:
        printf("invalid certificate chain version:%d\n", dwVersion & CERT_CHAIN_VERSION_MASK);
        break;
    }

    xfree(s);
    return True;
}
Example #27
0
int
xrdpvr_send_init(void *channel)
{
    STREAM  *s;
    char    *cptr;
    int     rv;
    int     len;

    printf("xrdpvr_send_init:\n");
    stream_new(s, MAX_BUFSIZE);

    stream_ins_u32_le(s, 0); /* number of bytes to follow */
    stream_ins_u32_le(s, CMD_INIT_XRDPVR);

    /* insert number of bytes in stream */
    len = stream_length(s) - 4;
    cptr = s->p;
    s->p = s->data;
    stream_ins_u32_le(s, len);
    s->p = cptr;

    /* write data to virtual channel */
    rv = xrdpvr_write_to_client(channel, s);
    stream_free(s);
    return rv;
}
Example #28
0
/**
 * write set volume to a xrdpvr client
 *
 * @param  channel  opaque handle returned by WTSVirtualChannelOpenEx
 * @param  volume   volume 0x0000 to 0xffff
 *
 * @return 0 on success, -1 on failure
 ******************************************************************************/
int
xrdpvr_set_volume(void *channel, int volume)
{
    STREAM  *s;
    char    *cptr;
    int     rv;
    int     len;

    stream_new(s, MAX_BUFSIZE);

    stream_ins_u32_le(s, 0); /* number of bytes to follow */
    stream_ins_u32_le(s, CMD_SET_VOLUME);
    stream_ins_u32_le(s, volume);

    /* insert number of bytes in stream */
    len = stream_length(s) - 4;
    cptr = s->p;
    s->p = s->data;
    stream_ins_u32_le(s, len);
    s->p = cptr;

    /* write data to virtual channel */
    rv = xrdpvr_write_to_client(channel, s);
    stream_free(s);
    return rv;
}
Example #29
0
void dev_redir_send_server_core_cap_req()
{
    struct stream *s;
    int            bytes;

    stream_new(s, 1024);

    /* setup header */
    stream_wr_u16_le(s, RDPDR_CTYP_CORE);
    stream_wr_u16_le(s, PAKID_CORE_SERVER_CAPABILITY);

    stream_wr_u16_le(s, 5);                /* num of caps we are sending     */
    stream_wr_u16_le(s, 0x0000);           /* padding                        */

    /* setup general capability */
    stream_wr_u16_le(s, CAP_GENERAL_TYPE); /* CapabilityType                 */
    stream_wr_u16_le(s, 44);               /* CapabilityLength - len of this */
                                           /* CAPABILITY_SET in bytes, inc   */
                                           /* the header                     */
    stream_wr_u32_le(s, 2);                /* Version                        */
    stream_wr_u32_le(s, 2);                /* O.S type                       */
    stream_wr_u32_le(s, 0);                /* O.S version                    */
    stream_wr_u16_le(s, 1);                /* protocol major version         */
    stream_wr_u16_le(s, g_client_rdp_version); /* protocol minor version     */
    stream_wr_u32_le(s, 0xffff);           /* I/O code 1                     */
    stream_wr_u32_le(s, 0);                /* I/O code 2                     */
    stream_wr_u32_le(s, 7);                /* Extended PDU                   */
    stream_wr_u32_le(s, 0);                /* extra flags 1                  */
    stream_wr_u32_le(s, 0);                /* extra flags 2                  */
    stream_wr_u32_le(s, 2);                /* special type device cap        */

    /* setup printer capability */
    stream_wr_u16_le(s, CAP_PRINTER_TYPE);
    stream_wr_u16_le(s, 8);
    stream_wr_u32_le(s, 1);

    /* setup serial port capability */
    stream_wr_u16_le(s, CAP_PORT_TYPE);
    stream_wr_u16_le(s, 8);
    stream_wr_u32_le(s, 1);

    /* setup file system capability */
    stream_wr_u16_le(s, CAP_DRIVE_TYPE);   /* CapabilityType                 */
    stream_wr_u16_le(s, 8);                /* CapabilityLength - len of this */
                                           /* CAPABILITY_SET in bytes, inc   */
                                           /* the header                     */
    stream_wr_u32_le(s, 2);                /* Version                        */

    /* setup smart card capability */
    stream_wr_u16_le(s, CAP_SMARTCARD_TYPE);
    stream_wr_u16_le(s, 8);
    stream_wr_u32_le(s, 1);

    /* send to client */
    bytes = stream_len(s);
    send_channel_data(g_rdpdr_chan_id, s->data, bytes);

    stream_free(s);
}
Example #30
0
void credssp_send(rdpCredssp* credssp)
{
	STREAM* s;
	int length;
	int ts_request_length;
	int nego_tokens_length;
	int pub_key_auth_length;
	int auth_info_length;

	nego_tokens_length = (credssp->negoToken.cbBuffer > 0) ? credssp_skip_nego_tokens(credssp->negoToken.cbBuffer) : 0;
	pub_key_auth_length = (credssp->pubKeyAuth.cbBuffer > 0) ? credssp_skip_pub_key_auth(credssp->pubKeyAuth.cbBuffer) : 0;
	auth_info_length = (credssp->authInfo.cbBuffer > 0) ? credssp_skip_auth_info(credssp->authInfo.cbBuffer) : 0;

	length = nego_tokens_length + pub_key_auth_length + auth_info_length;
	ts_request_length = credssp_skip_ts_request(length);

	s = stream_new(ts_request_length);

	/* TSRequest */
	length = der_get_content_length(ts_request_length);
	der_write_sequence_tag(s, length); /* SEQUENCE */

	/* [0] version */
	ber_write_contextual_tag(s, 0, 3, true);
	ber_write_integer(s, 2); /* INTEGER */

	/* [1] negoTokens (NegoData) */
	if (nego_tokens_length > 0)
	{
		length = der_get_content_length(nego_tokens_length);
		length -= der_write_contextual_tag(s, 1, length, true); /* NegoData */
		length -= der_write_sequence_tag(s, length); /* SEQUENCE OF NegoDataItem */
		length -= der_write_sequence_tag(s, length); /* NegoDataItem */
		length -= der_write_contextual_tag(s, 0, length, true); /* [0] negoToken */
		der_write_octet_string(s, (uint8*) credssp->negoToken.pvBuffer, length); /* OCTET STRING */
	}

	/* [2] authInfo (OCTET STRING) */
	if (auth_info_length > 0)
	{
		length = ber_get_content_length(auth_info_length);
		length -= ber_write_contextual_tag(s, 2, length, true);
		ber_write_octet_string(s, credssp->authInfo.pvBuffer, credssp->authInfo.cbBuffer);
	}

	/* [3] pubKeyAuth (OCTET STRING) */
	if (pub_key_auth_length > 0)
	{
		length = ber_get_content_length(pub_key_auth_length);
		length -= ber_write_contextual_tag(s, 3, length, true);
		ber_write_octet_string(s, credssp->pubKeyAuth.pvBuffer, length);
	}

	//printf("Sending TSRequest: (%d)\n", stream_get_length(s));
	//freerdp_hexdump(s->data, stream_get_length(s));

	tls_write(credssp->tls, s->data, stream_get_length(s));
	stream_free(s);
}