Re: [PATCH v2 02/11] crypto: Documentation - userspace interface spec

2014-11-05 Thread Joy M. Latten
Hi Stephan,

On Sun, 2014-11-02 at 21:36 +0100, Stephan Mueller wrote:
 The userspace interface of the kernel crypto API is documented with
  * a general explanation
  * a discussion of the memory in-place operation
  * the description of the message digest API
  * the description of the symmetric cipher API
 
 In addition, a fully self contained example that can readily be used as
 a library is added as well.
 
 Signed-off-by: Stephan Mueller smuel...@chronox.de
 CC: Marek Vasut ma...@denx.de
 ---
  Documentation/crypto/crypto-API-userspace.txt | 662 
 ++
  1 file changed, 662 insertions(+)
  create mode 100644 Documentation/crypto/crypto-API-userspace.txt
 
 diff --git a/Documentation/crypto/crypto-API-userspace.txt 
 b/Documentation/crypto/crypto-API-userspace.txt
 new file mode 100644
 index 000..30ca6a7
 --- /dev/null
 +++ b/Documentation/crypto/crypto-API-userspace.txt
 @@ -0,0 +1,662 @@
 +Introduction
 +
 +
 +The concepts of the kernel crypto API visible to kernel space is fully
 +applicable to the user space interface as well. Therefore, the kernel crypto 
 API
 +high level discussion for the in-kernel use cases applies here as well.
 +
 +The major difference, however, is that user space can only act as a consumer
 +and never as a provider of a transformation or cipher algorithm.
 +
 +The following covers the user space interface exported by the kernel crypto
 +API. It provides a fully working sample code at the that can be used as a
at the can probably be deleted.
 
 +library for user space applications that require cryptographic services from
 +the kernel.
 +
 +Some details of the in-kernel kernel crypto API aspects do not
 +apply to user space, however. This includes the difference between 
 synchronous
 +and asynchronous invocations. The user space API call is fully synchronous.
 +In addition, only a subset of all cipher types are available as documented
 +below.
 +
 +
 +User space API general remarks
 +==
 +
 +The kernel crypto API is accessible from user space. Currently, the following
 +ciphers are accessible:
 +
 + * Message digest including keyed message digest (HMAC, CMAC)
 +
 + * Symmetric ciphers
 +
 +Note, AEAD ciphers are currently not supported via the symmetric cipher
 +interface.
 +
 +The interface is provided via Netlink using the type AF_ALG. In addition, the
 +setsockopt option type is SOL_ALG. In case the user space header files do not
 +export these flags yet, use the following macros:
 +
 +#ifndef AF_ALG
 +#define AF_ALG 38
 +#endif
 +#ifndef SOL_ALG
 +#define SOL_ALG 279
 +#endif
 +
 +A cipher is accessed with the same name as done for the in-kernel API calls.
 +This includes the generic vs. unique naming schema for ciphers as well as the
 +enforcement of priorities for generic names.
 +
 +To interact with the kernel crypto API, a Netlink socket must be created by
 +the user space application. User space invokes the cipher operation with the
 +send/write system call family. The result of the cipher operation is obtained
 +with the read/recv system call family.
 +
 +The following API calls assume that the Netlink socket descriptor is already
 +opened by the user space application and discusses only the kernel crypto API
 +specific invocations.
 +
 +In-place cipher operation
 +=
 +
 +Just like the in-kernel operation of the kernel crypto API, the user space
 +interface allows the cipher operation in-place. That means that the input 
 buffer
 +used for the send/write system call and the output buffer used by the 
 read/recv
 +system call may be one and the same. This is of particular interest for
 +symmetric cipher operations where a copying of the output data to its final
 +destination can be avoided.
For clarity, it might be helpful to reader if both ways are mentioned.
That you can encrypt in place or have your output place in a separate
destination.

 +
 +Message digest API
 +==
 +
 +The message digest type to be used for the cipher operation is selected when
 +invoking the bind syscall. bind requires the caller to provide a filled
 +struct sockaddr data structure. This data structure must be filled as 
 follows:
 +
 +struct sockaddr_alg sa = {
 + .salg_family = AF_ALG,
 + .salg_type = hash, /* this selects the hash logic in the kernel */
 + .salg_name = sha1 /* this is the cipher name */
 +};
 +
 +The salg_type value hash applies to message digests and keyed message 
 digests.
 +Though, a keyed message digest is referenced by the appropriate salg_name and
 +providing a key for the cipher operation.
