This commit is contained in:
Ken McMillan 2018-12-17 13:47:43 -08:00
Родитель 46c9d603fa af5b239fa9
Коммит 65eef34e20
5 изменённых файлов: 102 добавлений и 48 удалений

Просмотреть файл

@ -95,31 +95,36 @@ module quic_protection(tls_id,tls) = {
var h := get_header_info(pkt); var h := get_header_info(pkt);
var level := get_level(pkt); var level := get_level(pkt);
var sample_size := tls.iv_size(c,level); var sample_size := tls.iv_size(c,level);
var pnum_pos := h.pkt_num_pos; if sample_size = 0 {
res.ok := false;
}
else {
var pnum_pos := h.pkt_num_pos;
var sample_pos := pnum_pos + 4; var sample_pos := pnum_pos + 4;
if sample_pos + sample_size > pkt.end { if sample_pos + sample_size > pkt.end {
sample_pos := pkt.end - sample_size sample_pos := pkt.end - sample_size
};
var sample := pkt.segment(sample_pos,sample_pos+sample_size);
var pnum := pkt.segment(pnum_pos,pnum_pos+4);
pnum := tls.decrypt_cipher(c,level,pnum,sample);
var pnum_len := get_pnum_len(pnum,0);
var hdr := pkt.segment(0,pnum_pos);
hdr := hdr.extend(pnum.segment(0,pnum_len));
var new_seq := get_pnum(pnum,0,pnum_len);
new_seq := correct_pnum(seq,new_seq,pnum_len);
var pyld := pkt.segment(pnum_pos + pnum_len,pkt.end);
res := tls.decrypt_aead(c,level,pyld,new_seq,hdr);
if res.ok {
# fix up the length field to account for removal of checksum
if h.hdr_long {
var new_len := to_var_int_16(h.payload_length-16);
hdr := hdr.set(pnum_pos-2,new_len.value(0));
hdr := hdr.set(pnum_pos-1,new_len.value(1));
}; };
res.data := hdr.extend(res.data); var sample := pkt.segment(sample_pos,sample_pos+sample_size);
var pnum := pkt.segment(pnum_pos,pnum_pos+4);
pnum := tls.decrypt_cipher(c,level,pnum,sample);
var pnum_len := get_pnum_len(pnum,0);
var hdr := pkt.segment(0,pnum_pos);
hdr := hdr.extend(pnum.segment(0,pnum_len));
var new_seq := get_pnum(pnum,0,pnum_len);
new_seq := correct_pnum(seq,new_seq,pnum_len);
var pyld := pkt.segment(pnum_pos + pnum_len,pkt.end);
res := tls.decrypt_aead(c,level,pyld,new_seq,hdr);
if res.ok {
# fix up the length field to account for removal of checksum
if h.hdr_long {
var new_len := to_var_int_16(h.payload_length-16);
hdr := hdr.set(pnum_pos-2,new_len.value(0));
hdr := hdr.set(pnum_pos-1,new_len.value(1));
};
res.data := hdr.extend(res.data);
}
} }
} }

Просмотреть файл

