chg: [Server] unpack header

pull/23/head
Terrtia 2018-12-21 15:27:51 +01:00
parent 788aad117e
commit 2001e86c2a
No known key found for this signature in database
GPG Key ID: 1E1B1F50D84613D0
2 changed files with 51 additions and 20 deletions

View File

@ -5,3 +5,4 @@ sudo python3 -m pip install --upgrade service_identity
client: client:
cat /proc/cpuinfo | ./d4 -c conf.sample | socat - OPENSSL-CONNECT:127.178.0.1:4443,verify=0 cat /proc/cpuinfo | ./d4 -c conf.sample | socat - OPENSSL-CONNECT:127.178.0.1:4443,verify=0

View File

@ -5,6 +5,7 @@ import sys
import hmac import hmac
import stat import stat
import redis import redis
import struct
from twisted.internet import ssl, task, protocol, endpoints, defer from twisted.internet import ssl, task, protocol, endpoints, defer
from twisted.python import log from twisted.python import log
@ -16,7 +17,7 @@ from twisted.internet.protocol import Protocol
from ctypes import * from ctypes import *
from uuid import UUID from uuid import UUID
hmac_reset = '0000000000000000000000000000000000000000000000000000000000000000' hmac_reset = bytearray(32)
hmac_key = b'private key to change\n' hmac_key = b'private key to change\n'
redis_server = redis.StrictRedis( redis_server = redis.StrictRedis(
@ -51,62 +52,90 @@ class D4Header(Structure):
def process_header(data): def process_header(data):
if len(data) > 73: if len(data) > 63:
d4_header = data[:72].hex() d4_header = data[:62]
all_data = data[62:]
#print(d4_header)
version = struct.unpack('B', d4_header[0:1])[0]
type = struct.unpack('B', d4_header[1:2])[0]
uuid_header = d4_header[2:18].hex()
timestamp = struct.unpack('Q', d4_header[18:26])[0]
hmac_header = d4_header[26:58]
size = struct.unpack('I', d4_header[58:62])[0]
print('-------------------------')
print(hmac_header)
print(hmac_reset)
print('***************************')
print(d4_header) print(d4_header)
uuid_header = d4_header[4:36]
hmac_header = d4_header[64:128]
d4_header = d4_header.replace(hmac_header, hmac_reset) d4_header = d4_header.replace(hmac_header, hmac_reset)
temp = bytes.fromhex(d4_header)
data = data.replace(data[:72], temp) print(d4_header)
data = d4_header + all_data
print(data) print(data)
#print(data[:62])
#print(len(data[:62]))
data_header = unpack(D4Header, data) hmac_header = hmac_header.hex()
# verify hmac sha256
HMAC = hmac.new(hmac_key, msg=data, digestmod='sha256')
print('hexdigest: {}'.format( HMAC.hexdigest() ))
#print(data)
if hmac_header != HMAC.hexdigest():
print("hmac don't match ...")
print('hexdigest: {}'.format( HMAC.hexdigest() ))
print('hexdigest: {}'.format( hmac_header ))
### Debug ### ### Debug ###
print('version: {}'.format( data_header['version'] )) print('version: {}'.format( version ))
print('type: {}'.format( data_header['type'] )) print('type: {}'.format( type ))
print('uuid: {}'.format(uuid_header)) print('uuid: {}'.format(uuid_header))
print('timestamp: {}'.format( data_header['timestamp'] )) print('timestamp: {}'.format( timestamp ))
print('hmac: {}'.format( hmac_header )) print('hmac: {}'.format( hmac_header ))
print('size: {}'.format( data_header['size'] )) print('size: {}'.format( size ))
print('size: {}'.format( len(data) - data_header['struct_size']))
#print(d4_header) #print(d4_header)
### ### ### ###
# check if is valid uuid v4 # check if is valid uuid v4
if not is_valid_uuid_v4(uuid_header): if not is_valid_uuid_v4(uuid_header):
print('not uuid v4') print('not uuid v4')
print()
print()
# verify timestamp # verify timestamp
#elif : #elif :
# print('not valid timestamp') # print('not valid timestamp')
elif data_header['size'] != (len(data) - data_header['struct_size']): elif size != (len(data) - 62):
print('invalid size') print('invalid size')
print('size: {}'.format(data_header['size'])) print('size: {}'.format(size))
print(len(data) - data_header['struct_size']) # sizeof(d)=72 print()
print()
else: else:
# verify hmac sha256 # verify hmac sha256
HMAC = hmac.new(hmac_key, msg=data, digestmod='sha256') HMAC = hmac.new(hmac_key, msg=data, digestmod='sha256')
print('hexdigest: {}'.format( HMAC.hexdigest() )) print('hexdigest: {}'.format( HMAC.hexdigest() ))
print(data) #print(data)
if hmac_header == HMAC.hexdigest(): if hmac_header == HMAC.hexdigest():
print('hmac match') print('hmac match')
redis_server.xadd('stream:{}'.format(data_header['type']), {'message': data[72:], 'uuid':uuid_header, 'timestamp': data_header['timestamp'], 'version': data_header['version']}) #redis_server.xadd('stream:{}'.format(data_header['type']), {'message': data[72:], 'uuid':uuid_header, 'timestamp': data_header['timestamp'], 'version': data_header['version']})
print('END') print('END')
print() print()
# discard data # discard data
else: else:
print("hmac don't match") print("hmac don't match")
print()
print()
else: else:
print('incomplete data') print('incomplete data')
print()
print()
'''
def unpack(ctype, buffer): def unpack(ctype, buffer):
c_str = create_string_buffer(buffer) c_str = create_string_buffer(buffer)
d = cast(pointer(c_str), POINTER(ctype)).contents d = cast(pointer(c_str), POINTER(ctype)).contents
@ -117,6 +146,7 @@ def unpack(ctype, buffer):
data_header['size'] = d.size data_header['size'] = d.size
data_header['struct_size'] = sizeof(d) data_header['struct_size'] = sizeof(d)
return data_header return data_header
'''
def is_valid_uuid_v4(header_uuid): def is_valid_uuid_v4(header_uuid):
#try: #try: