aboutsummaryrefslogtreecommitdiffstats
path: root/src/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'src/scripts')
-rwxr-xr-xsrc/scripts/oids.py162
1 files changed, 162 insertions, 0 deletions
diff --git a/src/scripts/oids.py b/src/scripts/oids.py
new file mode 100755
index 000000000..e3c232211
--- /dev/null
+++ b/src/scripts/oids.py
@@ -0,0 +1,162 @@
+#!/usr/bin/python2
+
+"""
+(C) 2016 Jack Lloyd
+
+Botan is released under the Simplified BSD License (see license.txt)
+"""
+
+import sys
+import datetime
+import re
+
+def format_map(m, for_oid = False):
+ s = ''
+ for k in sorted(m.keys()):
+ v = m[k]
+
+ if len(s) > 0:
+ s += ' '
+
+ if for_oid:
+ s += '{ "%s", OID("%s") },\n' % (k,v)
+ else:
+ s += '{ "%s", "%s" },\n' % (k,v)
+
+ s = s[:-2] # chomp last two chars
+
+ return s
+
+
+def format_as_map(oid2str, str2oid):
+ return """/*
+* OID maps
+*
+* This file was automatically generated by %s on %s
+*
+* Botan is released under the Simplified BSD License (see license.txt)
+*/
+
+#include <botan/oids.h>
+#include <unordered_map>
+
+namespace Botan {
+
+std::unordered_map<std::string, std::string> OIDS::load_oid2str_map()
+ {
+ return std::unordered_map<std::string,std::string>{
+ %s
+ };
+ }
+
+std::unordered_map<std::string, OID> OIDS::load_str2oid_map()
+ {
+ return std::unordered_map<std::string,OID>{
+ %s
+ };
+ }
+
+}
+""" % (sys.argv[0], datetime.date.today().strftime("%Y-%m-%d"),
+ format_map(oid2str), format_map(str2oid, True))
+
+
+def format_if(m, nm,t=False):
+ s = ''
+ for k in sorted(m.keys()):
+ v = m[k]
+
+ if t:
+ s += ' if(%s == "%s") return OID("%s");\n' % (nm,k, v)
+ else:
+ s += ' if(%s == "%s") return "%s";\n' % (nm,k, v)
+
+ s = s[:-1]
+
+ return s
+
+def format_as_ifs(oid2str, str2oid):
+ return """/*
+* OID maps
+*
+* This file was automatically generated by %s on %s
+*
+* Botan is released under the Simplified BSD License (see license.txt)
+*/
+
+#include <botan/oids.h>
+
+namespace Botan {
+
+namespace OIDS {
+
+std::string lookup(const OID& oid)
+ {
+ const std::string oid_str = oid.as_string();
+%s
+ return std::string();
+ }
+
+OID lookup(const std::string& name)
+ {
+%s
+ return OID();
+ }
+
+}
+
+}
+""" % (sys.argv[0], datetime.date.today().strftime("%Y-%m-%d"),
+ format_if(oid2str,"oid_str"), format_if(str2oid, "name", True))
+
+def main(args = None):
+ if args is None:
+ args = sys.argv
+
+ oid_lines = open('src/build-data/oids.txt').readlines()
+
+ oid_re = re.compile("^([1-9][0-9.]+) = ([A-Za-z0-9_\./\(\), -]+)$")
+ hdr_re = re.compile("^\[([a-z0-9_]+)\]$")
+
+ oid2str = {}
+ str2oid = {}
+ cur_hdr = None
+
+ for line in oid_lines:
+ line = line.strip()
+ if len(line) == 0:
+ continue
+
+ if line[0] == '#':
+ continue
+
+ match = hdr_re.match(line)
+ if match is not None:
+ cur_hdr = match.group(1)
+ continue
+
+ match = oid_re.match(line)
+ if match is None:
+ raise Exception(line)
+
+ oid = match.group(1)
+ nam = match.group(2)
+
+ if oid in str2oid:
+ print "Duplicated OID", oid, name, oid2str[oid]
+ sys.exit() # hard error
+ else:
+ oid2str[oid] = nam
+
+ if nam in str2oid:
+ #print "Duplicated name", nam, oid, str2oid[nam]
+ #str2oid[nam] = oid
+ pass
+ else:
+ str2oid[nam] = oid
+
+ print format_as_ifs(oid2str, str2oid)
+
+
+if __name__ == '__main__':
+ sys.exit(main())