make openssl keys 64-bit safe
authorJohannes Berg <johannes@sipsolutions.net>
Fri, 17 Apr 2009 21:27:20 +0000 (23:27 +0200)
committerJohannes Berg <johannes@sipsolutions.net>
Fri, 17 Apr 2009 21:36:25 +0000 (23:36 +0200)
openssl uses unsigned longs -- which are 8 bytes on 64-bit
platforms, not 4, so the python code needs to account for
that... how stupid!

Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
utils/key2pub.py

index 74aa28d..8338e27 100755 (executable)
@@ -9,7 +9,31 @@ except ImportError, e:
        sys.stderr.write('On Debian GNU/Linux the package is called "python-m2crypto".\n')
        sys.exit(1)
 
-def print_ssl(output, name, val):
+def print_ssl_64(output, name, val):
+    while val[0] == '\0':
+        val = val[1:]
+    while len(val) % 8:
+        val = '\0' + val
+    vnew = []
+    while len(val):
+        vnew.append((val[0], val[1], val[2], val[3], val[4], val[5], val[6], val[7]))
+        val = val[8:]
+    vnew.reverse()
+    output.write('static BN_ULONG %s[%d] = {\n' % (name, len(vnew)))
+    idx = 0
+    for v1, v2, v3, v4, v5, v6, v7, v8 in vnew:
+        if not idx:
+            output.write('\t')
+        output.write('0x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x, ' % (ord(v1), ord(v2), ord(v3), ord(v4), ord(v5), ord(v6), ord(v7), ord(v8)))
+        idx += 1
+        if idx == 8:
+            idx = 0
+            output.write('\n')
+    if idx:
+        output.write('\n')
+    output.write('};\n\n')
+
+def print_ssl_32(output, name, val):
     while val[0] == '\0':
         val = val[1:]
     while len(val) % 4:
@@ -33,6 +57,13 @@ def print_ssl(output, name, val):
         output.write('\n')
     output.write('};\n\n')
 
+def print_ssl(output, name, val):
+    import struct
+    if len(struct.pack('@L', 0)) == 8:
+        return print_ssl_64(output, name, val)
+    else:
+        return print_ssl_32(output, name, val)
+
 def print_ssl_keys(output, n):
     output.write(r'''
 struct pubkey {