Ignore:
Timestamp:
Oct 24, 2026, 11:15:22 PM (7 days ago)
Author:
stuerze
Message:

test suite extended regardiing security aspects

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/BNC/tests/tools/ssr_harness.cpp

    r11125 r11127  
    66// struct is a separate heap block here, so a write beyond a struct is
    77// reported by AddressSanitizer instead of silently corrupting the next member.
     8//
     9// Every decoded VTEC (all formats) and metadata message (new RTCM-SSR) is
     10// encoded again with the Make* function of the same class and decoded once
     11// more; the result must be identical (exit code 1 otherwise).
    812//
    913// Usage: ssr_harness <file>   (BNC raw file or plain RTCM3 byte stream)
    … …  
    3337}
    3438
     39struct t_target {
     40  t_target()  : co(new SsrCorr::ClockOrbit()), cb(new SsrCorr::CodeBias()),
     41                v(new SsrCorr::VTEC()), pb(new SsrCorr::PhaseBias()),
     42                md(new SsrCorr::MetaData()), a(new SsrCorr::Antenna()) {}
     43  ~t_target() {delete co; delete cb; delete v; delete pb; delete md; delete a;}
     44  int decode(SsrCorr* ssr, const unsigned char* frame, size_t size) {
     45    int bytesused = 0;
     46    return ssr->GetSSR(co, cb, v, pb, md, a, (const char*)frame, size, &bytesused);
     47  }
     48  SsrCorr::ClockOrbit* co;
     49  SsrCorr::CodeBias*   cb;
     50  SsrCorr::VTEC*       v;
     51  SsrCorr::PhaseBias*  pb;
     52  SsrCorr::MetaData*   md;
     53  SsrCorr::Antenna*    a;
     54};
     55
     56static bool sameVTEC(const SsrCorr::VTEC* v1, const SsrCorr::VTEC* v2) {
     57  if (v1->EpochTime != v2->EpochTime || v1->NumLayers != v2->NumLayers ||
     58      v1->Quality != v2->Quality) {
     59    return false;
     60  }
     61  for (unsigned l = 0; l < v1->NumLayers; l++) {
     62    const SsrCorr::VTEC::IonoLayers& l1 = v1->Layers[l];
     63    const SsrCorr::VTEC::IonoLayers& l2 = v2->Layers[l];
     64    if (l1.Height != l2.Height || l1.Degree != l2.Degree || l1.Order != l2.Order) {
     65      return false;
     66    }
     67    for (unsigned d = 0; d <= l1.Degree; d++) {
     68      for (unsigned o = 0; o <= l1.Order; o++) {
     69        if (l1.Cosinus[d][o] != l2.Cosinus[d][o] || l1.Sinus[d][o] != l2.Sinus[d][o]) {
     70          return false;
     71        }
     72      }
     73    }
     74  }
     75  return true;
     76}
     77
     78static bool sameMetaData(const SsrCorr::MetaData* m1, const SsrCorr::MetaData* m2) {
     79  if (m1->SSRIOD != m2->SSRIOD || m1->SSRProviderID != m2->SSRProviderID ||
     80      m1->SSRSolutionID != m2->SSRSolutionID || m1->NumEntries != m2->NumEntries) {
     81    return false;
     82  }
     83  for (unsigned i = 0; i < m1->NumEntries; i++) {
     84    if (memcmp(&m1->Entries[i], &m2->Entries[i], sizeof(m1->Entries[i])) != 0) {
     85      return false;
     86    }
     87  }
     88  return true;
     89}
     90
     91static int nFailed = 0;
     92
     93// Decode, print a summary, encode the result again and compare
    3594static void decode(const char* name, SsrCorr* ssr, const unsigned char* frame, size_t size) {
    36   SsrCorr::ClockOrbit* co = new SsrCorr::ClockOrbit();
    37   SsrCorr::CodeBias*   cb = new SsrCorr::CodeBias();
    38   SsrCorr::VTEC*       v  = new SsrCorr::VTEC();
    39   SsrCorr::PhaseBias*  pb = new SsrCorr::PhaseBias();
    40   SsrCorr::MetaData*   md = new SsrCorr::MetaData();
    41   SsrCorr::Antenna*    a  = new SsrCorr::Antenna();
    42   int bytesused = 0;
    43 
    44   int irc = ssr->GetSSR(co, cb, v, pb, md, a, (const char*)frame, size, &bytesused);
     95  t_target t1;
     96  int irc = t1.decode(ssr, frame, size);
    4597  printf("  %-8s irc %3d", name, irc);
    46   if (irc >= 0 && v->NumLayers) {
     98  if (irc >= 0 && t1.v->NumLayers) {
    4799    double sum = 0.0;
    48100    printf("  VTEC");
    49     for (unsigned l = 0; l < v->NumLayers; l++) {
    50       const SsrCorr::VTEC::IonoLayers& layer = v->Layers[l];
     101    for (unsigned l = 0; l < t1.v->NumLayers; l++) {
     102      const SsrCorr::VTEC::IonoLayers& layer = t1.v->Layers[l];
    51103      printf(" %u/%u", layer.Degree, layer.Order);
    52104      for (unsigned d = 0; d <= layer.Degree; d++) {
    … …  
    57109    }
    58110    printf("  sum(C-S) %.3f", sum);
     111
     112    char buffer[CLOCKORBIT_BUFFERSIZE];
     113    size_t len = ssr->MakeVTEC(t1.v, 0, buffer, sizeof(buffer));
     114    t_target t2;
     115    bool ok = len > 0 && t2.decode(ssr, (const unsigned char*)buffer, len) >= 0 && sameVTEC(t1.v, t2.v);
     116    printf("  re-encoded: %s", ok ? "identical" : "DIFFERENT");
     117    nFailed += !ok;
    59118  }
    60   if (irc >= 0 && md->NumEntries) {
    61     printf("  META %u entries, additional data", md->NumEntries);
    62     for (unsigned i = 0; i < md->NumEntries; i++) {
    63       if (md->Entries[i].additionalParameterIndicator) {
    64         printf(" %u:0x%x", md->Entries[i].additionalParameterNumBits,
    65                md->Entries[i].additionalParameterData);
     119  if (irc >= 0 && t1.md->NumEntries) {
     120    printf("  META %u entries, additional data", t1.md->NumEntries);
     121    for (unsigned i = 0; i < t1.md->NumEntries; i++) {
     122      if (t1.md->Entries[i].additionalParameterIndicator) {
     123        printf(" %u:0x%x", t1.md->Entries[i].additionalParameterNumBits,
     124               t1.md->Entries[i].additionalParameterData);
    66125      }
     126    }
     127    SsrCorrRtcmNew* rtcmNew = dynamic_cast<SsrCorrRtcmNew*>(ssr);
     128    if (rtcmNew) {
     129      char buffer[CLOCKORBIT_BUFFERSIZE];
     130      size_t len = rtcmNew->MakeMetaData(t1.md, buffer, sizeof(buffer));
     131      t_target t2;
     132      bool ok = len > 0 && t2.decode(ssr, (const unsigned char*)buffer, len) >= 0 && sameMetaData(t1.md, t2.md);
     133      printf("  re-encoded: %s", ok ? "identical" : "DIFFERENT");
     134      nFailed += !ok;
    67135    }
    68136  }
    69137  printf("\n");
    70 
    71   delete co; delete cb; delete v; delete pb; delete md; delete a;
    72138}
    73139
    … …  
    111177    ii += len + 6;
    112178  }
     179  if (nFailed) {
     180    printf("%d decoded messages differ after re-encoding\n", nFailed);
     181    return 1;
     182  }
    113183  return 0;
    114184}
Note: See TracChangeset for help on using the changeset viewer.