schwehr/libais

View on GitHub
src/libais/ais8_366.cpp

Summary

Maintainability
Test Coverage
// USCG binary application messages (BBM).

#include "ais.h"

namespace libais {

// US Coast Guard (USCG) blue force encrypted position report.
//
// Also known as: Blue Force Tracking (BFT) or encrypted AIS (EAIS).
// Messages use AES 256 or Blowfish, but the decryption is not done here.
//
// "NAIS Performance Specification" says:
//
// Technical Characteristics for USCG Encrypted Automatic
// Identification System (EAIS) Very High Frequency Data Link (VDL)
// Standard (v4.0)
//
// (FIPS) 140-2 and 197 for data communications encryption
Ais8_366_56::Ais8_366_56(const char *nmea_payload, const size_t pad)
    : Ais8(nmea_payload, pad) {
  assert(dac == 366);
  assert(fi == 56);

  if (!CheckStatus()) {
    return;
  }
  if (num_bits < 56 || num_bits > 1192) {
    status = AIS_ERR_BAD_BIT_COUNT;
    return;
  }

  bits.SeekTo(56);
  int num_full_bytes = bits.GetRemaining() / 8;

  for (int i = 0; i < num_full_bytes; i++) {
    encrypted.push_back(bits.ToUnsignedInt(56 + i * 8, 8));
  }

  if (bits.GetRemaining() > 0) {
    assert(bits.GetRemaining() < 8);
    encrypted.push_back(
        bits.ToUnsignedInt(bits.GetPosition(), bits.GetRemaining()));
  }

  status = AIS_OK;
}

}  // namespace libais