xref: /third_party/openssl/test/certs/mkcert.sh (revision e1051a39)
1e1051a39Sopenharmony_ci#! /bin/bash
2e1051a39Sopenharmony_ci#
3e1051a39Sopenharmony_ci# Copyright 2016-2023 The OpenSSL Project Authors. All Rights Reserved.
4e1051a39Sopenharmony_ci# Copyright (c) 2016 Viktor Dukhovni <openssl-users@dukhovni.org>.
5e1051a39Sopenharmony_ci# All rights reserved.
6e1051a39Sopenharmony_ci#
7e1051a39Sopenharmony_ci# Licensed under the Apache License 2.0 (the "License").  You may not use
8e1051a39Sopenharmony_ci# this file except in compliance with the License.  You can obtain a copy
9e1051a39Sopenharmony_ci# in the file LICENSE in the source distribution or at
10e1051a39Sopenharmony_ci# https://www.openssl.org/source/license.html
11e1051a39Sopenharmony_ci
12e1051a39Sopenharmony_ci# This file is dual-licensed and is also available under other terms.
13e1051a39Sopenharmony_ci# Please contact the author.
14e1051a39Sopenharmony_ci
15e1051a39Sopenharmony_ci# 100 years should be enough for now
16e1051a39Sopenharmony_ciif [ -z "$DAYS" ]; then
17e1051a39Sopenharmony_ci    DAYS=36525
18e1051a39Sopenharmony_cifi
19e1051a39Sopenharmony_ci
20e1051a39Sopenharmony_ciif [ -z "$OPENSSL_SIGALG" ]; then
21e1051a39Sopenharmony_ci    OPENSSL_SIGALG=sha256
22e1051a39Sopenharmony_cifi
23e1051a39Sopenharmony_ci
24e1051a39Sopenharmony_ciif [ -z "$REQMASK" ]; then
25e1051a39Sopenharmony_ci    REQMASK=utf8only
26e1051a39Sopenharmony_cifi
27e1051a39Sopenharmony_ci
28e1051a39Sopenharmony_cistderr_onerror() {
29e1051a39Sopenharmony_ci    (
30e1051a39Sopenharmony_ci        err=$("$@" >&3 2>&1) || {
31e1051a39Sopenharmony_ci            printf "%s\n" "$err" >&2
32e1051a39Sopenharmony_ci            exit 1
33e1051a39Sopenharmony_ci        }
34e1051a39Sopenharmony_ci    ) 3>&1
35e1051a39Sopenharmony_ci}
36e1051a39Sopenharmony_ci
37e1051a39Sopenharmony_cikey() {
38e1051a39Sopenharmony_ci    local key=$1; shift
39e1051a39Sopenharmony_ci
40e1051a39Sopenharmony_ci    local alg=rsa
41e1051a39Sopenharmony_ci    if [ -n "$OPENSSL_KEYALG" ]; then
42e1051a39Sopenharmony_ci        alg=$OPENSSL_KEYALG
43e1051a39Sopenharmony_ci    fi
44e1051a39Sopenharmony_ci
45e1051a39Sopenharmony_ci    local bits=2048
46e1051a39Sopenharmony_ci    if [ -n "$OPENSSL_KEYBITS" ]; then
47e1051a39Sopenharmony_ci        bits=$OPENSSL_KEYBITS
48e1051a39Sopenharmony_ci    fi
49e1051a39Sopenharmony_ci
50e1051a39Sopenharmony_ci    if [ ! -f "${key}.pem" ]; then
51e1051a39Sopenharmony_ci        args=(-algorithm "$alg")
52e1051a39Sopenharmony_ci        case $alg in
53e1051a39Sopenharmony_ci        rsa) args=("${args[@]}" -pkeyopt rsa_keygen_bits:$bits );;
54e1051a39Sopenharmony_ci        ec)  args=("${args[@]}" -pkeyopt "ec_paramgen_curve:$bits")
55e1051a39Sopenharmony_ci               args=("${args[@]}" -pkeyopt ec_param_enc:named_curve);;
56e1051a39Sopenharmony_ci        dsa)  args=(-paramfile "$bits");;
57e1051a39Sopenharmony_ci        ed25519)  ;;
58e1051a39Sopenharmony_ci        ed448)  ;;
59e1051a39Sopenharmony_ci        *) printf "Unsupported key algorithm: %s\n" "$alg" >&2; return 1;;
60e1051a39Sopenharmony_ci        esac
61e1051a39Sopenharmony_ci        stderr_onerror \
62e1051a39Sopenharmony_ci            openssl genpkey "${args[@]}" -out "${key}.pem"
63e1051a39Sopenharmony_ci    fi
64e1051a39Sopenharmony_ci}
65e1051a39Sopenharmony_ci
66e1051a39Sopenharmony_ci# Usage: $0 req keyname dn1 dn2 ...
67e1051a39Sopenharmony_cireq() {
68e1051a39Sopenharmony_ci    local key=$1; shift
69e1051a39Sopenharmony_ci
70e1051a39Sopenharmony_ci    key "$key"
71e1051a39Sopenharmony_ci    local errs
72e1051a39Sopenharmony_ci
73e1051a39Sopenharmony_ci    stderr_onerror \
74e1051a39Sopenharmony_ci        openssl req -new -"${OPENSSL_SIGALG}" -key "${key}.pem" \
75e1051a39Sopenharmony_ci            -config <(printf "string_mask=%s\n[req]\n%s\n%s\n[dn]\n" \
76e1051a39Sopenharmony_ci              "$REQMASK" "prompt = no" "distinguished_name = dn"
77e1051a39Sopenharmony_ci                      for dn in "$@"; do echo "$dn"; done)
78e1051a39Sopenharmony_ci}
79e1051a39Sopenharmony_ci
80e1051a39Sopenharmony_cireq_nocn() {
81e1051a39Sopenharmony_ci    local key=$1; shift
82e1051a39Sopenharmony_ci
83e1051a39Sopenharmony_ci    key "$key"
84e1051a39Sopenharmony_ci    stderr_onerror \
85e1051a39Sopenharmony_ci        openssl req -new -"${OPENSSL_SIGALG}" -subj / -key "${key}.pem" \
86e1051a39Sopenharmony_ci            -config <(printf "[req]\n%s\n[dn]\nCN_default =\n" \
87e1051a39Sopenharmony_ci		      "distinguished_name = dn")
88e1051a39Sopenharmony_ci}
89e1051a39Sopenharmony_ci
90e1051a39Sopenharmony_cicert() {
91e1051a39Sopenharmony_ci    local cert=$1; shift
92e1051a39Sopenharmony_ci    local exts=$1; shift
93e1051a39Sopenharmony_ci
94e1051a39Sopenharmony_ci    stderr_onerror \
95e1051a39Sopenharmony_ci        openssl x509 -req -"${OPENSSL_SIGALG}" -out "${cert}.pem" \
96e1051a39Sopenharmony_ci            -extfile <(printf "%s\n" "$exts") "$@"
97e1051a39Sopenharmony_ci}
98e1051a39Sopenharmony_ci
99e1051a39Sopenharmony_cigenroot() {
100e1051a39Sopenharmony_ci    local cn=$1; shift
101e1051a39Sopenharmony_ci    local key=$1; shift
102e1051a39Sopenharmony_ci    local cert=$1; shift
103e1051a39Sopenharmony_ci    local bcon="basicConstraints = critical,CA:true"
104e1051a39Sopenharmony_ci    local ku="keyUsage = keyCertSign,cRLSign"
105e1051a39Sopenharmony_ci    local skid="subjectKeyIdentifier = hash"
106e1051a39Sopenharmony_ci    local akid="authorityKeyIdentifier = keyid"
107e1051a39Sopenharmony_ci
108e1051a39Sopenharmony_ci    exts=$(printf "%s\n%s\n%s\n" "$bcon" "$ku" "$skid" "$akid")
109e1051a39Sopenharmony_ci    for eku in "$@"
110e1051a39Sopenharmony_ci    do
111e1051a39Sopenharmony_ci        exts=$(printf "%s\nextendedKeyUsage = %s\n" "$exts" "$eku")
112e1051a39Sopenharmony_ci    done
113e1051a39Sopenharmony_ci    csr=$(req "$key" "CN = $cn") || return 1
114e1051a39Sopenharmony_ci    echo "$csr" |
115e1051a39Sopenharmony_ci       cert "$cert" "$exts" -signkey "${key}.pem" -set_serial 1 -days "${DAYS}"
116e1051a39Sopenharmony_ci}
117e1051a39Sopenharmony_ci
118e1051a39Sopenharmony_cigenca() {
119e1051a39Sopenharmony_ci    local OPTIND=1
120e1051a39Sopenharmony_ci    local purpose=
121e1051a39Sopenharmony_ci
122e1051a39Sopenharmony_ci    while getopts p:c: o
123e1051a39Sopenharmony_ci    do
124e1051a39Sopenharmony_ci        case $o in
125e1051a39Sopenharmony_ci        p) purpose="$OPTARG";;
126e1051a39Sopenharmony_ci        c) certpol="$OPTARG";;
127e1051a39Sopenharmony_ci        *) echo "Usage: $0 genca [-p EKU][-c policyoid] cn keyname certname cakeyname cacertname" >&2
128e1051a39Sopenharmony_ci           return 1;;
129e1051a39Sopenharmony_ci        esac
130e1051a39Sopenharmony_ci    done
131e1051a39Sopenharmony_ci
132e1051a39Sopenharmony_ci    shift $((OPTIND - 1))
133e1051a39Sopenharmony_ci    local cn=$1; shift
134e1051a39Sopenharmony_ci    local key=$1; shift
135e1051a39Sopenharmony_ci    local cert=$1; shift
136e1051a39Sopenharmony_ci    local cakey=$1; shift
137e1051a39Sopenharmony_ci    local cacert=$1; shift
138e1051a39Sopenharmony_ci    local bcon="basicConstraints = critical,CA:true"
139e1051a39Sopenharmony_ci    local ku="keyUsage = keyCertSign,cRLSign"
140e1051a39Sopenharmony_ci    local skid="subjectKeyIdentifier = hash"
141e1051a39Sopenharmony_ci    local akid="authorityKeyIdentifier = keyid"
142e1051a39Sopenharmony_ci
143e1051a39Sopenharmony_ci    exts=$(printf "%s\n%s\n%s\n" "$bcon" "$ku" "$skid" "$akid")
144e1051a39Sopenharmony_ci    if [ -n "$purpose" ]; then
145e1051a39Sopenharmony_ci        exts=$(printf "%s\nextendedKeyUsage = %s\n" "$exts" "$purpose")
146e1051a39Sopenharmony_ci    fi
147e1051a39Sopenharmony_ci    if [ -n "$NC" ]; then
148e1051a39Sopenharmony_ci        exts=$(printf "%s\nnameConstraints = %s\n" "$exts" "$NC")
149e1051a39Sopenharmony_ci    fi
150e1051a39Sopenharmony_ci    if [ -n "$certpol" ]; then
151e1051a39Sopenharmony_ci        exts=$(printf "%s\ncertificatePolicies = %s\n" "$exts" "$certpol")
152e1051a39Sopenharmony_ci    fi
153e1051a39Sopenharmony_ci
154e1051a39Sopenharmony_ci    csr=$(req "$key" "CN = $cn") || return 1
155e1051a39Sopenharmony_ci    echo "$csr" |
156e1051a39Sopenharmony_ci        cert "$cert" "$exts" -CA "${cacert}.pem" -CAkey "${cakey}.pem" \
157e1051a39Sopenharmony_ci	    -set_serial 2 -days "${DAYS}" "$@"
158e1051a39Sopenharmony_ci}
159e1051a39Sopenharmony_ci
160e1051a39Sopenharmony_cigen_nonbc_ca() {
161e1051a39Sopenharmony_ci    local cn=$1; shift
162e1051a39Sopenharmony_ci    local key=$1; shift
163e1051a39Sopenharmony_ci    local cert=$1; shift
164e1051a39Sopenharmony_ci    local cakey=$1; shift
165e1051a39Sopenharmony_ci    local cacert=$1; shift
166e1051a39Sopenharmony_ci    local skid="subjectKeyIdentifier = hash"
167e1051a39Sopenharmony_ci    local akid="authorityKeyIdentifier = keyid"
168e1051a39Sopenharmony_ci
169e1051a39Sopenharmony_ci    exts=$(printf "%s\n%s\n%s\n" "$skid" "$akid")
170e1051a39Sopenharmony_ci    exts=$(printf "%s\nkeyUsage = %s\n" "$exts" "keyCertSign, cRLSign")
171e1051a39Sopenharmony_ci    for eku in "$@"
172e1051a39Sopenharmony_ci    do
173e1051a39Sopenharmony_ci        exts=$(printf "%s\nextendedKeyUsage = %s\n" "$exts" "$eku")
174e1051a39Sopenharmony_ci    done
175e1051a39Sopenharmony_ci    csr=$(req "$key" "CN = $cn") || return 1
176e1051a39Sopenharmony_ci    echo "$csr" |
177e1051a39Sopenharmony_ci        cert "$cert" "$exts" -CA "${cacert}.pem" -CAkey "${cakey}.pem" \
178e1051a39Sopenharmony_ci	    -set_serial 2 -days "${DAYS}"
179e1051a39Sopenharmony_ci}
180e1051a39Sopenharmony_ci
181e1051a39Sopenharmony_ci# Usage: $0 genpc keyname certname eekeyname eecertname pcext1 pcext2 ...
182e1051a39Sopenharmony_ci#
183e1051a39Sopenharmony_ci# Note: takes csr on stdin, so must be used with $0 req like this:
184e1051a39Sopenharmony_ci#
185e1051a39Sopenharmony_ci# $0 req keyname dn | $0 genpc keyname certname eekeyname eecertname pcext ...
186e1051a39Sopenharmony_cigenpc() {
187e1051a39Sopenharmony_ci    local key=$1; shift
188e1051a39Sopenharmony_ci    local cert=$1; shift
189e1051a39Sopenharmony_ci    local cakey=$1; shift
190e1051a39Sopenharmony_ci    local ca=$1; shift
191e1051a39Sopenharmony_ci
192e1051a39Sopenharmony_ci    exts=$(printf "%s\n%s\n%s\n%s\n" \
193e1051a39Sopenharmony_ci	    "subjectKeyIdentifier = hash" \
194e1051a39Sopenharmony_ci	    "authorityKeyIdentifier = keyid, issuer:always" \
195e1051a39Sopenharmony_ci	    "basicConstraints = CA:false" \
196e1051a39Sopenharmony_ci	    "proxyCertInfo = critical, @pcexts";
197e1051a39Sopenharmony_ci           echo "[pcexts]";
198e1051a39Sopenharmony_ci           for x in "$@"; do echo $x; done)
199e1051a39Sopenharmony_ci    cert "$cert" "$exts" -CA "${ca}.pem" -CAkey "${cakey}.pem" \
200e1051a39Sopenharmony_ci	 -set_serial 2 -days "${DAYS}"
201e1051a39Sopenharmony_ci}
202e1051a39Sopenharmony_ci
203e1051a39Sopenharmony_cigeneeconfig() {
204e1051a39Sopenharmony_ci    local key=$1; shift
205e1051a39Sopenharmony_ci    local cert=$1; shift
206e1051a39Sopenharmony_ci    local cakey=$1; shift
207e1051a39Sopenharmony_ci    local ca=$1; shift
208e1051a39Sopenharmony_ci    local conf=$1; shift
209e1051a39Sopenharmony_ci
210e1051a39Sopenharmony_ci    exts=$(printf "%s\n%s\n%s\n%s\n" \
211e1051a39Sopenharmony_ci        "subjectKeyIdentifier = hash" \
212e1051a39Sopenharmony_ci        "authorityKeyIdentifier = keyid" \
213e1051a39Sopenharmony_ci        "basicConstraints = CA:false"; \
214e1051a39Sopenharmony_ci        echo "$conf")
215e1051a39Sopenharmony_ci
216e1051a39Sopenharmony_ci    cert "$cert" "$exts" -CA "${ca}.pem" -CAkey "${cakey}.pem" \
217e1051a39Sopenharmony_ci        -set_serial 2 -days "${DAYS}"
218e1051a39Sopenharmony_ci}
219e1051a39Sopenharmony_ci
220e1051a39Sopenharmony_ci# Usage: $0 geneealt keyname certname cakeyname cacertname alt1 alt2 ...
221e1051a39Sopenharmony_ci#
222e1051a39Sopenharmony_ci# Note: takes csr on stdin, so must be used with $0 req like this:
223e1051a39Sopenharmony_ci#
224e1051a39Sopenharmony_ci# $0 req keyname dn | $0 geneealt keyname certname cakeyname cacertname alt ...
225e1051a39Sopenharmony_cigeneealt() {
226e1051a39Sopenharmony_ci    local key=$1; shift
227e1051a39Sopenharmony_ci    local cert=$1; shift
228e1051a39Sopenharmony_ci    local cakey=$1; shift
229e1051a39Sopenharmony_ci    local ca=$1; shift
230e1051a39Sopenharmony_ci
231e1051a39Sopenharmony_ci    conf=$(echo "subjectAltName = @alts"
232e1051a39Sopenharmony_ci           echo "[alts]";
233e1051a39Sopenharmony_ci           for x in "$@"; do echo "$x"; done)
234e1051a39Sopenharmony_ci
235e1051a39Sopenharmony_ci    geneeconfig $key $cert $cakey $ca "$conf"
236e1051a39Sopenharmony_ci}
237e1051a39Sopenharmony_ci
238e1051a39Sopenharmony_cigenee() {
239e1051a39Sopenharmony_ci    local OPTIND=1
240e1051a39Sopenharmony_ci    local purpose=serverAuth
241e1051a39Sopenharmony_ci
242e1051a39Sopenharmony_ci    while getopts p: o
243e1051a39Sopenharmony_ci    do
244e1051a39Sopenharmony_ci        case $o in
245e1051a39Sopenharmony_ci        p) purpose="$OPTARG";;
246e1051a39Sopenharmony_ci        *) echo "Usage: $0 genee [-p EKU] cn keyname certname cakeyname cacertname" >&2
247e1051a39Sopenharmony_ci           return 1;;
248e1051a39Sopenharmony_ci        esac
249e1051a39Sopenharmony_ci    done
250e1051a39Sopenharmony_ci
251e1051a39Sopenharmony_ci    shift $((OPTIND - 1))
252e1051a39Sopenharmony_ci    local cn=$1; shift
253e1051a39Sopenharmony_ci    local key=$1; shift
254e1051a39Sopenharmony_ci    local cert=$1; shift
255e1051a39Sopenharmony_ci    local cakey=$1; shift
256e1051a39Sopenharmony_ci    local ca=$1; shift
257e1051a39Sopenharmony_ci
258e1051a39Sopenharmony_ci    exts=$(printf "%s\n%s\n%s\n%s\n%s\n[alts]\n%s\n" \
259e1051a39Sopenharmony_ci	    "subjectKeyIdentifier = hash" \
260e1051a39Sopenharmony_ci	    "authorityKeyIdentifier = keyid, issuer" \
261e1051a39Sopenharmony_ci	    "basicConstraints = CA:false" \
262e1051a39Sopenharmony_ci	    "extendedKeyUsage = $purpose" \
263e1051a39Sopenharmony_ci	    "subjectAltName = @alts" "DNS=${cn}")
264e1051a39Sopenharmony_ci    csr=$(req "$key" "CN = $cn") || return 1
265e1051a39Sopenharmony_ci    echo "$csr" |
266e1051a39Sopenharmony_ci	cert "$cert" "$exts" -CA "${ca}.pem" -CAkey "${cakey}.pem" \
267e1051a39Sopenharmony_ci	    -set_serial 2 -days "${DAYS}" "$@"
268e1051a39Sopenharmony_ci}
269e1051a39Sopenharmony_ci
270e1051a39Sopenharmony_cigeneeextra() {
271e1051a39Sopenharmony_ci    local OPTIND=1
272e1051a39Sopenharmony_ci    local purpose=serverAuth
273e1051a39Sopenharmony_ci
274e1051a39Sopenharmony_ci    while getopts p: o
275e1051a39Sopenharmony_ci    do
276e1051a39Sopenharmony_ci        case $o in
277e1051a39Sopenharmony_ci        p) purpose="$OPTARG";;
278e1051a39Sopenharmony_ci        *) echo "Usage: $0 geneeextra [-p EKU] cn keyname certname cakeyname cacertname extraext" >&2
279e1051a39Sopenharmony_ci           return 1;;
280e1051a39Sopenharmony_ci        esac
281e1051a39Sopenharmony_ci    done
282e1051a39Sopenharmony_ci
283e1051a39Sopenharmony_ci    shift $((OPTIND - 1))
284e1051a39Sopenharmony_ci    local cn=$1; shift
285e1051a39Sopenharmony_ci    local key=$1; shift
286e1051a39Sopenharmony_ci    local cert=$1; shift
287e1051a39Sopenharmony_ci    local cakey=$1; shift
288e1051a39Sopenharmony_ci    local ca=$1; shift
289e1051a39Sopenharmony_ci    local extraext=$1; shift
290e1051a39Sopenharmony_ci
291e1051a39Sopenharmony_ci    exts=$(printf "%s\n%s\n%s\n%s\n%s\n%s\n[alts]\n%s\n" \
292e1051a39Sopenharmony_ci	    "subjectKeyIdentifier = hash" \
293e1051a39Sopenharmony_ci	    "authorityKeyIdentifier = keyid, issuer" \
294e1051a39Sopenharmony_ci	    "basicConstraints = CA:false" \
295e1051a39Sopenharmony_ci	    "extendedKeyUsage = $purpose" \
296e1051a39Sopenharmony_ci	    "subjectAltName = @alts"\
297e1051a39Sopenharmony_ci	    "$extraext" "DNS=${cn}")
298e1051a39Sopenharmony_ci    csr=$(req "$key" "CN = $cn") || return 1
299e1051a39Sopenharmony_ci    echo "$csr" |
300e1051a39Sopenharmony_ci	cert "$cert" "$exts" -CA "${ca}.pem" -CAkey "${cakey}.pem" \
301e1051a39Sopenharmony_ci	    -set_serial 2 -days "${DAYS}" "$@"
302e1051a39Sopenharmony_ci}
303e1051a39Sopenharmony_ci
304e1051a39Sopenharmony_cigeneenocsr() {
305e1051a39Sopenharmony_ci    local OPTIND=1
306e1051a39Sopenharmony_ci    local purpose=serverAuth
307e1051a39Sopenharmony_ci
308e1051a39Sopenharmony_ci    while getopts p: o
309e1051a39Sopenharmony_ci    do
310e1051a39Sopenharmony_ci        case $o in
311e1051a39Sopenharmony_ci        p) purpose="$OPTARG";;
312e1051a39Sopenharmony_ci        *) echo "Usage: $0 geneenocsr [-p EKU] cn certname cakeyname cacertname" >&2
313e1051a39Sopenharmony_ci           return 1;;
314e1051a39Sopenharmony_ci        esac
315e1051a39Sopenharmony_ci    done
316e1051a39Sopenharmony_ci
317e1051a39Sopenharmony_ci    shift $((OPTIND - 1))
318e1051a39Sopenharmony_ci    local cn=$1; shift
319e1051a39Sopenharmony_ci    local cert=$1; shift
320e1051a39Sopenharmony_ci    local cakey=$1; shift
321e1051a39Sopenharmony_ci    local ca=$1; shift
322e1051a39Sopenharmony_ci
323e1051a39Sopenharmony_ci    exts=$(printf "%s\n%s\n%s\n%s\n%s\n[alts]\n%s\n" \
324e1051a39Sopenharmony_ci	    "subjectKeyIdentifier = hash" \
325e1051a39Sopenharmony_ci	    "authorityKeyIdentifier = keyid, issuer" \
326e1051a39Sopenharmony_ci	    "basicConstraints = CA:false" \
327e1051a39Sopenharmony_ci	    "extendedKeyUsage = $purpose" \
328e1051a39Sopenharmony_ci	    "subjectAltName = @alts" "DNS=${cn}")
329e1051a39Sopenharmony_ci	cert "$cert" "$exts" -CA "${ca}.pem" -CAkey "${cakey}.pem" \
330e1051a39Sopenharmony_ci	    -set_serial 2 -days "${DAYS}" "$@"
331e1051a39Sopenharmony_ci}
332e1051a39Sopenharmony_ci
333e1051a39Sopenharmony_cigenss() {
334e1051a39Sopenharmony_ci    local cn=$1; shift
335e1051a39Sopenharmony_ci    local key=$1; shift
336e1051a39Sopenharmony_ci    local cert=$1; shift
337e1051a39Sopenharmony_ci
338e1051a39Sopenharmony_ci    exts=$(printf "%s\n%s\n%s\n%s\n%s\n[alts]\n%s\n" \
339e1051a39Sopenharmony_ci	    "subjectKeyIdentifier   = hash" \
340e1051a39Sopenharmony_ci	    "authorityKeyIdentifier = keyid, issuer" \
341e1051a39Sopenharmony_ci	    "basicConstraints = CA:false" \
342e1051a39Sopenharmony_ci	    "extendedKeyUsage = serverAuth" \
343e1051a39Sopenharmony_ci	    "subjectAltName = @alts" "DNS=${cn}")
344e1051a39Sopenharmony_ci    csr=$(req "$key" "CN = $cn") || return 1
345e1051a39Sopenharmony_ci    echo "$csr" |
346e1051a39Sopenharmony_ci        cert "$cert" "$exts" -signkey "${key}.pem" \
347e1051a39Sopenharmony_ci            -set_serial 1 -days "${DAYS}" "$@"
348e1051a39Sopenharmony_ci}
349e1051a39Sopenharmony_ci
350e1051a39Sopenharmony_cigennocn() {
351e1051a39Sopenharmony_ci    local key=$1; shift
352e1051a39Sopenharmony_ci    local cert=$1; shift
353e1051a39Sopenharmony_ci
354e1051a39Sopenharmony_ci    csr=$(req_nocn "$key") || return 1
355e1051a39Sopenharmony_ci    echo "$csr" |
356e1051a39Sopenharmony_ci	cert "$cert" "" -signkey "${key}.pem" -set_serial 1 -days -1 "$@"
357e1051a39Sopenharmony_ci}
358e1051a39Sopenharmony_ci
359e1051a39Sopenharmony_cigenct() {
360e1051a39Sopenharmony_ci    local OPTIND=1
361e1051a39Sopenharmony_ci    local purpose=serverAuth
362e1051a39Sopenharmony_ci
363e1051a39Sopenharmony_ci    while getopts p: o
364e1051a39Sopenharmony_ci    do
365e1051a39Sopenharmony_ci        case $o in
366e1051a39Sopenharmony_ci        p) purpose="$OPTARG";;
367e1051a39Sopenharmony_ci        *) echo "Usage: $0 genct [-p EKU] cn keyname certname cakeyname cacertname ctlogkey" >&2
368e1051a39Sopenharmony_ci           return 1;;
369e1051a39Sopenharmony_ci        esac
370e1051a39Sopenharmony_ci    done
371e1051a39Sopenharmony_ci
372e1051a39Sopenharmony_ci    shift $((OPTIND - 1))
373e1051a39Sopenharmony_ci    local cn=$1; shift
374e1051a39Sopenharmony_ci    local key=$1; shift
375e1051a39Sopenharmony_ci    local cert=$1; shift
376e1051a39Sopenharmony_ci    local cakey=$1; shift
377e1051a39Sopenharmony_ci    local ca=$1; shift
378e1051a39Sopenharmony_ci    local logkey=$1; shift
379e1051a39Sopenharmony_ci
380e1051a39Sopenharmony_ci    exts=$(printf "%s\n%s\n%s\n%s\n%s\n%s\n[alts]\n%s\n" \
381e1051a39Sopenharmony_ci	    "subjectKeyIdentifier = hash" \
382e1051a39Sopenharmony_ci	    "authorityKeyIdentifier = keyid, issuer" \
383e1051a39Sopenharmony_ci	    "basicConstraints = CA:false" \
384e1051a39Sopenharmony_ci	    "extendedKeyUsage = $purpose" \
385e1051a39Sopenharmony_ci            "1.3.6.1.4.1.11129.2.4.3 = critical,ASN1:NULL"\
386e1051a39Sopenharmony_ci	    "subjectAltName = @alts" "DNS=${cn}")
387e1051a39Sopenharmony_ci    csr=$(req "$key" "CN = $cn") || return 1
388e1051a39Sopenharmony_ci    echo "$csr" |
389e1051a39Sopenharmony_ci	cert "$cert" "$exts" -CA "${ca}.pem" -CAkey "${cakey}.pem" \
390e1051a39Sopenharmony_ci	    -set_serial 2 -days "${DAYS}" "$@"
391e1051a39Sopenharmony_ci    cat ${cert}.pem ${ca}.pem > ${cert}-chain.pem
392e1051a39Sopenharmony_ci    go run github.com/google/certificate-transparency-go/ctutil/sctgen \
393e1051a39Sopenharmony_ci       --log_private_key ${logkey}.pem \
394e1051a39Sopenharmony_ci       --timestamp="2020-01-01T00:00:00Z" \
395e1051a39Sopenharmony_ci       --cert_chain ${cert}-chain.pem \
396e1051a39Sopenharmony_ci       --tls_out ${cert}.tlssct
397e1051a39Sopenharmony_ci    rm ${cert}-chain.pem
398e1051a39Sopenharmony_ci    filesize=$(wc -c <${cert}.tlssct)
399e1051a39Sopenharmony_ci    exts=$(printf "%s\n%s\n%s\n%s\n%s%04X%04X%s\n%s\n[alts]\n%s\n" \
400e1051a39Sopenharmony_ci	    "subjectKeyIdentifier = hash" \
401e1051a39Sopenharmony_ci	    "authorityKeyIdentifier = keyid, issuer" \
402e1051a39Sopenharmony_ci	    "basicConstraints = CA:false" \
403e1051a39Sopenharmony_ci	    "extendedKeyUsage = $purpose" \
404e1051a39Sopenharmony_ci	    "1.3.6.1.4.1.11129.2.4.2 = ASN1:FORMAT:HEX,OCT:" $((filesize+2)) $filesize `xxd -p ${cert}.tlssct | tr -d '\n'` \
405e1051a39Sopenharmony_ci	    "subjectAltName = @alts" "DNS=${cn}")
406e1051a39Sopenharmony_ci    echo "$csr" |
407e1051a39Sopenharmony_ci	cert "$cert" "$exts" -CA "${ca}.pem" -CAkey "${cakey}.pem" \
408e1051a39Sopenharmony_ci	    -set_serial 2 -days "${DAYS}" "$@"
409e1051a39Sopenharmony_ci}
410e1051a39Sopenharmony_ci
411e1051a39Sopenharmony_ci"$@"
412