Skip to content

Commit b740b79

Browse files
committed
- QZNMA: added authentication for multiple QZSS satellite.
- OSNMA: common function moved to qznma and gnss.
1 parent 9da6983 commit b740b79

File tree

3 files changed

+298
-263
lines changed

3 files changed

+298
-263
lines changed

src/cssrlib/gnss.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from math import floor, sin, cos, sqrt, asin, atan2, fabs, tan
88
import numpy as np
99
from datetime import datetime, timezone
10+
import bitstruct.c as bs
1011

1112
gpst0 = [1980, 1, 6, 0, 0, 0] # GPS system time reference
1213
gst0 = [1999, 8, 22, 0, 0, 0] # Galileo system time reference
@@ -1486,3 +1487,16 @@ def tropmodelHpf():
14861487
trop_wet = (77.6e-6 * 11000.0 * 4810.0 * e/temp**2)/5.0
14871488

14881489
return trop_dry, trop_wet, None
1490+
1491+
1492+
def copy_buff(src, dst, ofst_s=0, ofst_d=0, blen=0):
1493+
""" copy bit-wise buffer copy """
1494+
b = blen//32
1495+
r = blen-b*32
1496+
for k in range(b):
1497+
d = bs.unpack_from('u32', src, k*32+ofst_s)[0]
1498+
bs.pack_into('u32', dst, k*32+ofst_d, d)
1499+
if r > 0:
1500+
fmt = 'u'+str(r)
1501+
d = bs.unpack_from(fmt, src, b*32+ofst_s)[0]
1502+
bs.pack_into(fmt, dst, b*32+ofst_d, d)

src/cssrlib/osnma.py

Lines changed: 16 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@
2121
from binascii import unhexlify, hexlify
2222
from enum import IntEnum
2323
import xml.etree.ElementTree as et
24-
from cssrlib.gnss import gpst2time, time2gst
24+
from cssrlib.gnss import gpst2time, time2gst, copy_buff
25+
from cssrlib.qznma import raw2der
2526

2627

2728
class uOSNMA(IntEnum):
@@ -164,16 +165,6 @@ class osnma():
164165
flg_slowmac = False
165166
nsat = 0
166167

167-
def raw2der(self, ds):
168-
""" convert digital signature from raw format to der format """
169-
lds = len(ds)
170-
ln = lds//2
171-
r = int.from_bytes(ds[:ln], byteorder='big')
172-
s = int.from_bytes(ds[ln:], byteorder='big')
173-
der = utils.encode_dss_signature(r, s)
174-
175-
return bytes(der)
176-
177168
def difftime(self, t1, t2):
178169
""" difference of time between t1 and t2 """
179170
wn1, tow1 = bs.unpack_from('u12u20', t1, 0)
@@ -277,7 +268,7 @@ def verify_root_key(self):
277268

278269
result = False
279270
hash_func = self.hash_table[self.hf]
280-
ds_der = self.raw2der(self.ds)
271+
ds_der = raw2der(self.ds)
281272
if self.pubk_path is None:
282273
pk = self.pk_list[self.pkid].pk
283274
else:
@@ -580,14 +571,8 @@ def decode_nav(self, df):
580571
return False
581572
if mt > 0 and mt <= 10:
582573
j = (mt-1)*16*8
583-
for k in range(14):
584-
b = bs.unpack_from('u8', df, 2+8*k)[0]
585-
bs.pack_into('u8', self.subfrm, j, b)
586-
j += 8
587-
for k in range(2):
588-
b = bs.unpack_from('u8', df, 122+8*k)[0]
589-
bs.pack_into('u8', self.subfrm, j, b)
590-
j += 8
574+
copy_buff(df, self.subfrm, 2, j, 112)
575+
copy_buff(df, self.subfrm, 122, j+112, 16)
591576
return True
592577

