Changeset 11130 in ntrip for trunk/BNC/tests/tools/mkcrafted.py


Ignore:
Timestamp:
Oct 28, 2026, 9:32:30 AM (5 days ago)
Author:
stuerze
Message:

Some fixes from security point of view

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/BNC/tests/tools/mkcrafted.py

    r11125 r11130  
    66  CRAFT0IGS0  IGS-SSR VTEC (4076/201), decoded by SsrCorrIgs, followed by
    77              RTCM 1300/1301/1302 with 31-character names (BNC's RTCM scan
    8               lists them only for streams that also decode successfully)
     8              lists them only for streams that also decode successfully);
     9              in the first epoch also two RTCM 1033 (antenna and receiver
     10              descriptors): a complete one and one whose receiver descriptor
     11              length (200) runs beyond the end of the message
    912  CRAFT0RTC0  RTCM-SSR VTEC (1264), decoded by SsrCorrRtcm
    1013  CRAFT0NEW0  new RTCM-SSR metadata (60), not dispatched by BNC at present;
    … …  
    1215                - 7 entries (maximum), additional parameter of 40 and 0 bits
    1316                - 31 entries (5-bit count, more than META_MAXNUMENTRIES=7)
     17              and satellite antenna messages (DF+010-DF+021):
     18                - BDS (83): C01, C17, C33, C49, C64 (mask bits in all four
     19                  16-bit quarters of DF394), individual blocks
     20                - GPS (80): G01, G02, G32 sharing one block and one frequency
     21                  block; nadir angle corrections incl. the invalid value
    1422
    1523VTEC epochs (every 5 s):
    … …  
    2230by eye; the heights are 100 km * layer number.
    2331
     32With --rawfile, a raw file with hostile chunk headers is written instead
     33(test of the raw file reader, data/crafted_rawfile.raw):
     34  ../ESCAPE0  station ID with a path: RTCM-SSR VTEC whose .ssr file must be
     35              written inside the output directory
     36  CRAFT0RTC0  RTCM-SSR VTEC, 5 s later
     37  then a chunk header announcing 2000000000 bytes, which must be rejected
     38
    2439Usage: mkcrafted.py <out.raw>
     40       mkcrafted.py --rawfile <out.raw>
    2541"""
    2642
    … …  
    140156
    141157
     158def descriptors(strings, truncate=False):
     159    """RTCM 1033: antenna, setup ID, serial, receiver, firmware, serial."""
     160    w = BitWriter()
     161    w.u(1033, 12)
     162    w.u(0, 12)               # reference station ID
     163    ant, antser, rec, firm, recser = strings
     164    w.text(ant, 8)
     165    w.u(0, 8)                # antenna setup ID
     166    w.text(antser, 8)
     167    if truncate:
     168        w.u(200, 8)          # receiver descriptor length beyond the message
     169        for c in rec.encode("ascii"):
     170            w.u(c, 8)
     171    else:
     172        w.text(rec, 8)
     173        w.text(firm, 8)
     174        w.text(recser, 8)
     175    return frame(w.payload())
     176
     177
    142178def metadata(entries):
    143179    """entries: list of None (default model) or number of additional bits."""
    … …  
    163199
    164200
     201def antenna(msg, sats, shared, nadir):
     202    """Satellite antenna message; sats: PRNs (1..64) of the mask."""
     203    w = BitWriter()
     204    w.u(msg, 12)
     205    w.u(4711, 16)            # provider ID
     206    w.u(5, 6)                # satellite antenna IOD
     207    w.u(1, 1)                # phase center information
     208    w.u(0, 1)                # group delay information
     209    w.u(1, 1)                # nadir angle dependent corrections follow
     210    w.u(3, 5)                # maximum off-nadir angle: corrections 0..3 deg
     211    w.u(1, 4)                # range extension: 3 + 1 = 4 bits
     212    w.u(shared, 1)           # satellite set indicator
     213    mask = 0
     214    for prn in sats:
     215        mask |= 1 << (64 - prn)
     216    w.u(mask, 64)
     217    for n in range(1 if shared else len(sats)):
     218        w.u(shared, 1)       # frequency set indicator
     219        w.u(0b101000, 6)     # frequencies 0 and 2
     220        for f in range(1 if shared else 2):
     221            w.u(1, 1)        # nadir correction follows
     222            w.s(100 * n + 10 * f + 1, 12)    # mm
     223            for deg in range(4):
     224                w.s(nadir[(n + f + deg) % len(nadir)], 4)   # mm, -8: invalid
     225    return frame(w.payload())
     226
     227
     228def rawfile(path):
     229    chunks = []
     230    for i, sta in enumerate(["../ESCAPE0", "CRAFT0RTC0"]):
     231        t = T0 + datetime.timedelta(seconds=5 * i)
     232        chunks.append((t.isoformat(), sta, "RTCM_3", vtec_rtcm(t, [(2, 2)])))
     233    write_chunks(path, chunks)
     234    t = T0 + datetime.timedelta(seconds=10)
     235    with open(path, "ab") as o:
     236        o.write(("%s CRAFT0RTC0 RTCM_3 2000000000\n" % t.isoformat()).encode())
     237        o.write(vtec_rtcm(t, [(2, 2)]) + b"\n")
     238
     239
    165240def main():
     241    if len(sys.argv) == 3 and sys.argv[1] == "--rawfile":
     242        rawfile(sys.argv[2])
     243        return
    166244    if len(sys.argv) != 2:
    167245        sys.exit(__doc__)
    … …  
    175253        t = T0 + datetime.timedelta(seconds=5 * i)
    176254        stamp = t.isoformat()
    177         chunks.append((stamp, "CRAFT0IGS0", "RTCM_3", vtec_igs(t, layers)
    178                        + service_crs() + helmert() + rtcm_crs()))
     255        data = vtec_igs(t, layers) + service_crs() + helmert() + rtcm_crs()
     256        if i == 0:
     257            data += descriptors(["LEIAR25.R4      LEIT", "12345", "SEPT POLARX5",
     258                                 "5.5.0", "3001234"])
     259            data += descriptors(["TRUNCATED ANTENNA", "9", "RECEIVER", "", ""],
     260                                truncate=True)
     261        chunks.append((stamp, "CRAFT0IGS0", "RTCM_3", data))
    179262        chunks.append((stamp, "CRAFT0RTC0", "RTCM_3", vtec_rtcm(t, layers)))
    180263    stamp = (T0 + datetime.timedelta(seconds=15)).isoformat()
    181264    chunks.append((stamp, "CRAFT0NEW0", "RTCM_3",
    182                    metadata([40, 0] + [None] * 5) + metadata([None] * 31)))
     265                   metadata([40, 0] + [None] * 5) + metadata([None] * 31)
     266                   + antenna(83, [1, 17, 33, 49, 64], 0, [-7, 0, 7, 3])
     267                   + antenna(80, [1, 2, 32], 1, [5, -8, -1, 2])))
    183268    write_chunks(sys.argv[1], chunks)
    184269
Note: See TracChangeset for help on using the changeset viewer.