reorder comments for DE entry a bit
[platform/upstream/crda.git] / key2pub.py
1 #!/usr/bin/env python
2
3 import sys
4 from M2Crypto import RSA
5
6 def print_ssl(name, val):
7     sys.stdout.write('static BN_ULONG %s[] = {\n' % name)
8     idx = 0
9     while val[0] == '\0':
10         val = val[1:]
11     while len(val) % 4:
12         val = '\0' + val
13     vnew = []
14     while len(val):
15         vnew.append((val[0], val[1], val[2], val[3], ))
16         val = val[4:]
17     vnew.reverse()
18     for v1, v2, v3, v4 in vnew:
19         if not idx:
20             sys.stdout.write('\t')
21         sys.stdout.write('0x%.2x%.2x%.2x%.2x, ' % (ord(v1), ord(v2), ord(v3), ord(v4)))
22         idx += 1
23         if idx == 4:
24             idx = 0
25             sys.stdout.write('\n')
26     if idx:
27         sys.stdout.write('\n')
28     sys.stdout.write('};\n\n')
29
30 def print_ssl_keys(n):
31     sys.stdout.write(r'''
32 struct pubkey {
33         struct bignum_st e, n;
34 };
35
36 #define KEY(data) {                             \
37         .d = data,                              \
38         .top = sizeof(data)/sizeof(data[0]),    \
39 }
40
41 #define KEYS(e,n)       { KEY(e), KEY(n), }
42
43 static struct pubkey keys[] = {
44 ''')
45     for n in xrange(n + 1):
46         sys.stdout.write('      KEYS(e_%d, n_%d),\n' % (n, n))
47     sys.stdout.write('};\n')
48     pass
49
50 def print_gcrypt(name, val):
51     sys.stdout.write('static __u8 %s[] = {\n' % name)
52     idx = 0
53     while val[0] == '\0':
54         val = val[1:]
55     for v in val:
56         if not idx:
57             sys.stdout.write('\t')
58         sys.stdout.write('0x%.2x, ' % ord(v))
59         idx += 1
60         if idx == 8:
61             idx = 0
62             sys.stdout.write('\n')
63     if idx:
64         sys.stdout.write('\n')
65     sys.stdout.write('};\n\n')
66
67 def print_gcrypt_keys(n):
68     sys.stdout.write(r'''
69 struct key_params {
70         __u8 *e, *n;
71         __u32 len_e, len_n; 
72 };
73
74 #define KEYS(_e, _n) {                  \
75         .e = _e, .len_e = sizeof(_e),   \
76         .n = _n, .len_n = sizeof(_n),   \
77 }
78
79 static struct key_params keys[] = {
80 ''')
81     for n in xrange(n + 1):
82         sys.stdout.write('      KEYS(e_%d, n_%d),\n' % (n, n))
83     sys.stdout.write('};\n')
84     
85
86 modes = {
87     '--ssl': (print_ssl, print_ssl_keys),
88     '--gcrypt': (print_gcrypt, print_gcrypt_keys),
89 }
90
91 try:
92     mode = sys.argv[1]
93     files = sys.argv[2:]
94 except IndexError:
95     mode = None
96
97 if not mode in modes:
98     print 'Usage: %s [%s] files' % (sys.argv[0], '|'.join(modes.keys()))
99     sys.exit(2)
100
101 # load key
102 idx = 0
103 for f in files:
104     try:
105         key = RSA.load_pub_key(f)
106     except RSA.RSAError:
107         key = RSA.load_key(f)
108
109     modes[mode][0]('e_%d' % idx, key.e[4:])
110     modes[mode][0]('n_%d' % idx, key.n[4:])
111
112 modes[mode][1](idx)