diff options
author | NIIBE Yutaka <gniibe@fsij.org> | 2021-09-06 14:14:49 +0900 |
---|---|---|
committer | NIIBE Yutaka <gniibe@fsij.org> | 2021-09-06 14:14:49 +0900 |
commit | 7bd7773c5020d487574c84fc58165afdd2dc8e82 (patch) | |
tree | 56a96dbec749c89391a26660892dceebe48db676 | |
parent | 1e9d4b474bafec3e087c7ab1bfa433af52129a7f (diff) | |
download | libgcrypt-7bd7773c5020d487574c84fc58165afdd2dc8e82.tar.gz |
experiment: Implement Ed25519ctx.
Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
-rw-r--r-- | cipher/pkey.c | 48 |
1 files changed, 40 insertions, 8 deletions
diff --git a/cipher/pkey.c b/cipher/pkey.c index b3891918..6cd54fb8 100644 --- a/cipher/pkey.c +++ b/cipher/pkey.c @@ -162,15 +162,21 @@ _gcry_pkey_op (gcry_pkey_hd_t h, int cmd, gcry_sexp_t s_msg= NULL; gcry_sexp_t s_sig= NULL; + /* Just for Ed25519 for now. Will support more... */ if (cmd == GCRY_PKEY_OP_SIGN) { gcry_sexp_t s_tmp, s_tmp2; if ((h->flags & GCRY_PKEY_FLAG_CONTEXT)) - return gpg_error (GPG_ERR_NOT_IMPLEMENTED); - - if (num_in != 1) - return gpg_error (GPG_ERR_NOT_IMPLEMENTED); + { + if (num_in != 2 || (h->flags & GCRY_PKEY_FLAG_PREHASH)) + return gpg_error (GPG_ERR_INV_ARG); + } + else + { + if (num_in != 1) + return gpg_error (GPG_ERR_INV_ARG); + } if (num_out != 2) return gpg_error (GPG_ERR_INV_ARG); @@ -196,7 +202,16 @@ _gcry_pkey_op (gcry_pkey_hd_t h, int cmd, if (err) return err; - if ((h->flags & GCRY_PKEY_FLAG_PREHASH)) + if ((h->flags & GCRY_PKEY_FLAG_CONTEXT)) + err = sexp_build (&s_msg, NULL, + "(data" + " (flags eddsa)" + " (hash-algo sha512)" + " (value %b)" + " (label %b))", + (int)in_len[0], in[0], + (int)in_len[1], in[1]); + else if ((h->flags & GCRY_PKEY_FLAG_PREHASH)) err = sexp_build (&s_msg, NULL, "(data" " (flags eddsa prehash)" @@ -254,8 +269,16 @@ _gcry_pkey_op (gcry_pkey_hd_t h, int cmd, } else if (cmd == GCRY_PKEY_OP_VERIFY) { - if (num_in != 3) - return gpg_error (GPG_ERR_NOT_IMPLEMENTED); + if ((h->flags & GCRY_PKEY_FLAG_CONTEXT)) + { + if (num_in != 4 || (h->flags & GCRY_PKEY_FLAG_PREHASH)) + return gpg_error (GPG_ERR_INV_ARG); + } + else + { + if (num_in != 3) + return gpg_error (GPG_ERR_INV_ARG); + } err = sexp_build (&s_pk, NULL, "(public-key" @@ -267,7 +290,16 @@ _gcry_pkey_op (gcry_pkey_hd_t h, int cmd, if (err) return err; - if ((h->flags & GCRY_PKEY_FLAG_PREHASH)) + if (h->flags & GCRY_PKEY_FLAG_CONTEXT) + err = sexp_build (&s_msg, NULL, + "(data" + " (flags eddsa)" + " (hash-algo sha512)" + " (value %b)" + " (label %b))", + (int)in_len[0], in[0], + (int)in_len[3], in[3]); + else if ((h->flags & GCRY_PKEY_FLAG_PREHASH)) err = sexp_build (&s_msg, NULL, "(data" " (flags eddsa prehash)" |