remove useless VERIFY_SIGNATURE #ifdef
[platform/upstream/crda.git] / db2bin.py
1 #!/usr/bin/env python
2
3 from cStringIO import StringIO
4 import struct
5 import sha
6 from dbparse import DBParser, create_rules, create_collections
7
8 MAGIC = 0x52474442
9 VERSION = 19
10
11 def be32(output, val):
12     output.write(struct.pack('>I', val))
13
14 class PTR(object):
15     def __init__(self, output):
16         self._output = output
17         self._pos = output.tell()
18         be32(output, 0xFFFFFFFF)
19
20     def set(self, val=None):
21         if val is None:
22             val = self._output.tell()
23         self._offset = val
24         pos = self._output.tell()
25         self._output.seek(self._pos)
26         be32(self._output, val)
27         self._output.seek(pos)
28
29     def get(self):
30         return self._offset
31
32 p = DBParser()
33 bands, power, countries = p.parse(file('db.txt'))
34 rules = create_rules(countries)
35 collections = create_collections(countries)
36
37 output = StringIO()
38
39 # struct regdb_file_header
40 be32(output, MAGIC)
41 be32(output, VERSION)
42 reg_country_ptr = PTR(output)
43 # add number of countries
44 be32(output, len(countries))
45 siglen = PTR(output)
46
47 power_rules = {}
48 for power_rule_id, pr in power.iteritems():
49     environ = pr[0]
50     pr = [int(v * 100) for v in pr[1:]]
51     power_rules[power_rule_id] = output.tell()
52     # struct regdb_file_power_rule
53     output.write(struct.pack('>cxxxIIIII', str(environ), *pr))
54
55 freq_ranges = {}
56 for freq_range_id, fr in bands.iteritems():
57     freq_ranges[freq_range_id] = output.tell()
58     fl = fr[3]
59     fr = [int(f * 1000) for f in fr[:3]]
60     # struct regdb_file_freq_range
61     output.write(struct.pack('>IIIII', fr[0], fr[1], fr[2], fl, 0))
62
63
64 reg_rules = {}
65 for reg_rule in rules:
66     freq_range_id, power_rule_id = reg_rule
67     reg_rules[reg_rule] = output.tell()
68     # struct regdb_file_reg_rule
69     output.write(struct.pack('>II', freq_ranges[freq_range_id], power_rules[power_rule_id]))
70
71
72 reg_rules_collections = {}
73
74 for coll in collections:
75     reg_rules_collections[coll] = output.tell()
76     # struct regdb_file_reg_rules_collection
77     be32(output, len(coll))
78     for regrule in coll:
79         be32(output, reg_rules[regrule])
80
81 # update country pointer now!
82 reg_country_ptr.set()
83
84 countrynames = countries.keys()
85 countrynames.sort()
86 for alpha2 in countrynames:
87     coll = countries[alpha2]
88     # struct regdb_file_reg_country
89     output.write(struct.pack('>ccxxI', str(alpha2[0]), str(alpha2[1]), reg_rules_collections[coll]))
90
91 # Load RSA only now so people can use this script
92 # without having those libraries installed to verify
93 # their SQL changes
94 from M2Crypto import RSA
95
96 # determine signature length
97 key = RSA.load_key('key.priv.pem')
98 hash = sha.new()
99 hash.update(output.getvalue())
100 sig = key.sign(hash.digest())
101 # write it to file
102 siglen.set(len(sig))
103 # sign again
104 hash = sha.new()
105 hash.update(output.getvalue())
106 sig = key.sign(hash.digest())
107
108 output.write(sig)
109
110 outfile = open('regulatory.bin', 'w')
111 outfile.write(output.getvalue())