Home | History | Annotate | Line # | Download | only in enginepkcs11
      1      1.1  christos #!/bin/sh
      2      1.1  christos #
      3      1.1  christos # Copyright (C) Internet Systems Consortium, Inc. ("ISC")
      4      1.1  christos #
      5      1.1  christos # SPDX-License-Identifier: MPL-2.0
      6      1.1  christos #
      7      1.1  christos # This Source Code Form is subject to the terms of the Mozilla Public
      8      1.1  christos # License, v. 2.0. If a copy of the MPL was not distributed with this
      9      1.1  christos # file, you can obtain one at https://mozilla.org/MPL/2.0/.
     10      1.1  christos #
     11      1.1  christos # See the COPYRIGHT file distributed with this work for additional
     12      1.1  christos # information regarding copyright ownership.
     13      1.1  christos 
     14      1.1  christos # shellcheck source=conf.sh
     15      1.1  christos . ../conf.sh
     16      1.1  christos 
     17      1.1  christos set -e
     18      1.1  christos 
     19  1.1.1.2  christos OPENSSL_CONF= softhsm2-util --delete-token --token "softhsm2-enginepkcs11" >/dev/null 2>&1 || true
     20  1.1.1.2  christos OPENSSL_CONF= softhsm2-util --init-token --free --pin 1234 --so-pin 1234 --label "softhsm2-enginepkcs11" | awk '/^The token has been initialized and is reassigned to slot/ { print $NF }'
     21      1.1  christos 
     22  1.1.1.2  christos printf '%s' "${HSMPIN:-1234}" >ns1/pin
     23      1.1  christos PWD=$(pwd)
     24      1.1  christos 
     25      1.1  christos keygen() {
     26      1.1  christos   type="$1"
     27      1.1  christos   bits="$2"
     28      1.1  christos   zone="$3"
     29      1.1  christos   id="$4"
     30      1.1  christos 
     31      1.1  christos   label="${id}-${zone}"
     32      1.1  christos   p11id=$(echo "${label}" | openssl sha1 -r | awk '{print $1}')
     33  1.1.1.2  christos   OPENSSL_CONF= pkcs11-tool --module $SOFTHSM2_MODULE --token-label "softhsm2-enginepkcs11" -l -k --key-type $type:$bits --label "${label}" --id "${p11id}" --pin $(cat $PWD/ns1/pin) >pkcs11-tool.out.$zone.$id 2>pkcs11-tool.err.$zone.$id || return 1
     34      1.1  christos }
     35      1.1  christos 
     36      1.1  christos keyfromlabel() {
     37      1.1  christos   alg="$1"
     38      1.1  christos   zone="$2"
     39      1.1  christos   id="$3"
     40      1.1  christos   dir="$4"
     41      1.1  christos   shift 4
     42      1.1  christos 
     43  1.1.1.3  christos   $KEYFRLAB $ENGINE_ARG -K $dir -a $alg -y -l "pkcs11:token=softhsm2-enginepkcs11;object=${id}-${zone};pin-source=$PWD/ns1/pin" "$@" $zone >>keyfromlabel.out.$zone.$id 2>keyfromlabel.err.$zone.$id || return 1
     44      1.1  christos   cat keyfromlabel.out.$zone.$id
     45      1.1  christos }
     46      1.1  christos 
     47  1.1.1.2  christos mkdir ns1/keys
     48  1.1.1.2  christos 
     49      1.1  christos dir="ns1"
     50      1.1  christos infile="${dir}/template.db.in"
     51      1.1  christos for algtypebits in rsasha256:rsa:2048 rsasha512:rsa:2048 \
     52      1.1  christos   ecdsap256sha256:EC:prime256v1 ecdsap384sha384:EC:prime384v1; do # Edwards curves are not yet supported by OpenSC
     53      1.1  christos   # ed25519:EC:edwards25519 ed448:EC:edwards448
     54      1.1  christos   alg=$(echo "$algtypebits" | cut -f 1 -d :)
     55      1.1  christos   type=$(echo "$algtypebits" | cut -f 2 -d :)
     56      1.1  christos   bits=$(echo "$algtypebits" | cut -f 3 -d :)
     57  1.1.1.2  christos   alg_upper=$(echo "$alg" | tr '[:lower:]' '[:upper:]')
     58  1.1.1.2  christos   supported=$(eval "echo \$${alg_upper}_SUPPORTED")
     59      1.1  christos 
     60  1.1.1.2  christos   tld="example"
     61  1.1.1.2  christos   if [ "${supported}" = 1 ]; then
     62  1.1.1.2  christos     zone="$alg.$tld"
     63  1.1.1.2  christos     zonefile="zone.$alg.$tld.db"
     64      1.1  christos     ret=0
     65      1.1  christos 
     66      1.1  christos     echo_i "Generate keys $alg $type:$bits for zone $zone"
     67      1.1  christos     keygen $type $bits $zone enginepkcs11-zsk || ret=1
     68      1.1  christos     keygen $type $bits $zone enginepkcs11-ksk || ret=1
     69      1.1  christos     test "$ret" -eq 0 || exit 1
     70      1.1  christos 
     71      1.1  christos     echo_i "Get ZSK $alg $zone $type:$bits"
     72      1.1  christos     zsk1=$(keyfromlabel $alg $zone enginepkcs11-zsk $dir)
     73      1.1  christos     test -z "$zsk1" && exit 1
     74      1.1  christos 
     75      1.1  christos     echo_i "Get KSK $alg $zone $type:$bits"
     76      1.1  christos     ksk1=$(keyfromlabel $alg $zone enginepkcs11-ksk $dir -f KSK)
     77      1.1  christos     test -z "$ksk1" && exit 1
     78      1.1  christos 
     79      1.1  christos     (
     80      1.1  christos       cd $dir
     81      1.1  christos       zskid1=$(keyfile_to_key_id $zsk1)
     82      1.1  christos       kskid1=$(keyfile_to_key_id $ksk1)
     83      1.1  christos       echo "$zskid1" >$zone.zskid1
     84      1.1  christos       echo "$kskid1" >$zone.kskid1
     85      1.1  christos     )
     86      1.1  christos 
     87      1.1  christos     echo_i "Sign zone with $ksk1 $zsk1"
     88      1.1  christos     cat "$infile" "${dir}/${ksk1}.key" "${dir}/${zsk1}.key" >"${dir}/${zonefile}"
     89  1.1.1.2  christos     $SIGNER $ENGINE_ARG -K $dir -S -a -g -O full -o "$zone" "${dir}/${zonefile}" >signer.out.$zone || ret=1
     90      1.1  christos     test "$ret" -eq 0 || exit 1
     91      1.1  christos 
     92      1.1  christos     echo_i "Generate successor keys $alg $type:$bits for zone $zone"
     93      1.1  christos     keygen $type $bits $zone enginepkcs11-zsk2 || ret=1
     94      1.1  christos     keygen $type $bits $zone enginepkcs11-ksk2 || ret=1
     95      1.1  christos     test "$ret" -eq 0 || exit 1
     96      1.1  christos 
     97      1.1  christos     echo_i "Get ZSK $alg $id-$zone $type:$bits"
     98      1.1  christos     zsk2=$(keyfromlabel $alg $zone enginepkcs11-zsk2 $dir)
     99      1.1  christos     test -z "$zsk2" && exit 1
    100      1.1  christos 
    101      1.1  christos     echo_i "Get KSK $alg $id-$zone $type:$bits"
    102      1.1  christos     ksk2=$(keyfromlabel $alg $zone enginepkcs11-ksk2 $dir -f KSK)
    103      1.1  christos     test -z "$ksk2" && exit 1
    104      1.1  christos 
    105      1.1  christos     (
    106      1.1  christos       cd $dir
    107      1.1  christos       zskid2=$(keyfile_to_key_id $zsk2)
    108      1.1  christos       kskid2=$(keyfile_to_key_id $ksk2)
    109      1.1  christos       echo "$zskid2" >$zone.zskid2
    110      1.1  christos       echo "$kskid2" >$zone.kskid2
    111      1.1  christos       cp "${zsk2}.key" "${zsk2}.zsk2"
    112      1.1  christos       cp "${ksk2}.key" "${ksk2}.ksk2"
    113      1.1  christos     )
    114      1.1  christos 
    115  1.1.1.2  christos     echo_i "Add zone $alg.kasp to named.conf"
    116  1.1.1.2  christos     cp $infile ${dir}/zone.${alg}.kasp.db
    117  1.1.1.2  christos 
    118  1.1.1.2  christos     echo_i "Add zone $alg.split to named.conf"
    119  1.1.1.2  christos     cp $infile ${dir}/zone.${alg}.split.db
    120  1.1.1.2  christos 
    121  1.1.1.2  christos     echo_i "Add weird zone to named.conf"
    122  1.1.1.2  christos     cp $infile ${dir}/zone.${alg}.weird.db
    123  1.1.1.2  christos 
    124      1.1  christos     echo_i "Add zone $zone to named.conf"
    125      1.1  christos     cat >>"${dir}/named.conf" <<EOF
    126      1.1  christos zone "$zone" {
    127      1.1  christos 	type primary;
    128      1.1  christos 	file "${zonefile}.signed";
    129      1.1  christos 	allow-update { any; };
    130      1.1  christos };
    131      1.1  christos 
    132  1.1.1.2  christos dnssec-policy "$alg" {
    133  1.1.1.2  christos 	keys {
    134  1.1.1.2  christos 		ksk key-store "hsm" lifetime unlimited algorithm ${alg};
    135  1.1.1.2  christos 		zsk key-store "pin" lifetime unlimited algorithm ${alg};
    136  1.1.1.2  christos 	};
    137  1.1.1.2  christos };
    138  1.1.1.2  christos 
    139  1.1.1.2  christos zone "${alg}.kasp" {
    140  1.1.1.2  christos 	type primary;
    141  1.1.1.2  christos 	file "zone.${alg}.kasp.db";
    142  1.1.1.2  christos 	dnssec-policy "$alg";
    143  1.1.1.2  christos 	allow-update { any; };
    144  1.1.1.2  christos };
    145  1.1.1.2  christos 
    146  1.1.1.2  christos dnssec-policy "weird-${alg}-\"\:\;\?\&\[\]\@\!\$\*\+\,\|\=\.\(\)" {
    147  1.1.1.2  christos 	keys {
    148  1.1.1.2  christos 		ksk key-store "hsm" lifetime unlimited algorithm ${alg};
    149  1.1.1.2  christos 		zsk key-store "pin" lifetime unlimited algorithm ${alg};
    150  1.1.1.2  christos 	};
    151  1.1.1.2  christos };
    152  1.1.1.2  christos 
    153  1.1.1.2  christos zone "${alg}.\"\:\;\?\&\[\]\@\!\$\*\+\,\|\=\.\(\)foo.weird" {
    154  1.1.1.2  christos 	type primary;
    155  1.1.1.2  christos 	file "zone.${alg}.weird.db";
    156  1.1.1.2  christos 	check-names ignore;
    157  1.1.1.2  christos 	dnssec-policy "weird-${alg}-\"\:\;\?\&\[\]\@\!\$\*\+\,\|\=\.\(\)";
    158  1.1.1.2  christos 	allow-update { any; };
    159  1.1.1.2  christos };
    160  1.1.1.2  christos 
    161  1.1.1.2  christos dnssec-policy "${alg}-split" {
    162  1.1.1.2  christos 	keys {
    163  1.1.1.2  christos 		ksk key-store "hsm" lifetime unlimited algorithm ${alg};
    164  1.1.1.2  christos 		zsk key-store "disk" lifetime unlimited algorithm ${alg};
    165  1.1.1.2  christos 	};
    166  1.1.1.2  christos };
    167  1.1.1.2  christos 
    168  1.1.1.2  christos zone "${alg}.split" {
    169  1.1.1.2  christos 	type primary;
    170  1.1.1.2  christos 	file "zone.${alg}.split.db";
    171  1.1.1.2  christos 	dnssec-policy "${alg}-split";
    172  1.1.1.2  christos 	allow-update { any; };
    173  1.1.1.2  christos };
    174  1.1.1.2  christos 
    175      1.1  christos EOF
    176      1.1  christos   fi
    177      1.1  christos done
    178  1.1.1.2  christos 
    179  1.1.1.2  christos mkdir ns2/keys
    180  1.1.1.2  christos 
    181  1.1.1.2  christos dir="ns2"
    182  1.1.1.2  christos infile="${dir}/template.db.in"
    183  1.1.1.2  christos algtypebits="ecdsap256sha256:EC:prime256v1"
    184  1.1.1.2  christos alg=$(echo "$algtypebits" | cut -f 1 -d :)
    185  1.1.1.2  christos type=$(echo "$algtypebits" | cut -f 2 -d :)
    186  1.1.1.2  christos bits=$(echo "$algtypebits" | cut -f 3 -d :)
    187  1.1.1.2  christos alg_upper=$(echo "$alg" | tr '[:lower:]' '[:upper:]')
    188  1.1.1.2  christos supported=$(eval "echo \$${alg_upper}_SUPPORTED")
    189  1.1.1.2  christos tld="views"
    190  1.1.1.2  christos 
    191  1.1.1.2  christos if [ "${supported}" = 1 ]; then
    192  1.1.1.2  christos   zone="$alg.$tld"
    193  1.1.1.2  christos   zonefile1="zone.$alg.$tld.view1.db"
    194  1.1.1.2  christos   zonefile2="zone.$alg.$tld.view2.db"
    195  1.1.1.2  christos   ret=0
    196  1.1.1.2  christos 
    197  1.1.1.2  christos   echo_i "Generate keys $alg $type:$bits for zone $zone"
    198  1.1.1.2  christos   keygen $type $bits $zone enginepkcs11-zsk || ret=1
    199  1.1.1.2  christos   keygen $type $bits $zone enginepkcs11-ksk || ret=1
    200  1.1.1.2  christos   test "$ret" -eq 0 || exit 1
    201  1.1.1.2  christos 
    202  1.1.1.2  christos   echo_i "Get ZSK $alg $zone $type:$bits"
    203  1.1.1.2  christos   zsk1=$(keyfromlabel $alg $zone enginepkcs11-zsk $dir)
    204  1.1.1.2  christos   test -z "$zsk1" && exit 1
    205  1.1.1.2  christos 
    206  1.1.1.2  christos   echo_i "Get KSK $alg $zone $type:$bits"
    207  1.1.1.2  christos   ksk1=$(keyfromlabel $alg $zone enginepkcs11-ksk $dir -f KSK)
    208  1.1.1.2  christos   test -z "$ksk1" && exit 1
    209  1.1.1.2  christos 
    210  1.1.1.2  christos   (
    211  1.1.1.2  christos     cd $dir
    212  1.1.1.2  christos     zskid1=$(keyfile_to_key_id $zsk1)
    213  1.1.1.2  christos     kskid1=$(keyfile_to_key_id $ksk1)
    214  1.1.1.2  christos     echo "$zskid1" >$zone.zskid1
    215  1.1.1.2  christos     echo "$kskid1" >$zone.kskid1
    216  1.1.1.2  christos   )
    217  1.1.1.2  christos 
    218  1.1.1.2  christos   echo_i "Sign zone with $ksk1 $zsk1"
    219  1.1.1.2  christos   cat "$infile" "${dir}/${ksk1}.key" "${dir}/${zsk1}.key" >"${dir}/${zonefile1}"
    220  1.1.1.2  christos   $SIGNER $ENGINE_ARG -K $dir -S -a -g -O full -o "$zone" "${dir}/${zonefile1}" >signer.out.view1.$zone || ret=1
    221  1.1.1.2  christos   test "$ret" -eq 0 || exit 1
    222  1.1.1.2  christos 
    223  1.1.1.2  christos   cat "$infile" "${dir}/${ksk1}.key" "${dir}/${zsk1}.key" >"${dir}/${zonefile2}"
    224  1.1.1.2  christos   $SIGNER $ENGINE_ARG -K $dir -S -a -g -O full -o "$zone" "${dir}/${zonefile2}" >signer.out.view2.$zone || ret=1
    225  1.1.1.2  christos   test "$ret" -eq 0 || exit 1
    226  1.1.1.2  christos 
    227  1.1.1.2  christos   echo_i "Generate successor keys $alg $type:$bits for zone $zone"
    228  1.1.1.2  christos   keygen $type $bits $zone enginepkcs11-zsk2 || ret=1
    229  1.1.1.2  christos   keygen $type $bits $zone enginepkcs11-ksk2 || ret=1
    230  1.1.1.2  christos   test "$ret" -eq 0 || exit 1
    231  1.1.1.2  christos 
    232  1.1.1.2  christos   echo_i "Get ZSK $alg $id-$zone $type:$bits"
    233  1.1.1.2  christos   zsk2=$(keyfromlabel $alg $zone enginepkcs11-zsk2 $dir)
    234  1.1.1.2  christos   test -z "$zsk2" && exit 1
    235  1.1.1.2  christos 
    236  1.1.1.2  christos   echo_i "Get KSK $alg $id-$zone $type:$bits"
    237  1.1.1.2  christos   ksk2=$(keyfromlabel $alg $zone enginepkcs11-ksk2 $dir -f KSK)
    238  1.1.1.2  christos   test -z "$ksk2" && exit 1
    239  1.1.1.2  christos 
    240  1.1.1.2  christos   (
    241  1.1.1.2  christos     cd $dir
    242  1.1.1.2  christos     zskid2=$(keyfile_to_key_id $zsk2)
    243  1.1.1.2  christos     kskid2=$(keyfile_to_key_id $ksk2)
    244  1.1.1.2  christos     echo "$zskid2" >$zone.zskid2
    245  1.1.1.2  christos     echo "$kskid2" >$zone.kskid2
    246  1.1.1.2  christos     cp "${zsk2}.key" "${zsk2}.zsk2"
    247  1.1.1.2  christos     cp "${ksk2}.key" "${ksk2}.ksk2"
    248  1.1.1.2  christos   )
    249  1.1.1.2  christos 
    250  1.1.1.2  christos   echo_i "Add zone $alg.same-policy.$tld to named.conf"
    251  1.1.1.2  christos   cp $infile ${dir}/zone.${alg}.same-policy.view1.db
    252  1.1.1.2  christos   cp $infile ${dir}/zone.${alg}.same-policy.view2.db
    253  1.1.1.2  christos 
    254  1.1.1.2  christos   echo_i "Add zone zone-with.different-policy.$tld to named.conf"
    255  1.1.1.2  christos   cp $infile ${dir}/zone.zone-with.different-policy.view1.db
    256  1.1.1.2  christos   cp $infile ${dir}/zone.zone-with.different-policy.view2.db
    257  1.1.1.2  christos 
    258  1.1.1.2  christos   echo_i "Add zone $zone to named.conf"
    259  1.1.1.2  christos   cat >>"${dir}/named.conf" <<EOF
    260  1.1.1.2  christos dnssec-policy "$alg" {
    261  1.1.1.2  christos 	keys {
    262  1.1.1.2  christos 		csk key-store "hsm" lifetime unlimited algorithm ${alg};
    263  1.1.1.2  christos 	};
    264  1.1.1.2  christos };
    265  1.1.1.2  christos 
    266  1.1.1.2  christos dnssec-policy "rsasha256" {
    267  1.1.1.2  christos 	keys {
    268  1.1.1.2  christos 		csk key-store "hsm2" lifetime unlimited algorithm rsasha256 2048;
    269  1.1.1.2  christos 	};
    270  1.1.1.2  christos };
    271  1.1.1.2  christos 
    272  1.1.1.2  christos view "view1" {
    273  1.1.1.2  christos 	match-clients { key "keyforview1"; };
    274  1.1.1.2  christos 
    275  1.1.1.2  christos 	zone "$zone" {
    276  1.1.1.2  christos 		type primary;
    277  1.1.1.2  christos 		file "${zonefile1}.signed";
    278  1.1.1.2  christos 		allow-update { any; };
    279  1.1.1.2  christos 	};
    280  1.1.1.2  christos 
    281  1.1.1.2  christos 	zone "${alg}.same-policy.${tld}" {
    282  1.1.1.2  christos 		type primary;
    283  1.1.1.2  christos 		file "zone.${alg}.same-policy.view1.db";
    284  1.1.1.2  christos 		dnssec-policy "$alg";
    285  1.1.1.2  christos 		allow-update { any; };
    286  1.1.1.2  christos 	};
    287  1.1.1.2  christos 
    288  1.1.1.2  christos 	zone "zone-with.different-policy.${tld}" {
    289  1.1.1.2  christos 		type primary;
    290  1.1.1.2  christos 		file "zone.zone-with.different-policy.view1.db";
    291  1.1.1.2  christos 		dnssec-policy "$alg";
    292  1.1.1.2  christos 		allow-update { any; };
    293  1.1.1.2  christos 	};
    294  1.1.1.2  christos };
    295  1.1.1.2  christos 
    296  1.1.1.2  christos view "view2" {
    297  1.1.1.2  christos 	match-clients { key "keyforview2"; };
    298  1.1.1.2  christos 
    299  1.1.1.2  christos 	zone "$zone" {
    300  1.1.1.2  christos 		type primary;
    301  1.1.1.2  christos 		file "${zonefile2}.signed";
    302  1.1.1.2  christos 		allow-update { any; };
    303  1.1.1.2  christos 	};
    304  1.1.1.2  christos 
    305  1.1.1.2  christos 	zone "${alg}.same-policy.${tld}" {
    306  1.1.1.2  christos 		type primary;
    307  1.1.1.2  christos 		file "zone.${alg}.same-policy.view2.db";
    308  1.1.1.2  christos 		dnssec-policy "$alg";
    309  1.1.1.2  christos 		allow-update { any; };
    310  1.1.1.2  christos 	};
    311  1.1.1.2  christos 
    312  1.1.1.2  christos 	zone "zone-with.different-policy.${tld}" {
    313  1.1.1.2  christos 		type primary;
    314  1.1.1.2  christos 		file "zone.zone-with.different-policy.view2.db";
    315  1.1.1.2  christos 		dnssec-policy "rsasha256";
    316  1.1.1.2  christos 		allow-update { any; };
    317  1.1.1.2  christos 	};
    318  1.1.1.2  christos };
    319  1.1.1.2  christos 
    320  1.1.1.2  christos EOF
    321  1.1.1.2  christos fi
    322