Use void pointers for opaque data blobs in the SPTPS code.
This commit is contained in:
parent
3df86ef17b
commit
107d9c7da5
11 changed files with 35 additions and 34 deletions
|
@ -787,7 +787,7 @@ ask_netname:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static bool invitation_send(void *handle, uint8_t type, const char *data, size_t len) {
|
static bool invitation_send(void *handle, uint8_t type, const void *data, size_t len) {
|
||||||
while(len) {
|
while(len) {
|
||||||
int result = send(sock, data, len, 0);
|
int result = send(sock, data, len, 0);
|
||||||
if(result == -1 && errno == EINTR)
|
if(result == -1 && errno == EINTR)
|
||||||
|
@ -800,7 +800,7 @@ static bool invitation_send(void *handle, uint8_t type, const char *data, size_t
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool invitation_receive(void *handle, uint8_t type, const char *msg, uint16_t len) {
|
static bool invitation_receive(void *handle, uint8_t type, const void *msg, uint16_t len) {
|
||||||
switch(type) {
|
switch(type) {
|
||||||
case SPTPS_HANDSHAKE:
|
case SPTPS_HANDSHAKE:
|
||||||
return sptps_send_record(&sptps, 0, cookie, sizeof cookie);
|
return sptps_send_record(&sptps, 0, cookie, sizeof cookie);
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
meta.c -- handle the meta communication
|
meta.c -- handle the meta communication
|
||||||
Copyright (C) 2000-2013 Guus Sliepen <guus@tinc-vpn.org>,
|
Copyright (C) 2000-2014 Guus Sliepen <guus@tinc-vpn.org>,
|
||||||
2000-2005 Ivo Timmermans
|
2000-2005 Ivo Timmermans
|
||||||
2006 Scott Lamb <slamb@slamb.org>
|
2006 Scott Lamb <slamb@slamb.org>
|
||||||
|
|
||||||
|
@ -30,7 +30,7 @@
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "xalloc.h"
|
#include "xalloc.h"
|
||||||
|
|
||||||
bool send_meta_sptps(void *handle, uint8_t type, const char *buffer, size_t length) {
|
bool send_meta_sptps(void *handle, uint8_t type, const void *buffer, size_t length) {
|
||||||
connection_t *c = handle;
|
connection_t *c = handle;
|
||||||
|
|
||||||
if(!c) {
|
if(!c) {
|
||||||
|
@ -80,7 +80,8 @@ void broadcast_meta(connection_t *from, const char *buffer, int length) {
|
||||||
send_meta(c, buffer, length);
|
send_meta(c, buffer, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool receive_meta_sptps(void *handle, uint8_t type, const char *data, uint16_t length) {
|
bool receive_meta_sptps(void *handle, uint8_t type, const void *vdata, uint16_t length) {
|
||||||
|
const char *data = vdata;
|
||||||
connection_t *c = handle;
|
connection_t *c = handle;
|
||||||
|
|
||||||
if(!c) {
|
if(!c) {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
meta.h -- header for meta.c
|
meta.h -- header for meta.c
|
||||||
Copyright (C) 2000-2012 Guus Sliepen <guus@tinc-vpn.org>,
|
Copyright (C) 2000-2014 Guus Sliepen <guus@tinc-vpn.org>,
|
||||||
2000-2005 Ivo Timmermans
|
2000-2005 Ivo Timmermans
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -24,8 +24,8 @@
|
||||||
#include "connection.h"
|
#include "connection.h"
|
||||||
|
|
||||||
extern bool send_meta(struct connection_t *, const char *, int);
|
extern bool send_meta(struct connection_t *, const char *, int);
|
||||||
extern bool send_meta_sptps(void *, uint8_t, const char *, size_t);
|
extern bool send_meta_sptps(void *, uint8_t, const void *, size_t);
|
||||||
extern bool receive_meta_sptps(void *, uint8_t, const char *, uint16_t);
|
extern bool receive_meta_sptps(void *, uint8_t, const void *, uint16_t);
|
||||||
extern void broadcast_meta(struct connection_t *, const char *, int);
|
extern void broadcast_meta(struct connection_t *, const char *, int);
|
||||||
extern bool receive_meta(struct connection_t *);
|
extern bool receive_meta(struct connection_t *);
|
||||||
|
|
||||||
|
|
|
@ -184,8 +184,8 @@ extern void handle_new_meta_connection(void *, int);
|
||||||
extern void handle_new_unix_connection(void *, int);
|
extern void handle_new_unix_connection(void *, int);
|
||||||
extern int setup_listen_socket(const sockaddr_t *);
|
extern int setup_listen_socket(const sockaddr_t *);
|
||||||
extern int setup_vpn_in_socket(const sockaddr_t *);
|
extern int setup_vpn_in_socket(const sockaddr_t *);
|
||||||
extern bool send_sptps_data(void *handle, uint8_t type, const char *data, size_t len);
|
extern bool send_sptps_data(void *handle, uint8_t type, const void *data, size_t len);
|
||||||
extern bool receive_sptps_record(void *handle, uint8_t type, const char *data, uint16_t len);
|
extern bool receive_sptps_record(void *handle, uint8_t type, const void *data, uint16_t len);
|
||||||
extern void send_packet(struct node_t *, vpn_packet_t *);
|
extern void send_packet(struct node_t *, vpn_packet_t *);
|
||||||
extern void receive_tcppacket(struct connection_t *, const char *, int);
|
extern void receive_tcppacket(struct connection_t *, const char *, int);
|
||||||
extern void broadcast_packet(const struct node_t *, vpn_packet_t *);
|
extern void broadcast_packet(const struct node_t *, vpn_packet_t *);
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
net_packet.c -- Handles in- and outgoing VPN packets
|
net_packet.c -- Handles in- and outgoing VPN packets
|
||||||
Copyright (C) 1998-2005 Ivo Timmermans,
|
Copyright (C) 1998-2005 Ivo Timmermans,
|
||||||
2000-2013 Guus Sliepen <guus@tinc-vpn.org>
|
2000-2014 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
2010 Timothy Redaelli <timothy@redaelli.eu>
|
2010 Timothy Redaelli <timothy@redaelli.eu>
|
||||||
2010 Brandon Black <blblack@gmail.com>
|
2010 Brandon Black <blblack@gmail.com>
|
||||||
|
|
||||||
|
|
|
@ -198,7 +198,7 @@ static bool finalize_invitation(connection_t *c, const char *data, uint16_t len)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool receive_invitation_sptps(void *handle, uint8_t type, const char *data, uint16_t len) {
|
static bool receive_invitation_sptps(void *handle, uint8_t type, const void *data, uint16_t len) {
|
||||||
connection_t *c = handle;
|
connection_t *c = handle;
|
||||||
|
|
||||||
if(type == 128)
|
if(type == 128)
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
protocol_key.c -- handle the meta-protocol, key exchange
|
protocol_key.c -- handle the meta-protocol, key exchange
|
||||||
Copyright (C) 1999-2005 Ivo Timmermans,
|
Copyright (C) 1999-2005 Ivo Timmermans,
|
||||||
2000-2013 Guus Sliepen <guus@tinc-vpn.org>
|
2000-2014 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -87,7 +87,7 @@ bool key_changed_h(connection_t *c, const char *request) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool send_initial_sptps_data(void *handle, uint8_t type, const char *data, size_t len) {
|
static bool send_initial_sptps_data(void *handle, uint8_t type, const void *data, size_t len) {
|
||||||
node_t *to = handle;
|
node_t *to = handle;
|
||||||
to->sptps.send_data = send_sptps_data;
|
to->sptps.send_data = send_sptps_data;
|
||||||
char buf[len * 4 / 3 + 5];
|
char buf[len * 4 / 3 + 5];
|
||||||
|
|
14
src/sptps.c
14
src/sptps.c
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
sptps.c -- Simple Peer-to-Peer Security
|
sptps.c -- Simple Peer-to-Peer Security
|
||||||
Copyright (C) 2011-2013 Guus Sliepen <guus@tinc-vpn.org>,
|
Copyright (C) 2011-2014 Guus Sliepen <guus@tinc-vpn.org>,
|
||||||
2010 Brandon L. Black <blblack@gmail.com>
|
2010 Brandon L. Black <blblack@gmail.com>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -81,7 +81,7 @@ static void warning(sptps_t *s, const char *format, ...) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send a record (datagram version, accepts all record types, handles encryption and authentication).
|
// Send a record (datagram version, accepts all record types, handles encryption and authentication).
|
||||||
static bool send_record_priv_datagram(sptps_t *s, uint8_t type, const char *data, uint16_t len) {
|
static bool send_record_priv_datagram(sptps_t *s, uint8_t type, const void *data, uint16_t len) {
|
||||||
char buffer[len + 21UL];
|
char buffer[len + 21UL];
|
||||||
|
|
||||||
// Create header with sequence number, length and record type
|
// Create header with sequence number, length and record type
|
||||||
|
@ -102,7 +102,7 @@ static bool send_record_priv_datagram(sptps_t *s, uint8_t type, const char *data
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Send a record (private version, accepts all record types, handles encryption and authentication).
|
// Send a record (private version, accepts all record types, handles encryption and authentication).
|
||||||
static bool send_record_priv(sptps_t *s, uint8_t type, const char *data, uint16_t len) {
|
static bool send_record_priv(sptps_t *s, uint8_t type, const void *data, uint16_t len) {
|
||||||
if(s->datagram)
|
if(s->datagram)
|
||||||
return send_record_priv_datagram(s, type, data, len);
|
return send_record_priv_datagram(s, type, data, len);
|
||||||
|
|
||||||
|
@ -127,7 +127,7 @@ static bool send_record_priv(sptps_t *s, uint8_t type, const char *data, uint16_
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send an application record.
|
// Send an application record.
|
||||||
bool sptps_send_record(sptps_t *s, uint8_t type, const char *data, uint16_t len) {
|
bool sptps_send_record(sptps_t *s, uint8_t type, const void *data, uint16_t len) {
|
||||||
// Sanity checks: application cannot send data before handshake is finished,
|
// Sanity checks: application cannot send data before handshake is finished,
|
||||||
// and only record types 0..127 are allowed.
|
// and only record types 0..127 are allowed.
|
||||||
if(!s->outstate)
|
if(!s->outstate)
|
||||||
|
@ -424,7 +424,7 @@ static bool sptps_check_seqno(sptps_t *s, uint32_t seqno, bool update_state) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check datagram for valid HMAC
|
// Check datagram for valid HMAC
|
||||||
bool sptps_verify_datagram(sptps_t *s, const char *data, size_t len) {
|
bool sptps_verify_datagram(sptps_t *s, const void *data, size_t len) {
|
||||||
if(!s->instate || len < 21)
|
if(!s->instate || len < 21)
|
||||||
return error(s, EIO, "Received short packet");
|
return error(s, EIO, "Received short packet");
|
||||||
|
|
||||||
|
@ -495,7 +495,7 @@ static bool sptps_receive_data_datagram(sptps_t *s, const char *data, size_t len
|
||||||
}
|
}
|
||||||
|
|
||||||
// Receive incoming data. Check if it contains a complete record, if so, handle it.
|
// Receive incoming data. Check if it contains a complete record, if so, handle it.
|
||||||
bool sptps_receive_data(sptps_t *s, const char *data, size_t len) {
|
bool sptps_receive_data(sptps_t *s, const void *data, size_t len) {
|
||||||
if(!s->state)
|
if(!s->state)
|
||||||
return error(s, EIO, "Invalid session state zero");
|
return error(s, EIO, "Invalid session state zero");
|
||||||
|
|
||||||
|
@ -582,7 +582,7 @@ bool sptps_receive_data(sptps_t *s, const char *data, size_t len) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start a SPTPS session.
|
// Start a SPTPS session.
|
||||||
bool sptps_start(sptps_t *s, void *handle, bool initiator, bool datagram, ecdsa_t *mykey, ecdsa_t *hiskey, const char *label, size_t labellen, send_data_t send_data, receive_record_t receive_record) {
|
bool sptps_start(sptps_t *s, void *handle, bool initiator, bool datagram, ecdsa_t *mykey, ecdsa_t *hiskey, const void *label, size_t labellen, send_data_t send_data, receive_record_t receive_record) {
|
||||||
// Initialise struct sptps
|
// Initialise struct sptps
|
||||||
memset(s, 0, sizeof *s);
|
memset(s, 0, sizeof *s);
|
||||||
|
|
||||||
|
|
14
src/sptps.h
14
src/sptps.h
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
sptps.h -- Simple Peer-to-Peer Security
|
sptps.h -- Simple Peer-to-Peer Security
|
||||||
Copyright (C) 2011-2013 Guus Sliepen <guus@tinc-vpn.org>,
|
Copyright (C) 2011-2014 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -42,8 +42,8 @@
|
||||||
// Overhead for datagrams
|
// Overhead for datagrams
|
||||||
#define SPTPS_DATAGRAM_OVERHEAD 21
|
#define SPTPS_DATAGRAM_OVERHEAD 21
|
||||||
|
|
||||||
typedef bool (*send_data_t)(void *handle, uint8_t type, const char *data, size_t len);
|
typedef bool (*send_data_t)(void *handle, uint8_t type, const void *data, size_t len);
|
||||||
typedef bool (*receive_record_t)(void *handle, uint8_t type, const char *data, uint16_t len);
|
typedef bool (*receive_record_t)(void *handle, uint8_t type, const void *data, uint16_t len);
|
||||||
|
|
||||||
typedef struct sptps {
|
typedef struct sptps {
|
||||||
bool initiator;
|
bool initiator;
|
||||||
|
@ -85,11 +85,11 @@ extern unsigned int sptps_replaywin;
|
||||||
extern void sptps_log_quiet(sptps_t *s, int s_errno, const char *format, va_list ap);
|
extern void sptps_log_quiet(sptps_t *s, int s_errno, const char *format, va_list ap);
|
||||||
extern void sptps_log_stderr(sptps_t *s, int s_errno, const char *format, va_list ap);
|
extern void sptps_log_stderr(sptps_t *s, int s_errno, const char *format, va_list ap);
|
||||||
extern void (*sptps_log)(sptps_t *s, int s_errno, const char *format, va_list ap);
|
extern void (*sptps_log)(sptps_t *s, int s_errno, const char *format, va_list ap);
|
||||||
extern bool sptps_start(sptps_t *s, void *handle, bool initiator, bool datagram, ecdsa_t *mykey, ecdsa_t *hiskey, const char *label, size_t labellen, send_data_t send_data, receive_record_t receive_record);
|
extern bool sptps_start(sptps_t *s, void *handle, bool initiator, bool datagram, ecdsa_t *mykey, ecdsa_t *hiskey, const void *label, size_t labellen, send_data_t send_data, receive_record_t receive_record);
|
||||||
extern bool sptps_stop(sptps_t *s);
|
extern bool sptps_stop(sptps_t *s);
|
||||||
extern bool sptps_send_record(sptps_t *s, uint8_t type, const char *data, uint16_t len);
|
extern bool sptps_send_record(sptps_t *s, uint8_t type, const void *data, uint16_t len);
|
||||||
extern bool sptps_receive_data(sptps_t *s, const char *data, size_t len);
|
extern bool sptps_receive_data(sptps_t *s, const void *data, size_t len);
|
||||||
extern bool sptps_force_kex(sptps_t *s);
|
extern bool sptps_force_kex(sptps_t *s);
|
||||||
extern bool sptps_verify_datagram(sptps_t *s, const char *data, size_t len);
|
extern bool sptps_verify_datagram(sptps_t *s, const void *data, size_t len);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
sptps_speed.c -- SPTPS benchmark
|
sptps_speed.c -- SPTPS benchmark
|
||||||
Copyright (C) 2013 Guus Sliepen <guus@tinc-vpn.org>,
|
Copyright (C) 2013-2014 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -35,13 +35,13 @@ bool send_meta(void *c, const char *msg , int len) { return false; }
|
||||||
char *logfilename = NULL;
|
char *logfilename = NULL;
|
||||||
struct timeval now;
|
struct timeval now;
|
||||||
|
|
||||||
static bool send_data(void *handle, uint8_t type, const char *data, size_t len) {
|
static bool send_data(void *handle, uint8_t type, const void *data, size_t len) {
|
||||||
int fd = *(int *)handle;
|
int fd = *(int *)handle;
|
||||||
send(fd, data, len, 0);
|
send(fd, data, len, 0);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool receive_record(void *handle, uint8_t type, const char *data, uint16_t len) {
|
static bool receive_record(void *handle, uint8_t type, const void *data, uint16_t len) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
sptps_test.c -- Simple Peer-to-Peer Security test program
|
sptps_test.c -- Simple Peer-to-Peer Security test program
|
||||||
Copyright (C) 2011-2013 Guus Sliepen <guus@tinc-vpn.org>,
|
Copyright (C) 2011-2014 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -43,7 +43,7 @@ static bool writeonly;
|
||||||
static int in = 0;
|
static int in = 0;
|
||||||
static int out = 1;
|
static int out = 1;
|
||||||
|
|
||||||
static bool send_data(void *handle, uint8_t type, const char *data, size_t len) {
|
static bool send_data(void *handle, uint8_t type, const void *data, size_t len) {
|
||||||
char hex[len * 2 + 1];
|
char hex[len * 2 + 1];
|
||||||
bin2hex(data, hex, len);
|
bin2hex(data, hex, len);
|
||||||
if(verbose)
|
if(verbose)
|
||||||
|
@ -54,7 +54,7 @@ static bool send_data(void *handle, uint8_t type, const char *data, size_t len)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool receive_record(void *handle, uint8_t type, const char *data, uint16_t len) {
|
static bool receive_record(void *handle, uint8_t type, const void *data, uint16_t len) {
|
||||||
if(verbose)
|
if(verbose)
|
||||||
fprintf(stderr, "Received type %d record of %hu bytes:\n", type, len);
|
fprintf(stderr, "Received type %d record of %hu bytes:\n", type, len);
|
||||||
if(!writeonly)
|
if(!writeonly)
|
||||||
|
|
Loading…
Reference in a new issue