コード例 #1
0
ファイル: hu_aap.c プロジェクト: kovrov/headunit
  int iaap_recv_dec_process (int chan, int flags, byte * buf, int len) {// Decrypt & Process 1 received encrypted message

    int bytes_written = BIO_write (hu_ssl_rm_bio, buf, len);           // Write encrypted to SSL input BIO
    if (bytes_written <= 0) {
      loge ("BIO_write() bytes_written: %d", bytes_written);
      return (-1);
    }
    if (bytes_written != len)
      loge ("BIO_write() len: %d  bytes_written: %d  chan: %d", len, bytes_written, chan);
    else if (ena_log_verbo)
      logd ("BIO_write() len: %d  bytes_written: %d  chan: %d", len, bytes_written, chan);

    errno = 0;
    int ctr = 0;
    int max_tries = 1;  // Higher never works
    int bytes_read = -1;
    while (bytes_read <= 0 && ctr ++ < max_tries) {
      bytes_read = SSL_read (hu_ssl_ssl, dec_buf, sizeof (dec_buf));   // Read decrypted to decrypted rx buf
      if (bytes_read <= 0) {
        loge ("ctr: %d  SSL_read() bytes_read: %d  errno: %d", ctr, bytes_read, errno);
        hu_ssl_ret_log (bytes_read);
        ms_sleep (1);
      }
      //logd ("ctr: %d  SSL_read() bytes_read: %d  errno: %d", ctr, bytes_read, errno);
    }

    if (bytes_read <= 0) {
      loge ("ctr: %d  SSL_read() bytes_read: %d  errno: %d", ctr, bytes_read, errno);
      hu_ssl_ret_log (bytes_read);
      return (-1);                                                      // Fatal so return error and de-initialize; Should we be able to recover, if USB data got corrupted ??
    }
    if (ena_log_verbo)
      logd ("ctr: %d  SSL_read() bytes_read: %d", ctr, bytes_read);

    int rmv = 0;
#ifndef NDEBUG
//    if (chan != AA_CH_VID)                                            // If not video...
      rmv = hu_aad_dmp ("DR: ", 2, dec_buf, bytes_read);                // Dump decrypted AA
#endif

    int prot_func_ret = iaap_msg_process (chan, flags, dec_buf, bytes_read);   // Process decrypted AA protocol message
    return (0);//prot_func_ret);
  }
コード例 #2
0
ファイル: hu_aap.c プロジェクト: kovrov/headunit
  int hu_aap_enc_send (int chan, byte * buf, int len) {                // Send encrypted data: type,...
    if (iaap_state != hu_STATE_STARTED) {
      loge ("CHECK: iaap_state: %d (%s)", iaap_state, state_get (iaap_state));
      return (-1);
    }
    if (ena_log_verbo && ena_log_send) {
#ifndef NDEBUG
      hu_aad_dmp ("ES: ", 1, buf, len);
#endif
    }
    int bytes_written = SSL_write (hu_ssl_ssl, buf, len);              // Write plaintext to SSL
    if (bytes_written <= 0) {
      loge ("SSL_write() bytes_written: %d", bytes_written);
      hu_ssl_ret_log (bytes_written);
      hu_ssl_inf_log ();
      hu_aap_stop ();
      return (-1);
    }
    if (bytes_written != len)
      loge ("SSL_write() len: %d  bytes_written: %d  chan: %d", len, bytes_written, chan);
    else if (ena_log_verbo && ena_log_send)
      logd ("SSL_write() len: %d  bytes_written: %d  chan: %d", len, bytes_written, chan);

    int bytes_read = BIO_read (hu_ssl_wm_bio, & enc_buf [4], sizeof (enc_buf) - 4); // Read encrypted from SSL BIO to enc_buf
    if (bytes_read <= 0) {
      loge ("BIO_read() bytes_read: %d", bytes_read);
      hu_aap_stop ();
      return (-1);
    }
    if (ena_log_verbo && ena_log_send)
      logd ("BIO_read() bytes_read: %d", bytes_read);

    int flags = 0x0b;                                                   // Flags = First + Last + Encrypted
    if (chan != 0 && buf [0] == 0) {                                    // If msg_type = 0 - 255
      flags = 0x0f;                                                     // Control
      //logd ("Setting control");
    }

    hu_aap_usb_set (chan, flags, -1, enc_buf, bytes_read + 4);          // -1 for type so encrypted type position is not overwritten !!
    hu_aap_usb_send (enc_buf, bytes_read + 4, iaap_send_tmo);           // Send encrypted data to AA Server

    return (0);
  }
