]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
TESTS: jws: register a unittest for jwk
authorWilliam Lallemand <wlallemand@haproxy.com>
Fri, 28 Feb 2025 21:27:28 +0000 (22:27 +0100)
committerWilliam Lallemand <wlallemand@haproxy.com>
Mon, 3 Mar 2025 11:43:32 +0000 (12:43 +0100)
Add a way to test the jwk converter in the unit test system

    $ make TARGET=linux-glibc USE_OPENSSL=1 CFLAGS="-DDEBUG_UNIT=1"
    $ ./haproxy -U jwk foobar.pem.rsa
    {
        "kty": "RSA",
        "n":   "...",
        "e":   "AQAB"
    }
    $ ./haproxy -U jwk foobar.pem.ecdsa
    {
        "kty": "EC",
        "crv": "P-384",
        "x":   "...",
        "y":   "..."
    }

This is then tested by a shell script:

    $ HAPROXY_PROGRAM=${PWD}/haproxy tests/unit/jwk/test.sh
    + readlink -f tests/unit/jwk/test.sh
    + BASENAME=/haproxy/tests/unit/jwk/test.sh
    + dirname /haproxy/tests/unit/jwk/test.sh
    + TESTDIR=/haproxy/tests/unit/jwk
    + HAPROXY_PROGRAM=/haproxy/haproxy
    + mktemp
    + FILE1=/tmp/tmp.iEICxC5yNK
    + /haproxy/haproxy -U jwk /haproxy/tests/unit/jwk/ecdsa.key
    + diff -Naurp /haproxy/tests/unit/jwk/ecdsa.pub.jwk /tmp/tmp.iEICxC5yNK
    + rm /tmp/tmp.iEICxC5yNK
    + mktemp
    + FILE2=/tmp/tmp.EIrGZGaCDi
    + /haproxy/haproxy -U jwk /haproxy/tests/unit/jwk/rsa.key
    + diff -Naurp /haproxy/tests/unit/jwk/rsa.pub.jwk /tmp/tmp.EIrGZGaCDi
    + rm /tmp/tmp.EIrGZGaCDi

    $ echo $?
    0

src/jws.c
tests/unit/jwk/ecdsa.key [new file with mode: 0644]
tests/unit/jwk/ecdsa.pub.jwk [new file with mode: 0644]
tests/unit/jwk/rsa.key [new file with mode: 0644]
tests/unit/jwk/rsa.pub.jwk [new file with mode: 0644]
tests/unit/jwk/test.sh [new file with mode: 0755]

index e0cc23a82f7283cca341446453fa3fd29a94de80..77d4e909e132ca9c5596e94dfca19269156d5fe6 100644 (file)
--- a/src/jws.c
+++ b/src/jws.c
@@ -4,6 +4,7 @@
 
 #include <haproxy/base64.h>
 #include <haproxy/chunk.h>
+#include <haproxy/init.h>
 #include <haproxy/openssl-compat.h>
 
 #if defined(HAVE_JWS)
@@ -194,5 +195,44 @@ int EVP_PKEY_to_pub_jwk(EVP_PKEY *pkey, char *dst, size_t dsize)
        return ret;
 }
 
+int jwk_debug(int argc, char **argv)
+{
+       FILE *f = NULL;
+       EVP_PKEY *pkey = NULL;
+       char msg[1024];
+       int ret = 1;
+       const char *filename;
+
+       if (argc < 1)
+               goto out;
+
+       filename = argv[1];
+
+       if ((f = fopen(filename, "r")) == NULL) {
+               fprintf(stderr, "fopen!\n");
+               goto out;
+       }
+       if ((pkey = PEM_read_PrivateKey(f, NULL, NULL, NULL)) == NULL) {
+               fprintf(stderr, "PEM_read_PrivateKey!\n");
+               goto out;
+       }
+
+       ret = !EVP_PKEY_to_pub_jwk(pkey, msg, sizeof(msg));
+       fprintf(stdout, "%s\n", msg);
+
+       EVP_PKEY_free(pkey);
+out:
+
+       return ret;
+}
+
+static void __jws_init(void)
+{
+       hap_register_unittest("jwk", jwk_debug);
+}
+
+
+INITCALL0(STG_REGISTER, __jws_init);
+
 #endif /* HAVE_JWS */
 
