Index: net/data/verify_name_match_unittest/scripts/generate-names.py |
diff --git a/net/data/verify_name_match_unittest/scripts/generate-names.py b/net/data/verify_name_match_unittest/scripts/generate-names.py |
new file mode 100755 |
index 0000000000000000000000000000000000000000..eba5d3e7355b9ae0f78c56b1d7aa8c0402c29ad8 |
--- /dev/null |
+++ b/net/data/verify_name_match_unittest/scripts/generate-names.py |
@@ -0,0 +1,113 @@ |
+#!/usr/bin/env python |
+# Copyright 2015 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+import copy |
+import os |
+import subprocess |
+import tempfile |
+ |
+ |
+class RDN: |
+ def __init__(self): |
+ self.attrs = [] |
+ |
+ def add_attr(self, attr_type, attr_value_type, attr_value): |
+ self.attrs.append((attr_type, attr_value_type, attr_value)) |
+ return self |
+ |
+ def __str__(self): |
+ s = '' |
+ for n, attr in enumerate(self.attrs): |
+ s += 'attrTypeAndValue%i=SEQUENCE:attrTypeAndValueSequence%i_%i\n' % ( |
+ n, id(self), n) |
+ |
+ s += '\n' |
+ for n, attr in enumerate(self.attrs): |
+ s += '[attrTypeAndValueSequence%i_%i]\n' % (id(self), n) |
+ # Note the quotes around the string value here, which is necessary for |
+ # trailing whitespace to be included by openssl. |
+ s += 'type=OID:%s\nvalue=%s:"%s"\n' % attr |
+ |
+ return s |
+ |
+ |
+class NameGenerator: |
+ def __init__(self): |
+ self.rdns = [] |
+ |
+ def add_rdn(self): |
+ rdn = RDN() |
+ self.rdns.append(rdn) |
+ return rdn |
+ |
+ def __str__(self): |
+ s = 'asn1 = SEQUENCE:rdnSequence\n\n[rdnSequence]\n' |
+ for n, rdn in enumerate(self.rdns): |
+ s += 'rdn%i = SET:rdnSet%i\n' % (n, n) |
+ |
+ s += '\n' |
+ |
+ for n, rdn in enumerate(self.rdns): |
+ s += '[rdnSet%i]\n%s\n' % (n, rdn) |
+ |
+ return s |
+ |
+ def generate(self, outfn): |
+ f = tempfile.NamedTemporaryFile() |
+ f.write(str(self)) |
+ f.flush() |
+ subprocess.check_call(['openssl', 'asn1parse', '-genconf', f.name, '-noout', |
+ '-out', outfn]) |
+ f.close() |
+ |
+ |
+def unmangled(s): |
+ return s |
+ |
+ |
+def extra_whitespace(s): |
+ return ' ' + s.replace(' ', ' ') + ' ' |
+ |
+ |
+def case_swap(s): |
+ return s.swapcase() |
+ |
+ |
+def main(): |
+ output_path = '../names' |
+ for valuetype in ('PRINTABLESTRING', 'T61STRING', 'UTF8', 'BMPSTRING', |
+ 'UNIVERSALSTRING'): |
+ for string_mangler in (unmangled, extra_whitespace, case_swap): |
+ n=NameGenerator() |
+ n.add_rdn().add_attr('countryName', 'PRINTABLESTRING', 'US') |
+ n.add_rdn().add_attr('stateOrProvinceName', |
+ valuetype, |
+ string_mangler('New York')) |
+ n.add_rdn().add_attr('localityName', |
+ valuetype, |
+ string_mangler("ABCDEFGHIJKLMNOPQRSTUVWXYZ " |
+ "abcdefghijklmnopqrstuvwxyz " |
+ "0123456789 '()+,-./:=?")) |
+ |
+ n_extra_attr = copy.deepcopy(n) |
+ n_extra_attr.rdns[-1].add_attr('organizationName', |
+ valuetype, |
+ string_mangler('Name of company')) |
+ |
+ n_extra_rdn = copy.deepcopy(n) |
+ n_extra_rdn.add_rdn().add_attr('organizationName', |
+ valuetype, |
+ string_mangler('Name of company')) |
+ |
+ filename_base = os.path.join( |
+ output_path, 'ascii-' + valuetype + '-' + string_mangler.__name__) |
+ |
+ n.generate(filename_base + '.der') |
+ n_extra_attr.generate(filename_base + '-extra_attr.der') |
+ n_extra_rdn.generate(filename_base + '-extra_rdn.der') |
+ |
+ |
+if __name__ == '__main__': |
+ main() |