コード例 #3
0
ファイル: hu_aap.c プロジェクト: kovrov/headunit
  int hu_aap_usb_send (byte * buf, int len, int tmo) {                 // Send USB data: chan,flags,len,type,...
    if (iaap_state != hu_STATE_STARTED && iaap_state != hu_STATE_STARTIN) {   // Need to send when starting
      loge ("CHECK: iaap_state: %d (%s)", iaap_state, state_get (iaap_state));
      return (-1);
    }
    if (ena_log_verbo && ena_log_send) {
#ifndef NDEBUG
      if (buf [1] | 0x08 == 0)                                          // If not encrypted (which was dumped in hu_aap_enc_send()
        hu_aad_dmp ("US: ", 1, & buf [4], len - 4);
#endif
    }
    int ret = hu_usb_send (buf, len, tmo);
    if (ret < 0 || ret != len) {
      loge ("Error hu_usb_send() error so stop USB & AAP  ret: %d  len: %d", ret, len);
      hu_aap_stop (); 
      return (-1);
    }  
    if (ena_log_verbo && ena_log_send)
      logd ("OK hu_usb_send() ret: %d  len: %d", ret, len);
    return (ret);
  }
コード例 #4
0
ファイル: hu_aap.cpp プロジェクト: mishaaq/headunit
 int HUServer::hu_aap_unenc_send (int retry,int chan, byte * buf, int len, int overrideTimeout) {                 // Encrypt data and send: type,...
    if (iaap_state != hu_STATE_STARTED && iaap_state != hu_STATE_STARTIN) {
      logw ("CHECK: iaap_state: %d (%s)", iaap_state, state_get (iaap_state));
      //logw ("chan: %d  len: %d  buf: %p", chan, len, buf);
      //hex_dump (" W/    hu_aap_enc_send: ", 16, buf, len);    // Byebye: hu_aap_enc_send:  00000000 00 0f 08 00
      return (-1);
    }

    byte base_flags = 0;
    uint16_t message_type = be16toh(*((uint16_t*)buf));
    if (chan != AA_CH_CTR && message_type >= 2 && message_type < 0x8000) {                            // If not control channel and msg_type = 0 - 255 = control type message
        base_flags |= HU_FRAME_CONTROL_MESSAGE;                                                     // Set Control Flag (On non-control channels, indicates generic/"control type" messages
        //logd ("Setting control");
    }

    logd("Sending hu_aap_unenc_send %i bytes", len);

    for (int frag_start = 0; frag_start < len; frag_start += MAX_FRAME_PAYLOAD_SIZE)
    {
      byte flags = base_flags;

      if (frag_start == 0)
      {
        flags |= HU_FRAME_FIRST_FRAME;
      }
      int cur_len = MAX_FRAME_PAYLOAD_SIZE;
      if ((frag_start + MAX_FRAME_PAYLOAD_SIZE) >= len)
      {
        flags |= HU_FRAME_LAST_FRAME;
        cur_len = len - frag_start;
      }

      logd("Frame %i : %i bytes",(int)flags, cur_len);
  #ifndef NDEBUG
  //    if (ena_log_verbo && ena_log_aap_send) {
      if (log_packet_info) { // && ena_log_aap_send)
        char prefix [MAX_FRAME_SIZE] = {0};
        snprintf (prefix, sizeof (prefix), "S %d %s %1.1x", chan, chan_get (chan), flags);  // "S 1 VID B"
        int rmv = hu_aad_dmp (prefix, "HU", chan, flags, &buf[frag_start], cur_len);
      }
  #endif

      enc_buf [0] = (byte) chan;                                              // Encode channel and flags
      enc_buf [1] = flags;
      *((uint16_t*)&enc_buf[2]) = htobe16(cur_len);
      int header_size = 4;
      if ((flags & HU_FRAME_FIRST_FRAME) & !(flags & HU_FRAME_LAST_FRAME))
      {
        //write total len
        *((uint32_t*)&enc_buf[header_size]) = htobe32(len);
        header_size += 4;
      }

      memcpy(&enc_buf[header_size], &buf[frag_start], cur_len);

      int ret = 0;
      return hu_aap_tra_send (retry, enc_buf, cur_len + header_size, overrideTimeout < 0 ? iaap_tra_send_tmo : overrideTimeout);           // Send encrypted data to AA Server
    }

    return (0);
  }