@ -26,8 +26,8 @@ include file
# Parameters are: # Parameters are:
# #
# the_cid:int cid to be used by the client (default 0xd) # the_cid:int cid to be used by the client (default 0xd)
# client_addr:int the client IP address (default 0xff000001, i.e., the loopback interface) # client_addr:int the client IP address (default 0x7f000001, i.e., the loopback interface)
# server_addr:int the server IP address (default 0xff000001, i.e., the loopback interface) # server_addr:int the server IP address (default 0x7f000001, i.e., the loopback interface)
# server_port:int the server port number (default 4443) # server_port:int the server port number (default 4443)
# send_fin:bool indicates the server waits for FIN in stream to respond # send_fin:bool indicates the server waits for FIN in stream to respond
# #
@ -64,8 +64,8 @@ object endpoint_id = {
# The parameters # The parameters
parameter the_cid : cid = 0xd parameter the_cid : cid = 0xd
parameter client_addr : ip.addr = 0xff000001 parameter client_addr : ip.addr = 0x7f000001
parameter server_addr : ip.addr = 0xff000001 parameter server_addr : ip.addr = 0x7f000001
parameter server_port : ip.port = 4443 parameter server_port : ip.port = 4443
parameter server_cid : cid = 0xb parameter server_cid : cid = 0xb
parameter client_port : ip.port = 4987 parameter client_port : ip.port = 4987
@ -122,7 +122,7 @@ instance net : udp_impl(endpoint_id,prot.arr,quic_prot_ser,quic_prot_deser)
action endpoint_id_addr(ep_id : endpoint_id) returns (ep:ip.endpoint) = { action endpoint_id_addr(ep_id : endpoint_id) returns (ep:ip.endpoint) = {
ep.protocol := ip.udp; ep.protocol := ip.udp;
ep.addr := server_addr if ep_id = endpoint_id.server else 0xc0a80102; # the loop-back addr ep.addr := server_addr if ep_id = endpoint_id.server else client_addr; # the loop-back addr
ep.port := client_port if ep_id = endpoint_id.client ep.port := client_port if ep_id = endpoint_id.client
else (client_port_alt if ep_id = endpoint_id.client_alt else (client_port_alt if ep_id = endpoint_id.client_alt
else server_port); else server_port);
@ -349,7 +349,7 @@ implement net.recv(host:endpoint_id, s:net.socket, src:ip.endpoint, pkts:prot.ar
} }
else { else {
call undecryptable_packet_event(src,dst,ppkt); call undecryptable_packet_event(src,dst,ppkt);
assert false; # assert false;
}; };
idx := idx.next; idx := idx.next;
} }

Просмотреть файл

