/*---------------------------------------------------------------------------*/ wake_up_counter_t wake_up_counter_parse(uint8_t *src) { wake_up_counter_t wuc; memcpy(wuc.u8, src, 4); wuc.u32 = LLSEC802154_HTONL(wuc.u32); return wuc; }
/*---------------------------------------------------------------------------*/ uint32_t anti_replay_get_counter(void) { frame802154_frame_counter_t disordered_counter; disordered_counter.u16[0] = packetbuf_attr(PACKETBUF_ATTR_FRAME_COUNTER_BYTES_0_1); disordered_counter.u16[1] = packetbuf_attr(PACKETBUF_ATTR_FRAME_COUNTER_BYTES_2_3); return LLSEC802154_HTONL(disordered_counter.u32); }
/*---------------------------------------------------------------------------*/ void order_and_set_counter(uint32_t counter) { frame802154_frame_counter_t reordered_counter; reordered_counter.u32 = LLSEC802154_HTONL(counter); packetbuf_set_attr(PACKETBUF_ATTR_FRAME_COUNTER_BYTES_0_1, reordered_counter.u16[0]); packetbuf_set_attr(PACKETBUF_ATTR_FRAME_COUNTER_BYTES_2_3, reordered_counter.u16[1]); }
/*---------------------------------------------------------------------------*/ void anti_replay_set_counter(struct net_mbuf *buf) { frame802154_frame_counter_t reordered_counter; reordered_counter.u32 = LLSEC802154_HTONL(++counter); packetbuf_set_attr(buf, PACKETBUF_ATTR_FRAME_COUNTER_BYTES_0_1, reordered_counter.u16[0]); packetbuf_set_attr(buf, PACKETBUF_ATTR_FRAME_COUNTER_BYTES_2_3, reordered_counter.u16[1]); }
/*---------------------------------------------------------------------------*/ static void process_update_command(struct akes_nbr *nbr, uint8_t *data, int cmd_id) { switch(cmd_id) { case AKES_ACK_IDENTIFIER: akes_nbr_free_tentative_metadata(nbr); nbr->sent_authentic_hello = 1; break; case AKES_HELLOACK_IDENTIFIER: nbr->sent_authentic_hello = 0; break; } anti_replay_was_replayed(&nbr->anti_replay_info); #if ANTI_REPLAY_WITH_SUPPRESSION nbr->last_was_broadcast = 1; #endif /* ANTI_REPLAY_WITH_SUPPRESSION */ akes_nbr_prolong(nbr); #if AKES_NBR_WITH_INDICES nbr->foreign_index = data[0]; data++; #endif /* AKES_NBR_WITH_INDICES */ #if ANTI_REPLAY_WITH_SUPPRESSION { frame802154_frame_counter_t disordered_counter; data += 4; memcpy(disordered_counter.u8, data, 4); nbr->anti_replay_info.his_broadcast_counter.u32 = LLSEC802154_HTONL(disordered_counter.u32); data += 4; } #endif /* ANTI_REPLAY_WITH_SUPPRESSION */ #if AKES_NBR_WITH_GROUP_KEYS switch(cmd_id) { case AKES_HELLOACK_IDENTIFIER: case AKES_ACK_IDENTIFIER: akes_nbr_copy_key(nbr->group_key, data); break; } #endif /* AKES_NBR_WITH_GROUP_KEYS */ }
/*---------------------------------------------------------------------------*/ void wake_up_counter_write(uint8_t *dst, wake_up_counter_t wuc) { wuc.u32 = LLSEC802154_HTONL(wuc.u32); memcpy(dst, wuc.u8, 4); }
/*---------------------------------------------------------------------------*/ static void prepare_update_command(uint8_t cmd_id, struct akes_nbr_entry *entry, enum akes_nbr_status status) { uint8_t *payload; uint8_t payload_len; payload = adaptivesec_prepare_command(cmd_id, akes_nbr_get_addr(entry)); adaptivesec_add_security_header(entry->refs[status]); anti_replay_suppress_counter(); if(status) { /* avoids that csma.c confuses frames for tentative and permanent neighbors */ packetbuf_set_attr(PACKETBUF_ATTR_MAC_SEQNO, 0xff00 + packetbuf_attr(PACKETBUF_ATTR_MAC_SEQNO)); } #if ANTI_REPLAY_WITH_SUPPRESSION packetbuf_set_attr(PACKETBUF_ATTR_NEIGHBOR_INDEX, akes_nbr_index_of(entry->refs[status])); #endif /* ANTI_REPLAY_WITH_SUPPRESSION */ switch(cmd_id) { case AKES_HELLOACK_IDENTIFIER: case AKES_HELLOACK_P_IDENTIFIER: case AKES_ACK_IDENTIFIER: packetbuf_set_attr(PACKETBUF_ATTR_MAX_MAC_TRANSMISSIONS, MAX_RETRANSMISSIONS_OF_HELLOACKS_AND_ACKS + 1); break; default: break; } /* write payload */ if(status) { akes_nbr_copy_challenge(payload, entry->tentative->challenge); payload += AKES_NBR_CHALLENGE_LEN; } #if AKES_NBR_WITH_INDICES payload[0] = akes_nbr_index_of(entry->refs[status]); payload++; #endif /* AKES_NBR_WITH_INDICES */ #if ANTI_REPLAY_WITH_SUPPRESSION { frame802154_frame_counter_t reordered_counter; anti_replay_write_counter(payload); payload += 4; reordered_counter.u32 = LLSEC802154_HTONL(anti_replay_my_broadcast_counter); memcpy(payload, reordered_counter.u8, 4); payload += 4; } #endif /* ANTI_REPLAY_WITH_SUPPRESSION */ payload_len = payload - ((uint8_t *)packetbuf_hdrptr()); #if AKES_NBR_WITH_GROUP_KEYS switch(cmd_id) { case AKES_HELLOACK_IDENTIFIER: case AKES_HELLOACK_P_IDENTIFIER: case AKES_ACK_IDENTIFIER: akes_nbr_copy_key(payload, adaptivesec_group_key); packetbuf_set_attr(PACKETBUF_ATTR_UNENCRYPTED_BYTES, payload_len); payload_len += AES_128_KEY_LENGTH; break; } #endif /* AKES_NBR_WITH_GROUP_KEYS */ packetbuf_set_datalen(payload_len); }