Picky, but maybe now is the time to mention what you mention 2 or 3
paragraphs below about how to set the message digest key.

 +
 +Using the send() system call, the application provides the data that should 
 be
 +processed with the message digest. The send system call allows the following
 +flags to be specified:
 +
 + * MSG_MORE: If this flag is 

[PATCH v2 02/11] crypto: Documentation - userspace interface spec

2014-11-02 Thread Stephan Mueller
The userspace interface of the kernel crypto API is documented with
 * a general explanation
 * a discussion of the memory in-place operation
 * the description of the message digest API
 * the description of the symmetric cipher API

In addition, a fully self contained example that can readily be used as
a library is added as well.

Signed-off-by: Stephan Mueller smuel...@chronox.de
CC: Marek Vasut ma...@denx.de
---
 Documentation/crypto/crypto-API-userspace.txt | 662 ++
 1 file changed, 662 insertions(+)
 create mode 100644 Documentation/crypto/crypto-API-userspace.txt

diff --git a/Documentation/crypto/crypto-API-userspace.txt 
b/Documentation/crypto/crypto-API-userspace.txt
new file mode 100644
index 000..30ca6a7
--- /dev/null
+++ b/Documentation/crypto/crypto-API-userspace.txt
@@ -0,0 +1,662 @@
+Introduction
+
+
+The concepts of the kernel crypto API visible to kernel space is fully
+applicable to the user space interface as well. Therefore, the kernel crypto 
API
+high level discussion for the in-kernel use cases applies here as well.
+
+The major difference, however, is that user space can only act as a consumer
+and never as a provider of a transformation or cipher algorithm.
+
+The following covers the user space interface exported by the kernel crypto
+API. It provides a fully working sample code at the that can be used as a
+library for user space applications that require cryptographic services from
+the kernel.
+
+Some details of the in-kernel kernel crypto API aspects do not
+apply to user space, however. This includes the difference between synchronous
+and asynchronous invocations. The user space API call is fully synchronous.
+In addition, only a subset of all cipher types are available as documented
+below.
+
+
+User space API general remarks
+==
+
+The kernel crypto API is accessible from user space. Currently, the following
+ciphers are accessible:
+
+   * Message digest including keyed message digest (HMAC, CMAC)
+
+   * Symmetric ciphers
+
+Note, AEAD ciphers are currently not supported via the symmetric cipher
+interface.
+
+The interface is provided via Netlink using the type AF_ALG. In addition, the
+setsockopt option type is SOL_ALG. In case the user space header files do not
+export these flags yet, use the following macros:
+
+#ifndef AF_ALG
+#define AF_ALG 38
+#endif
+#ifndef SOL_ALG
+#define SOL_ALG 279
+#endif
+
+A cipher is accessed with the same name as done for the in-kernel API calls.
+This includes the generic vs. unique naming schema for ciphers as well as the
+enforcement of priorities for generic names.
+
+To interact with the kernel crypto API, a Netlink socket must be created by
+the user space application. User space invokes the cipher operation with the
+send/write system call family. The result of the cipher operation is obtained
+with the read/recv system call family.
+
+The following API calls assume that the Netlink socket descriptor is already
+opened by the user space application and discusses only the kernel crypto API
+specific invocations.
+
+In-place cipher operation
+=
+
+Just like the in-kernel operation of the kernel crypto API, the user space
+interface allows the cipher operation in-place. That means that the input 
buffer
+used for the send/write system call and the output buffer used by the read/recv
+system call may be one and the same. This is of particular interest for
+symmetric cipher operations where a copying of the output data to its final
+destination can be avoided.
+
+Message digest API
+==
+
+The message digest type to be used for the cipher operation is selected when
+invoking the bind syscall. bind requires the caller to provide a filled
+struct sockaddr data structure. This data structure must be filled as follows:
+
+struct sockaddr_alg sa = {
+   .salg_family = AF_ALG,
+   .salg_type = hash, /* this selects the hash logic in the kernel */
+   .salg_name = sha1 /* this is the cipher name */
+};
+
+The salg_type value hash applies to message digests and keyed message 
digests.
+Though, a keyed message digest is referenced by the appropriate salg_name and
+providing a key for the cipher operation.
+
+Using the send() system call, the application provides the data that should be
+processed with the message digest. The send system call allows the following
+flags to be specified:
+
+   * MSG_MORE: If this flag is set, the send system call acts like a
+   message digest update function where the final hash is not
+   yet calculated. If the flag is not set, the send system call
+   calculates the final message digest immediately.
+
+With the recv() system call, the application can read the message digest from
+the kernel crypto API. If the buffer is too small for the message digest, the
+flag MSG_TRUNC is set by the kernel.
+
+In order to set a message digest