コード例 #5
0
ファイル: hu_aap.cpp プロジェクト: mishaaq/headunit
  int HUServer::hu_aap_enc_send (int retry,int chan, byte * buf, int len, int overrideTimeout) {                 // Encrypt data and send: type,...
    if (iaap_state != hu_STATE_STARTED) {
      logw ("CHECK: iaap_state: %d (%s)", iaap_state, state_get (iaap_state));
      //logw ("chan: %d  len: %d  buf: %p", chan, len, buf);
      //hex_dump (" W/    hu_aap_enc_send: ", 16, buf, len);    // Byebye: hu_aap_enc_send:  00000000 00 0f 08 00
      return (-1);
    }

    byte base_flags = HU_FRAME_ENCRYPTED;
    uint16_t message_type = be16toh(*((uint16_t*)buf));
    if (chan != AA_CH_CTR && message_type >= 2 && message_type < 0x8000) {                            // If not control channel and msg_type = 0 - 255 = control type message
        base_flags |= HU_FRAME_CONTROL_MESSAGE;                                                     // Set Control Flag (On non-control channels, indicates generic/"control type" messages
        //logd ("Setting control");
    }

    for (int frag_start = 0; frag_start < len; frag_start += MAX_FRAME_PAYLOAD_SIZE)
    {
      byte flags = base_flags;

      if (frag_start == 0)
      {
        flags |= HU_FRAME_FIRST_FRAME;
      }
      int cur_len = MAX_FRAME_PAYLOAD_SIZE;
      if ((frag_start + MAX_FRAME_PAYLOAD_SIZE) >= len)
      {
        flags |= HU_FRAME_LAST_FRAME;
        cur_len = len - frag_start;
      }
  #ifndef NDEBUG
  //    if (ena_log_verbo && ena_log_aap_send) {
      if (log_packet_info) { // && ena_log_aap_send)
        char prefix [MAX_FRAME_SIZE] = {0};
        snprintf (prefix, sizeof (prefix), "S %d %s %1.1x", chan, chan_get (chan), flags);  // "S 1 VID B"
        int rmv = hu_aad_dmp (prefix, "HU", chan, flags, &buf[frag_start], cur_len);
      }
  #endif


      int bytes_written = SSL_write (hu_ssl_ssl, &buf[frag_start], cur_len);               // Write plaintext to SSL
      if (bytes_written <= 0) {
        loge ("SSL_write() bytes_written: %d", bytes_written);
        hu_ssl_ret_log (bytes_written);
        hu_ssl_inf_log ();
        hu_aap_stop ();
        return (-1);
      }
      if (bytes_written != cur_len)
        loge ("SSL_write() cur_len: %d  bytes_written: %d  chan: %d %s", cur_len, bytes_written, chan, chan_get (chan));
      else if (ena_log_verbo && ena_log_aap_send)
        logd ("SSL_write() cur_len: %d  bytes_written: %d  chan: %d %s", cur_len, bytes_written, chan, chan_get (chan));

      enc_buf [0] = (byte) chan;                                              // Encode channel and flags
      enc_buf [1] = flags;

      int header_size = 4;
      if ((flags & HU_FRAME_FIRST_FRAME) & !(flags & HU_FRAME_LAST_FRAME))
      {
        //write total len
        *((uint32_t*)&enc_buf[header_size]) = htobe32(len);
        header_size += 4;
      }

      int bytes_read = BIO_read (hu_ssl_wm_bio, & enc_buf [header_size], sizeof (enc_buf) - header_size); // Read encrypted from SSL BIO to enc_buf +

      if (bytes_read <= 0) {
        loge ("BIO_read() bytes_read: %d", bytes_read);
        hu_aap_stop ();
        return (-1);
      }
      if (ena_log_verbo && ena_log_aap_send)
        logd ("BIO_read() bytes_read: %d", bytes_read);



      *((uint16_t*)&enc_buf[2]) = htobe16(bytes_read);

      int ret = 0;
      ret = hu_aap_tra_send (retry, enc_buf, bytes_read + header_size, overrideTimeout < 0 ? iaap_tra_send_tmo : overrideTimeout);           // Send encrypted data to AA Server
      if (retry)
  		  return (ret);
    }

    return (0);
  }