593578
def load_inav(self, msg):
@@ -606,18 +591,9 @@ def load_inav(self, msg):
606591
if even != 0 or odd != 1 or pt1 != 0 or pt2 != 0:
607592
print("I/NAV page format error.")
608593

609-
i = 2
610-
for k in range(14):
611-
nav[k] = bs.unpack_from('u8', msg, i)[0]
612-
i += 8
613-
i += 8
614-
for k in range(2):
615-
nav[14+k] = bs.unpack_from('u8', msg, i)[0]
616-
i += 8
617-
618-
for k in range(5):
619-
nma_b[k] = bs.unpack_from('u8', msg, i)[0]
620-
i += 8
594+
copy_buff(msg, nav, 2, 0, 112)
595+
copy_buff(msg, nav, 122, 112, 16)
596+
copy_buff(msg, nma_b, 138, 0, 40)
621597

622598
return nav, nma_b
623599

@@ -629,7 +605,6 @@ def load_nav(self, nav, prn, tow):
629605
if tow % 30 == 1:
630606
self.subfrm[j0:j0+160] = self.subfrm_p[j0:j0+160]
631607
self.subfrm_p[j0:j0+160] = self.subfrm_n[j0:j0+160]
632-
# self.subfrm_n[j0:j0+160] = [0]*160
633608

634609
if mt > 0 and mt <= 10:
635610
j = j0+(mt-1)*16
@@ -659,26 +634,17 @@ def gen_navmsg(self, prn):
659634
if self.monlevel > 1:
660635
svid = bs.unpack_from('u6', self.subfrm, j0+16+3*16*8)[0]
661636
wn, tow = bs.unpack_from('u12u20', self.subfrm, j0+73+4*16*8)
662-
print(f" svid={svid:2d} iodnav={
663-
iodnav1:2d} gst_wn={wn:4d} gst_tow={tow:6d}")
637+
print(f" svid={svid:2d} iodnav={iodnav1:2d} "
638+
f"gst_wn={wn:4d} gst_tow={tow:6d}")
664639

665640
msg = bytearray(69)
666641
# 549b MT1 120b, MT2 120b, MT3 122b, MT4 120b, MT5 67b
642+
blen_t = [120, 120, 122, 120, 67]
667643
j = 0
668644
for mt in range(5):
669-
for k in range(15):
670-
b = bs.unpack_from('u8', self.subfrm, j0+6+k*8+mt*16*8)[0]
671-
bs.pack_into('u8', msg, j, b)
672-
j += 8
673-
if mt == 4 and k >= 7:
674-
b = bs.unpack_from('u3', self.subfrm, j0+70+4*16*8)[0]
675-
bs.pack_into('u3', msg, j, b)
676-
j += 3
677-
break
678-
if mt == 2:
679-
b = bs.unpack_from('u2', self.subfrm, j0+126+2*16*8)[0]
680-
bs.pack_into('u2', msg, j, b)
681-
j += 2
645+
copy_buff(self.subfrm, msg, j0+6+mt*16*8, j, blen_t[mt])
646+
j += blen_t[mt]
647+
682648
return msg
683649

684650
def gen_utcmsg(self):
@@ -699,15 +665,8 @@ def gen_utcmsg(self):
699665

700666
# 141b MT6 99b, MT10 42b
701667
msg = bytearray(18)
702-
j = 0
703-
for k in range(13):
704-
b = bs.unpack_from('u8', mt6, 6+k*8)[0]
705-
bs.pack_into('u8', msg, j, b)
706-
j += 8
707-
j = 99
708-
709-
a0g, a1g, t0g, wn0g = bs.unpack_from('s16s12u8u6', mt10, 86)
710-
bs.pack_into('s16s12u8u6', msg, j, a0g, a1g, t0g, wn0g)
668+
copy_buff(mt6, msg, 6, 0, 99)
669+
copy_buff(mt10, msg, 86, 99, 42)
711670

712671
return msg
713672

0 commit comments

Comments
 (0)