Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 import asn1 | 5 import asn1 |
| 6 import datetime | 6 import datetime |
| 7 import hashlib | 7 import hashlib |
| 8 import itertools | 8 import itertools |
| 9 import os | 9 import os |
| 10 import time | 10 import time |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 121 ORGANIZATION, o, | 121 ORGANIZATION, o, |
| 122 ]) | 122 ]) |
| 123 ]) | 123 ]) |
| 124 ) | 124 ) |
| 125 | 125 |
| 126 return names | 126 return names |
| 127 | 127 |
| 128 | 128 |
| 129 # The private key and root certificate name are hard coded here: | 129 # The private key and root certificate name are hard coded here: |
| 130 | 130 |
| 131 # This is the private key | 131 # This is the root private key |
| 132 KEY = RSA(0x00a71998f2930bfe73d031a87f133d2f378eeeeed52a77e44d0fc9ff6f07ff32cbf3 da999de4ed65832afcb0807f98787506539d258a0ce3c2c77967653099a9034a9b115a876c39a8c4 e4ed4acd0c64095946fb39eeeb47a0704dbb018acf48c3a1c4b895fc409fb4a340a986b1afc45519 ab9eca47c30185c771c64aa5ecf07d, | 132 ROOT_KEY = RSA(0x00c1541fac63d3b969aa231a02cb2e0d9ee7b26724f136c121b2c28bdae5caa 87733cc407ad83842ef20ec67d941b448a1ce3557cf5ddebf3c9bde8f36f253ee73e670d1c4c6631 d1ddc0e39cbde09b833f66347ea379c3fa891d61a0ca005b38b0b2cad1058e3589c9f30600be81e4 ff4ac220972c17b74f92f03d72b496f643543d0b27a5227f1efee13c138888b23cb101877b3b4dc0 91f0b3bb6fc3c792187b05ab38e97862f8af6156bcbfbb824385132c6741e6c65cfcd5f13142421a 210b95185884c4866f3ea644dfb8006133d14e72a4704f3e700cf827ca5ffd2ef74c2ab6a5259fff f40f0f7f607891388f917fc9fc9e65742df1bfa0b322140bb65, |
| 133 3, | 133 65537, |
| 134 0x6f6665f70cb2a9a28acbc5aa0cd374cfb49f49e371a542de0a86aa4a0554cc87f7e7 1113edf399021ca875aaffbafaf8aee268c3b15ded2c84fb9a4375bbc6011d841e57833bc6f998d2 5daf6fa7f166b233e3e54a4bae7a5aaaba21431324967d5ff3e1d4f413827994262115ca54396e70 68d0afa7af787a5782bc7040e6d3) | 134 0x00980f2db66ef249e4954074a5fbdf663135363a3071554ac4d19079661bd5b1 79c890ffaa5fc4a8c8e3116e81104fd7cd049f2a48dd2165332bb9fad511f6f817cb09b3c45cf1fa 25d13e9331099c8578c173c74dae9dc3e83784ba0a7216e9e8144af8786221b741c167d033ad47a2 45e4da04aa710a44aff5cdc480b48adbba3575d1315555690f081f9f69691e801e34c21240bcd3df 9573ec5f9aa290c5ed19404fb911ab28b7680e0be086487273db72da6621f24d8c66197a5f1b7687 efe1d9e3b6655af2891d4540482e1246ff5f62ce61b8b5dcb2c66ade6bb41e0bf071445fb8544aa0 a489780f770a6f1031ee19347641794f4ad17354d579a9d061) |
| 135 | |
| 136 # And the same thing in PEM format | |
| 137 KEY_PEM = '''-----BEGIN RSA PRIVATE KEY----- | |
| 138 MIICXAIBAAKBgQCnGZjykwv+c9AxqH8TPS83ju7u1Sp35E0Pyf9vB/8yy/PamZ3k | |
| 139 7WWDKvywgH+YeHUGU50ligzjwsd5Z2UwmakDSpsRWodsOajE5O1KzQxkCVlG+znu | |
| 140 60egcE27AYrPSMOhxLiV/ECftKNAqYaxr8RVGaueykfDAYXHccZKpezwfQIBAwKB | |
| 141 gG9mZfcMsqmiisvFqgzTdM+0n0njcaVC3gqGqkoFVMyH9+cRE+3zmQIcqHWq/7r6 | |
| 142 +K7iaMOxXe0shPuaQ3W7xgEdhB5XgzvG+ZjSXa9vp/FmsjPj5UpLrnpaqrohQxMk | |
| 143 ln1f8+HU9BOCeZQmIRXKVDlucGjQr6eveHpXgrxwQObTAkEA2wBAfuduw5G0/VfN | |
| 144 Wx66D5fbPccfYFqLM5LuTimLmNqzK2gIKXckB2sm44gJZ6wVlumaB1CSNug2LNYx | |
| 145 3cAjUwJBAMNUo1hbI8ugqqwI9kpxv9+2Heea4BlnXbS6tYF8pvkHMoliuxNbXmmB | |
| 146 u4zNB5iZ6V0ZZ4nvtUNo2cGr/h/Lcu8CQQCSACr/RPSCYSNTj948vya1D+d+hL+V | |
| 147 kbIiYfQ0G7Jl5yIc8AVw+hgE8hntBVuacrkPRmaviwwkms7IjsvpKsI3AkEAgjhs | |
| 148 5ZIX3RXHHVtO3EvVP86+mmdAEO+TzdHOVlMZ+1ohsOx8t5I+8QEnszNaZbvw6Lua | |
| 149 W/UjgkXmgR1UFTJMnwJBAKErmAw21/g3SST0a4wlyaGT/MbXL8Ouwnb5IOKQVe55 | |
| 150 CZdeVeSh6cJ4hAcQKfr2s1JaZTJFIBPGKAif5HqpydA= | |
| 151 -----END RSA PRIVATE KEY----- | |
| 152 ''' | |
| 153 | 135 |
| 154 # Root certificate CN | 136 # Root certificate CN |
| 155 ISSUER_CN = "Testing CA" | 137 ROOT_CN = "Testing CA" |
| 156 | 138 |
| 157 # All certificates are issued under this policy OID, in the Google arc: | 139 # All certificates are issued under this policy OID, in the Google arc: |
| 158 CERT_POLICY_OID = asn1.OID([1, 3, 6, 1, 4, 1, 11129, 2, 4, 1]) | 140 CERT_POLICY_OID = asn1.OID([1, 3, 6, 1, 4, 1, 11129, 2, 4, 1]) |
| 159 | 141 |
| 160 # These result in the following root certificate: | 142 # These result in the following root certificate: |
| 161 # -----BEGIN CERTIFICATE----- | 143 # -----BEGIN CERTIFICATE----- |
| 162 # MIIBzTCCATagAwIBAgIBATANBgkqhkiG9w0BAQsFADAVMRMwEQYDVQQDEwpUZXN0aW5nIENBMB4X | 144 # MIIC1DCCAbygAwIBAgIBATANBgkqhkiG9w0BAQsFADAVMRMwEQYDVQQDEwpUZXN0 |
| 163 # DTEwMDEwMTA2MDAwMFoXDTMyMTIwMTA2MDAwMFowFTETMBEGA1UEAxMKVGVzdGluZyBDQTCBnTAN | 145 # aW5nIENBMB4XDTEwMDEwMTA2MDAwMFoXDTMyMTIwMTA2MDAwMFowFTETMBEGA1UE |
| 164 # BgkqhkiG9w0BAQEFAAOBiwAwgYcCgYEApxmY8pML/nPQMah/Ez0vN47u7tUqd+RND8n/bwf/Msvz | 146 # AxMKVGVzdGluZyBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMFU |
| 165 # 2pmd5O1lgyr8sIB/mHh1BlOdJYoM48LHeWdlMJmpA0qbEVqHbDmoxOTtSs0MZAlZRvs57utHoHBN | 147 # H6xj07lpqiMaAssuDZ7nsmck8TbBIbLCi9rlyqh3M8xAetg4Qu8g7GfZQbRIoc41 |
| 166 # uwGKz0jDocS4lfxAn7SjQKmGsa/EVRmrnspHwwGFx3HGSqXs8H0CAQOjLzAtMBIGA1UdEwEB/wQI | 148 # V89d3r88m96PNvJT7nPmcNHExmMdHdwOOcveCbgz9mNH6jecP6iR1hoMoAWziwss |
| 167 # MAYBAf8CAQAwFwYDVR0gBBAwDjAMBgorBgEEAdZ5AgQBMA0GCSqGSIb3DQEBCwUAA4GBAHJJigXg | 149 # rRBY41icnzBgC+geT/SsIglywXt0+S8D1ytJb2Q1Q9CyelIn8e/uE8E4iIsjyxAY |
| 168 # ArH/E9n3AilgivA58hawSRVqiTHHv7oAguDRrA4zC8IvsL6b/6LV7nA3KWM0OUSZSGE3zQb9UlB2 | 150 # d7O03AkfCzu2/Dx5IYewWrOOl4YvivYVa8v7uCQ4UTLGdB5sZc/NXxMUJCGiELlR |
| 169 # nNYsPMdv0Ls4GuOzVfy4bnQXqMWIflRw9L5Z5KH8Vu5U3ohoOUCfWN1sYMoeS9/22K9xtRsDPS+d | 151 # hYhMSGbz6mRN+4AGEz0U5ypHBPPnAM+CfKX/0u90wqtqUln//0Dw9/YHiROI+Rf8 |
| 170 # pQo7Q6ZoOo8o | 152 # n8nmV0LfG/oLMiFAu2UCAwEAAaMvMC0wEgYDVR0TAQH/BAgwBgEB/wIBATAXBgNV |
| 153 # HSAEEDAOMAwGCisGAQQB1nkCBAEwDQYJKoZIhvcNAQELBQADggEBADNrvoAyqAVm | |
| 154 # bydPBBfLRqyH4DXt2vuMVmnSdnWnOxYiEezGmNSNiO1k1ZFBwVSsd+JHrT24lax9 | |
| 155 # kvU1yQDW//PBu3ijfZOCaIUleQiGXHMGfV4MjzgYbxpvHOvEUC6IXmYCsIEwcZgK | |
| 156 # lrwnfJQ3MVU4hOgGTlOTWYPtCwvTsBObNRLdIs+ifMQiWmzPBlM8XeX4e5acDjTb | |
| 157 # emcN4szU3EcgmCA0LvBIRI4F6NWpaIJl2WnLyMUDyKq4vjpRJOZkNwAC+525duDr | |
| 158 # JFE4PKR2Lh53nJQIJv6mcTZQkX1mmw0yzqWxcGCoHACma3TgSwOHryvSopL+t26+ | |
| 159 # ZlQvP2ygwqY= | |
| 171 # -----END CERTIFICATE----- | 160 # -----END CERTIFICATE----- |
| 172 | 161 |
| 173 # If you update any of the above, you can generate a new root by running this | 162 # If you update any of the above, you can generate a new root by running this |
| 174 # file as a script. | 163 # file as a script. |
| 175 | 164 |
| 165 INTERMEDIATE_KEY = RSA(0x00c661afcc659f88855a83ade8fb792dc13d0cf388b17bece9149cf 0b8556d27b19101d081fb2a842d13a2ac95d8308ddd66783843ecc5806513959eb6b30dd69b2845d 97e10d0bbbf653d686dc8828935022cc96f9e030b567157257d3d6526734080bb9727cee0d30f420 9d5820e1d662f358fc789c0e9366d84f89adf1beb8d843f74e6f325876ac35d5c11691fcb296967c 06edf69450c16bb2314c14599fe90725d5ec90f2db6698afae72bba0cfbf77967c7e8b49f2172f93 81827c27ab7f9471c62bd8da4a6c657966ec1385cf41d739449835888f30d64971619dcd380408cd 74f25c3be19833a92620c9cf710da67e15ac8cef69bc7e4e5e7f813c1ed, | |
| 166 65537, | |
| 167 0x77c5e2edf52d2cafd6c649e9b06aa9455226cfa26805fa337f4e81c 7c94bedfb3721715208e2d28aa4a042b2f5a3db03212ad44dae564ffeb6a44efedf7c2b65e21aca0 56301a3591b36c82600394fbdc16268fc0adaabadb5207871f4ef6d17888a30b84240955cd889768 681cf23d0de0fe88f008c8841643e341acd397e2d1104a23242e566088b7617c26ae8b48a85b6c9b 7dc64ef1fa5e9b124ff8c1659a82d8225f28a820cc6ca07beff0354364c631a9142309fea1d8b054 f6e00e23c54b493a21fcbe89a646b39d1acba5bc2ace9bba0252671d42a15202f3afccc912114d6c 20eb3131e74289f2c744c5b39e7d3780fe21402ab1c3ae65854fee401) | |
| 168 | |
| 169 # Intermediate certificate CN | |
| 170 INTERMEDIATE_CN = "Testing Intermediate CA" | |
| 171 | |
| 172 LEAF_KEY = RSA(0x00cd12d317b39cfbb160fb1dc9c9f0dc8fef3604dda4d8c557392ce1d616483 713f78216cadbefd1c76ea0f3bbbe410e24b233b1b73583922b09314e249b2cfde1be0995e13f160 fb630c10d447750da20ffaa4880006717feaa3e4db602e4f511b5cc312f770f44b037784effec626 40f948aa189c3769f03bdd0e22a36ecfa5951f5577de195a4fba33c879b657968b79138fd7ab389a 9968522f7389c6052be1ff78bc168d3ea961e132a044eba33ac07ead95367c7b815e91eca924d914 fd0d811349b8bf500707ba71a43a2901a545f34e1792e72654f6649fab9716f4ba17379ee8042186 bbba9b9bac416a60474cc60686f0e6e4b01259cc3cb5873edf9, | |
| 173 65537, | |
| 174 0x009c23e81bd4c30314743dded9646b82d408937db2f0afa7d9988be6cba59d8 86a287aa13605ad9c7117776efc94885de76cd3554da46e301d9a5b331f4613449edb9ddac36cd03 45848d8c46c4bd880acbd5cfee48ee9efe813e16a33da124fd213348c8292494ac84d03ca4aabc5e 25fc67ea32e0c6845fc884b01d8988768b8b931c41de49708dbcd5fcb61823f9a1f7507c6f364be4 cb5a8cf24af4925997030dd4f67a0c9c6813401cc8b2f5d1971ee0022770239b7042fde8228c3394 2e9c0a0b18854cb1b5542be928338ab33ac936bbba174e55457007b16f36011dbb8f4258abe64e42 b1cfa79803d30170b7ecf3e7c595d42003fff72591e07acd9cd) | |
| 175 | |
| 176 LEAF_KEY_PEM = '''-----BEGIN RSA PRIVATE KEY----- | |
| 177 MIIEpQIBAAKCAQEAzRLTF7Oc+7Fg+x3JyfDcj+82BN2k2MVXOSzh1hZINxP3ghbK | |
| 178 2+/Rx26g87u+QQ4ksjOxtzWDkisJMU4kmyz94b4JleE/Fg+2MMENRHdQ2iD/qkiA | |
| 179 AGcX/qo+TbYC5PURtcwxL3cPRLA3eE7/7GJkD5SKoYnDdp8DvdDiKjbs+llR9Vd9 | |
| 180 4ZWk+6M8h5tleWi3kTj9erOJqZaFIvc4nGBSvh/3i8Fo0+qWHhMqBE66M6wH6tlT | |
| 181 Z8e4FekeypJNkU/Q2BE0m4v1AHB7pxpDopAaVF804XkucmVPZkn6uXFvS6Fzee6A | |
| 182 Qhhru6m5usQWpgR0zGBobw5uSwElnMPLWHPt+QIDAQABAoIBAQCcI+gb1MMDFHQ9 | |
| 183 3tlka4LUCJN9svCvp9mYi+bLpZ2Iaih6oTYFrZxxF3du/JSIXeds01VNpG4wHZpb | |
| 184 Mx9GE0Se253aw2zQNFhI2MRsS9iArL1c/uSO6e/oE+FqM9oST9ITNIyCkklKyE0D | |
| 185 ykqrxeJfxn6jLgxoRfyISwHYmIdouLkxxB3klwjbzV/LYYI/mh91B8bzZL5MtajP | |
| 186 JK9JJZlwMN1PZ6DJxoE0AcyLL10Zce4AIncCObcEL96CKMM5QunAoLGIVMsbVUK+ | |
| 187 koM4qzOsk2u7oXTlVFcAexbzYBHbuPQlir5k5Csc+nmAPTAXC37PPnxZXUIAP/9y | |
| 188 WR4HrNnNAoGBAPmOqTe7ntto6rDEsU1cKOJFKIZ7UVcSByyz8aLrvj1Rb2mkrNJU | |
| 189 SdTqJvtqrvDXgO0HuGtFOzsZrRV9+XRPd2P0mP0uhfRiYGWT8hnILGyI2+7zlC/w | |
| 190 HDtLEefelhtdOVKgUaLQXptSn7aGalUHghZKWjRNT5ah+U85MoI2ZkDbAoGBANJe | |
| 191 KvrBBPSFLj+x2rsMhG+ksK0I6tivapVvSTtDV3ME1DvA/4BIMV/nIZyoH4AYI72c | |
| 192 m/vD66+eCqh75cq5BzbVD63tR+ZRi/VdT1HJcl2IFXynk6eaBw8v7gpQyx6t3iSK | |
| 193 lx/dIdpLt1BQuR4qI6x1wYp7Utn98soEkiFXzgq7AoGBAJTLBYPQXvgNBxlcPSaV | |
| 194 016Nw4rjTe0vN43kwCbWjjf7LQV9BPnm/Zpv/cwboLDCnQE2gDOdNKKZPYS59pjt | |
| 195 pI65UNpr+bxrR3RpEIlku2/+7br8ChfG/t4vdT6djTxFih8ErYf42t+bFNT8Mbv+ | |
| 196 3QYzULMsgU6bxo0A2meezbrPAoGBAK/IxmtQXP6iRxosWRUSCZxs5sFAgVVdh1el | |
| 197 bXEa/Xj8IQhpZlbgfHmh3oFULzZPdZYcxm7jsQ7HpipRlZwHbtLPyNFSRFFd9PCr | |
| 198 7vrttSYY77OBKC3V1G5JY8S07HYPXV/1ewDCPGZ3/I8dVQKyvap/n6FDGeFUhctv | |
| 199 dFhuUZq/AoGAWLXlbcIl1cvOhfFJ5owohJhzh9oW9tlCtjV5/dlix2RaE5CtDZWS | |
| 200 oMm4sQu9HiA8jLDP1MEEMRFPrPXdrZnxnSqVd1DgabSegD1/ZCb1QlWwQWkk5QU+ | |
| 201 wotPOMI33L50kZqUaDP+1XSL0Dyfo/pYpm4tYy/5QmP6WKXCtFUXybI= | |
| 202 -----END RSA PRIVATE KEY----- | |
| 203 ''' | |
| 176 | 204 |
| 177 # Various OIDs | 205 # Various OIDs |
| 178 | 206 |
| 179 AIA_OCSP = asn1.OID([1, 3, 6, 1, 5, 5, 7, 48, 1]) | 207 AIA_OCSP = asn1.OID([1, 3, 6, 1, 5, 5, 7, 48, 1]) |
| 208 AIA_CA_ISSUERS = asn1.OID([1, 3, 6, 1, 5, 5, 7, 48, 2]) | |
| 180 AUTHORITY_INFORMATION_ACCESS = asn1.OID([1, 3, 6, 1, 5, 5, 7, 1, 1]) | 209 AUTHORITY_INFORMATION_ACCESS = asn1.OID([1, 3, 6, 1, 5, 5, 7, 1, 1]) |
| 181 BASIC_CONSTRAINTS = asn1.OID([2, 5, 29, 19]) | 210 BASIC_CONSTRAINTS = asn1.OID([2, 5, 29, 19]) |
| 182 CERT_POLICIES = asn1.OID([2, 5, 29, 32]) | 211 CERT_POLICIES = asn1.OID([2, 5, 29, 32]) |
| 183 COMMON_NAME = asn1.OID([2, 5, 4, 3]) | 212 COMMON_NAME = asn1.OID([2, 5, 4, 3]) |
| 184 COUNTRY = asn1.OID([2, 5, 4, 6]) | 213 COUNTRY = asn1.OID([2, 5, 4, 6]) |
| 185 HASH_SHA1 = asn1.OID([1, 3, 14, 3, 2, 26]) | 214 HASH_SHA1 = asn1.OID([1, 3, 14, 3, 2, 26]) |
| 186 OCSP_TYPE_BASIC = asn1.OID([1, 3, 6, 1, 5, 5, 7, 48, 1, 1]) | 215 OCSP_TYPE_BASIC = asn1.OID([1, 3, 6, 1, 5, 5, 7, 48, 1, 1]) |
| 187 ORGANIZATION = asn1.OID([2, 5, 4, 10]) | 216 ORGANIZATION = asn1.OID([2, 5, 4, 10]) |
| 188 PUBLIC_KEY_RSA = asn1.OID([1, 2, 840, 113549, 1, 1, 1]) | 217 PUBLIC_KEY_RSA = asn1.OID([1, 2, 840, 113549, 1, 1, 1]) |
| 189 SHA256_WITH_RSA_ENCRYPTION = asn1.OID([1, 2, 840, 113549, 1, 1, 11]) | 218 SHA256_WITH_RSA_ENCRYPTION = asn1.OID([1, 2, 840, 113549, 1, 1, 11]) |
| 190 | 219 |
| 191 | 220 |
| 192 def MakeCertificate( | 221 def MakeCertificate( |
| 193 issuer_cn, subject_cn, serial, pubkey, privkey, ocsp_url = None): | 222 issuer_cn, subject_cn, serial, pubkey, privkey, ocsp_url = None, |
| 223 ca_issuers_url = None, is_ca=False, path_len=None): | |
| 194 '''MakeCertificate returns a DER encoded certificate, signed by privkey.''' | 224 '''MakeCertificate returns a DER encoded certificate, signed by privkey.''' |
| 195 extensions = asn1.SEQUENCE([]) | 225 extensions = asn1.SEQUENCE([]) |
| 196 | 226 |
| 197 # Default subject name fields | 227 # Default subject name fields |
| 198 c = "XX" | 228 c = "XX" |
| 199 o = "Testing Org" | 229 o = "Testing Org" |
| 200 | 230 |
| 201 if issuer_cn == subject_cn: | 231 if is_ca: |
| 202 # Root certificate. | 232 # Root certificate. |
| 203 c = None | 233 c = None |
| 204 o = None | 234 o = None |
| 205 extensions.children.append( | 235 extensions.children.append( |
| 206 asn1.SEQUENCE([ | 236 asn1.SEQUENCE([ |
| 207 BASIC_CONSTRAINTS, | 237 BASIC_CONSTRAINTS, |
| 208 True, | 238 True, |
| 209 asn1.OCTETSTRING(asn1.ToDER(asn1.SEQUENCE([ | 239 asn1.OCTETSTRING(asn1.ToDER(asn1.SEQUENCE([ |
| 210 True, # IsCA | 240 True, # IsCA |
| 211 0, # Path len | 241 ] + ([path_len] if path_len is not None else []) # Path len |
| 212 ]))), | 242 ))), |
| 213 ])) | 243 ])) |
| 214 | 244 |
| 215 if ocsp_url is not None: | 245 if ocsp_url is not None or ca_issuers_url is not None: |
| 246 aia_entries = [] | |
| 247 if ocsp_url is not None: | |
| 248 aia_entries.append( | |
| 249 asn1.SEQUENCE([ | |
| 250 AIA_OCSP, | |
| 251 asn1.Raw(asn1.TagAndLength(0x86, len(ocsp_url)) + ocsp_url), | |
| 252 ])) | |
| 253 if ca_issuers_url is not None: | |
| 254 aia_entries.append( | |
| 255 asn1.SEQUENCE([ | |
| 256 AIA_CA_ISSUERS, | |
| 257 asn1.Raw(asn1.TagAndLength(0x86, | |
| 258 len(ca_issuers_url)) + ca_issuers_url), | |
| 259 ])) | |
| 216 extensions.children.append( | 260 extensions.children.append( |
| 217 asn1.SEQUENCE([ | 261 asn1.SEQUENCE([ |
| 218 AUTHORITY_INFORMATION_ACCESS, | 262 AUTHORITY_INFORMATION_ACCESS, |
| 219 # There is implicitly a critical=False here. Since false is the default, | 263 # There is implicitly a critical=False here. Since false is the default, |
| 220 # encoding the value would be invalid DER. | 264 # encoding the value would be invalid DER. |
| 221 asn1.OCTETSTRING(asn1.ToDER(asn1.SEQUENCE([ | 265 asn1.OCTETSTRING(asn1.ToDER(asn1.SEQUENCE(aia_entries))), |
| 222 asn1.SEQUENCE([ | 266 ])) |
| 223 AIA_OCSP, | |
| 224 asn1.Raw(asn1.TagAndLength(0x86, len(ocsp_url)) + ocsp_url), | |
| 225 ]), | |
| 226 ]))), | |
| 227 ])) | |
| 228 | 267 |
| 229 extensions.children.append( | 268 extensions.children.append( |
| 230 asn1.SEQUENCE([ | 269 asn1.SEQUENCE([ |
| 231 CERT_POLICIES, | 270 CERT_POLICIES, |
| 232 # There is implicitly a critical=False here. Since false is the default, | 271 # There is implicitly a critical=False here. Since false is the default, |
| 233 # encoding the value would be invalid DER. | 272 # encoding the value would be invalid DER. |
| 234 asn1.OCTETSTRING(asn1.ToDER(asn1.SEQUENCE([ | 273 asn1.OCTETSTRING(asn1.ToDER(asn1.SEQUENCE([ |
| 235 asn1.SEQUENCE([ # PolicyInformation | 274 asn1.SEQUENCE([ # PolicyInformation |
| 236 CERT_POLICY_OID, | 275 CERT_POLICY_OID, |
| 237 ]), | 276 ]), |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 394 * ocsp_der contains a DER encoded OCSP response or None if ocsp_url is | 433 * ocsp_der contains a DER encoded OCSP response or None if ocsp_url is |
| 395 None''' | 434 None''' |
| 396 | 435 |
| 397 if ocsp_states is None: | 436 if ocsp_states is None: |
| 398 ocsp_states = [OCSP_STATE_GOOD] | 437 ocsp_states = [OCSP_STATE_GOOD] |
| 399 if ocsp_dates is None: | 438 if ocsp_dates is None: |
| 400 ocsp_dates = [OCSP_DATE_VALID] | 439 ocsp_dates = [OCSP_DATE_VALID] |
| 401 | 440 |
| 402 if serial == 0: | 441 if serial == 0: |
| 403 serial = RandomNumber(16) | 442 serial = RandomNumber(16) |
| 404 cert_der = MakeCertificate(ISSUER_CN, bytes(subject), serial, KEY, KEY, | 443 cert_der = MakeCertificate(ROOT_CN, bytes(subject), serial, LEAF_KEY, |
| 405 bytes(ocsp_url)) | 444 ROOT_KEY, bytes(ocsp_url)) |
| 406 cert_pem = DERToPEM(cert_der) | 445 cert_pem = DERToPEM(cert_der) |
| 407 | 446 |
| 408 ocsp_der = None | 447 ocsp_der = None |
| 409 if ocsp_url is not None: | 448 if ocsp_url is not None: |
| 410 if ocsp_states[0] == OCSP_STATE_UNAUTHORIZED: | 449 if ocsp_states[0] == OCSP_STATE_UNAUTHORIZED: |
| 411 ocsp_der = unauthorizedDER | 450 ocsp_der = unauthorizedDER |
| 412 elif ocsp_states[0] == OCSP_STATE_INVALID_RESPONSE: | 451 elif ocsp_states[0] == OCSP_STATE_INVALID_RESPONSE: |
| 413 ocsp_der = '3' | 452 ocsp_der = '3' |
| 414 elif ocsp_states[0] == OCSP_STATE_TRY_LATER: | 453 elif ocsp_states[0] == OCSP_STATE_TRY_LATER: |
| 415 resp = asn1.SEQUENCE([ | 454 resp = asn1.SEQUENCE([ |
| 416 asn1.ENUMERATED(3), | 455 asn1.ENUMERATED(3), |
| 417 ]) | 456 ]) |
| 418 ocsp_der = asn1.ToDER(resp) | 457 ocsp_der = asn1.ToDER(resp) |
| 419 elif ocsp_states[0] == OCSP_STATE_INVALID_RESPONSE_DATA: | 458 elif ocsp_states[0] == OCSP_STATE_INVALID_RESPONSE_DATA: |
| 420 invalid_data = asn1.ToDER(asn1.OCTETSTRING('not ocsp data')) | 459 invalid_data = asn1.ToDER(asn1.OCTETSTRING('not ocsp data')) |
| 421 basic_resp = asn1.SEQUENCE([ | 460 basic_resp = asn1.SEQUENCE([ |
| 422 asn1.Raw(invalid_data), | 461 asn1.Raw(invalid_data), |
| 423 asn1.SEQUENCE([ | 462 asn1.SEQUENCE([ |
| 424 SHA256_WITH_RSA_ENCRYPTION, | 463 SHA256_WITH_RSA_ENCRYPTION, |
| 425 None, | 464 None, |
| 426 ]), | 465 ]), |
| 427 asn1.BitString(KEY.Sign(invalid_data)), | 466 asn1.BitString(ROOT_KEY.Sign(invalid_data)), |
| 428 ]) | 467 ]) |
| 429 resp = asn1.SEQUENCE([ | 468 resp = asn1.SEQUENCE([ |
| 430 asn1.ENUMERATED(0), | 469 asn1.ENUMERATED(0), |
| 431 asn1.Explicit(0, asn1.SEQUENCE([ | 470 asn1.Explicit(0, asn1.SEQUENCE([ |
| 432 OCSP_TYPE_BASIC, | 471 OCSP_TYPE_BASIC, |
| 433 asn1.OCTETSTRING(asn1.ToDER(basic_resp)), | 472 asn1.OCTETSTRING(asn1.ToDER(basic_resp)), |
| 434 ])), | 473 ])), |
| 435 ]) | 474 ]) |
| 436 ocsp_der = asn1.ToDER(resp) | 475 ocsp_der = asn1.ToDER(resp) |
| 437 else: | 476 else: |
| 438 ocsp_der = MakeOCSPResponse( | 477 ocsp_der = MakeOCSPResponse( |
| 439 ISSUER_CN, KEY, serial, ocsp_states, ocsp_dates, ocsp_produced) | 478 ROOT_CN, ROOT_KEY, serial, ocsp_states, ocsp_dates, ocsp_produced) |
| 440 | 479 |
| 441 return (cert_pem + KEY_PEM, ocsp_der) | 480 return (cert_pem + LEAF_KEY_PEM, ocsp_der) |
| 481 | |
| 482 | |
| 483 def GenerateCertKeyAndIntermediate(subject = "127.0.0.1", | |
| 484 ca_issuers_url = "http://127.0.0.1", | |
|
davidben
2016/10/21 22:42:27
Doesn't seem these defaults are ever used.
mattm
2016/10/21 23:24:20
removed.
| |
| 485 serial = 0): | |
| 486 '''Returns a (cert_and_key_pem, intermediate_cert_pem) where: | |
| 487 * cert_and_key_pem contains a certificate and private key in PEM format | |
| 488 with the given subject common name and caIssuers URL. | |
| 489 * intermediate_cert_pem contains a PEM encoded certificate that signed | |
| 490 cert_and_key_pem and was signed by ocsp-test-root.pem.''' | |
| 491 if serial == 0: | |
| 492 serial = RandomNumber(16) | |
| 493 target_cert_der = MakeCertificate(INTERMEDIATE_CN, bytes(subject), serial, | |
| 494 LEAF_KEY, INTERMEDIATE_KEY, | |
| 495 ca_issuers_url=bytes(ca_issuers_url)) | |
| 496 target_cert_pem = DERToPEM(target_cert_der) | |
| 497 | |
| 498 intermediate_serial = RandomNumber(16) | |
| 499 intermediate_cert_der = MakeCertificate(ROOT_CN, INTERMEDIATE_CN, | |
| 500 intermediate_serial, | |
| 501 INTERMEDIATE_KEY, ROOT_KEY, | |
| 502 is_ca=True) | |
| 503 | |
| 504 return target_cert_pem + LEAF_KEY_PEM, intermediate_cert_der | |
| 442 | 505 |
| 443 | 506 |
| 444 if __name__ == '__main__': | 507 if __name__ == '__main__': |
| 445 def bin_to_array(s): | 508 def bin_to_array(s): |
| 446 return ' '.join(['0x%02x,'%ord(c) for c in s]) | 509 return ' '.join(['0x%02x,'%ord(c) for c in s]) |
| 447 | 510 |
| 448 import sys | 511 import sys |
| 449 sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', | 512 sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', |
| 450 '..', 'data', 'ssl', 'scripts')) | 513 '..', 'data', 'ssl', 'scripts')) |
| 451 import crlsetutil | 514 import crlsetutil |
| 452 | 515 |
| 453 der_root = MakeCertificate(ISSUER_CN, ISSUER_CN, 1, KEY, KEY, None) | 516 der_root = MakeCertificate(ROOT_CN, ROOT_CN, 1, ROOT_KEY, ROOT_KEY, |
| 517 is_ca=True, path_len=1) | |
| 454 print 'ocsp-test-root.pem:' | 518 print 'ocsp-test-root.pem:' |
| 455 print DERToPEM(der_root) | 519 print DERToPEM(der_root) |
| 456 | 520 |
| 457 print | 521 print |
| 458 print 'kOCSPTestCertFingerprint:' | 522 print 'kOCSPTestCertFingerprint:' |
| 459 print bin_to_array(hashlib.sha1(der_root).digest()) | 523 print bin_to_array(hashlib.sha1(der_root).digest()) |
| 460 | 524 |
| 461 print | 525 print |
| 462 print 'kOCSPTestCertSPKI:' | 526 print 'kOCSPTestCertSPKI:' |
| 463 print bin_to_array(crlsetutil.der_cert_to_spki_hash(der_root)) | 527 print bin_to_array(crlsetutil.der_cert_to_spki_hash(der_root)) |
| OLD | NEW |