diff --git a/tests/unit/jwk/ecdsa.key b/tests/unit/jwk/ecdsa.key
new file mode 100644 (file)
index 0000000..6eec0ec
--- /dev/null
@@ -0,0 +1,6 @@
+-----BEGIN PRIVATE KEY-----
+MIG2AgEAMBAGByqGSM49AgEGBSuBBAAiBIGeMIGbAgEBBDDZMkuztqaUgCAC9/7P
+CsmlC2ac7rWerq5+NKbP0Cz1+mao6+F5Hc8DKNXHgi5GPr2hZANiAAQc00b9lK5L
+sJe8vTfJ79j4uladfzXyadiTGpRB0U7Y3UI7SnqRIgwevMxAhF6/f6PaDp2sp6Ew
+aMGZ5knCxsPqdjJQ7XP7Qxq1blSJMxYWY+ri/TxMMO13yw1xaCxJatM=
+-----END PRIVATE KEY-----
diff --git a/tests/unit/jwk/ecdsa.pub.jwk b/tests/unit/jwk/ecdsa.pub.jwk
new file mode 100644 (file)
index 0000000..cb0d765
--- /dev/null
@@ -0,0 +1,7 @@
+{
+    "kty": "EC",
+    "crv": "P-384",
+    "x":   "HNNG_ZSuS7CXvL03ye_Y-LpWnX818mnYkxqUQdFO2N1CO0p6kSIMHrzMQIRev3-j",
+    "y":   "2g6drKehMGjBmeZJwsbD6nYyUO1z-0MatW5UiTMWFmPq4v08TDDtd8sNcWgsSWrT"
+}
+
diff --git a/tests/unit/jwk/rsa.key b/tests/unit/jwk/rsa.key
new file mode 100644 (file)
index 0000000..c46b8fb
--- /dev/null
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEowIBAAKCAQEA3fgUyE3616u0t/nSFAZVxHTSl2T6ksIXIK4lTbw4btEJwW4q
+jFfejIhLWvja1r1ct1WONWNKbw0tT61rJwpQTHQRXT5CEaQMdtHM9zOJQQ4v6deJ
+viW2L7FYSxg6MzBG2jsTEnonUxQx0Ku5NG9LDDLydr9PUbz2g8rVmkbQtO51ZWT1
+NHz0AksN6GX9SvbvW3W7jCTnjtg9Pz13s21q3Yt/lbmiuO3vtQYo4ekJvLg/H+0k
+ShhZtukJFfO8ClsPMYT52S9TzVskDXwMxkH+rI6ZmoYc/i72t8sG7+V2lKfKI4MO
+Czq89X7wvHQ4/cFYNdyYVoZsCwv+cxuXmNy7mQIDAQABAoIBAAtHSbcLz00aGmqm
+tPfzgnQjA3hR1zGRzx8H+jlC8RMgaAB+GodbB6HYYwvSTTxQDt/55unri6Ks5rp/
+s0weiAn6c89rFGxVC5UV//YnljfKAsE9BHC29dTii/v01TA4qcD483Ui49Ci3A0g
+TJ7PcN7Dz/IcsmkS0uvLaKMYKg6nXu9UnKkLBqThTiLA5I+eZZ4zX862Yurku8NI
+HwbMtBsICbe1H0Ebdc/PPAShB8pvV3nQMGFjADOEYolaByQAltolADmIc5K9E6wL
+SsHzAjGTjarSYdqjZRuoEtQrWQTG1fnvJZBXB8L1Brv9RbrPWN2TW/A1uhUR4qYd
+wuxB1mkCgYEA9ao05RsJzDVc4qLBvDXuqo1WapwnYUyc8Jeq+r5l67Ota1ykQyiQ
+BJZDM/mdFRzZZjMAAMN9cxsDdY7gp0ebN190F443tSxjvlVOGJ/e8UJ+Au+9WEYM
+xZQo5VquU8XlxfwFYtYANMvr7DB8yEr25S7S2v3jZ70NZQDDR6G+5L8CgYEA506s
+JJM/NfP82e6JtSB9fOEcjEeddPCdf2RkB+E3Ppt7AQX5Aje/8VOSiZkIbOap9oLc
+rBd9GrER2m2pahd9DFkSs1td70IM5CwwgYIKyWkCCkLXyMrLpelFEqZsFvWD14Go
+c29NSDOpVfVJkPr46Gym6dBvy1rCMh+/ZrgsPacCgYAXFU0vEeFTzNfTe9OUacTp
+RaqPDektXVOJz9aDBQzynsl2wxe0L8WIiM37vkKiTzmmPriLWdMZ07n5e9lkHnhZ
+NaDk7boSTf95TO6vpaX/KW5JvFkgSES+8/L7yg+DU58JgWrIJK+URmz+nne7IkAc
+vM+XQC/z+XGewfmXa31SZQKBgGSDpHyUXBCXARa2+LJz9vQQYrZ23G6XrOlR98IQ
+1U/ogrA0JzwWe9tjxLb0gFvKdKtBvKEv59Z0gdyYcNlAcb+u6Vh1aMFyw2VX6pAs
+sYFKl29cEqcXsR1c2/45wZjMgclhd5EKGdw5TumimKBe31Eo/fN29024F9FuSF9b
+wyXbAoGBALGIKzPgV7Tt6SbzcCjJGQHlH/RKBcuFJjJS+Qph3w7K3L5b6Y35zPOY
+3+FxT2Z5wAlOGYeF9Qa8K3/VX1l7Vhktu9EcTqM59fMGuTM0mEgwwdFM4oFgRIau
+wmlIuAFmo7OwlsggHuHJ7lDk+r7AoNVW7l7Gd1JnG4CasvymVc3N
+-----END RSA PRIVATE KEY-----
diff --git a/tests/unit/jwk/rsa.pub.jwk b/tests/unit/jwk/rsa.pub.jwk
new file mode 100644 (file)
index 0000000..b12196e
--- /dev/null
@@ -0,0 +1,6 @@
+{
+    "kty": "RSA",
+    "n":   "3fgUyE3616u0t_nSFAZVxHTSl2T6ksIXIK4lTbw4btEJwW4qjFfejIhLWvja1r1ct1WONWNKbw0tT61rJwpQTHQRXT5CEaQMdtHM9zOJQQ4v6deJviW2L7FYSxg6MzBG2jsTEnonUxQx0Ku5NG9LDDLydr9PUbz2g8rVmkbQtO51ZWT1NHz0AksN6GX9SvbvW3W7jCTnjtg9Pz13s21q3Yt_lbmiuO3vtQYo4ekJvLg_H-0kShhZtukJFfO8ClsPMYT52S9TzVskDXwMxkH-rI6ZmoYc_i72t8sG7-V2lKfKI4MOCzq89X7wvHQ4_cFYNdyYVoZsCwv-cxuXmNy7mQ",
+    "e":   "AQAB"
+}
+
diff --git a/tests/unit/jwk/test.sh b/tests/unit/jwk/test.sh
new file mode 100755 (executable)
index 0000000..bcb1346
--- /dev/null
@@ -0,0 +1,26 @@
+#!/bin/sh
+
+check() {
+       ${HAPROXY_PROGRAM} -vv | grep -E '^Unit tests list :' | grep -q "jwk"
+}
+
+run() {
+       FILE1=$(mktemp)
+       ${HAPROXY_PROGRAM} -U jwk ${TESTDIR}/ecdsa.key > "${FILE1}"
+       diff -Naurp ${TESTDIR}/ecdsa.pub.jwk "${FILE1}"
+       rm "${FILE1}"
+
+       FILE2=$(mktemp)
+       ${HAPROXY_PROGRAM} -U jwk ${TESTDIR}/rsa.key > "${FILE2}"
+       diff -Naurp ${TESTDIR}/rsa.pub.jwk "${FILE2}"
+       rm "${FILE2}"
+}
+
+case "$1" in
+       "check")
+               check
+       ;;
+       "run")
+               run
+       ;;
+esac