Advertisement
Guest User

test

a guest
Jan 19th, 2019
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.92 KB | None | 0 0
  1. bool LoRaWANPacketGen::Gen_UnconfirmedDataUp(const DataRef data_in, DataRef& out_buffer)
  2.  {
  3.     PHYPayload payload;
  4.  
  5.     uint8_t crypto_block[16];
  6.     uint8_t out_enc_buff[16];
  7.  
  8.     uint32_t mic = 0;
  9.     packet_len = 16;
  10.     frame_counter++;
  11.    
  12.     payload.mac_header.rfu = 0;
  13.     payload.mac_header.major = 0;
  14.     payload.mac_header.m_type = MACMessageType::unconfirmed_data_up;
  15.  
  16.     memcpy(&output_packet_buffer[packet_len], &payload.mac_header, sizeof(payload.mac_header));
  17.     packet_len += sizeof(payload.mac_header);
  18.  
  19.     payload.header.dev_addr = device_addr;
  20.     memset(&payload.header.frame_control,0,sizeof(payload.header.frame_control));
  21.     payload.header.frame_counter = frame_counter;
  22.  
  23.     memcpy(&output_packet_buffer[packet_len], &payload.header, sizeof(payload.header));
  24.     packet_len += sizeof(payload.header);
  25.  
  26.     payload.port = 1;
  27.     output_packet_buffer[packet_len] = 1;//port
  28.     packet_len++;
  29.  
  30.     crypto_block[0] = 0x01;
  31.     crypto_block[1] = 0x00;
  32.     crypto_block[2] = 0x00;
  33.     crypto_block[3] = 0x00;
  34.     crypto_block[4] = 0x00;
  35.     crypto_block[5] = 0x00;//dir
  36.  
  37.     crypto_block[6] = (uint8_t)(device_addr>>24);
  38.     crypto_block[7] = (uint8_t)(device_addr>>16);
  39.     crypto_block[8] = (uint8_t)(device_addr>>8);
  40.     crypto_block[9] = (uint8_t)(device_addr>>0);
  41.  
  42.     crypto_block[10] = (uint8_t)(frame_counter>>24);
  43.     crypto_block[11] = (uint8_t)(frame_counter>>16);
  44.     crypto_block[12] = (uint8_t)(frame_counter>>8);
  45.     crypto_block[13] = (uint8_t)(frame_counter>>0);
  46.     crypto_block[14] = 0x00;
  47.  
  48.     uint8_t len = ceil(data_in.size/16);
  49.  
  50.     int data_i = 0;
  51.     for(uint8_t i=0; i<=len; i++)
  52.     {
  53.         crypto_block[15] = i;
  54.         AES_CBC_encrypt_buffer(out_enc_buff,crypto_block, 16, m_appKey, iv);
  55.         for(int i=0; i<16; i++)
  56.         {
  57.             output_packet_buffer[packet_len] = data_in.data[data_i] ^ out_enc_buff[i];
  58.             data_i++;
  59.             packet_len++;
  60.         }
  61.     }
  62.  
  63.     output_packet_buffer[0] = 0x49;
  64.     output_packet_buffer[1] = 0x00;
  65.     output_packet_buffer[2] = 0x00;
  66.     output_packet_buffer[3] = 0x00;
  67.     output_packet_buffer[4] = 0x00;
  68.     output_packet_buffer[5] = 0x00;//dir
  69.  
  70.     output_packet_buffer[6] = (uint8_t)(device_addr>>24);
  71.     output_packet_buffer[7] = (uint8_t)(device_addr>>16);
  72.     output_packet_buffer[8] = (uint8_t)(device_addr>>8);
  73.     output_packet_buffer[9] = (uint8_t)(device_addr>>0);
  74.  
  75.     output_packet_buffer[10] = (uint8_t)(frame_counter>>24);
  76.     output_packet_buffer[11] = (uint8_t)(frame_counter>>16);
  77.     output_packet_buffer[12] = (uint8_t)(frame_counter>>8);
  78.     output_packet_buffer[13] = (uint8_t)(frame_counter>>0);
  79.     output_packet_buffer[14] = 0x00;
  80.     output_packet_buffer[15] = packet_len-16;
  81.  
  82.     uint8_t mic_buff[16];
  83.     //generate message integrity code
  84.     AES_CMAC(m_networkKey, output_packet_buffer, packet_len, mic_buff);
  85.     mic = mic_buff[0] | (mic_buff[1]<<8) | (mic_buff[2]<<16) | (mic_buff[3]<<24);
  86.  
  87.     memcpy(&output_packet_buffer[packet_len], (void*)&mic, sizeof(mic));
  88.     packet_len += sizeof(mic);
  89.  
  90.     out_buffer.data = &output_packet_buffer[16];
  91.     out_buffer.size = packet_len-16;
  92.  
  93.     return true;
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement