/*---------------------------------------------------------------------------*/ void adaptivesec_aead(uint8_t *key, int shall_encrypt, uint8_t *result, int forward) { uint8_t nonce[CCM_STAR_NONCE_LENGTH]; uint8_t *m; uint8_t m_len; uint8_t *a; uint8_t a_len; ccm_star_packetbuf_set_nonce(nonce, forward); a = packetbuf_hdrptr(); if(shall_encrypt) { #if AKES_NBR_WITH_GROUP_KEYS && PACKETBUF_WITH_UNENCRYPTED_BYTES a_len = packetbuf_hdrlen() + packetbuf_attr(PACKETBUF_ATTR_UNENCRYPTED_BYTES); #else /* AKES_NBR_WITH_GROUP_KEYS && PACKETBUF_WITH_UNENCRYPTED_BYTES */ a_len = packetbuf_hdrlen(); #endif /* AKES_NBR_WITH_GROUP_KEYS && PACKETBUF_WITH_UNENCRYPTED_BYTES */ m = a + a_len; m_len = packetbuf_totlen() - a_len; } else { a_len = packetbuf_totlen(); m = NULL; m_len = 0; } AES_128_GET_LOCK(); ADAPTIVESEC_SET_KEY(key); CCM_STAR.aead(nonce, m, m_len, a, a_len, result, adaptivesec_mic_len(), forward); AES_128_RELEASE_LOCK(); }
/*---------------------------------------------------------------------------*/ void packetbuf_compact(void) { int16_t i; if(bufptr) { /* shift data to the left */ for(i = 0; i < buflen; i++) { packetbuf[hdrlen + i] = packetbuf[packetbuf_hdrlen() + i]; } bufptr = 0; } }
/*---------------------------------------------------------------------------*/ void packetbuf_compact(void) { int16_t i; if(packetbuf->bufptr) { /* shift data to the left */ for(i = 0; i < packetbuf->datalen; i++) { packetbuf->data[packetbuf->hdrlen + i] = packetbuf->data[packetbuf_hdrlen() + i]; } packetbuf->bufptr = 0; } }
/*---------------------------------------------------------------------------*/ int chameleon_create(struct channel *c) { int ret; PRINTF("%d.%d: chameleon_output channel %d\n", linkaddr_node_addr.u8[0],linkaddr_node_addr.u8[1], c->channelno); ret = CHAMELEON_MODULE.output(c); packetbuf_set_attr(PACKETBUF_ATTR_CHANNEL, c->channelno); #if DEBUG printhdr(packetbuf_hdrptr(), packetbuf_hdrlen()); #endif /* DEBUG */ if(ret) { return 1; } return 0; }
/*---------------------------------------------------------------------------*/ int chameleon_output(struct channel *c) { int ret; PRINTF("%d.%d: chameleon_output channel %d\n", rimeaddr_node_addr.u8[0],rimeaddr_node_addr.u8[1], c->channelno); if(header_module) { ret = header_module->output(c); packetbuf_set_attr(PACKETBUF_ATTR_CHANNEL, c->channelno); #if DEBUG printhdr(packetbuf_hdrptr(), packetbuf_hdrlen()); #endif /* DEBUG */ if(ret) { rime_output(); return 1; } } return 0; }
/*---------------------------------------------------------------------------*/ uint16_t packetbuf_totlen(void) { return packetbuf_hdrlen() + packetbuf_datalen(); }
/*---------------------------------------------------------------------------*/ void * packetbuf_dataptr(void) { return packetbuf + packetbuf_hdrlen(); }