src.hhvn.uk > hhvn.uk-scripts > commit > 819cc613df6ec263b6aed13ab426ded2749ac46c

scripts that power hhvn.uk
Log | Files | Refs | README

commit 819cc613df6ec263b6aed13ab426ded2749ac46c
parent f0e48b15d39467d081e26442037e9a907f3cdd0e
Author: Hayden Hamilton <hayden@hhvn.uk>
Date:   Sun, 24 May 2026 21:28:17 +0100

Add ed25519 capability to dkim/ scripts

Diffstat:
Mdkim/mkcert | 71+++++++++++++++++++++++++++++++++++++++++++----------------------------
Mdkim/rmcert | 16++++++++++++----
2 files changed, 55 insertions(+), 32 deletions(-)

diff --git a/dkim/mkcert b/dkim/mkcert @@ -1,24 +1,30 @@ #!/bin/rc # This script generates and stores DKIM keypair, using the correct user -# It outputs all paths generated in the following order: +# It outputs all paths generated in the following order for each algorithm: # - privkey -# - pubkey # - txt record to be used in dns # # Example/intended usage: # dkimfiles = `$nl{dkim/mkcert <selector>} -# privkey = $dkimfiles(1) -# txtfile = $dkimfiles(2) -# -# There is no real need for the pubkey to be stored as its own file. +# rsakey = $dkimfiles(1) +# rsatxt = $dkimfiles(2) +# edkey = $dkimfiles(3) +# edtxt = $dkimfiles(4) + +dir = /etc/mail/dkim +user =_dkimsign_ +selector = $1 +ed = ed25519 +rsaprivkey = $dir/$selector.rsa.priv.key +rsapubkey = $dir/$selector.rsa.pub.key +rsatxt = $dir/$selector.rsa.txt +edprivkey = $dir/$selector.$ed.priv.key +edpubkey = $dir/$selector.$ed.pub.key +edtxt = $dir/$selector.$ed.txt -dir = /etc/mail/dkim -user =_dkimsign_ -selector = $1 -privkey = $dir/$selector.priv.key -pubkey = $dir/$selector.pub.key -txt = $dir/$selector.txt +files = ( $rsaprivkey $rsapubkey $rsatxt \ + $edprivkey $edpubkey $edtxt ) fn err { echo $* >[1=2] @@ -38,9 +44,9 @@ fn mustsucceed { } fn cleanupfailed { - as rm $privkey - as rm $pubkey - as rm $txt + for (f in $files) { + as rm $f [2]>/dev/null + } } fn as { @@ -52,21 +58,30 @@ if (!~ $#* 1) { exit 2 } - -as test -e $privkey && die $privkey already exists -as test -e $pubkey && die $pubkey already exists -as test -e $txt && die $txt already exists +for (f in $files) { + as test -e $f && die $f already exists +} mustsucceed as mkdir -p $dir -mustsucceed as openssl genrsa -out $privkey -mustsucceed as openssl rsa -in $privkey -pubout | \ - mustsucceed as tee $pubkey >/dev/null -mustsucceed as cat $pubkey | \ +# RSA +mustsucceed as openssl genrsa -out $rsaprivkey +mustsucceed as openssl rsa -in $rsaprivkey -pubout | \ + mustsucceed as tee $rsapubkey >/dev/null +mustsucceed as cat $rsapubkey | \ mustsucceed as sed '1s/.*/v=DKIM1;p=/;:nl;${s/-----.*//;q;};N;s/\n//g;b nl;' | \ - mustsucceed as tee $txt >/dev/null + mustsucceed as tee $rsatxt >/dev/null + +# ED25519 +mustsucceed as openssl genpkey -algorithm $ed -out $edprivkey +mustsucceed as openssl pkey -outform DER -pubout -in $edprivkey | \ + mustsucceed tail -c +13 | mustsucceed openssl base64 | \ + mustsucceed as tee $edpubkey >/dev/null +mustsucceed printf 'v=DKIM1;k=%s;p=%s\n' $ed `$nl{mustsucceed as cat $edpubkey} | \ + mustsucceed as tee $edtxt >/dev/null -err 'Paths generated (privkey, pubkey, txt dns record):' -echo $privkey -echo $pubkey -echo $txt +err 'Paths generated (rsa privkey, rsa dns record, ed25519 privkey, ed25519 dns record):' +echo $rsaprivkey +echo $rsatxt +echo $edprivkey +echo $edtxt diff --git a/dkim/rmcert b/dkim/rmcert @@ -5,10 +5,18 @@ dir = /etc/mail/dkim user = _dkimsign selector = $1 -privkey = $dir/$selector.priv.key +ed = ed25519 +rsaprivkey = $dir/$selector.priv.key pubkey = $dir/$selector.pub.key txt = $dir/$selector.txt +files = ( $dir/$selector.rsa.priv.key \ + $dir/$selector.rsa.pub.key \ + $dir/$selector.rsa.txt \ + $dir/$selector.$ed.priv.key \ + $dir/$selector.$ed.pub.key \ + $dir/$selector.$ed.txt ) + fn err { echo $* >[1=2] } @@ -32,9 +40,9 @@ if (!~ $#* 1) { exit 2 } -removeif-e $privkey -removeif-e $pubkey -removeif-e $txt +for (f in $files) { + removeif-e $f +} if (~ $removed () && ~ $failed ()) { err no such selector: $selector