aboutsummaryrefslogtreecommitdiff
path: root/keyctl.c
diff options
context:
space:
mode:
authorEugene Syromyatnikov <evgsyr@gmail.com>2016-10-03 21:35:24 +0300
committerDmitry V. Levin <ldv@altlinux.org>2016-10-03 19:27:38 +0000
commit04ec08ab6271eba568665b51618ad5f21d7ee5f6 (patch)
treee6d60f38883580a1007bc154d50d8dcc22285b23 /keyctl.c
parent820adffcd9b23c780e06fc5c216438223d5896ed (diff)
downloadstrace-04ec08ab6271eba568665b51618ad5f21d7ee5f6.tar.gz
keyctl: add support for KEYCTL_DH_COMPUTE
* keyctl.c (struct keyctl_dh_params): New structure. (print_dh_params, keyctl_dh_compute): New functions. (SYS_FUNC(keyctl)): Add support for KEYCTL_DH_COMPUTE cmd value.
Diffstat (limited to 'keyctl.c')
-rw-r--r--keyctl.c45
1 files changed, 45 insertions, 0 deletions
diff --git a/keyctl.c b/keyctl.c
index 894af62b0..536fa8055 100644
--- a/keyctl.c
+++ b/keyctl.c
@@ -31,6 +31,12 @@ typedef int32_t key_serial_t;
#include "xlat/key_spec.h"
+struct keyctl_dh_params {
+ int32_t private;
+ int32_t prime;
+ int32_t base;
+};
+
static void
print_keyring_serial_number(key_serial_t id)
{
@@ -213,6 +219,40 @@ keyctl_setperm_key(struct tcb *tcp, key_serial_t id, uint32_t perm)
printflags(key_perms, perm, "KEY_???");
}
+static void
+print_dh_params(struct tcb *tcp, long addr)
+{
+ struct keyctl_dh_params params;
+
+ if (umove_or_printaddr(tcp, addr, &params))
+ return;
+
+ tprints("{private=");
+ print_keyring_serial_number(params.private);
+ tprints(", prime=");
+ print_keyring_serial_number(params.prime);
+ tprints(", base=");
+ print_keyring_serial_number(params.base);
+ tprints("}");
+}
+
+static void
+keyctl_dh_compute(struct tcb *tcp, long params, long buf, long len)
+{
+ if (entering(tcp)) {
+ print_dh_params(tcp, params);
+ tprints(", ");
+ } else {
+ if (syserror(tcp)) {
+ printaddr(buf);
+ } else {
+ long rval = tcp->u_rval > len ? len : tcp->u_rval;
+ printstr(tcp, buf, rval);
+ }
+ tprintf(", %lu", len);
+ }
+}
+
#include "xlat/key_reqkeys.h"
#include "xlat/keyctl_commands.h"
@@ -314,6 +354,11 @@ SYS_FUNC(keyctl)
keyctl_get_persistent(tcp, tcp->u_arg[1], tcp->u_arg[2]);
break;
+ case KEYCTL_DH_COMPUTE:
+ keyctl_dh_compute(tcp, tcp->u_arg[1], tcp->u_arg[2],
+ tcp->u_arg[3]);
+ return 0;
+
default:
tprintf("%#llx, %#llx, %#llx, %#llx",
getarg_ull(tcp, 1), getarg_ull(tcp, 2),