@ -5,7 +5,6 @@ import os
import sys import sys
import imp import imp
import subprocess import subprocess
import stats
import re import re
import time import time
@ -30,15 +29,62 @@ tests = [
import sys import sys
def usage(): def usage():
print "usage: \n {} <dir> <iters> <server> [pat]".format(sys.argv[0]) print """usage:
{} [option...]
options:
dir=<output directory to create>
iters=<number of iterations>
server={{picoquic,quant,winquic}}
test=<test name pattern>
stats={{true,false}}
""".format(sys.argv[0])
sys.exit(1) sys.exit(1)
if len(sys.argv) < 4 or len(sys.argv) > 5 :
usage() dirpath = None
exit(1) iters = 100
dirpath = sys.argv[1] server_name = 'winquic'
iters = int(sys.argv[2]) getstats = False
server_name = sys.argv[3] pat = '*'
pat = sys.argv[4] if len(sys.argv) >= 5 else '*'
# server_addr=0xc0a80101 client_addr=0xc0a80102
ivy_options = {'server_addr':None,'client_addr':None}
for arg in sys.argv[1:]:
vals = arg.split('=')
if len(vals) != 2:
usage()
name,val = vals
if name == 'dir':
dirpath = val
elif name == 'iters':
try:
iters = int(val)
except:
usage()
elif name == 'server':
server_name = val
elif name == 'stats':
if val not in ['true','false']:
usage()
getstats = val == 'true'
elif name == 'test':
pat = val
elif name in ivy_options:
ivy_options[name] = val
else:
usage()
if dirpath is None:
idx = 0
while True:
path = os.path.join('temp',str(idx))
if not os.path.exists(path):
dirpath = path
break
idx = idx + 1
print 'output directory: {}'.format(dirpath)
try: try:
patre = re.compile(pat) patre = re.compile(pat)
except: except:
@ -51,7 +97,8 @@ except OSError:
sys.stderr.write('cannot create directory "{}"\n'.format(dirpath)) sys.stderr.write('cannot create directory "{}"\n'.format(dirpath))
exit(1) exit(1)
extra_args = ['server_addr=0xc0a80101','client_addr=0xc0a80102'] if server_name == 'winquic' else [] # extra_args = ['server_addr=0xc0a80101','client_addr=0xc0a80102'] if server_name == 'winquic' else []
extra_args = [oname+'='+oval for oname,oval in ivy_options.iteritems() if oval is not None]
svrd = dict(servers) svrd = dict(servers)
if server_name not in svrd: if server_name not in svrd:
@ -178,11 +225,13 @@ try:
status = test.run(seq) status = test.run(seq)
if not status: if not status:
num_failures += 1 num_failures += 1
with open_out(test.name+'.dat') as out: if getstats:
save = os.getcwd() import stats
os.chdir(dirpath) with open_out(test.name+'.dat') as out:
stats.doit(test.name,out) save = os.getcwd()
os.chdir(save) os.chdir(dirpath)
stats.doit(test.name,out)
os.chdir(save)
if num_failures: if num_failures:
print 'error: {} tests(s) failed'.format(num_failures) print 'error: {} tests(s) failed'.format(num_failures)
else: else:

Просмотреть файл

@ -249,7 +249,7 @@ module tls_gnutls(cid,index,bytes,extens,exten_ser,lower,upper) = {
ptls_buffer_init(&sendbuf, (void *)"", 0); ptls_buffer_init(&sendbuf, (void *)"", 0);
int ret = ptls_handle_message(s->gs, &sendbuf, epoch_offsets, in_epoch, input, inlen, s->hsp); int ret = ptls_handle_message(s->gs, &sendbuf, epoch_offsets, in_epoch, input, inlen, s->hsp);
if (ret == PTLS_ERROR_IN_PROGRESS) { if (ret == PTLS_ERROR_IN_PROGRESS) {
std::cerr << "PICOTLS RETURNED PTLS_ERROR_IN_PROGRESS\n"; // std::cerr << "PICOTLS RETURNED PTLS_ERROR_IN_PROGRESS\n";
} else if (ret != 0) { } else if (ret != 0) {
std::cerr << "PICOTLS RETURNED ERROR: " << ret << "\n"; std::cerr << "PICOTLS RETURNED ERROR: " << ret << "\n";
} }
@ -408,9 +408,9 @@ module tls_gnutls(cid,index,bytes,extens,exten_ser,lower,upper) = {
pn_enc = (ptls_cipher_context_t *)(s->crypto_context[l].pn_dec); pn_enc = (ptls_cipher_context_t *)(s->crypto_context[l].pn_dec);
if (!pn_enc) { if (!pn_enc) {
std::cerr << "cipher for level " << l << " is not set\n"; std::cerr << "cipher for level " << l << " is not set\n";
exit(1); sz = 0;
} }
sz = pn_enc->algo->iv_size; else sz = pn_enc->algo->iv_size;
>>> >>>
} }

Просмотреть файл

@ -201,7 +201,7 @@ object impl(me:host) = {
myaddr.sin_addr.s_addr = htonl(addr.addr); myaddr.sin_addr.s_addr = htonl(addr.addr);
// myaddr.sin_addr.s_addr = htonl(INADDR_ANY); // myaddr.sin_addr.s_addr = htonl(INADDR_ANY);
myaddr.sin_port = htons(addr.port); myaddr.sin_port = htons(addr.port);
// std::cout << "binding id: " << `me` << " port: " << ntohs(myaddr.sin_port) << std::endl; std::cout << "binding id: " << `me` << " addr: " << ntohl(myaddr.sin_addr.s_addr) << " port: " << ntohs(myaddr.sin_port) << std::endl;
if (::bind(s, (struct sockaddr *)&myaddr, sizeof(myaddr)) < 0) if (::bind(s, (struct sockaddr *)&myaddr, sizeof(myaddr)) < 0)
{ perror("bind failed"); exit(1); } { perror("bind failed"); exit(1); }
install_reader(new udp_reader(`me`,s, *`cb`, this)); install_reader(new udp_reader(`me`,s, *`cb`, this));