.\"
.\" Copyright (C) 2018 Red Hat, Inc. All Rights Reserved.
.\" Written by David Howells (dhowells@redhat.com)
.\"
.\" This program is free software; you can redistribute it and/or
.\" modify it under the terms of the GNU General Public Licence
.\" as published by the Free Software Foundation; either version
.\" 2 of the Licence, or (at your option) any later version.
.\"
.TH KEYCTL_PKEY_QUERY 3 "8 Nov 2018" Linux "Linux Key Management Calls"
.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
.SH NAME
keyctl_pkey_query \- Query public key parameters
.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
.SH SYNOPSIS
.nf
.B #include <keyutils.h>
.sp
.BI "long keyctl_pkey_query(key_serial_t " key ", const char *" info ,
.BI "                       struct keyctl_pkey_query *" result ");"
.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
.SH DESCRIPTION
.BR keyctl_pkey_query ()
queries the public key parameters associated with a kernel
key that supports these operations (typically
.BR asymmetric -type).
The caller must have
.B search
permission on the target key to be able to query its parameters.
.PP
When invoking the function,
.I key
indicates the key to be queried,
.I info
points to a comma-separated string of "key[=value]" parameters and
.I result
points to a buffer in which the result will be placed.
.PP
The parameters that can be used in the
.I info
parameter string are dependent on the type of key.  Parameters can specify such
things as encoding types (such as "enc=pkcs1"); see asymmetric-key(7) for more
information.
.PP
If successful, the result is written into the following struct:
.PP
.in +4n
.EX
struct keyctl_pkey_query {
        unsigned int    supported_ops;
        unsigned int    key_size;
        unsigned short  max_data_size;
        unsigned short  max_sig_size;
        unsigned short  max_enc_size;
        unsigned short  max_dec_size;
};
.EE
.in
.PP
The
.I supported_ops
field contains a bitmask of the following constants:
.PP
.in +4n
.TS
lB l.
KEYCTL_SUPPORTS_ENCRYPT
KEYCTL_SUPPORTS_DECRYPT
KEYCTL_SUPPORTS_SIGN
KEYCTL_SUPPORTS_VERIFY
.TE
.in
.PP
indicating what operations are supported and thus which of the other
.BR keyctl_pkey_* ()
operations can be used with this key.
.PP
The
.I key_size
field indicates the number of bits in the key size and the
.IR max_data_size ", " max_sig_size ", " max_enc_size " and " max_dec_size
fields indicate the maximum sizes in bytes of a blob of data to be signed, a
signature blob, a blob to be encrypted and a blob to be decrypted respectively.
.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
.SH RETURN VALUE
On success
.BR keyctl_pkey_query ()
returns
.BR 0 .
On error, the value
.B -1
will be returned and
.I errno
will have been set to an appropriate error.
.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
.SH ERRORS
.TP
.B ENOKEY
The key specified is invalid.
.TP
.B EKEYEXPIRED
The key specified has expired.
.TP
.B EKEYREVOKED
The key specified has been revoked.
.TP
.B EACCES
The key exists, but is not
.B searchable
by the calling process.
.TP
.B ENOPKG
Some facility needed to complete the requested operation is not available.
This is most probably a requested or required digest or encryption algorithm.
.TP
.B EFAULT
Bad address.
.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
.SH LINKING
This is a library function that can be found in
.IR libkeyutils .
When linking,
.B \-lkeyutils
should be specified to the linker.
.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
.SH SEE ALSO
.ad l
.nh
.BR keyctl (1),
.BR add_key (2),
.BR keyctl (2),
.BR keyctl (3),
.BR keyctl_pkey_encrypt (3),
.BR keyctl_pkey_sign (3),
.BR asymmetric-key (7),
.BR keyrings (7),
.BR keyutils (7)
