1#!/usr/bin/env python 2# Copyright 2017 The Chromium Authors 3# 4# Licensed under the Apache License, Version 2.0 (the "License"); 5# you may not use this file except in compliance with the License. 6# You may obtain a copy of the License at 7# 8# https://www.apache.org/licenses/LICENSE-2.0 9# 10# Unless required by applicable law or agreed to in writing, software 11# distributed under the License is distributed on an "AS IS" BASIS, 12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13# See the License for the specific language governing permissions and 14# limitations under the License. 15 16"""Generates a variety of chains where the target certificate varies in its key 17type and key usages.""" 18 19import sys 20sys.path += ['../..'] 21 22import gencerts 23 24# Self-signed root certificate (used as trust anchor). 25root = gencerts.create_self_signed_root_certificate('Root') 26 27# Intermediate certificate. 28intermediate = gencerts.create_intermediate_certificate('Intermediate', root) 29 30# Use either an RSA key, or an EC key for the target certificate. Generate the 31# possible keys ahead of time so as not to duplicate the work. 32 33KEYS = { 34 'rsa': gencerts.get_or_generate_rsa_key( 35 2048, gencerts.create_key_path('Target-rsa')), 36 'ec': gencerts.get_or_generate_ec_key( 37 'secp384r1', gencerts.create_key_path('Target-ec')) 38}; 39 40KEY_USAGES = [ 'decipherOnly', 41 'digitalSignature', 42 'keyAgreement', 43 'keyEncipherment' ] 44 45# The proper key usage depends on the key purpose (serverAuth in this case), 46# and the key type. Generate a variety of combinations. 47for key_type in sorted(KEYS.keys()): 48 for key_usage in KEY_USAGES: 49 # Target certificate. 50 target = gencerts.create_end_entity_certificate('Target', intermediate) 51 target.get_extensions().set_property('extendedKeyUsage', 'serverAuth') 52 target.get_extensions().set_property('keyUsage', 53 'critical,%s' % (key_usage)) 54 55 # Set the key. 56 target.set_key(KEYS[key_type]) 57 58 # Write the chain. 59 chain = [target, intermediate, root] 60 description = ('Certificate chain where the target certificate uses a %s ' 61 'key and has the single key usage %s') % (key_type.upper(), 62 key_usage) 63 gencerts.write_chain(description, chain, 64 '%s-%s.pem' % (key_type, key_usage)) 65