summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ironclad.asd7
-rw-r--r--src/public-key/secp521r1.lisp300
-rw-r--r--testing/test-vectors/public-key.lisp2
-rw-r--r--testing/test-vectors/secp521r1-dh.testvec7
-rw-r--r--testing/test-vectors/secp521r1-sig.testvec58
-rw-r--r--testing/testfuns.lisp36
6 files changed, 406 insertions, 4 deletions
diff --git a/ironclad.asd b/ironclad.asd
index f9b1a22..24cb1ee 100644
--- a/ironclad.asd
+++ b/ironclad.asd
@@ -154,7 +154,8 @@
(:file "ed25519")
(:file "ed448")
(:file "secp256r1")
- (:file "secp384r1")))))))
+ (:file "secp384r1")
+ (:file "secp521r1")))))))
(macrolet ((do-silently (&body body)
`(handler-bind ((style-warning #'muffle-warning)
@@ -351,4 +352,6 @@
(:test-vector-file "secp256r1-dh")
(:test-vector-file "secp256r1-sig")
(:test-vector-file "secp384r1-dh")
- (:test-vector-file "secp384r1-sig")))))))
+ (:test-vector-file "secp384r1-sig")
+ (:test-vector-file "secp521r1-dh")
+ (:test-vector-file "secp521r1-sig")))))))
diff --git a/src/public-key/secp521r1.lisp b/src/public-key/secp521r1.lisp
new file mode 100644
index 0000000..a48a128
--- /dev/null
+++ b/src/public-key/secp521r1.lisp
@@ -0,0 +1,300 @@
+;;;; -*- mode: lisp; indent-tabs-mode: nil -*-
+;;;; secp521r1.lisp -- secp521r1 (a.k.a. NIST P-521) elliptic curve
+
+
+(in-package :crypto)
+
+
+;;; class definitions
+
+(defclass secp521r1-public-key ()
+ ((y :initarg :y :reader secp521r1-key-y :type (simple-array (unsigned-byte 8) (*)))))
+
+(defclass secp521r1-private-key ()
+ ((x :initarg :x :reader secp521r1-key-x :type (simple-array (unsigned-byte 8) (*)))
+ (y :initarg :y :reader secp521r1-key-y :type (simple-array (unsigned-byte 8) (*)))))
+
+(eval-when (:compile-toplevel :load-toplevel :execute)
+ (defclass secp521r1-point ()
+ ;; Internally, a point (x, y) is represented using the Jacobian projective
+ ;; coordinates (X, Y, Z), with x = X / Z^2 and y = Y / Z^3.
+ ((x :initarg :x :type integer)
+ (y :initarg :y :type integer)
+ (z :initarg :z :type integer))))
+
+
+;;; constant and function definitions
+
+(defconstant +secp521r1-bits+ 521)
+(defconstant +secp521r1-p+ 6864797660130609714981900799081393217269435300143305409394463459185543183397656052122559640661454554977296311391480858037121987999716643812574028291115057151)
+(defconstant +secp521r1-b+ 1093849038073734274511112390766805569936207598951683748994586394495953116150735016013708737573759623248592132296706313309438452531591012912142327488478985984)
+(defconstant +secp521r1-l+ 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005449)
+(defconstant +secp521r1-i+ 5148598245097957286236425599311044912952076475107479057045847594389157387548242039091919730496090916232972233543610643527841490999787482859430521218336292863)
+
+(defconst +secp521r1-g+
+ (make-instance 'secp521r1-point
+ :x 2661740802050217063228768716723360960729859168756973147706671368418802944996427808491545080627771902352094241225065558662157113545570916814161637315895999846
+ :y 3757180025770020463545507224491183603594455134769762486694567779615544477440556316691234405012945539562144444537289428522585666729196580810124344277578376784
+ :z 1))
+(defconst +secp521r1-point-at-infinity+
+ (make-instance 'secp521r1-point :x 1 :y 1 :z 0))
+
+
+(defmethod ec-scalar-inv ((kind (eql :secp521r1)) n)
+ (expt-mod n (- +secp521r1-p+ 2) +secp521r1-p+))
+
+(defmethod ec-point-equal ((p secp521r1-point) (q secp521r1-point))
+ (declare (optimize (speed 3) (safety 0) (space 0) (debug 0)))
+ (with-slots ((x1 x) (y1 y) (z1 z)) p
+ (declare (type integer x1 y1 z1))
+ (with-slots ((x2 x) (y2 y) (z2 z)) q
+ (declare (type integer x2 y2 z2))
+ (let ((z1z1 (mod (* z1 z1) +secp521r1-p+))
+ (z2z2 (mod (* z2 z2) +secp521r1-p+)))
+ (and (zerop (mod (- (* x1 z2z2) (* x2 z1z1)) +secp521r1-p+))
+ (zerop (mod (- (* y1 z2z2 z2) (* y2 z1z1 z1)) +secp521r1-p+)))))))
+
+(defmethod ec-double ((p secp521r1-point))
+ (declare (optimize (speed 3) (safety 0) (space 0) (debug 0)))
+ (with-slots ((x1 x) (y1 y) (z1 z)) p
+ (declare (type integer x1 y1 z1))
+ (if (zerop z1)
+ +secp521r1-point-at-infinity+
+ (let* ((xx (mod (* x1 x1) +secp521r1-p+))
+ (yy (mod (* y1 y1) +secp521r1-p+))
+ (yyyy (mod (* yy yy) +secp521r1-p+))
+ (zz (mod (* z1 z1) +secp521r1-p+))
+ (x1+yy (mod (+ x1 yy) +secp521r1-p+))
+ (y1+z1 (mod (+ y1 z1) +secp521r1-p+))
+ (s (mod (* 2 (- (* x1+yy x1+yy) xx yyyy)) +secp521r1-p+))
+ (m (mod (* 3 (- xx (* zz zz))) +secp521r1-p+))
+ (u (mod (- (* m m) (* 2 s)) +secp521r1-p+))
+ (x2 u)
+ (y2 (mod (- (* m (- s u)) (* 8 yyyy)) +secp521r1-p+))
+ (z2 (mod (- (* y1+z1 y1+z1) yy zz) +secp521r1-p+)))
+ (make-instance 'secp521r1-point :x x2 :y y2 :z z2)))))
+
+(defmethod ec-add ((p secp521r1-point) (q secp521r1-point))
+ (declare (optimize (speed 3) (safety 0) (space 0) (debug 0)))
+ (with-slots ((x1 x) (y1 y) (z1 z)) p
+ (declare (type integer x1 y1 z1))
+ (with-slots ((x2 x) (y2 y) (z2 z)) q
+ (declare (type integer x2 y2 z2))
+ (cond
+ ((zerop z1)
+ q)
+ ((zerop z2)
+ p)
+ (t
+ (let* ((z1z1 (mod (* z1 z1) +secp521r1-p+))
+ (z2z2 (mod (* z2 z2) +secp521r1-p+))
+ (u1 (mod (* x1 z2z2) +secp521r1-p+))
+ (u2 (mod (* x2 z1z1) +secp521r1-p+))
+ (s1 (mod (* y1 z2 z2z2) +secp521r1-p+))
+ (s2 (mod (* y2 z1 z1z1) +secp521r1-p+)))
+ (if (= u1 u2)
+ (if (= s1 s2)
+ (ec-double p)
+ +secp521r1-point-at-infinity+)
+ (let* ((h (mod (- u2 u1) +secp521r1-p+))
+ (i (mod (* 4 h h) +secp521r1-p+))
+ (j (mod (* h i) +secp521r1-p+))
+ (r (mod (* 2 (- s2 s1)) +secp521r1-p+))
+ (v (mod (* u1 i) +secp521r1-p+))
+ (x3 (mod (- (* r r) j (* 2 v)) +secp521r1-p+))
+ (y3 (mod (- (* r (- v x3)) (* 2 s1 j)) +secp521r1-p+))
+ (z1+z2 (mod (+ z1 z2) +secp521r1-p+))
+ (z3 (mod (* (- (* z1+z2 z1+z2) z1z1 z2z2) h) +secp521r1-p+)))
+ (make-instance 'secp521r1-point :x x3 :y y3 :z z3)))))))))
+
+(defmethod ec-scalar-mult ((p secp521r1-point) e)
+ ;; Point multiplication on NIST P-521 curve using the Montgomery ladder.
+ (declare (optimize (speed 3) (safety 0) (space 0) (debug 0))
+ (type integer e))
+ (do ((r0 +secp521r1-point-at-infinity+)
+ (r1 p)
+ (i (1- +secp521r1-bits+) (1- i)))
+ ((minusp i) r0)
+ (declare (type secp521r1-point r0 r1)
+ (type fixnum i))
+ (if (logbitp i e)
+ (setf r0 (ec-add r0 r1)
+ r1 (ec-double r1))
+ (setf r1 (ec-add r0 r1)
+ r0 (ec-double r0)))))
+
+(defmethod ec-point-on-curve-p ((p secp521r1-point))
+ (declare (optimize (speed 3) (safety 0) (space 0) (debug 0)))
+ (with-slots (x y z) p
+ (declare (type integer x y z))
+ (let* ((y2 (mod (* y y) +secp521r1-p+))
+ (x3 (mod (* x x x) +secp521r1-p+))
+ (z2 (mod (* z z) +secp521r1-p+))
+ (z4 (mod (* z2 z2) +secp521r1-p+))
+ (z6 (mod (* z4 z2) +secp521r1-p+))
+ (a (mod (+ x3 (* -3 x z4) (* +secp521r1-b+ z6)) +secp521r1-p+)))
+ (declare (type integer y2 x3 z2 z4 z6 a))
+ (zerop (mod (- y2 a) +secp521r1-p+)))))
+
+(defmethod ec-encode-scalar ((kind (eql :secp521r1)) n)
+ (integer-to-octets n :n-bits +secp521r1-bits+ :big-endian t))
+
+(defmethod ec-decode-scalar ((kind (eql :secp521r1)) octets)
+ (octets-to-integer octets :big-endian t))
+
+(defmethod ec-encode-point ((p secp521r1-point))
+ (declare (optimize (speed 3) (safety 0) (space 0) (debug 0)))
+ (with-slots (x y z) p
+ (declare (type integer x y z))
+ (when (zerop z)
+ (error 'ironclad-error
+ :format-control "The point at infinity can't be encoded."))
+ (let* ((invz (ec-scalar-inv :secp521r1 z))
+ (invz2 (mod (* invz invz) +secp521r1-p+))
+ (invz3 (mod (* invz2 invz) +secp521r1-p+))
+ (x (mod (* x invz2) +secp521r1-p+))
+ (y (mod (* y invz3) +secp521r1-p+))
+ (y-sign (logand y 1)))
+ (concatenate '(simple-array (unsigned-byte 8) (*))
+ (vector (+ 2 y-sign))
+ (ec-encode-scalar :secp521r1 x)))))
+
+(defmethod ec-decode-point ((kind (eql :secp521r1)) octets)
+ (declare (optimize (speed 3) (safety 0) (space 0) (debug 0)))
+ (case (aref octets 0)
+ ((2 3)
+ ;; Compressed point
+ (if (= (length octets) (1+ (ceiling +secp521r1-bits+ 8)))
+ (let* ((x-bytes (subseq octets 1 (1+ (ceiling +secp521r1-bits+ 8))))
+ (x (ec-decode-scalar :secp521r1 x-bytes))
+ (y-sign (- (aref octets 0) 2))
+ (y2 (mod (+ (* x x x) (* -3 x) +secp521r1-b+) +secp521r1-p+))
+ (y (expt-mod y2 +secp521r1-i+ +secp521r1-p+))
+ (y (if (= (logand y 1) y-sign) y (- +secp521r1-p+ y)))
+ (p (make-instance 'secp521r1-point :x x :y y :z 1)))
+ (if (ec-point-on-curve-p p)
+ p
+ (error 'invalid-curve-point :kind 'secp521r1)))
+ (error 'invalid-curve-point :kind 'secp521r1)))
+ ((4)
+ ;; Uncompressed point
+ (if (= (length octets) (1+ (* 2 (ceiling +secp521r1-bits+ 8))))
+ (let* ((x-bytes (subseq octets 1 (1+ (ceiling +secp521r1-bits+ 8))))
+ (x (ec-decode-scalar :secp521r1 x-bytes))
+ (y-bytes (subseq octets (1+ (ceiling +secp521r1-bits+ 8))))
+ (y (ec-decode-scalar :secp521r1 y-bytes))
+ (p (make-instance 'secp521r1-point :x x :y y :z 1)))
+ (if (ec-point-on-curve-p p)
+ p
+ (error 'invalid-curve-point :kind 'secp521r1)))
+ (error 'invalid-curve-point :kind 'secp521r1)))
+ (t
+ (error 'invalid-curve-point :kind 'secp521r1))))
+
+(defun secp521r1-public-key (sk)
+ (let ((a (ec-decode-scalar :secp521r1 sk)))
+ (ec-encode-point (ec-scalar-mult +secp521r1-g+ a))))
+
+(defmethod make-signature ((kind (eql :secp521r1)) &key r s &allow-other-keys)
+ (unless r
+ (error 'missing-signature-parameter
+ :kind 'secp521r1
+ :parameter 'r
+ :description "first signature element"))
+ (unless s
+ (error 'missing-signature-parameter
+ :kind 'secp521r1
+ :parameter 's
+ :description "second signature element"))
+ (concatenate '(simple-array (unsigned-byte 8) (*)) r s))
+
+(defmethod destructure-signature ((kind (eql :secp521r1)) signature)
+ (let ((length (length signature)))
+ (if (/= length (* 2 (ceiling +secp521r1-bits+ 8)))
+ (error 'invalid-signature-length :kind 'secp521r1)
+ (let* ((middle (/ length 2))
+ (r (subseq signature 0 middle))
+ (s (subseq signature middle)))
+ (list :r r :s s)))))
+
+(declaim (notinline secp521r1-generate-k))
+;; In the tests, this function is redefined to use a constant value
+;; instead of a random one. Therefore it must not be inlined or the tests
+;; will fail.
+(defun secp521r1-generate-k ()
+ (1+ (strong-random (1- +secp521r1-l+))))
+
+;;; Note that hashing is not performed here.
+(defmethod sign-message ((key secp521r1-private-key) message &key (start 0) end &allow-other-keys)
+ (declare (optimize (speed 3) (safety 0) (space 0) (debug 0)))
+ (let* ((end (min (or end (length message)) (ceiling +secp521r1-bits+ 8)))
+ (sk (ec-decode-scalar :secp521r1 (secp521r1-key-x key)))
+ (k (secp521r1-generate-k))
+ (invk (modular-inverse-with-blinding k +secp521r1-l+))
+ (r (ec-scalar-mult +secp521r1-g+ k))
+ (r (ec-decode-scalar :secp521r1 (subseq (ec-encode-point r) 1)))
+ (r (mod r +secp521r1-l+))
+ (h (subseq message start end))
+ (e (ec-decode-scalar :secp521r1 h))
+ (s (mod (* invk (+ e (* sk r))) +secp521r1-l+)))
+ (if (not (or (zerop r) (zerop s)))
+ (make-signature :secp521r1
+ :r (ec-encode-scalar :secp521r1 r)
+ :s (ec-encode-scalar :secp521r1 s))
+ (sign-message key message :start start :end end))))
+
+(defmethod verify-signature ((key secp521r1-public-key) message signature &key (start 0) end &allow-other-keys)
+ (declare (optimize (speed 3) (safety 0) (space 0) (debug 0)))
+ (unless (= (length signature) (* 2 (ceiling +secp521r1-bits+ 8)))
+ (error 'invalid-signature-length :kind 'secp521r1))
+ (let* ((end (min (or end (length message)) (ceiling +secp521r1-bits+ 8)))
+ (pk (ec-decode-point :secp521r1 (secp521r1-key-y key)))
+ (signature-elements (destructure-signature :secp521r1 signature))
+ (r (ec-decode-scalar :secp521r1 (getf signature-elements :r)))
+ (s (ec-decode-scalar :secp521r1 (getf signature-elements :s)))
+ (h (subseq message start end))
+ (e (ec-decode-scalar :secp521r1 h))
+ (w (modular-inverse-with-blinding s +secp521r1-l+))
+ (u1 (mod (* e w) +secp521r1-l+))
+ (u2 (mod (* r w) +secp521r1-l+))
+ (rp (ec-add (ec-scalar-mult +secp521r1-g+ u1)
+ (ec-scalar-mult pk u2)))
+ (v (ec-decode-scalar :secp521r1 (subseq (ec-encode-point rp) 1)))
+ (v (mod v +secp521r1-l+)))
+ (and (< r +secp521r1-l+)
+ (< s +secp521r1-l+)
+ (= v r))))
+
+(defmethod make-public-key ((kind (eql :secp521r1)) &key y &allow-other-keys)
+ (unless y
+ (error 'missing-key-parameter
+ :kind 'secp521r1
+ :parameter 'y
+ :description "public key"))
+ (make-instance 'secp521r1-public-key :y y))
+
+(defmethod destructure-public-key ((public-key secp521r1-public-key))
+ (list :y (secp521r1-key-y public-key)))
+
+(defmethod make-private-key ((kind (eql :secp521r1)) &key x y &allow-other-keys)
+ (unless x
+ (error 'missing-key-parameter
+ :kind 'secp521r1
+ :parameter 'x
+ :description "private key"))
+ (make-instance 'secp521r1-private-key :x x :y (or y (secp521r1-public-key x))))
+
+(defmethod destructure-private-key ((private-key secp521r1-private-key))
+ (list :x (secp521r1-key-x private-key)
+ :y (secp521r1-key-y private-key)))
+
+(defmethod generate-key-pair ((kind (eql :secp521r1)) &key &allow-other-keys)
+ (let* ((sk (ec-encode-scalar :secp521r1 (1+ (strong-random (1- +secp521r1-l+)))))
+ (pk (secp521r1-public-key sk)))
+ (values (make-private-key :secp521r1 :x sk :y pk)
+ (make-public-key :secp521r1 :y pk))))
+
+(defmethod diffie-hellman ((private-key secp521r1-private-key) (public-key secp521r1-public-key))
+ (let ((s (ec-decode-scalar :secp521r1 (secp521r1-key-x private-key)))
+ (p (ec-decode-point :secp521r1 (secp521r1-key-y public-key))))
+ (ec-encode-point (ec-scalar-mult p s))))
diff --git a/testing/test-vectors/public-key.lisp b/testing/test-vectors/public-key.lisp
index 9b4c613..fabc015 100644
--- a/testing/test-vectors/public-key.lisp
+++ b/testing/test-vectors/public-key.lisp
@@ -11,8 +11,10 @@
(rtest:deftest :ed448-signature (run-test-vector-file :ed448 *public-key-signature-tests*) t)
(rtest:deftest :secp256r1-signature (run-test-vector-file :secp256r1-sig *public-key-signature-tests*) t)
(rtest:deftest :secp384r1-signature (run-test-vector-file :secp384r1-sig *public-key-signature-tests*) t)
+(rtest:deftest :secp521r1-signature (run-test-vector-file :secp521r1-sig *public-key-signature-tests*) t)
(rtest:deftest :curve25519-dh (run-test-vector-file :curve25519 *public-key-diffie-hellman-tests*) t)
(rtest:deftest :curve448-dh (run-test-vector-file :curve448 *public-key-diffie-hellman-tests*) t)
(rtest:deftest :elgamal-dh (run-test-vector-file :elgamal-dh *public-key-diffie-hellman-tests*) t)
(rtest:deftest :secp256r1-dh (run-test-vector-file :secp256r1-dh *public-key-diffie-hellman-tests*) t)
(rtest:deftest :secp384r1-dh (run-test-vector-file :secp384r1-dh *public-key-diffie-hellman-tests*) t)
+(rtest:deftest :secp521r1-dh (run-test-vector-file :secp521r1-dh *public-key-diffie-hellman-tests*) t)
diff --git a/testing/test-vectors/secp521r1-dh.testvec b/testing/test-vectors/secp521r1-dh.testvec
new file mode 100644
index 0000000..bce5654
--- /dev/null
+++ b/testing/test-vectors/secp521r1-dh.testvec
@@ -0,0 +1,7 @@
+;;;; secp521r1 test vectors
+
+;;; Test vector from RFC 5903
+
+(:secp521r1-dh-test #h"0037ade9319a89f4dabdb3ef411aaccca5123c61acab57b5393dce47608172a095aa85a30fe1c2952c6771d937ba9777f5957b2639bab072462f68c27a57382d4a52" #h"040015417e84dbf28c0ad3c278713349dc7df153c897a1891bd98bab4357c9ecbee1e3bf42e00b8e380aeae57c2d107564941885942af5a7f4601723c4195d176ced3e017cae20b6641d2eeb695786d8c946146239d099e18e1d5a514c739d7cb4a10ad8a788015ac405d7799dc75e7b7d5b6cf2261a6a7f1507438bf01beb6ca3926f9582" #h"0145ba99a847af43793fdd0e872e7cdfa16be30fdc780f97bccc3f078380201e9c677d600b343757a3bdbf2a3163e4c2f869cca7458aa4a4effc311f5cb151685eb9" #h"0400d0b3975ac4b799f5bea16d5e13e9af971d5e9b984c9f39728b5e5739735a219b97c356436adc6e95bb0352f6be64a6c2912d4ef2d0433ced2b6171640012d9460f015c68226383956e3bd066e797b623c27ce0eac2f551a10c2c724d9852077b87220b6536c5c408a1d2aebb8e86d678ae49cb57091f4732296579ab44fcd17f0fc56a" #h"0301144c7d79ae6956bc8edb8e7c787c4521cb086fa64407f97894e5e6b2d79b04d1427e73ca4baa240a34786859810c06b3c715a3a8cc3151f2bee417996d19f3ddea")
+;; Same test vector with compressed points
+(:secp521r1-dh-test #h"0037ade9319a89f4dabdb3ef411aaccca5123c61acab57b5393dce47608172a095aa85a30fe1c2952c6771d937ba9777f5957b2639bab072462f68c27a57382d4a52" #h"020015417e84dbf28c0ad3c278713349dc7df153c897a1891bd98bab4357c9ecbee1e3bf42e00b8e380aeae57c2d107564941885942af5a7f4601723c4195d176ced3e" #h"0145ba99a847af43793fdd0e872e7cdfa16be30fdc780f97bccc3f078380201e9c677d600b343757a3bdbf2a3163e4c2f869cca7458aa4a4effc311f5cb151685eb9" #h"0200d0b3975ac4b799f5bea16d5e13e9af971d5e9b984c9f39728b5e5739735a219b97c356436adc6e95bb0352f6be64a6c2912d4ef2d0433ced2b6171640012d9460f" #h"0301144c7d79ae6956bc8edb8e7c787c4521cb086fa64407f97894e5e6b2d79b04d1427e73ca4baa240a34786859810c06b3c715a3a8cc3151f2bee417996d19f3ddea")
diff --git a/testing/test-vectors/secp521r1-sig.testvec b/testing/test-vectors/secp521r1-sig.testvec
new file mode 100644
index 0000000..089815f
--- /dev/null
+++ b/testing/test-vectors/secp521r1-sig.testvec
@@ -0,0 +1,58 @@
+;;;; secp521r1 test vectors
+
+;;; Test vectors from NIST CAPV
+
+(:secp521r1-signature-test #h"01bd56bd106118eda246155bd43b42b8e13f0a6e25dd3bb376026fab4dc92b6157bc6dfec2d15dd3d0cf2a39aa68494042af48ba9601118da82c6f2108a3a203ad74" #h"04012fbcaeffa6a51f3ee4d3d2b51c5dec6d7c726ca353fc014ea2bf7cfbb9b910d32cbfa6a00fe39b6cdb8946f22775398b2e233c0cf144d78c8a7742b5c7a3bb5d23009cdef823dd7bf9a79e8cceacd2e4527c231d0ae5967af0958e931d7ddccf2805a3e618dc3039fec9febbd33052fe4c0fee98f033106064982d88f4e03549d4a64d" #h"1bf7039cca2394273f11a1d48dccb4466f3161df" #x06fdfbd1af79c6c91da3eb00e494e18107d8431d5bf90f4b3db33114207a5add73114b50f97bee07443b9f14ff43155899476be2e91f27aef31a781aacb5e6225bf #h"00bd117b4807710898f9dd7778056485777668f0e78e6ddf5b000356121eb7a220e9493c7f9a57c077947f89ac45d5acb6661bbcd17abb3faea149ba0aa3bb1521be0019cd2c5c3f9870ecdeb9b323abdf3a98cd5e231d85c6ddc5b71ab190739f7f226e6b134ba1d5889ddeb2751dabd97911dff90c34684cdbe7bb669b6c3d22f2480c")
+(:secp521r1-signature-test #h"002d1b3b6e623bd4da81433a1f879e439ed0703c2ef318189a6e063fb41e667b22cfdf0114b2454a8f1c97907b6d2c4b2e930faab26dfa8136ac8ff9734463300590" #h"04006c723f4d9b93a179f7aedf617150f3154c8a260c457e138e1c5d41eea2f64d94b3ffb59d756435b6445d4e2f2bb4eb30b6de352d3d035cc033ed8ff5492e2c8a97004e392a39ad8e787f6cf507fffe55d5ae9d0c3f080debdcdc391fb00b84e7c3f9558fb67a3f923b4b06e0c2f94797344ba6bcd1766f7460dff2e99e2c348fa2b3cf" #h"532b3b9caab0a999157445da77dbddf666d5379c" #x037239dd949da0d2c4cac089ba80b6b3044520d9685191fd56f86535e94a7313f5da68b6ae7975427cf150fe448cc4ab4773815df1d4a7f8a0027923b3b0fd537c3 #h"0058b408af21dbaec528125c8a6507fa7a1770e3505c8461b25fe3cf020693b3e5fd5f184c5ebbc5bf3bfa66a1b43290ce52677e42957d8765df9d59525aaceaac3d00a7303625b965ca567211f03ca915bd5101afad687081f2bb38a98e970da0e1dbe5997bafc0113e69e84bf77d30085f22e77db6e0bb7fe90fb3ee1d571bcf11ecd4")
+(:secp521r1-signature-test #h"00d033879f6a89517fcf1578483bd4b73ec5ee1f5374fdd2217e21ed85afbc62b2e5e08a6f9c3b840241d4b12ea6888396e1047b0a9262b377daee113fd0b557eacf" #h"0401b026f9d1e25e16c7562e73d808ba852cf3642d6b4126fd2b63ec4439465ec4434e4b604d0a75c468868b631e5cdba5e00cd928a4f7314a264264011c6cfba0d4dd00fb3b429985a1323cdf7fbd9db89c58a4586c3aa37d4000ec87a15eb29be4b05f43c7d16ec4ce7779ea527446bcd8211deb8e73bbd3dfcc57ffc120a71b25edce2a" #h"13a71c788716dd9323bc647518e66d48939795e9" #x0b6674ea73861ca2527f90fd2e569dd22b9c9a5b86409ee2c3bb881e16e60b2ccc5ceabd8e05d0d67622c67929f2c3ae63dafe9868949854a48361b2d61524d46f3 #h"0149d319216de2e5333faa15a1c13549421834d4eda6795b0c77267399959307d5129a1f91f9f132f468f9273f98ceb19bc5432f0329965dd28b98a94767045f14af01acee37434fdc62ce3302181c540f397ed039529bc1b5de5bc4ad49b2dbfac070653e3d4393dada59c1e980f5de232db2ade0dea0d9b21dcf2c6df138aa0a5888c5")
+(:secp521r1-signature-test #h"009e26a1f92eed3a6bb92dc69203d30a9aa4fdf31f5e88f50df52fde253bc7a6d7158060f65212f04a81b3317dc2597eafffdab2ee909f43458d91a52215f20610e6" #h"0401febce6692598637c582bc370cdfdc9e3ec0936599109d5e1e44168163f676f722df00f9aaac853b207e32d8b9a2f2ad6c48ca9d70d876f9c4f5b8cb9f299180fed01461f762807c7286818aa905554f10fe9975b9b1bb7f5dc5ab6d5a468e027736e92fcc5f683ddf3cd8b9ebd08a3bbf8dd5b26b0714d676840ac8576e28f09aa879d" #h"ad5da3aa7c7a67d84e03aad3cb848b7c656d85db" #x0e6da1f25f890582284fa5650e975505cf64eef2227e522b8e3d42008c1a423b4c57f9e5ff913483754f238a6f9fa2b260fb3de94fb7c4a15f62b93a1cd2f805f67 #h"01a0540eb9653485aad3bb671edda4373235bb584441881bf7a0d85c9f39d20c9eebf73015f1edd718ec558a46e0958f108eb70357ec3d0bd94399139b5249921f26011dd71b173e8e50290f8649c363d6e74d2341a81fb7e1960b00e7b944cf0985547a73a48c7220627646770f28219833ed1cbc5f8601f9966f6d6c32715704aa4edb")
+(:secp521r1-signature-test #h"007d273e0d5835950b41f31200817f05e3391ece80b499fddbda7c081e10f1db5dac6bfa2607d21f821cef7bafec95c457f35856f06b2c56320033bc6352c207bb7d" #h"0401ce9ce8fcfc613f4667ded6b56e0eb8afa5eb83ef124e7e3bbbc5d33d2d80094cb38dc31e678e27c3193000fb8c4b84af9c331ea6b77d300efef31b20954b1571eb012f374aa12e3c127caf052c713a44e0ef52849d0fa0521ecc750441b5ccb051263998404d1927fd2a991705c5b64c7d942a46e156d178fb49612d8aa51883f6bbd4" #h"10ac7fd71b799d45c3ab7837b83723048dbac11a" #x032e33c75c4c038afaa14574aa17c4351e81f351cc6b0a22f9c58910c0808fb1b50a568d33c73fef4b77bf788ef4d29d644c609ed2869f0b47b71273117f9b3851e #h"015440668a7ab64171d3f12225119d4b91f7b734b1eff9abc64a38727e54e664ae65d198d7923c2bcd9e77976e562408362fc6576493e33c7a9ffa45cfa54b593a0101db168f3832705ca233f141224445420b4a84f6e45f02c27a87dbf64217ac9c464cdc5c65ac06b8cd7012c4090b7a4117496dedf88229c3b6570df51c787c2f2069")
+(:secp521r1-signature-test #h"0051d8c084706396e3441c9ac94db577e91b6d232220e109008b32a770233f0929a4636b1ec7c8edeb28918ff0f58e0589844b8c96785e06bb40250026f742751f03" #h"04002cd83921dd9338cbd288a97df29fbe295e7bd650ef201ea7ee2b58cf0e02ba97d67416d968a0a1c419bd80c125dcb096135e2fa9916eb103e1456ec67cee60681501d5831b764b4a252f3549484c4c7fd626d59cd388ac0669c5a5dbf6aa5f8315dce3f988e00cc11b4eb29f4aa8265c9d961b3f7ba2025d277a290479848106806d3f" #h"2295b31d5d75622ff62b906d0243b8c81dd264a2" #x07e4907956a25e5d86fddbc1d7b863c75746fb051c721a031866f58ef316e33231486fc556c6ce442bad99dacb70cf2588d2c2402c1d754623b891116ba43b14282 #h"017b795f02dc1ca6dba828702c7860579a5aed9a13cf2f83509d4ba8c0effb611ba198c6eea38a3037e9d0354eaeb07055962dd7d82916dd7652fca8594ffcae17d30184f86ae4f8d1dc97014a754e2aea5edcc9a8755626e2cbeb493b8cf3ebe97953feb8087b252c88523b1e283f9e83db6595266c22f21c4d0d82802577f99814bbd9")
+(:secp521r1-signature-test #h"013d8de8d8762dc54a6f53bb44cbbd2fed36b48b91dc072fa8f1f0152f36438424522a1037a60948b7323d7575aabce68113c1d0c6a1d91351ebe694a8d14fd6d09b" #h"0400ea3a0c7c21f700181737588ad68a33a55c46838ec79b1b657c33b19224645ebbeb469d80cc9e7c6f5592fe8b128257d49ab202777d800aaa2d749fd2acb8a1bfa2005df631eff2d082a6b111c2c8a448c6f70d2f77bf9822de04f5b95e1cc75d973354dbd9d87c0cb5d42839025cfb2bff9ac3b96626f3e3844985982c630ce0c1de09" #h"1ec45d6751f34b7fe50d40fdadc8991cf5171d68" #x118b782b87b98cd5c05d7993ebac9617f883471b4b5b9fc1dade182e399e962b0e75153b7d64e0e4fd7de4cd460aee188592dbfa8a88f391d28538cdffdbffc93ff #h"00af163167a3d73de5714e108f0d04379ccf60fb3983ddca76fef077c0d093cb68bf600251d7f47e32ea348f73c637bda0b3d4ae68b9eef512ea01ed5f64f38b0d240133af4bc060b00b05a2df982e059949cdefc2f38a5208546620ae0c2efcff40acb68973c4889708037135db6120c2022a2dabb4429bff9a452422d74ae612e4c241")
+(:secp521r1-signature-test #h"0088cb094e5667f3c0aeffce6718c8147108a78c50b8e8500f25dbbae3a604903b19c6d82927a745ba2e3ec97c7e57d6b5030768f7e01064e11af1db1b6b0bb1a621" #h"0400ea442ef42c1dd34fb4c65501e9bda6073d37aa993ec353e7d731e423dfb577206847685fec3d0ef2c0ec33d31bf6464bccdab9549b900d77800531dfc48464172600d05aac36017c71ee856fef9cefbe1859b7b6e92d69e1a38f792ca90c51e270eb0ec1a9e304b26e5589c6fe2ebe7c7637885a0f108f87a9ebf67c7e1c2a7bf288e7" #h"2bf581b8a009a740207d8a7cab129b351df907db" #x17cef489985944e18d4a75dcc7fbd6669d593dbc00a96e38857056784349431d5ee662210ca37377d027d436bc86f3af6ab1cf863b432f346153f27f349e41d3a28 #h"01c68969ba75f63ba76a66c90d48315e532f7747e50719d23515339c79ba5bc24115793af7a68f1956ac85d3c46b23199134c9f310a8d6c4a2954664c61f4b7224290198d12602acc4794e02c2cc6d00e62552be24b1cdd6cf883aec83aa457389fbd21f8fa72957485e74b69b7cfa07097f404ea8d2bfb801e9adb74b9ad80fde36dfa8")
+(:secp521r1-signature-test #h"011d67e954684cb1c60b6103dcded3e7ea2b0b5bfcdc09f10fe24c4c26e9c23b7ba69314a6615f30378e524f4d4bdd94e75aa4370b355d4fbfbcc0f548382fc0edcd" #h"04015270a6e3348effcc678b2865c871e44ffb1733445e58a084dd0ac221a6b64ec25675092ff219ae178e063e80b74be85d47401512bcb3c3b13329883f216b3180c501c2b0296a765d707dbd4f75dc64d10ef35ac5015c670db2e4215f85587ae7d6934c64cd11c3a8c55030aced791852048913cab0db9b983f589001fd2acf9176fcde" #h"82fd980d55dc2e669001e52583c97f886a7f0759" #x04ded3f651f55738cf034d1ca129c13e7eb0594f050b3e44cf17ee3685878e8a41cf309002d9358b063a5010a9552ee30af36f93f136a06c1fdbdef5b59c30f8c49 #h"001ba80beb9367210c963fd7791c332c76f448e8a315e98d4c2c61a2ee9bd6e7433fa80dcd0ef4a96df6105f1aae768c82676a8ac180ab153487d9adcaedd404f0800126fc7e5a4136e1b2ca8e4001dc148f4e612d8902cb79b1dfc927cf60667d823a90b6872b16b95f7cb00813b5ba5bc59dd2ca9694293ffbe403b6c46e42a5b6e98d")
+(:secp521r1-signature-test #h"004a72502386c16bb07cb050474458792aba0d4201e7cf80a0aed5326e40700bc7be90276ea0eaa74878d232a4142c7d5b937fa8616d3b16c887f89cfa6c21f99774" #h"0400de92e6c832b0b970ba4052fc182aebcd0c23eef8825720857d02487c1dfc6ba4a3ccbec20e314a3d531b811762b6946c0020bbdbdc59c7a8c3466646753b8616240056e3adfc41bae352eb57c3592b3c7c2c360722f8bcd7a910963817e2ad82f82d880225c785c96ee33799bfdb44d1e50cc1b10b230a767478d11f019df9598bae7d" #h"97d2a3a674c5996678d7ab5c82fb581d135f700b" #x0b5f1b5270855ca83ae71b08a9f9ce839329d6b000fd85a5e4a42436cfefa0661230e7ab0aff8982d1a1ce3263832d311f7600179b34f37a49026f536366b8c49a5 #h"010c5a575b1871851b589c76ccc625c2189b2f14b001552364f4b17d8fcae95b5f259ebe71063459ab336183a4a8b1438987349ff5ab15bc6d11db1115f1c74496bd0066364550fd07fae74ce722dfbe92986642dc27e36521a31bf74ab126ba8f55062ddb83cc245c9d985d5b8c0be3418348758ae0f631a2f8f377ef553cc5fcad623e")
+
+(:secp521r1-signature-test #h"01d7bb864c5b5ecae019296cf9b5c63a166f5f1113942819b1933d889a96d12245777a99428f93de4fc9a18d709bf91889d7f8dddd522b4c364aeae13c983e9fae46" #h"0401a7596d38aac7868327ddc1ef5e8178cf052b7ebc512828e8a45955d85bef49494d15278198bbcc5454358c12a2af9a3874e7002e1a2f02fcb36ff3e3b4bc0c69e70184902e515982bb225b8c84f245e61b327c08e94d41c07d0b4101a963e02fe52f6a9f33e8b1de2394e0cb74c40790b4e489b5500e6804cabed0fe8c192443d4027b" #h"84358f87f45970a080efcb8b1d9284c8e61e06edbf5209b1a9db9cbc" #x141f679033b27ec29219afd8aa123d5e535c227badbe2c86ff6eafa5116e9778000f538579a80ca4739b1675b8ff8b6245347852aa524fe9aad781f9b672e0bb3ff #h"006b973a638bde22d8c1c0d804d94e40538526093705f92c0c4dac2c72e7db013a9c89ffc5b12a396886305ddf0cbaa7f10cdd4cd8866334c8abfc800e5cca36539100b0a01eca07a3964dd27d9ba6f3750615ea36434979dc73e153cd8ed1dbcde2885ead5757ebcabba117a64fcff9b5085d848f107f0c9ecc83dfa2fa09ada3503028")
+(:secp521r1-signature-test #h"017e49b8ea8f9d1b7c0378e378a7a42e68e12cf78779ed41dcd29a090ae7e0f883b0d0f2cbc8f0473c0ad6732bea40d371a7f363bc6537d075bd1a4c23e558b0bc73" #h"0400156cd2c485012ea5d5aadad724fb87558637de37b34485c4cf7c8cbc3e4f106cb1efd3e64f0adf99ddb51e3ac991bdd90785172386cdaf2c582cc46d6c99b0fed101edeeda717554252b9f1e13553d4af028ec9e158dbe12332684fc1676dc731f39138a5d301376505a9ab04d562cc1659b0be9cb2b5e03bad8b412f2699c245b0ba2" #h"962bade1e8227c9f2a069177fb89dab45c4f7e8e2f81fdd206b0b99e" #x1dc3e60a788caa5f62cb079f332d7e5c918974643dca3ab3566a599642cd84964fbef43ce94290041fe3d2c8c26104d9c73a57a7d4724613242531083b49e255f33 #h"012592c0be6cce18efb2b972cd193d036dcb850f2390fa8b9b86b2f876548bc424fb3bc13c1e5c415fa09d0ecfcae5bf76fb23e8322d7eecb264a2ae6d20ef50d405011bc9713be88e3b9912a3e5f5d7b56f20573e979b1a75d04ce339f724bddffa4665d25995fe24d32507d8a07c5e10169f5338ef2827737f7b0291752b21237217e3")
+(:secp521r1-signature-test #h"0135ea346852f837d10c1b2dfb8012ae8215801a7e85d4446dadd993c68d1e9206e1d8651b7ed763b95f707a52410eeef4f21ae9429828289eaea1fd9caadf826ace" #h"04018d40cc4573892b3e467d314c39c95615ee0510e3e4dbc9fa28f6cd1f73e7acde15ad7c8c5339df9a7774f8155130e7d1f8de9139ddd6dfe1841c1e64c38ea98243017021782d33dc513716c83afe7ba5e7abef9cb25b31f483661115b8d6b5ae469aaf6f3d54baa3b658a9af9b6249fd4d5ea7a07cb8b600f1df72b81dac614cfc384a" #h"3ab194db447f5dc738e1452bf7958b346c071b84d6ca2edd9ea3b870" #x0c24acc1edb3777212e5b0bac744eadf4eda11fa150753b355bf96b189e6f57fc02284bb22d8b3cd8bba7a09aae9f4ea955b382063425a6f8da2f99b9647b147172 #h"0183da7b8a9f9d5f08903359c1a2435b085fcf26a2ed09ab71357bb7634054acc569535e6fe81d28233e4703005fc4bf83ce794d9463d575795aa0f03398e854cefd00b3621145b9866ab7809139795cc30cd0404127a7f0fafa793660491009f6c53724fdb0b1ffbf0fd51c131180b8a957fe66e76d2970247c024261c768dee9abbfb9")
+(:secp521r1-signature-test #h"01393cb1ee9bfd7f7b9c057ecc66b43e807e12515f66ed7e9c9210ba1514693965988e567fbad7c3f17231aacee0e9b9a4b1940504b1cd4fd5edfaa62ba4e3e476fc" #h"0401e855c935139c8092092cfa733db1292530506eeb2bbb1687f9602c36d97a6714e998892d5d3b842d1896a6ece9d549e9792881a256256137b3dff180c96cc5d07b018d83b6e93cd287311f7bf7c1d7f9eeabcf0b69c12f2d8f40e333e81e956d968532a37a4c04d761874df293b484cd7053b03fdbc2fdcd3b4c412d6f272fb7c93fe6" #h"7c72d5606cbc1610e101aa50d4793f96339eab9eba88342e87ff2642" #x1d98619bdc04735d30c222fc67da82c069aea5f449af5e8c4db10c1786c0cb9e6f2cc0bb66fa6be18c485570d648dafcd0a973c43d5c94e9a9dacbd3170e53fa2a0 #h"00bf47fabe107ce0ec03e2ad60a79b058e1bebb18568b6a8cdbe86032e71aa30c15766105b2ea952cfa79bcab046df601159f96e179bbcf252dc68ac73d31481fdae01f918fec69cd07d90f9d892b7117e7519c3224947f4262f1fd97077dd5386a6c78aeddff3ee97e59ea353f06029f1336f0d6ef5c0f4b17ca59343a55319b7bfc3db")
+(:secp521r1-signature-test #h"0179fa164e051c5851e8a37d82c181e809a05fea9a3f083299b22684f59aa27e40dc5a33b3f7949338764d46bfe1f355134750518b856d98d9167ef07aac3092c549" #h"0401857cc7bbed20e87b3fd9a104956aa20c6502192910e0e7598410526ebfe1c99397b85189612a60c51fb8f4dd5cb08a8cd2e702563062dcb043410715c5323a004601fce8d135284310d2f38c216030634b32cd223222f0d9d8d2b7c55477c4b8b74fc6c96a6092f34b05ca44d3633a5037c2166c479a032bb4f949f89fc1ba5236d07d" #h"b2d36a3bfc82c960eb05f4993b9bd596a25920145d4267f74481a070" #x16d9704c0cee791f2938bb2a8a595752a3635c2f557efeecefd719414b5f2aaf846080f582c76eae7a8fddf81859b49d0131c212524d55defa67dca1a9a28ca400f #h"01c9a4e51774384e8362876a87c572e6463a54413c7c6252c552ebb182f83e45ace436ade4ca373d8a7216e83efb62c8b41c4d5132a0afa65078f16d189baca3918701e92a7dd5fea29a666398e1df5775cbb5664fe6943fe4c1d2bba516b7543c84df584458e53919c4ffab579a26fb3c892a5d1a77b0a07428c89350f8b559e627b014")
+(:secp521r1-signature-test #h"013dabca37130ba278eae2b3d106b5407711b0d3b437fbf1c952f0773571570764d2c7cb8896a8815f3f1975b21adc6697898e5c0a4242092fc1b80db819a4702df4" #h"0400bc2aebf40cd435bc37d73c09d05f2fd71321111a767c2b0d446f90dd4a186839c694ceb734e027e7ee948f0f63e4d3f1656d3d543df23c342a599306909b34710901f4c98ac03f0718e58d5d1762c920445b11dbdd60ec7f60095809204e14965a4ecb0be6fea06adbac8ba431d6f144c75c199225df2a619a34be99897125b3a10af8" #h"06d4fd20efb2a725626550c8097bd7b38dcadf64ee36350ce8e47a24" #x0401187c8b89945a1e48cda9ee52167789f4121e67482a7ac797899f5d3d2e623aed31e4adae08a8d43e69028fa074d2650317cbc765f6ed191cf0317b4bae57881 #h"01e572afed754016fba43fc33e352932c4db65efcb84e2bd159b40fc5925893b161effc40240be28d8c07154d2615f605c6f0451b976522d95afd37f46602df7a12a0030370c1c5352c2b663ac1858b42f69545b2f58ed5b2c007f303726977d3c756b5d644ec6788f94c886f78269aa190a3d8d1ae10e4fd24d937c4556fb9e1953fd6d")
+(:secp521r1-signature-test #h"0198681adbde7840d7ccd9cf1fb82056433fb4dd26bddf909af7b3b99da1ca2c05c8d4560ecd80ba68f376f8b487897e374e99a9288ed7e3645cc0d00a478aae8d16" #h"040057ce3777af7032f1f82308682e71fe09f88bf29dacd5018a725e1caa4b1e2bfdd894fe618f9266f31ba089856dc9c1b70e4a2faa08b4b744d1aafcd5ae99e2c7360199bcfef2021bc5890d7d39ec5dc0c26956801e84cae742cf6c50386eb289b6e97754dd25a94abf81f1cb1b36935b5eb29f4b32a6516d2ff6a7d23064a0daec94b3" #h"8c7db2e1a2ba5f8bd0a4f7e7f67a20918a87bc6c6462c326406e6c4e" #x19d2d74ad8ee2d85048f386998a71899ef6c960b4ab324e5fd1c0a076c5a632fd0009500076522e052c5c9806eef7056da48df6b16eb71cdf0f1838b0e21715fce0 #h"018ecacbcffd5414bbb96728e5f2d4c90178e27733d13617e134ec788022db124374bbaa11e2c77fe3f38d1af6e998e1b0266b77380984c423e80ffa6ff2bcafd57a01c727f34b6a378f3087721a54e9796499b597ecf6666b8f18312d67e1190a8a66e878efc2367b551267494e0245979ef4deed6d2cbf2c3711af6d82ccfeb101a377")
+(:secp521r1-signature-test #h"008c4c0fd9696d86e99a6c1c32349a89a0b0c8384f2829d1281730d4e9af1df1ad5a0bcfccc6a03a703b210defd5d49a6fb82536f88b885776f0f7861c6fc010ef37" #h"040164ac88ed9afe137f648dd89cdd9956682830cac5f7c1a06d19a1b19f82bb1d22dfeefea30d35c11202fed93fd5ce64835d27c6564d6e181287fa04a2d20994986b005cb83669265f5380ccefe6b4f85fdf0049e6703f6f378a0b2e52ed0fbbcf300afebb722f4ed48e3819cb976c1d60e2ba05646b478f6dfecfbae730e9644c297f00" #h"4ff99d232c8fef39fecfe8af79d274e03beb4502fb833d8af4181d7b" #x189801432cba9bf8c0763d43b6ec3b8636e62324587a4e27905b09a58e4aa66d07d096dbce87824e837be1c243dd741f983c535a5dd2f077aac8beee9918258d3cb #h"00917723f7241e8dc7cd746b699ab621d068dd3a90e906aaf0a4862744b96fd4e5ccdb9c7796c27f7196e693d06ec209464c3ea60ad6313e9b77cceaa14767e6651c00957b0ecdc3668f6efa5d0957615bcfffd6419c5e57579b74f960f65ae3fb9e8284322ff710b066f7e0959ac926d3cf9a594bdb70bbec756c96910b26a2486dee9e")
+(:secp521r1-signature-test #h"01466d14f8fbe25544b209c5e6a000b771ef107867e28ed489a42015119d1aa64bff51d6b7a0ac88673bbc3618c917561cff4a41cdb7c2833dab5ebb9d0ddf2ca256" #h"0401dc8b71d55700573a26af6698b92b66180cf43e153edadb720780321dbb4e71d28e0a488e4201d207fc4848fe9dd10dcabec44492656a3ff7a665fe932445c82d0b01920b16331b7abeb3db883a31288ef66f80b7728b008b3cc33e03a68f68d9e653a86e3177bbc00014fa5ea4c1608c0d455c2e2ac7bd8ab8519ebf19955edf1baf8d" #h"c1120fe21c2c40b47a97c9815c619a223c2f11fb2ebb5e87cb175280" #x160d04420e0d31b0df476f83393b1f9aff68389cc3299e42ef348d97646f7531a722b66ddfb9501bbb5c4a41d84c78be7233b11489bceb817d23060e6017433fab8 #h"008077aabd0a342f03f912007c586cfedfc63f93d1118f720d5b62b3ce141a60f86f111dfd8fc2e31a6778981f1a5e28f29a7369bd7897bb41240c8d3a9c170e0ee0000abc75fc154b93840579457820957e89d1260fee0a4b9bb1946f61ca1e71afd76bb5e1077b3e38ceb39d1fac5ef8b217c4110617b3ad118e02b3fcc2a39ef38613")
+(:secp521r1-signature-test #h"001a99fcf54c9b85010f20dc4e48199266c70767e18b2c618044542cd0e23733817776a1a45dbd74a8e8244a313d96c779f723013cd88886cb7a08ef7ee8fdd862e7" #h"0401912d33b01d51e2f777bdbd1ada23f2b1a9faf2be2f2a3b152547db9b149b697dd71824ca96547462e347bc4ef9530e7466318c25338c7e04323b1ba5fd25ea716200bbe9b1e3a84accd69b76b253f556c63e3f374e3de0d1f5e3600fc19215533b2e40d6b32c3af33314d223ea2366a51d1a337af858f69326389276f91be5c466e649" #h"08a10ee8d56db0cbc4bd68611f39f23d2ef379fe730eae170d84b388" #x14fafd60cb026f50c23481867772411bb426ec6b97054e025b35db74fe8ea8f74faa2d36e7d40b4652d1f61794878510b49b7b4fe4349afccd24fc45fec2fd9e9e7 #h"018b1df1b6d7030a23a154cacce4a2e3761cc6251ff8bf6c9f6c89d0a15123baef9b338ada59728349ce685c03109fcde512ed01a40afd2ca34e1bc02ecf2871d45c00a399f9b9e21aeddf450429fec2dc5749e4a4c7e4f94cee736004dcc089c47635da22845992cd076a4f0a01d2cc1b0af6e17b81a802361699b862157ad6cad8bd1d")
+
+(:secp521r1-signature-test #h"01e8c05996b85e6f3f875712a09c1b40672b5e7a78d5852de01585c5fb990bf3812c3245534a714389ae9014d677a449efd658254e610da8e6cad33414b9d33e0d7a" #h"04007d042ca19408524e68b981f1419351e3b84736c77fe58fee7d11317df2e850d960c7dd10d10ba714c8a609d163502b79d682e8bbecd4f52591d2748533e45a867a0197ac6416111ccf987d290459ebc8ad9ec56e49059c992155539a36a626631f4a2d89164b985154f2dddc0281ee5b5178271f3a76a0914c3fcd1f97be8e8376efb3" #h"53e6537cb6ea68ae47a81611c22756d770d7a37e336c3af0b0814b04fa39434b" #x0dc8daaacddb8fd2ff5c34a5ce183a42261ad3c64dbfc095e58924364dc47ea1c05e2599aae917c2c95f47d6bb37da008af9f55730ddbe4d8ded24f9e8daa46db6a #h"009dd1f2a716843eedec7a6645ac834d4336e7b18e35701f06cae9d6b290d41491424735f3b57e829ad5de055eaeef1778f051c1ee152bf2131a081e53df2a567a8a002148e8428d70a72bc9fa986c38c2c97deda0420f222f9dc99d32c0acba699dc7ba0a2b79ce5999ff61bd0b233c744a893bc105bca5c235423e531612da65d72e62")
+(:secp521r1-signature-test #h"00b65bf33b2f27d52cbfabcadce741e691bf4762089afd37964de1a0deda98331bf8c74020a14b52d44d26e2f6fa7bcddbe83be7db17a0c8a1b376469cf92c6da27c" #h"04010038bb9a7aea626de68c14c64243150e72c69e2f8a1ab922bfbdaa6f33d24fb4542c0324357b0dd640bbcd07632ecd253f64ca2bfbfbf3de9b24fffd0568ab82da00faf867d95308cc36d6f46844a0f535dc70f9768eed011a2464d2f308fa1d8e72c3616aec7e70516908183ffce7fdd36984a15f73efaa3858c2edf16a784d40e6c2" #h"40aef13bb7192a564d72ba58f7efad15635248eca49619b4182bf6f979842d6f" #x14aeb96c57d99677a1f5e4588064215e7e9af4027bfb8f31ff6126dbf341b8e6f719465e4273e91ba32670feca802549808322b7ee108bb20653cf20f93284d365f #h"0075ead62edf7d86c5d1bc2443d1aeb5dc034fd999e6ea012cef7499d9d050cd97d262095884e9fc89a42e15bd3dee80fe3c1ba10f4caabc4aabb86347023028b6630129a992a6ff66d41948d11fa680f732b1a74315b804c982805190ed9d2fae223f2b149980b9241998cdea0c5672595a8a49d5186a0ef7a46c0a376f925bdda81726")
+(:secp521r1-signature-test #h"002c4e660609e99becd61c14d043e8b419a663010cc1d8f9469897d7d0a4f076a619a7214a2a9d07957b028f7d8539ba7430d0b9a7de08beeeae8452d7bb0eac669d" #h"0400fb3868238ca840dbb36ecc6cf04f5f773ea0ab8e8b0fdcf779dc4039a8d7146a417504e953c0cb5e7f4e599cc2c168deda8b7f16084b5582f89f2ece4cae5167f701f90b5c15eeda48e747cf3ee8183166a49dbfac6161cbd09d29d40a6854f4c495e88a435892a920cdaad20d41985890b648badd4f0a858ffcbd9afdfc23134ede18" #h"6fd829bd5fc68d7a36436284c1282e3fae76ba44c5babcee423142c1cf2b52c4" #x1f875bbf882cd6dd034a87916c7b3ba54b41b2ea2ce84ebaf4e393fcf7291fee09dec2b5bb8b6490997c9e62f077c34f0947fe14cec99b906dd6bf0b5d301e75ca1 #h"007aa70425697736b298233249f5d0cf25c99e640c9ff88035ef1804820e1bfe7d043755f02d7a079494f7fa6dc26740c4e6b7b430c63f29c67bbd3a5c88d2f0e8d100e0d42e4ff11cf5be37a9fda348514d5097a662f214687cbfb28ff42d635b13029871ca4f464bb1fbce02d5da4d5fb61b2a071844259fc863d136197bec3a61e7c7")
+(:secp521r1-signature-test #h"017c3522007a90357ff0bda7d3a36e66df88ca9721fb80e8f63f50255d47ee819068d018f14c6dd7c6ad176f69a4500e6f63caf5cf780531004f85009c69b9c1230c" #h"04013a4bea0eed80c66ea973a9d3d4a90b6abbb5dee57d8affaf93390a8783a20982eba644d2e2809f66530adeeee7f9a1da7515447e9ba118999f76f170c375f621f7012f9dfaee40a75d8442b39b37a5c19ea124b464236e9b9a31bae6780cfd50f7ea4a700154b5ea0feeb64e9b35a1b0e33e46900cca1f34d13bb17e5017769841af27" #h"902b55b79c29c0de27386e4fadb3469fc124f1225ad0fac06bd4a3a1e351c09e" #x18388a49caeda35859ef02702c1fd45ff26991998bd9d5e189c12c36cdae3f642ddd4a79561bd1d3e1cd9359de8f5c9e1604a312d207a27b08a6033f2741794ced5 #h"015c6264795837dfea19f91876455f564f073c5c84a3c9d76e67872ae0447ba0d4850d8721302b25bec7ebfedd2721de140b2f3dead547042b24b0876117e7093cc10060eb74236c189a28ed20bd0822eb22d75f7d97c9043a3c8e3f6d4c90bc8ca02ac4d37c1171c799a1c7dfd2fcbf83406b5e48c051e0fbf0fd937bfe6c3db4e18154")
+(:secp521r1-signature-test #h"00c4dad55871d3bd65b016d143ddd7a195cc868b3048c8bbcb1435622036bdb5e0dec7178ca0138c610238e0365968f6ddd191bbfacc91948088044d9966f652ff25" #h"040014858a3b9bd426b678fdcf93fc53d17e7a9e8fe022442aaaba65399d12fd3a6a381958fb0f07ac6088f4e490506ec0f1ab4d0dbd461126f7eb46ff69cfa8bd88af018c18ce29ecc6d79d26a2de0cd31c4b32e84b5e90f6ba748f86c5afbd89618aceb9079460cbd1a8261ed5476973e61bf1d17ea78b022387443800c9247d21dde550" #h"99a83d5d6471963d9e18b105e51662dce360f34f23b8d64be47d50e9f8afa4d9" #x05577108f4187a173e5c29e927a8fc8f5ffd37e184254a6e381ff1018955aec91a35f30085e8cee6a7555c10f9efdce26d62f2b4b52dfdbaeafc3a30983e2d50d5b #h"00344375ae7c804cbe32ced7a20976efae5d9c19eb88b6e24514d1d0cfb728b0f4601098b18b2e98f42b5222dd5237d4d87767007bf5acb185c5526d72047e2cb1a1002de4cfa908c73c1102d6fb7062baf54a056a9517701e036c9c51e09899d60051612d59348945f845dffebec5aa395b2fac7229929033615788777306ccad96d0a3")
+(:secp521r1-signature-test #h"003d4749fadcc2008f098de70545a669133c548ce0e32eec1276ff531bcff53533144555728ad8906d17f091cc0514571691107350b6561858e90dbe19633aaf31bf" #h"04010fe5986b65f6e65d13c88c4d2aed781a91026904f82129d46779bdadaf6b733c845a934e941ab4a285efdea9c96ecc9dc784d87e4d937b42c337b3a9cb111a96000077853768a2a4d6f596f57414e57ec60b76d3cd5ece8351cd1f335ebcb8801a3d91fb82c65caaeb5c31eea9918367bb5906863ff3ccaf7a6cee415e0d75c15ac2e0" #h"2c92465f323f6355ff408e42196e2de9a47807877ec02c9a7686917d3aa166a4" #x1fbb4de337b09e935a6dc6215ffcfcb85d236cc490585e73251a8b8bac37cfa36c5d1df5f4536d33659be1e7a442529a783452f7efda74a4f661b6a127f9248aaf7 #h"009d8f10eeff6178594c89d6e8184f9502117384813243ddf9ccf3c8eac5dc6502c472dfc1487a5caffc569f7dedd14a8ebcb310e9bacdb79fb6655aba026cdf87f200f74236c7915d638708d17c9f10e39dda358faf9bbb821d8dcda0d151aac143bfb165ad0a23a65cd3de532e32cad928728f5ae1c16f58fc16577f3ca8e36f9e708b")
+(:secp521r1-signature-test #h"0096a77b591bba65023ba92f8a51029725b555caf6eff129879d28f6400e760439d6e69ce662f6f1aecf3869f7b6057b530a3c6ff8ed9e86d5944f583ee0b3fbb570" #h"0400fdf6aed933dba73913142ef8bdcd4b760db8500831cd11d7707ab852a6372c05d112a1e7fbc7b514c42142c7370d9f4129493cd75cc6f2daf83747078f15229db600ef91dffb3c43080a59534b95ca585ee87f6145f6a0199b2b82c89f456d8bd8e6ac71c78039c08177184484eb2ebd372f189db3a58fab961a75a18afec1ee32764a" #h"17baaa5a7f97f2d17545c4baa468f36ef22b1945ea889b63b027806f5b1b7f90" #x13aa7b0471317a2a139c2f90df1c40d75e5a8a830fbaf87030fffdb2ef6f2c93d1310c9ed7fe9d7bcd4fe46537ff2495bc9c4f0aaff11461f5e4bebbfbce9a8740a #h"01c7a21800962c91d4651553633b18612d931bb88bff8b743ed595b4e869437e50f8e84fbf334c99061db123a1c40b73b07e203790561a37df65a660355ba2017d7801301e1782559a38f1ca0eebe9bed0f5c7c33103d506a24f8a688f500ee1fe37f97b6685319279e82e6fe43cfd823ccbc123309974cffa76c4f8d41ec02a3cbc45f1")
+(:secp521r1-signature-test #h"0015152382bfd4f7932a8668026e705e9e73daa8bade21e80ea62cf91bd2448ebc4487b508ca2bdaaf072e3706ba87252d64761c6885a65dcafa64c5573c224ae9e6" #h"04000b8c7c0186a77dc6e9addd2018188a6a40c3e2ba396f30bbd9293dba2841d57d60866b37f587432719b544d8bf7eb06d90a8c0dc9c93b0c53d53b2f667077228ca01dd2e5c73ab908ae34f701689f1cd3cf5186d3a2bc941e208bf3ef970e5e429ee9b154d73286b2e5da423e75b7c7b78c7bdf915da92279db43265a0cdefca51f86a" #h"b8f56952078ffcf04cd9815c6b06b63812eee9d682495d7172fd3677abe1c2db" #x0d03506999f5cc9ec3304072984a20a9c64a22ad9b418495ca904f4bbddc96e76d34672cb52763339d3f3bc5b1701c00a675b972797e3a086314da1a8d338436566 #h"0085406c0ff5ec91f598bb579ad8714ad718c3e133d5dcc2e67c5d2339c146b69919cac07f3bc2bda218f4c7c8be04855e2ca6fff7fbdc4fc0fda87c8c3081cad4f501b45f2066e583636215ae135afc202b8bf3f301eccff2e1c0198b9aeddf695fa8179488e7b622fc307f601e2f6551815117cc836bb09ef888f8e64a45d9c84ad30c")
+(:secp521r1-signature-test #h"01750ff0ca0c166560b2034bc5760fe0b3915340bc43216e9de0c1d4a76550e8b2036e8b874230f8d29354aed43e183610f24fd4abd4b0be2f111dae942bd7a121f7" #h"0401b4b8947192a7c0166c0e0b2791e217370836283e805f3ee11cfb78445aba3c5bc39fe594e01916617ad59e7c8e740d8f2d07d88905d3f33bd5e51aafd4943c5dc601175d117232836c28e717ce2a55e59f4ec550effde30d18e3d99e42c6aa2283c7b3e7f2f6ff1fca605dde78c3a5bffa689347b4c93f51ba59a1787bb7d5e43861dc" #h"9477d884384f80b528aa4c3408b7f7d0dc59bd3f678466b122d48a42c01fc3bd" #x023645023d6bdf20652cdce1185c4ef225c66d54f18632d99ccf743bf554d04c214c88ce52a4f71ec75c899ad1b3c07c34112ca20b55c217ff1d72c9528e2774ce8 #h"01e933f68ce0f8403cb16822b8e0564b1d39a35f27b53e4ae0bcdff3e051759464afbc34998ba7c8a7ee34ef6c1aaa722cffe48356fd0b738058358d4c768b3186c100a67368a305508ce6d25d29c84f552a4a513998990fef4936244f891a2909c30d5fdc9e8a267ecbf3c597138f4a08f7e92bee57d5420eadd700fee864bf78b2614b")
+(:secp521r1-signature-test #h"0023048bc16e00e58c4a4c7cc62ee80ea57f745bda35715510ed0fc29f62359ff60b0cf85b673383b87a6e1a792d93ab8549281515850fa24d6a2d93a20a2fff3d6e" #h"0400ba3dc98326a15999351a2ec6c59e221d7d9e7ee7152a6f71686c9797f3f330d3150123620d547813ba9d7cc6c6d35cc9a087d07dff780e4821e74ad05f3762efd6018b051af9824b5f614d23ecadd591e38edbfe910ad6cbebc3e8a6bec11ea90691c17deb3bc5f34a4a3acd90b7b10f521f6ee7b3cfbfdc03b72d5a8783a4a77c3e4c" #h"e995003b47e16fcdc7487e2fe3b715b707e5c8d1246de04172a3002b140dddac" #x06099d2667f06c58798757632d07d8b3efbe9c1323efb0c244be6b12b3b163ba1b7cf5246c98dcc0771665a66696d687af5f28ed664fd87d5093df6427523d4db84 #h"010dc80ea853064a2ba5a781f108aca3785c5ec0aa45aa05ba31d4de671170797589e863d54a3a986aadf6f670277f50355713dfb27d4ec7e348f787910b3cd668cd0018572bfad4f62e3694d1f2e6ffd432faed2e2b9d7e3611a07138212f1e79e6c394839f7cfae96bc368422630016fb9346681eadc5f9699e7331c3b5fde6d65e4c6")
+
+(:secp521r1-signature-test #h"0095976d387d814e68aeb09abecdbf4228db7232cd3229569ade537f33e07ed0da0abdee84ab057c9a00049f45250e2719d1ecaccf91c0e6fcdd4016b75bdd98a950" #h"04013b4ab7bc1ddf7fd74ca6f75ac560c94169f435361e74eba1f8e759ac70ab3af138d8807aca3d8e73b5c2eb787f6dcca2718122bd94f08943a686b115d869d3f40600f293c1d627b44e7954d0546270665888144a94d437679d074787959d0d944d8223b9d4b5d068b4fbbd1176a004b476810475cd2a200b83eccd226d08b444a71e71" #h"9832832c49754bdeba2d3799cbf6437af28ad9f942d3f313abd320fad0897be6b446aa24f1b23a86ea54aef12b1f5c0b" #x0a8d90686bd1104627836afe698effe22c51aa3b651737a940f2b0f9cd72c594575e550adb142e467a3f631f4429514df8296d8f5144df86faa9e3a8f13939ad5b3 #h"002128f77df66d16a604ffcd1a515e039d49bf6b91a215b814b2a1c88d32039521fbd142f717817b838450229025670d99c1fd5ab18bd965f093cae7accff0675aae0008dc65a243700a84619dce14e44ea8557e36631db1a55de15865497dbfd66e76a7471f78e510c04e613ced332aa563432a1017da8b81c146059ccc7930153103a6")
+(:secp521r1-signature-test #h"004ceb9896da32f2df630580de979515d698fbf1dd96bea889b98fc0efd0751ed35e6bcf75bc5d99172b0960ffd3d8b683fbffd4174b379fbdecd7b138bb9025574b" #h"0400e7a3d30d5bd443549d50e9b297aaa87bc80b5c9e94169602d9d43d6d0c490c0bed8cc2170288b106bdbf4c9f1ce53fd699af0b4c64b494b08520e57dc01ab9a8b001d81056d37aec8a75d588f6d05977416e6f24ad0117a7f4450036d695612e7bc2771caed80e580314eebc88c8fc51c453f066e752481f212b57165d67f8a44f375a" #h"cca0c216abf3baaff0b0d8597bcfc7183835b4e3d025749a741a0e75d00845a341fe094214b1c39e13e8932a062c1ecf" #x046639c5a3ec15afae5e4a7a418ac760846512d880c359bc2c751b199ce43b10887e861b14127809754dbea47f6cc0140d2817e3f5b9a80ce01abd81f81b748433a #h"00f913de91e19bd8f943d542ae357bacc942a0967abc9be6c06239a379db8cc733fa50013e0b0f088bce9d630262feaa33b30d84f91bcf5ce9976e4e740fcb112f84008a73a5c9c24235e0d9cecaac653f68ce5a6fb186ce67fa058d6ddbbd4d0a8c4d194e571148e8ad6c8882b4e33d2f60fb23dd7d07a1ae60864e8277918f592b3dc6")
+(:secp521r1-signature-test #h"000a8db566bd771a9689ea5188c63d586b9c8b576dbe74c06d618576f61365e90b843d00347fdd084fec4ba229fe671ccdd5d9a3afee821a84af9560cd455ed72e8f" #h"04004f5b790cbe2984b71d41af5efed6c6893d15e13f31816d55a9c2926a104eee66f1ada83115d1388551218773b8b9d1138e3e3f027bb4392c90c14fd232580b4a1100660eb160e9bfc8c5619e70e948e238c6fd37739bc1bb657b8e8436e63628f91992be7e63d9a7359623a1340642777b22026feb51116a6c50c54c3589b9bd39b6cb" #h"0af6f685cb6c1219cb1627dd2b9099b70b1622d32b2342cbef6c0b9604d3f22360d595198af65579062dddccb66a56ce" #x1e7b5e53571a24bd102dd7ad44a4b8d8a4e60e5957bc3c4e5d3c73109f55233f072e572c7892f425ba5e64d3cb7966096bb34a47e26cd5b3e3b44108b310d9f681b #h"01a88bcd7e2bdff6e497d943dde432fb3f855a7177c466319cb53b701230c299db030276269685857d1e3f28110e690f2f529c8d18115eb381f313bc891d92ad278e0146f1984ea879274dfd5e86ad92e564a4de081523ddbb1c397b8f9595911ef2e6501bc081584d5340f7aa47e1af036234ac6f27a5ac31f78dd3b0ff1a62693c630d")
+(:secp521r1-signature-test #h"01a300b8bf028449344d0e736145d9dd7c4075a783cb749e1ec7988d60440a07021a25a3de74ea5e3d7bd4ab774d8ad6163adae31877ef0b2bd50e26e9e4be8a7b66" #h"04005055b9ad726ba8a48219b0ecbfffb89f8428de895b231f676705b7de9f2022d9ff4e0114ebb52dea342f9bf76b2fb060c020e29d92074ebb1fbfe5290a58c8bc1000415af7f20a6e945315adbf757316bb486c80780a0a3a15b4b9609f126d7341053a2b726ab63cb46feee527b0bf532b32b477e5671aea23d9b3c3e604b9029954b5" #h"b5008011397235faff9eda7ac9838dd1199eb52b2921d28407e5c356dcca7611184d29d268c16bfb489481a294bd7a43" #x05a2e92717bb4dab3ee76724d4d9c2d58a32b873e491e36127985f0c9960c610962ca1c4510dba75c98d83beebdc58b1d8678e054640951d11db1bd2d8a4ab8476b #h"0104a78ce94f878822daaf00ee527fbdbf6cceb3cbb23a2caa485e4109466de8910252f92379ab292cac8d1eda164f880c0067696e733fc8588a27703a3e1f5b8f1f01ffe23e8ab5a31668a81161a234ea14879771fe9866f8872eb6edb672e0fe91d2bb75c9767a2dfbac7c15c802211236b22ea41ecd055a0b8b311ffc4255f86d5c67")
+(:secp521r1-signature-test #h"006a253acd79912a74270fc0703ed6507ab20a970f2bc2277f782062092cf0e60ae1ca1bb44dec003169bc25ef6e7123dd04692f77b181a6d7e692e66b09d35a540c" #h"0401f15c6b1df156fdd8381cd7446e039435e445f8f36f0247475058da0e371bf72753f6e39f98066bc79370b038c39687ba18e16cb118fe6538b7568c5403c251f6b7012d2b4f46b854eeae75f1c63f55b76bf0c604d47f870c28a50ecdeb52bba1dd9a0ff12e680804ff864111207652da7dd10b49edf66bb86be00bc06672de91982457" #h"64c05e43191b0313abd6514eb5a44dbf25befb232b8e928f92801f75a968d9a96801facc86b2174e0a5f247d9b5e7587" #x165faf3727e42fd61345cfa7b93e55fb4bf583b24bdc14ce635b6c99dbd788012f14da9a210b677c44acdd851e672f1a48188d6b8946c0efeebfe8a597ba0090a2c #h"01ad9463d2759abd568626548578deefdcd8b2d050ce6d9c7ed05feca20167484b86e89bdcc936fd647e0f8aedd7b6add2b8cf13ff6ff013c2b5540c6c56fda97a0c01645a7d0e11015256cfb034adca198695eea6aedd44d9fbf496850ccfed950f43fffd8dbf41e113f2d3837d8a5dd62b2ed580112ff05800b1f73196e5576810e15b")
+(:secp521r1-signature-test #h"00d5a5d3ddfd2170f9d2653b91967efc8a5157f8720d740dd974e272aab000cc1a4e6c630348754ab923cafb5056fc584b3706628051c557fce67744ee58ba7a56d0" #h"040128a4da5fc995678e457ceb3929adee93c280f851abe900fa21f4f809dafad4e33b381e0cd49ce8dd50e2e281cea162bfd60a1d6a1c0ee2228e6a011e171b559ab8006eb0917cd72256992c49ea527f6bb0315f13d8047794a0f1da1e93737703b1c2a74a00441ef3b47b6a2ff789c49ae32d91cabe7b29247aeec44f6c40a76597a2ca" #h"9e4bf8293245611cb31caf0b0125117a4ef286ca3730f1519f3c95e65a5db326ead01b08e6b219281a26f2a41bda1e98" #x03269983a5c2bcc98e9476f5abf82424566b1f08b17204d29e310ece88f99eb677a537f86fe2529e409cfef2c12929644100099e0de2f27c0f0ac11105a4dca935b #h"01a5257ae1e8187ba954f535b86ff9b8d6a181a3b95c250d090cb4e9c3bfbd03aa64696a76c569728ef67780d6338d70ce46da40b87a3e49bfe154b93930890dfa93005b6ccdfd5c63c7db76d3a0478064a2a376e0e050cb093be795a72a549247c2e4adba9183145c63d46479dbbdcf09986a6f64c09c7e16abc4853f6376c9558b014a")
+(:secp521r1-signature-test #h"01bcedf920fa148361671b43c64e3186e1937eb1bd4b28cbd84c421472394552889bc05509aa732ef69d732b21b750523fdfd811f36467690fe94e01e64c9d5cbbe9" #h"0400d33c151d202a5d4d831348e940b027ee32e4b0b9b48d823a05c67ff3bdaee0189fc6680565f352c062e99968afc643208b4f9c7af185b861658a88c4ad0fcc8ba200e4441ddb546468ad8ffa6074f137edfbb81e82e0e7d8f05c4c54598aa996a9cde54cb371f642bfdd4ae7eca5b769696030027129a4183da93567ad142a2dff5183" #h"417e8611fe90382b134add3b3df5a963d95c4de28a5a5b215b7f96731db9350d4646c1efe7455d48a1a2de6b4fcbd9c3" #x046e619b83aac868b26d0b3cbfab55e630e0b55c461985b5d00f94ff3a5ce90ff412cebf46bbd84550d2031d573ca27d924624428360708c8d8491c29eb01d30f2e #h"008427c0f0ac0263472cd423c0fb554bf3c851b9c775c566ab0f6878717bd57665830767b05b7789c5c0b078195bd943dc737325552d32877ecb04a7c41bd07cd80c010bb6652d6a624c40a7dd06828f15774130d02369ceb1a7d03b553e16e17b7fa5b5401f15885d5e4fc2e55c0c7a1b97871ab02f76386b93a16aa6e7eb65debac6dd")
+(:secp521r1-signature-test #h"003789e04b3a2a0254ade3380172c150d2fad033885e02ea8bea5b92db3f4adbab190ae423080a1154dfedec694c25eab46ce638be3db4e4cba67bc39f62d6e7db2d" #h"0401dbc2cf19627bdccf02432b1761f296275230c150cdde823ce3141ec315d7d05e16b2c29e2a67491078d5316883e933d85b4b10d4f64c477d3c4e0442dc928983a2007562e720807dd118d3d8b265b3abc61a71fce43e3dce0e7b5ae18b7a4cb01ecc00d39c1f22e150a9a8728997e502144f5b3f6fa9b4cb8a4136212b082ca394e3f6" #h"297eed020ddcd03aeeafc77469caa105469205595ef22f64860126135e2596ae99ccaeb679d073cd9364b1e4ee2c4b60" #x0fbccd8d7804bdd1d1d721b5ec74d4ba37603bc306f9fce2ec241853d8e07334e6b4b12c4ecca0c54bd71193dd7146507933a20737c5f3e15085830fab9b30ca57b #h"0181915a3998d8fa214f9715f4ca928d09c36de168dc15c6970a8a062b5cea2dc969b2437ca17b684f78a1fd583aad8e6c762c8f4ab0c91b86a497145e3ca440d307015a6c18c5c77f5470b27d061eafdc26b78561941a3b2ab0f5c81d40899fc053c3d9ed12d7d61e298abbae470009c7b2157731c58d7b16a66fa5abaf5e8a1b8ed394")
+(:secp521r1-signature-test #h"0124700aa9186353e298edefc57bec0c7d0201cca10c1d80dd408d5d71040592b0ac59facdadfa8712445f5977ef8d4854022720c3f02d60e0732dbb2f171fcf1490" #h"0400c80fc4cecae5d53348524ddba6a160b735c75b22fdb39af17e2a613d09246e3bb0fd3f2978577f6db5d2118e05c7898024808f8eb8e021d7969cdcf7fc981200bb01a880c93943fd446d4b3923b574d2221c1bb7b645fb5534dda60e827b497666ff586b77921f7e7f605147947194cffd2fef0678880b89cc0bc7fb74fa96d4b112d7" #h"39884fd5e7c8b6cb67836e257957cc11f6bd342f540bde745e0e4e55d3ead2ea080d8b2b2e96664056c50de0d7822f25" #x01a05238d595ded5c61d3bf6fde257dbf13095af8a5cb3a2e579e8e4c550fe31d12b71cc2dbcb295e6c4fd0fb8c22d1b741c097cc59d826ced1a8771f09983143c4 #h"0132762bc81e9922a8d642e3a9d0218affa21fa2331cfcb9e452545c5981c64a8f7e4cc8e68056023b2aa78bead59061d19c7f646c931163a91e544b106b3be8de9e00c3a1b0b000c3169984132add51d611e2cb7069a262a6983d2ae72b459c36e6469509bdb0f473600b8686700b08910779dee9ba83f82e755d4a4ef5f124eb09397f")
+(:secp521r1-signature-test #h"01f532d01af885cb4ad5c329ca5d421c5c021883bd5404c798d617679bb8b094cbb7e15c832fb436325c5302313ce5e496f9513455e7021ffad75777a19b226acfa1" #h"0400c0bd76b0027b85bdd879052220da1494d503f6a4bb972105a48ae98e7dda8c2d9fd9336f5646385b961ef68e8464e3a95b00f96614b1a408ceaa2c87b077b6a8fb017eb7eb5c78db7819af92e8537d110d9f05a5e24f954f4dde21c224d4040f059ec99e051702f390413d2708d18f84d82998c61847475250fb844b20082cbe651a6b" #h"ac6b375afaad4c5c1b8e8aa5ac94e2aa1553e8f8603d16a86d573d53a4e6c5731f6d6c18ac732cfd3ae8aed75046c1f1" #x14e66853e0f7cd3300ebcae06048532e19cbb95bee140edc1c867ce7310637651445b6dfeb1d99d2e32f2ffb787ebe3fe35032277f185d3dad84f95806924550abe #h"00c5b3a57161098e2e8e16e0a5ae8ecf4a14df14927eea18ed4925d11dc429dda145159323ba970174b194b9b4608a8fa2373b7a825c5e8bd80574e49698285c2c8201a0c038a51796158b42eb5b0dac37aff9ab93b903a47e06ebbdd15946e4bcc9a3b3875b18cf6294c33fc6c3693cef04ed1a43d08951e664c760e2cf3fb4e47490d2")
+
+(:secp521r1-signature-test #h"00f749d32704bc533ca82cef0acf103d8f4fba67f08d2678e515ed7db886267ffaf02fab0080dca2359b72f574ccc29a0f218c8655c0cccf9fee6c5e567aa14cb926" #h"040061387fd6b95914e885f912edfbb5fb274655027f216c4091ca83e19336740fd81aedfe047f51b42bdf68161121013e0d55b117a14e4303f926c8debb77a7fdaad100e7d0c75c38626e895ca21526b9f9fdf84dcecb93f2b233390550d2b1463b7ee3f58df7346435ff0434199583c97c665a97f12f706f2357da4b40288def888e59e6" #h"65f83408092261bda599389df03382c5be01a81fe00a36f3f4bb6541263f801627c440e50809712b0cace7c217e6e5051af81de9bfec3204dcd63c4f9a741047" #x03af5ab6caa29a6de86a5bab9aa83c3b16a17ffcd52b5c60c769be3053cdddeac60812d12fecf46cfe1f3db9ac9dcf881fcec3f0aa733d4ecbb83c7593e864c6df1 #h"004de826ea704ad10bc0f7538af8a3843f284f55c8b946af9235af5af74f2b76e099e4bc72fd79d28a380f8d4b4c919ac290d248c37983ba05aea42e2dd79fdd33e80087488c859a96fea266ea13bf6d114c429b163be97a57559086edb64aed4a18594b46fb9efc7fd25d8b2de8f09ca0587f54bd287299f47b2ff124aac566e8ee3b43")
+(:secp521r1-signature-test #h"01a4d2623a7d59c55f408331ba8d1523b94d6bf8ac83375ceb57a2b395a5bcf977cfc16234d4a97d6f6ee25a99aa5bff15ff535891bcb7ae849a583e01ac49e0e9b6" #h"04004d5c8afee038984d2ea96681ec0dccb6b52dfa4ee2e2a77a23c8cf43ef19905a34d6f5d8c5cf0981ed804d89d175b17d1a63522ceb1e785c0f5a1d2f3d15e513520014368b8e746807b2b68f3615cd78d761a464ddd7918fc8df51d225962fdf1e3dc243e265100ff0ec133359e332e44dd49afd8e5f38fe86133573432d33c02fa0a3" #h"a6200971c6a289e2fcb80f78ec08a5079ea2675efd68bcab479552aa5bcb8edf3c993c79d7cebcc23c20e5af41723052b871134cc71d5c57206182a7068cc39b" #x0bc2c0f37155859303de6fa539a39714e195c37c6ea826e224c8218584ae09cd0d1cc14d94d93f2d83c96e4ef68517fdb3f383da5404e5a426bfc5d424e253c181b #h"01a3c4a6386c4fb614fba2cb9e74201e1aaa0001aa931a2a939c92e04b8344535a20f53c6e3c69c75c2e5d2fe3549ed27e6713cb0f4a9a94f6189eb33bff7d453fce016a997f81aa0bea2e1469c8c1dab7df02a8b2086ba482c43af04f2174831f2b1761658795adfbdd44190a9b06fe10e578987369f3a2eced147cff89d8c2818f7471")
+(:secp521r1-signature-test #h"014787f95fb1057a2f3867b8407e54abb91740c097dac5024be92d5d65666bb16e4879f3d3904d6eab269cf5e7b632ab3c5f342108d1d4230c30165fba3a1bf1c66f" #h"0400c2d540a7557f4530de35bbd94da8a6defbff783f54a65292f8f76341c996cea38795805a1b97174a9147a8644282e0d7040a6f83423ef2a0453248156393a1782e0119f746c5df8cec24e4849ac1870d0d8594c799d2ceb6c3bdf891dfbd2242e7ea24d6aec3166214734acc4cbf4da8f71e2429c5c187b2b3a048527c861f58a9b97f" #h"46ff533622cc90321a3aeb077ec4db4fbf372c7a9db48b59de7c5d59e6314110676ba5491bd20d0f02774eef96fc2e88ca99857d21ef255184c93fb1ff4f01d3" #x186cd803e6e0c9925022e41cb68671adba3ead5548c2b1cd09348ab19612b7af3820fd14da5fe1d7b550ed1a3c8d2f30592cd7745a3c09ee7b5dcfa9ed31bdd0f1f #h"010ed3ab6d07a15dc3376494501c27ce5f78c8a2b30cc809d3f9c3bf1aef437e590ef66abae4e49065ead1af5f752ec145acfa98329f17bca9991a199579c41f9229008c3457fe1f93d635bb52df9218bf3b49a7a345b8a8a988ac0a254340546752cddf02e6ce47eee58ea398fdc9130e55a4c09f5ae548c715f5bcd539f07a34034d78")
+(:secp521r1-signature-test #h"015807c101099c8d1d3f24b212af2c0ce525432d7779262eed0709275de9a1d8a8eeeadf2f909cf08b4720815bc1205a23ad1f825618cb78bde747acad8049ca9742" #h"040160d7ea2e128ab3fabd1a3ad5455cb45e2f977c2354a1345d4ae0c7ce4e492fb9ff958eddc2aa61735e5c1971fa6c99beda0f424a20c3ce969380aaa52ef5f5daa8014e4c83f90d196945fb4fe1e41913488aa53e24c1d2142d35a1eed69fed784c0ef44d71bc21afe0a0065b3b87069217a5abab4355cf8f4ceae5657cd4b9c8008f1f" #h"6b514f8d85145e30ced23b4b22c85d79ed2bfcfed5b6b2b03f7c730f1981d46d4dadd6699c28627d41c8684bac305b59eb1d9c966de184ae3d7470a801c99fd4" #x096731f8c52e72ffcc095dd2ee4eec3da13c628f570dba169b4a7460ab471149abdede0b63e4f96faf57eab809c7d2f203fd5ab406c7bd79869b7fae9c62f97c794 #h"01e2bf98d1186d7bd3509f517c220de51c9200981e9b344b9fb0d36f34d969026c80311e7e73bb13789a99e0d59e82ebe0e9595d9747204c5f5550c30d934aa30c05012fed45cc874dc3ed3a11dd70f7d5c61451fbea497dd63e226e10364e0718d3722c27c7b4e5027051d54b8f2a57fc58bc070a55b1a5877b0f388d768837ef2e9cec")
+(:secp521r1-signature-test #h"018692def0b516edcdd362f42669999cf27a65482f9358fcab312c6869e22ac469b82ca9036fe123935b8b9ed064acb347227a6e377fb156ec833dab9f170c2ac697" #h"0401ceee0be3293d8c0fc3e38a78df55e85e6b4bbce0b9995251f0ac55234140f82ae0a434b2bb41dc0aa5ecf950d4628f82c7f4f67651b804d55d844a02c1da6606f701f775eb6b3c5e43fc754052d1f7fc5b99137afc15d231a0199a702fc065c917e628a54e038cbfebe05c90988b65183b368a2061e5b5c1b025bbf2b748fae00ba297" #h"53c86e0b08b28e22131324f6bfad52984879ab09363d6b6c051aac78bf3568be3faeade6a2dda57dece4527abaa148326d3adbd2d725374bdac9ccb8ac39e51e" #x161cf5d37953e09e12dc0091dc35d5fb3754c5c874e474d2b4a4f1a90b870dff6d99fb156498516e25b9a6a0763170702bb8507fdba4a6131c7258f6ffc3add81fd #h"014dfa43046302b81fd9a34a454dea25ccb594ace8df4f9d98556ca5076bcd44b2a9775dfaca50282b2c8988868e5a31d9eb08e794016996942088d43ad3379eb9a10120be63bd97691f6258b5e78817f2dd6bf5a7bf79d01b8b1c3382860c4b00f89894c72f93a69f3119cb74c90b03e9ede27bd298b357b9616a7282d176f3899aaa24")
+(:secp521r1-signature-test #h"00a63f9cdefbccdd0d5c9630b309027fa139c31e39ca26686d76c22d4093a2a5e5ec4e2308ce43eb8e563187b5bd811cc6b626eace4063047ac0420c3fdcff5bdc04" #h"04014cab9759d4487987b8a00afd16d7199585b730fb0bfe63796272dde9135e7cb9e27cec51207c876d9214214b8c76f82e7363f5086902a577e1c50b4fbf35ce996601a83f0caa01ca2166e1206292342f47f358009e8b891d3cb817aec290e0cf2f47e7fc637e39dca03949391839684f76b94d34e5abc7bb750cb44486cce525eb0093" #h"a9e9a9cb1febc380a22c03bacd18f8c46761180badd2e58b94703bd82d5987c52baec418388bc3f1e6831a130c400b3c865c51b73514f5b0a9026d9e8da2e342" #x01e51fd877dbbcd2ab138fd215d508879298d10c7fcbdcc918802407088eb6ca0f18976a13f2c0a57867b0298512fc85515b209c4435e9ef30ab01ba649838bc7a0 #h"011a1323f6132d85482d9b0f73be838d8f9e78647934f2570fededca7c234cc46aa1b97da5ac1b27b714f7a171dc4209cbb0d90e4f793c4c192dc039c31310d6d99b00386a5a0fc55d36ca7231a9537fee6b9e51c2255363d9c9e7cb7185669b302660e23133eb21eb56d305d36e69a79f5b6fa25b46ec61b7f699e1e9e927fb0bceca06")
+(:secp521r1-signature-test #h"0024f7d67dfc0d43a26cc7c19cb511d30a097a1e27e5efe29e9e76e43849af170fd9ad57d5b22b1c8840b59ebf562371871e12d2c1baefc1abaedc872ed5d2666ad6" #h"04009da1536154b46e3169265ccba2b4da9b4b06a7462a067c6909f6c0dd8e19a7bc2ac1a47763ec4be06c1bec57d28c55ee936cb19588cc1398fe4ea3bd07e6676b7f014150cdf25da0925926422e1fd4dcfcffb05bdf8682c54d67a9bd438d21de5af43a15d979b320a847683b6d12ac1383a7183095e9da491c3b4a7c28874625e70f87" #h"7e324819033de8f2bffded5472853c3e68f4872ed25db79636249aecc24242cc3ca229ce7bd6d74eac8ba32f779e7002095f5d452d0bf24b30e1ce2eb56bb413" #x1c1308f31716d85294b3b5f1dc87d616093b7654907f55289499b419f38ceeb906d2c9fe4cc3d80c5a38c53f9739311b0b198111fede72ebde3b0d2bc4c2ef090d2 #h"000dbf787ce07c453c6c6a67b0bf6850c8d6ca693a3e9818d7453487844c9048a7a2e48ff982b64eb9712461b26b5127c4dc57f9a6ad1e15d8cd56d4fd6da718642900c6f1c7774caf198fc189beb7e21ca92ceccc3f9875f0e2d07dc1d15bcc8f210b6dd376bf65bb6a454bf563d7f563c1041d62d6078828a57538b25ba54723170665")
+(:secp521r1-signature-test #h"00349471460c205d836aa37dcd6c7322809e4e8ef81501e5da87284b267d843897746b33016f50a7b702964910361ed51d0afd9d8559a47f0b7c25b2bc952ce8ed9e" #h"04000bbd4e8a016b0c254e754f68f0f4ed081320d529ecdc7899cfb5a67dd04bc85b3aa6891a3ed2c9861ae76c3847d81780c23ad84153ea2042d7fd5d517a26ff3ce400645953afc3c1b3b74fdf503e7d3f982d7ee17611d60f8eb42a4bddbec2b67db1f09b54440c30b44e8071d404658285cb571462001218fc8c5e5b98b9fae28272e6" #h"4541f9a04b289cd3b13d31d2f513d9243b7e8c3a0cbd3e0c790892235a4d4569ef8aef62444ecc64608509e6ad082bf7cd060d172550faa158b2fd396aa1e37b" #x00eb2bd8bb56b9d2e97c51247baf734cc655c39e0bfda35375f0ac2fe82fad699bf1989577e24afb33c3868f91111e24fefe7dec802f3323ac013bec6c048fe5568 #h"014bf63bdbc014aa352544bd1e83ede484807ed760619fa6bc38c4f8640840195e1f2f149b29903ca4b6934404fb1f7de5e39b1ea04dba42819c75dbef6a93ebe269005d1bcf2295240ce4415042306abd494b4bda7cf36f2ee2931518d2454faa01c606be120b057062f2f3a174cb09c14f57ab6ef41cb3802140da22074d0e46f908d4")
+(:secp521r1-signature-test #h"007788d34758b20efc330c67483be3999d1d1a16fd0da81ed28895ebb35ee21093d37ea1ac808946c275c44454a216195eb3eb3aea1b53a329eca4eb82dd48c784f5" #h"0400157d80bd426f6c3cee903c24b73faa02e758607c3e102d6e643b7269c299684fdaba1acddb83ee686a60acca53cddb2fe976149205c8b8ab6ad1458bc00993cc43016e33cbed05721b284dacc8c8fbe2d118c347fc2e2670e691d5d53daf6ef2dfec464a5fbf46f8efce81ac226915e11d43c11c8229fca2327815e1f8da5fe95021fc" #h"7ec0906f9fbe0e001460852c0b6111b1cd01c9306c0c57a5e746d43f48f50ebb111551d04a90255b22690d79ea60e58bed88220d485daaf9b6431740bb499e39" #x0a73477264a9cc69d359464abb1ac098a18c0fb3ea35e4f2e6e1b060dab05bef1255d9f9c9b9fbb89712e5afe13745ae6fd5917a9aedb0f2860d03a0d8f113ea10c #h"007e315d8d958b8ce27eaf4f3782294341d2a46fb1457a60eb9fe93a9ae86f3764716c4f5f124bd6b114781ed59c3f24e18aa35c903211b2f2039d85862932987d6801bcc1d211ebc120a97d465b603a1bb1e470109e0a55d2f1b5c597803931bd6d7718f010d7d289b31533e9fcef3d141974e5955bc7f0ee342b9cad05e29a3dded30e")
+(:secp521r1-signature-test #h"01f98696772221e6cccd5569ed8aed3c435ee86a04689c7a64d20c30f6fe1c59cc10c6d2910261d30c3b96117a669e19cfe5b696b68feeacf61f6a3dea55e6e5837a" #h"04007002872c200e16d57e8e53f7bce6e9a7832c387f6f9c29c6b75526262c57bc2b56d63e9558c5761c1d62708357f586d3aab41c6a7ca3bf6c32d9c3ca40f9a2796a01fe3e52472ef224fb38d5a0a14875b52c2f50b82b99eea98d826c77e6a9ccf798de5ffa92a0d65965f740c702a3027be66b9c844f1b2e96c134eb3fdf3edddcf11c" #h"7230642b79eed2fd50f19f79f943d67d6ef609ec06c9adbb4b0a62126926080ecd474922d1af6c01f4c354affde016b284b13dbb3122555dea2a2e6ca2a357dc" #x1a277cf0414c6adb621d1cc0311ec908401ce040c6687ed45a0cdf2910c42c9f1954a4572d8e659733d5e26cbd35e3260be40017b2f5d38ec42315f5c0b056c596d #h"00d732ba8b3e9c9e0a495249e152e5bee69d94e9ff012d001b140d4b5d082aa9df77e10b65f115a594a50114722db42fa5fbe457c5bd05e7ac7ee510aa68fe7b1e7f0134ac5e1ee339727df80c35ff5b2891596dd14d6cfd137bafd50ab98e2c1ab4008a0bd03552618d217912a9ec502a902f2353e757c3b5776309f7f2cfebf913e9cd")
diff --git a/testing/testfuns.lisp b/testing/testfuns.lisp
index 7cd9658..c95c698 100644
--- a/testing/testfuns.lisp
+++ b/testing/testfuns.lisp
@@ -561,6 +561,22 @@
(error "signature verification failed for ~A on pkey ~A, input ~A, signature ~A"
name pkey input signature))))
+(defun secp521r1-signature-test (name skey pkey input k signature)
+ ;; Redefine secp521r1-generate-k to use a defined K for the test instead of a random one
+ (setf (symbol-function 'ironclad::secp521r1-generate-k)
+ (lambda ()
+ k))
+
+ (let* ((sk (ironclad:make-private-key :secp521r1 :x skey :y pkey))
+ (pk (ironclad:make-public-key :secp521r1 :y pkey))
+ (s (ironclad:sign-message sk input)))
+ (when (mismatch s signature)
+ (error "signature failed for ~A on skey ~A, input ~A, signature ~A"
+ name skey input signature))
+ (unless (ironclad:verify-signature pk input signature)
+ (error "signature verification failed for ~A on pkey ~A, input ~A, signature ~A"
+ name pkey input signature))))
+
(defun curve25519-dh-test (name skey1 pkey1 skey2 pkey2 shared-secret)
(let* ((sk1 (ironclad:make-private-key :curve25519 :x skey1 :y pkey1))
(pk1 (ironclad:make-public-key :curve25519 :y pkey1))
@@ -631,6 +647,20 @@
(error "shared secret computation failed for ~A on skey ~A, pkey ~A, secret ~A"
name skey2 pkey1 shared-secret))))
+(defun secp521r1-dh-test (name skey1 pkey1 skey2 pkey2 shared-secret)
+ (let* ((sk1 (ironclad:make-private-key :secp521r1 :x skey1 :y pkey1))
+ (pk1 (ironclad:make-public-key :secp521r1 :y pkey1))
+ (sk2 (ironclad:make-private-key :secp521r1 :x skey2 :y pkey2))
+ (pk2 (ironclad:make-public-key :secp521r1 :y pkey2))
+ (ss1 (ironclad:diffie-hellman sk1 pk2))
+ (ss2 (ironclad:diffie-hellman sk2 pk1)))
+ (when (mismatch ss1 shared-secret)
+ (error "shared secret computation failed for ~A on skey ~A, pkey ~A, secret ~A"
+ name skey1 pkey2 shared-secret))
+ (when (mismatch ss2 shared-secret)
+ (error "shared secret computation failed for ~A on skey ~A, pkey ~A, secret ~A"
+ name skey2 pkey1 shared-secret))))
+
(defparameter *public-key-encryption-tests*
(list (cons :rsa-oaep-encryption-test 'rsa-oaep-encryption-test)
(cons :elgamal-encryption-test 'elgamal-encryption-test)))
@@ -642,14 +672,16 @@
(cons :ed25519-signature-test 'ed25519-signature-test)
(cons :ed448-signature-test 'ed448-signature-test)
(cons :secp256r1-signature-test 'secp256r1-signature-test)
- (cons :secp384r1-signature-test 'secp384r1-signature-test)))
+ (cons :secp384r1-signature-test 'secp384r1-signature-test)
+ (cons :secp521r1-signature-test 'secp521r1-signature-test)))
(defparameter *public-key-diffie-hellman-tests*
(list (cons :curve25519-dh-test 'curve25519-dh-test)
(cons :curve448-dh-test 'curve448-dh-test)
(cons :elgamal-dh-test 'elgamal-dh-test)
(cons :secp256r1-dh-test 'secp256r1-dh-test)
- (cons :secp384r1-dh-test 'secp384r1-dh-test)))
+ (cons :secp384r1-dh-test 'secp384r1-dh-test)
+ (cons :secp521r1-dh-test 'secp521r1-dh-test)))
;;; authenticated encryption testing routines