diff --git a/src/jws.c b/src/jws.c index e0cc23a82..77d4e909e 100644 --- a/src/jws.c +++ b/src/jws.c @@ -4,6 +4,7 @@ #include #include +#include #include #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 index 000000000..6eec0ec30 --- /dev/null +++ b/tests/unit/jwk/ecdsa.key @@ -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 index 000000000..cb0d765f6 --- /dev/null +++ b/tests/unit/jwk/ecdsa.pub.jwk @@ -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 index 000000000..c46b8fbe2 --- /dev/null +++ b/tests/unit/jwk/rsa.key @@ -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 index 000000000..b12196e38 --- /dev/null +++ b/tests/unit/jwk/rsa.pub.jwk @@ -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 index 000000000..bcb1346c8 --- /dev/null +++ b/tests/unit/jwk/test.sh @@ -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