diff --git a/iroha-drip-general-master/bluetooth/beacon_1.py b/iroha-drip-general-master/bluetooth/beacon_1.py index b0ea3b6b0d0f245206c59511ef5eaf979e69cec5..624963e310731ea0a32330c8bb2c8c23ef215cb2 100644 --- a/iroha-drip-general-master/bluetooth/beacon_1.py +++ b/iroha-drip-general-master/bluetooth/beacon_1.py @@ -32,7 +32,7 @@ FLIGHT_ID_FILE = os.path.join(FILE_DIR, "default_flight_id.txt") load_dotenv() -payload = "" +hash_location = "" #hash of location info such lat & long, it is saved to send later in manifests def separate_bytes(hex_str, delim=' '): return re.sub(r'.{2}', r'\g<0>{}'.format(delim), hex_str).strip() @@ -80,7 +80,7 @@ def get_auth_pages(signature: bytes, auth_type=0x10): return auth_pages # Placing a single location message For Now -def Drip_Wrapper(gpsd: GpsPoller, iroha: DripIrohaAccount, flight_id): +def Drip_Wrapper(gpsd: GpsPoller, iroha: DripIrohaAccount, flight_id, HostID: HostIdentity, exp_date): # ASTM F3-411 Location message 0x1 print("location_update") global executor @@ -98,20 +98,22 @@ def Drip_Wrapper(gpsd: GpsPoller, iroha: DripIrohaAccount, flight_id): lat = separate_bytes(astm_float_to_int_hex(g_lat)) lon = separate_bytes(astm_float_to_int_hex(g_lon)) - payload = "10 00 00 00 {lat} {lon} 00 00 00 00 00 00 00 00 {ts} 00 00".format( + location_info = "10 00 00 00 {lat} {lon} 00 00 00 00 00 00 00 00 {ts} 00 00".format( lat=lat, lon=lon, ts="00 00") - + if(location_info): + hash_location = cSHAKE128( location_info,25,"", flight_id) # hash of location_info, 25 bytes if iroha: # if iroha private supplied, send location transactions on separate thread. # location will be flight id concatenated with the bluetooth payload # In order to save space we can b64encode the bytes of the payload, # instead of sending a hexstring which would result in location message # taking up double the bytes (2 characters per byte). iroha_msg = b64encode( - unhexlify(flight_id + ''.join(payload.split(' ')))).decode("utf-8") + unhexlify(flight_id + ''.join(location_info.split(' ')))).decode("utf-8") executor.submit( iroha.set_account_details, "location", iroha_msg ) - + + payload = HostID.generate_self_attestation_Wrapper(hash_location, get_timestamp(exp_date)) # Set (Extended) Advertising command if is_bt5: """ @@ -124,7 +126,7 @@ def Drip_Wrapper(gpsd: GpsPoller, iroha: DripIrohaAccount, flight_id): Advertising_Data: 1e 16 fa ff 0d 00 10 + payload """ subprocess.run( - "hcitool -i hci0 cmd 0x08 0x0037 0x00 0x03 0x01 0x1f 0x1e 0x16 0xfa 0xff 0x0d 0x00 0x10 {payload}".format(payload=payload), shell=True) + "hcitool -i hci0 cmd 0x08 0x0037 0x00 0x03 0x01 0x1f 0x1e 0x16 0xfa 0xff 0x0d 0x00 0x10 {hash_location}{payload}".format(hash_location=hash_location,payload=payload), shell=True) else: """ OGF: 0x08 (LE controller commands) @@ -133,30 +135,17 @@ def Drip_Wrapper(gpsd: GpsPoller, iroha: DripIrohaAccount, flight_id): Advertising_Data: 1e 16 fa ff 0d 00 10 + payload """ subprocess.run( - "hcitool -i hci0 cmd 0x08 0x0008 1f 1e 16 fa ff 0d 00 10 {payload}".format(payload=payload), shell=True) + "hcitool -i hci0 cmd 0x08 0x0008 1f 1e 16 fa ff 0d 00 10 {hash_location}{payload}".format(hash_location=hash_location, payload=payload), shell=True) -def manifest_broadcast(payload, flight_id): ## Manifest broadcast can contain max 11 hashes (at 8-bytes each). For now we are sending one message. +def manifest_broadcast(HostID: HostIdentity, flight_id, prev_hash_loc, exp_date): ## Manifest broadcast can contain max 11 hashes (at 8-bytes each). For now we are sending one message. # ASTM F3-411 Location message 0x1 print("manifest_broadcast") - - hash_payload = " " - - # If gpsd is active, check that it has received values - if payload == None: - print("payload is empty, cannot generate hash_payload") - - if(payload): - hash_payload = cSHAKE128( - payload, - 8, - "", - flight_id - ) - - print(hash_payload + "aaaaaaaaaa") + if hash_location == None: + print("payload is empty, cannot generate hash_payload for gps information") + payload = HostID.generate_self_attestation_Manifests(cSHAKE128(prev_hash_loc,8, "",flight_id),cSHAKE128(hash_location,8,"",flight_id), get_timestamp(exp_date)) # Set (Extended) Advertising command if is_bt5: """ @@ -169,7 +158,7 @@ def manifest_broadcast(payload, flight_id): ## Manifest broadcast can contain ma Advertising_Data: 1e 16 fa ff 0d 00 10 + payload """ subprocess.run( - "hcitool -i hci0 cmd 0x08 0x0037 0x00 0x03 0x01 0x1f 0x1e 0x16 0xfa 0xff 0x0d 0x00 0x10 {payload}".format(payload=hash_payload), shell=True) #0x03 + "hcitool -i hci0 cmd 0x08 0x0037 0x00 0x03 0x01 0x1f 0x1e 0x16 0xfa 0xff 0x0d 0x00 0x10 {payload}".format(payload=payload), shell=True) #0x03 else: """ OGF: 0x08 (LE controller commands) @@ -178,7 +167,7 @@ def manifest_broadcast(payload, flight_id): ## Manifest broadcast can contain ma Advertising_Data: 1e 16 fa ff 0d 00 10 + payload """ subprocess.run( - "hcitool -i hci0 cmd 0x08 0x0008 1f 1e 16 fa ff 0d 00 10 {payload}".format(payload=hash_payload), shell=True) + "hcitool -i hci0 cmd 0x08 0x0008 1f 1e 16 fa ff 0d 00 10 {payload}".format(payload=payload), shell=True) @@ -281,9 +270,6 @@ def main(): type=str, help="Specify the registry identity xml file." ) - - - parser.add_argument( "-i", "--iroha", dest="iroha_priv_key_file", @@ -344,6 +330,7 @@ def main(): print("The specified file is not an xml file") sys.exit(-1) + #HostIdentity object containing Drone DRIP credentials hi = HostIdentity.from_file(hi_file) # registry host identity @@ -371,13 +358,10 @@ def main(): hhit = separate_bytes(hi.get_hhit()) hid = separate_bytes(hi.get_hid()) - # hhit and signature of the registry - r_hhit = separate_bytes(r_hi.get_hhit()) - r_signature = HostIdentity.generate_self_attestation(HostIdentity,astm_time()) # this signature should be generated by the registry, - # but just for now, we are generating the r_signature using the same function used for drone signature generate function - - - attest = hi.generate_self_concise_attestation(r_hhit,r_signature,get_timestamp(exp_date)) + # this endorsement should be generated by the registry, + # but just for now, we are generating it according draft-ietf-drip-auth-17 + attest = r_hi.generate_attestation_Endorsement_Broadcast(hhit,hid,get_timestamp(exp_date)) + if attest is None: print("Expiration date has expired.") sys.exit(-1) @@ -469,10 +453,13 @@ def main(): elif i % 3 == 2: auth_update(auth_pages[2:], 2) + # saving the hash_location information such as lon & lat, to use as previous location_hash later in Manifests + prev_hash_location = hash_location # Location updates at least once every second. - Drip_Wrapper(gpsd, iroha, flight_id) + Drip_Wrapper(gpsd, iroha, flight_id, hi, exp_date) # Manifest broadcast - manifest_broadcast(payload, flight_id) + manifest_broadcast(hi, flight_id, prev_hash_location, exp_date) + if args.run_scenario: g_lat += random.uniform(0.0001, 0.001) * \ random.choice([-1, 0, 1])