Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- bool LoRaWANPacketGen::Gen_UnconfirmedDataUp(const DataRef data_in, DataRef& out_buffer)
- {
- PHYPayload payload;
- uint8_t crypto_block[16];
- uint8_t out_enc_buff[16];
- uint32_t mic = 0;
- packet_len = 16;
- frame_counter++;
- payload.mac_header.rfu = 0;
- payload.mac_header.major = 0;
- payload.mac_header.m_type = MACMessageType::unconfirmed_data_up;
- memcpy(&output_packet_buffer[packet_len], &payload.mac_header, sizeof(payload.mac_header));
- packet_len += sizeof(payload.mac_header);
- payload.header.dev_addr = device_addr;
- memset(&payload.header.frame_control,0,sizeof(payload.header.frame_control));
- payload.header.frame_counter = frame_counter;
- memcpy(&output_packet_buffer[packet_len], &payload.header, sizeof(payload.header));
- packet_len += sizeof(payload.header);
- payload.port = 1;
- output_packet_buffer[packet_len] = 1;//port
- packet_len++;
- crypto_block[0] = 0x01;
- crypto_block[1] = 0x00;
- crypto_block[2] = 0x00;
- crypto_block[3] = 0x00;
- crypto_block[4] = 0x00;
- crypto_block[5] = 0x00;//dir
- crypto_block[6] = (uint8_t)(device_addr>>24);
- crypto_block[7] = (uint8_t)(device_addr>>16);
- crypto_block[8] = (uint8_t)(device_addr>>8);
- crypto_block[9] = (uint8_t)(device_addr>>0);
- crypto_block[10] = (uint8_t)(frame_counter>>24);
- crypto_block[11] = (uint8_t)(frame_counter>>16);
- crypto_block[12] = (uint8_t)(frame_counter>>8);
- crypto_block[13] = (uint8_t)(frame_counter>>0);
- crypto_block[14] = 0x00;
- uint8_t len = ceil(data_in.size/16);
- int data_i = 0;
- for(uint8_t i=0; i<=len; i++)
- {
- crypto_block[15] = i;
- AES_CBC_encrypt_buffer(out_enc_buff,crypto_block, 16, m_appKey, iv);
- for(int i=0; i<16; i++)
- {
- output_packet_buffer[packet_len] = data_in.data[data_i] ^ out_enc_buff[i];
- data_i++;
- packet_len++;
- }
- }
- output_packet_buffer[0] = 0x49;
- output_packet_buffer[1] = 0x00;
- output_packet_buffer[2] = 0x00;
- output_packet_buffer[3] = 0x00;
- output_packet_buffer[4] = 0x00;
- output_packet_buffer[5] = 0x00;//dir
- output_packet_buffer[6] = (uint8_t)(device_addr>>24);
- output_packet_buffer[7] = (uint8_t)(device_addr>>16);
- output_packet_buffer[8] = (uint8_t)(device_addr>>8);
- output_packet_buffer[9] = (uint8_t)(device_addr>>0);
- output_packet_buffer[10] = (uint8_t)(frame_counter>>24);
- output_packet_buffer[11] = (uint8_t)(frame_counter>>16);
- output_packet_buffer[12] = (uint8_t)(frame_counter>>8);
- output_packet_buffer[13] = (uint8_t)(frame_counter>>0);
- output_packet_buffer[14] = 0x00;
- output_packet_buffer[15] = packet_len-16;
- uint8_t mic_buff[16];
- //generate message integrity code
- AES_CMAC(m_networkKey, output_packet_buffer, packet_len, mic_buff);
- mic = mic_buff[0] | (mic_buff[1]<<8) | (mic_buff[2]<<16) | (mic_buff[3]<<24);
- memcpy(&output_packet_buffer[packet_len], (void*)&mic, sizeof(mic));
- packet_len += sizeof(mic);
- out_buffer.data = &output_packet_buffer[16];
- out_buffer.size = packet_len-16;
- return true;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement