|
|
\input texinfo @c -*-texinfo-*-
|
|
|
@c %**start of header
|
|
|
@setfilename nettle.info
|
|
|
@settitle Nettle: a low-level cryptographic library
|
|
|
@documentencoding UTF-8
|
|
|
@footnotestyle separate
|
|
|
@syncodeindex fn cp
|
|
|
@syncodeindex tp cp
|
|
|
@c %**end of header
|
|
|
|
|
|
@set UPDATED-FOR 3.9
|
|
|
@set AUTHOR Niels Möller
|
|
|
|
|
|
@copying
|
|
|
This manual is for the Nettle library (version @value{UPDATED-FOR}), a
|
|
|
low-level cryptographic library.
|
|
|
|
|
|
Originally written 2001 by @value{AUTHOR}, updated 2023.
|
|
|
|
|
|
@quotation
|
|
|
This manual is placed in the public domain. You may freely copy it, in
|
|
|
whole or in part, with or without modification. Attribution is
|
|
|
appreciated, but not required.
|
|
|
@end quotation
|
|
|
@end copying
|
|
|
|
|
|
@ifnottex
|
|
|
@macro pmod {m}
|
|
|
(mod \m\)
|
|
|
@end macro
|
|
|
@end ifnottex
|
|
|
|
|
|
@titlepage
|
|
|
@title Nettle Manual
|
|
|
@subtitle For the Nettle Library version @value{UPDATED-FOR}
|
|
|
@author @value{AUTHOR}
|
|
|
@page
|
|
|
@vskip 0pt plus 1filll
|
|
|
@insertcopying
|
|
|
@end titlepage
|
|
|
|
|
|
@dircategory Encryption
|
|
|
@direntry
|
|
|
* Nettle: (nettle). A low-level cryptographic library.
|
|
|
@end direntry
|
|
|
|
|
|
@contents
|
|
|
|
|
|
@ifnottex
|
|
|
@node Top
|
|
|
@top Nettle
|
|
|
|
|
|
This document describes the Nettle low-level cryptographic library. You
|
|
|
can use the library directly from your C programs, or write or use an
|
|
|
object-oriented wrapper for your favorite language or application.
|
|
|
|
|
|
@insertcopying
|
|
|
|
|
|
@menu
|
|
|
* Introduction:: What is Nettle?
|
|
|
* Copyright:: Your rights.
|
|
|
* Conventions:: General interface conventions.
|
|
|
* Example:: An example program.
|
|
|
* Linking:: Linking with libnettle and libhogweed.
|
|
|
* Compatibility:: On API and ABI compatibility between versions.
|
|
|
* Reference:: All Nettle functions and features.
|
|
|
* Nettle soup:: For the serious nettle hacker.
|
|
|
* Installation:: How to install Nettle.
|
|
|
* Index:: Function and concept index.
|
|
|
|
|
|
@detailmenu
|
|
|
--- The Detailed Node Listing ---
|
|
|
|
|
|
Reference
|
|
|
|
|
|
* Hash functions::
|
|
|
* Cipher functions::
|
|
|
* Cipher modes::
|
|
|
* Authenticated encryption::
|
|
|
* Keyed hash functions::
|
|
|
* Key derivation functions::
|
|
|
* Public-key algorithms::
|
|
|
* Randomness::
|
|
|
* ASCII encoding::
|
|
|
* Miscellaneous functions::
|
|
|
* Compatibility functions::
|
|
|
|
|
|
Hash functions
|
|
|
|
|
|
* Recommended hash functions::
|
|
|
* Miscellaneous hash functions::
|
|
|
* Legacy hash functions::
|
|
|
* nettle_hash abstraction::
|
|
|
|
|
|
Cipher functions
|
|
|
|
|
|
* AES::
|
|
|
* Arcfour::
|
|
|
* Arctwo::
|
|
|
* Blowfish::
|
|
|
* Camellia::
|
|
|
* CAST128::
|
|
|
* ChaCha::
|
|
|
* DES::
|
|
|
* DES3::
|
|
|
* Salsa20::
|
|
|
* Serpent::
|
|
|
* SM4::
|
|
|
* Twofish::
|
|
|
* nettle_cipher abstraction::
|
|
|
|
|
|
Cipher modes
|
|
|
|
|
|
* CBC::
|
|
|
* CTR::
|
|
|
* CFB and CFB8::
|
|
|
* XTS::
|
|
|
|
|
|
Authenticated encryption with associated data
|
|
|
|
|
|
* EAX::
|
|
|
* GCM::
|
|
|
* CCM::
|
|
|
* ChaCha-Poly1305::
|
|
|
* OCB::
|
|
|
* SIV-CMAC::
|
|
|
* SIV-GCM::
|
|
|
* nettle_aead abstraction::
|
|
|
|
|
|
Keyed Hash Functions
|
|
|
|
|
|
* HMAC::
|
|
|
* UMAC::
|
|
|
* CMAC::
|
|
|
* Poly1305::
|
|
|
|
|
|
Public-key algorithms
|
|
|
|
|
|
* RSA:: The RSA public key algorithm.
|
|
|
* DSA:: The DSA digital signature algorithm.
|
|
|
* Elliptic curves:: Elliptic curves and ECDSA
|
|
|
|
|
|
Elliptic curves
|
|
|
|
|
|
* Side-channel silence::
|
|
|
* ECDSA::
|
|
|
* GOSTDSA::
|
|
|
* Curve 25519 and Curve 448::
|
|
|
|
|
|
@end detailmenu
|
|
|
@end menu
|
|
|
|
|
|
@end ifnottex
|
|
|
|
|
|
@node Introduction
|
|
|
@chapter Introduction
|
|
|
|
|
|
Nettle is a cryptographic library that is designed to fit easily in more
|
|
|
or less any context: In crypto toolkits for object-oriented languages
|
|
|
(C++, Python, Pike, ...), in applications like LSH or GNUPG, or even in
|
|
|
kernel space. In most contexts, you need more than the basic
|
|
|
cryptographic algorithms, you also need some way to keep track of available
|
|
|
algorithms, their properties and variants. You often have some algorithm
|
|
|
selection process, often dictated by a protocol you want to implement.
|
|
|
|
|
|
And as the requirements of applications differ in subtle and not so
|
|
|
subtle ways, an API that fits one application well can be a pain to use
|
|
|
in a different context. And that is why there are so many different
|
|
|
cryptographic libraries around.
|
|
|
|
|
|
Nettle tries to avoid this problem by doing one thing, the low-level
|
|
|
crypto stuff, and providing a @emph{simple} but general interface to it.
|
|
|
In particular, Nettle doesn't do algorithm selection. It doesn't do
|
|
|
memory allocation. It doesn't do any I/O.
|
|
|
|
|
|
The idea is that one can build several application and context specific
|
|
|
interfaces on top of Nettle, and share the code, test cases, benchmarks,
|
|
|
documentation, etc. Examples are the Nettle module for the Pike
|
|
|
language, and LSH, which both use an object-oriented abstraction on top
|
|
|
of the library.
|
|
|
|
|
|
This manual explains how to use the Nettle library. It also tries to
|
|
|
provide some background on the cryptography, and advice on how to best
|
|
|
put it to use.
|
|
|
|
|
|
@node Copyright
|
|
|
@chapter Copyright
|
|
|
|
|
|
Nettle is dual licenced under the GNU General Public License version 2
|
|
|
or later, and the GNU Lesser General Public License version 3 or later.
|
|
|
When using Nettle, you must comply fully with all conditions of at least
|
|
|
one of these licenses. A few of the individual files are licensed under
|
|
|
more permissive terms, or in the public domain. To find the current
|
|
|
status of particular files, you have to read the copyright notices at
|
|
|
the top of the files.
|
|
|
|
|
|
This manual is in the public domain. You may freely copy it in whole or
|
|
|
in part, e.g., into documentation of programs that build on Nettle.
|
|
|
Attribution, as well as contribution of improvements to the text, is of
|
|
|
course appreciated, but it is not required.
|
|
|
|
|
|
@node Conventions
|
|
|
@chapter Conventions
|
|
|
|
|
|
For each supported algorithm, there is an include file that defines a
|
|
|
@emph{context struct}, a few constants, and declares functions for
|
|
|
operating on the context. The context struct encapsulates all information
|
|
|
needed by the algorithm, and it can be copied or moved in memory with no
|
|
|
unexpected effects.
|
|
|
|
|
|
For consistency, functions for different algorithms are very similar,
|
|
|
but there are some differences, for instance reflecting if the key setup
|
|
|
or encryption function differ for encryption and decryption, and whether
|
|
|
or not key setup can fail. There are also differences between algorithms
|
|
|
that don't show in function prototypes, but which the application must
|
|
|
nevertheless be aware of. There is no big difference between the
|
|
|
functions for stream ciphers and for block ciphers, although they should
|
|
|
be used quite differently by the application.
|
|
|
|
|
|
If your application uses more than one algorithm of the same type, you
|
|
|
should probably create an interface that is tailor-made for your needs,
|
|
|
and then write a few lines of glue code on top of Nettle.
|
|
|
|
|
|
By convention, for an algorithm named @code{foo}, the struct tag for the
|
|
|
context struct is @code{foo_ctx}, constants and functions uses prefixes
|
|
|
like @code{FOO_BLOCK_SIZE} (a constant) and @code{foo_set_key} (a
|
|
|
function).
|
|
|
|
|
|
In all functions, strings are represented with an explicit length, of
|
|
|
type @code{size_t}, and a pointer of type @code{uint8_t *} or
|
|
|
@code{const uint8_t *}. For functions that transform one string to
|
|
|
another, the argument order is length, destination pointer and source
|
|
|
pointer. Source and destination areas are usually of the same length.
|
|
|
When they differ, e.g., for @code{ccm_encrypt_message}, the length
|
|
|
argument specifies the size of the destination area. Source and
|
|
|
destination pointers may be equal, so that you can process strings in
|
|
|
place, but source and destination areas @emph{must not} overlap in any
|
|
|
other way.
|
|
|
|
|
|
Many of the functions lack return value and can never fail. Those
|
|
|
functions which can fail, return one on success and zero on failure.
|
|
|
|
|
|
@c FIXME: Say something about the name mangling.
|
|
|
|
|
|
@node Example
|
|
|
@chapter Example
|
|
|
|
|
|
A simple example program that reads a file from standard input and
|
|
|
writes its SHA1 check-sum on standard output should give the flavor of
|
|
|
Nettle.
|
|
|
|
|
|
@example
|
|
|
@verbatiminclude sha-example.c
|
|
|
@end example
|
|
|
|
|
|
On a typical Unix system, this program can be compiled and linked with
|
|
|
the command line
|
|
|
@example
|
|
|
gcc sha-example.c -o sha-example -lnettle
|
|
|
@end example
|
|
|
|
|
|
@node Linking
|
|
|
@chapter Linking
|
|
|
|
|
|
Nettle actually consists of two libraries, @file{libnettle} and
|
|
|
@file{libhogweed}. The @file{libhogweed} library contains those
|
|
|
functions of Nettle that uses bignum operations, and depends on the GMP
|
|
|
library. With this division, linking works the same for both static and
|
|
|
dynamic libraries.
|
|
|
|
|
|
If an application uses only the symmetric crypto algorithms of Nettle
|
|
|
(i.e., block ciphers, hash functions, and the like), it's sufficient to
|
|
|
link with @code{-lnettle}. If an application also uses public-key
|
|
|
algorithms, the recommended linker flags are @code{-lhogweed -lnettle
|
|
|
-lgmp}. If the involved libraries are installed as dynamic libraries, it
|
|
|
may be sufficient to link with just @code{-lhogweed}, and the loader
|
|
|
will resolve the dependencies automatically.
|
|
|
|
|
|
@node Compatibility
|
|
|
@chapter Compatibility
|
|
|
@cindex ABI compatibility
|
|
|
@cindex API compatibility
|
|
|
@cindex Binary compatibility
|
|
|
|
|
|
When you write a program using the Nettle library, it's desirable to
|
|
|
have it work together not only with exactly the same version of Nettle
|
|
|
you had at hand, but with other current and future versions. If a
|
|
|
different version of Nettle is used at compile time, i.e., you recompile
|
|
|
it using the header and library files belonging to a different version,
|
|
|
we talk about API compatibility (for Application Programming Interface).
|
|
|
If a different version of Nettle isn't used until link time, we talk
|
|
|
about ABI compatibility (Application Binary Interface) or binary
|
|
|
compatibility. ABI compatibility matters mainly when using dynamic
|
|
|
linking with a shared library. E.g., a user has an executable linking at
|
|
|
run-time with @file{libnettle.so}, and then updates to a later version
|
|
|
of the shared library, without updating or recompiling the executable.
|
|
|
|
|
|
Nettle aims to provide backwards compatibility, i.e., a program written
|
|
|
for a particular version of the Nettle library should usually work fine
|
|
|
with later version of the library. Note that the opposite is not
|
|
|
supported: The program should @emph{not} be expected to work with older
|
|
|
versions of the Nettle library; and ABI breakage can be unobvious. E.g,
|
|
|
the later version may define a new library symbol, and let header files
|
|
|
redefine an old API name as an alias for the new symbol. If the later
|
|
|
version ensures that the old symbol is still defined in the library,
|
|
|
this change is backwards compatible: A program compiled using headers
|
|
|
from the older version can be successfully linked with either version of
|
|
|
the library. But if you compile the same program using headers from the
|
|
|
later version of the library, and attempt to link with the older
|
|
|
version, you'll get an undefined reference to the new symbol.
|
|
|
|
|
|
API compatibility is rarely broken; exceptions are noted in the NEWS
|
|
|
file. For example, the key size argument to the function
|
|
|
@code{cast128_set_key} was dropped in the Nettle-3.0 release, and all
|
|
|
programs using that function had to be updated to work with the new
|
|
|
version.
|
|
|
|
|
|
ABI compatibility is broken occasionally. This is also noted in the NEWS
|
|
|
file, and the name of the shared library is updated to prevent
|
|
|
accidental run-time linking with the wrong version. All programs have to
|
|
|
be recompiled before they can link with the new version. Since names are
|
|
|
different, multiple versions can be installed on the same system, with a
|
|
|
mix of programs linking to one version or the other.
|
|
|
|
|
|
Under some circumstances, it is possible to have a single program
|
|
|
linking dynamically with two binary incompatible versions of the Nettle
|
|
|
library, thanks to the use of symbol versioning. Consider a program
|
|
|
calling functions in both Nettle and GnuTLS. For the direct dependency
|
|
|
on Nettle, the program is linked with a particular version of the Nettle
|
|
|
shared library. GnuTLS uses Nettle internally, but does not expose any
|
|
|
Nettle data structures or the like in its own ABI. In this situation,
|
|
|
the GnuTLS shared library may link with a different version of the
|
|
|
Nettle library. Then both versions of the Nettle library will be loaded
|
|
|
into the program's address space, and each reference to a symbol will be
|
|
|
resolved to the correct version.
|
|
|
|
|
|
Finally, some of Nettle's symbols are internal. They carry a leading
|
|
|
underscore, and are not declared in installed header files. They can be
|
|
|
used for local or experimental purposes, but programs referring directly
|
|
|
to those symbols get neither API nor ABI compatibility, not even between
|
|
|
minor versions.
|
|
|
|
|
|
@node Reference
|
|
|
@chapter Reference
|
|
|
|
|
|
This chapter describes all the Nettle functions, grouped by family.
|
|
|
|
|
|
@menu
|
|
|
* Hash functions::
|
|
|
* Cipher functions::
|
|
|
* Cipher modes::
|
|
|
* Authenticated encryption::
|
|
|
* Keyed hash functions::
|
|
|
* Key derivation functions::
|
|
|
* Public-key algorithms::
|
|
|
* Randomness::
|
|
|
* ASCII encoding::
|
|
|
* Miscellaneous functions::
|
|
|
* Compatibility functions::
|
|
|
@end menu
|
|
|
|
|
|
@node Hash functions
|
|
|
@section Hash functions
|
|
|
@cindex Hash function
|
|
|
|
|
|
A cryptographic @dfn{hash function} is a function that takes variable
|
|
|
size strings, and maps them to strings of fixed, short, length. There
|
|
|
are naturally lots of collisions, as there are more possible 1MB files
|
|
|
than 20 byte strings. But the function is constructed such that is hard
|
|
|
to find the collisions. More precisely, a cryptographic hash function
|
|
|
@code{H} should have the following properties:
|
|
|
|
|
|
@table @emph
|
|
|
|
|
|
@item One-way
|
|
|
@cindex One-way
|
|
|
Given a hash value @code{H(x)} it is hard to find a string @code{x}
|
|
|
that hashes to that value.
|
|
|
|
|
|
@item Collision-resistant
|
|
|
@cindex Collision-resistant
|
|
|
It is hard to find two different strings, @code{x} and @code{y}, such
|
|
|
that @code{H(x)} = @code{H(y)}.
|
|
|
|
|
|
@end table
|
|
|
|
|
|
Hash functions are useful as building blocks for digital signatures,
|
|
|
message authentication codes, pseudo random generators, association of
|
|
|
unique ids to documents, and many other things.
|
|
|
|
|
|
The most commonly used hash functions are MD5 and SHA1. Unfortunately,
|
|
|
both these fail the collision-resistance requirement; cryptologists have
|
|
|
found ways to construct colliding inputs. The recommended hash functions
|
|
|
for new applications are SHA2 (with main variants SHA256 and SHA512). At
|
|
|
the time of this writing (Autumn 2015), SHA3 has recently been
|
|
|
standardized, and the new SHA3 and other top SHA3 candidates may also be
|
|
|
reasonable alternatives.
|
|
|
|
|
|
@menu
|
|
|
* Recommended hash functions::
|
|
|
* Miscellaneous hash functions::
|
|
|
* Legacy hash functions::
|
|
|
* nettle_hash abstraction::
|
|
|
@end menu
|
|
|
|
|
|
@node Recommended hash functions
|
|
|
@subsection Recommended hash functions
|
|
|
|
|
|
The following hash functions have no known weaknesses, and are suitable
|
|
|
for new applications. The SHA2 family of hash functions were specified
|
|
|
by @dfn{NIST}, intended as a replacement for @acronym{SHA1}.
|
|
|
|
|
|
@subsubsection @acronym{SHA256}
|
|
|
|
|
|
SHA256 is a member of the SHA2 family. It outputs hash values of 256
|
|
|
bits, or 32 octets. Nettle defines SHA256 in @file{<nettle/sha2.h>}.
|
|
|
|
|
|
@deftp {Context struct} {struct sha256_ctx}
|
|
|
@end deftp
|
|
|
|
|
|
@defvr Constant SHA256_DIGEST_SIZE
|
|
|
The size of a SHA256 digest, i.e. 32.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant SHA256_BLOCK_SIZE
|
|
|
The internal block size of SHA256. Useful for some special constructions,
|
|
|
in particular HMAC-SHA256.
|
|
|
@end defvr
|
|
|
|
|
|
@deftypefun void sha256_init (struct sha256_ctx *@var{ctx})
|
|
|
Initialize the SHA256 state.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void sha256_update (struct sha256_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
Hash some more data.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void sha256_digest (struct sha256_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
Performs final processing and extracts the message digest, writing it
|
|
|
to @var{digest}. @var{length} may be smaller than
|
|
|
@code{SHA256_DIGEST_SIZE}, in which case only the first @var{length}
|
|
|
octets of the digest are written.
|
|
|
|
|
|
This function also resets the context in the same way as
|
|
|
@code{sha256_init}.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void sha256_compress (const uint32_t *@var{state}, uint8_t *@var{input})
|
|
|
Perform a raw SHA256 compress on SHA256_BLOCK_SIZE bytes from@var{input}
|
|
|
using @var{state} as IV (an array of 8 uint32_t). The output is stored in @var{state}.
|
|
|
This function provides access to the underlying compression function,
|
|
|
for the rare applications that need that (e.g., using different IV from
|
|
|
standard SHA256).
|
|
|
@end deftypefun
|
|
|
|
|
|
Earlier versions of nettle defined SHA256 in the header file
|
|
|
@file{<nettle/sha.h>}, which is now deprecated, but kept for
|
|
|
compatibility.
|
|
|
|
|
|
@subsubsection @acronym{SHA224}
|
|
|
|
|
|
SHA224 is a variant of SHA256, with a different initial state, and with
|
|
|
the output truncated to 224 bits, or 28 octets. Nettle defines SHA224 in
|
|
|
@file{<nettle/sha2.h>} (and in @file{<nettle/sha.h>}, for backwards
|
|
|
compatibility).
|
|
|
|
|
|
@deftp {Context struct} {struct sha224_ctx}
|
|
|
@end deftp
|
|
|
|
|
|
@defvr Constant SHA224_DIGEST_SIZE
|
|
|
The size of a SHA224 digest, i.e. 28.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant SHA224_BLOCK_SIZE
|
|
|
The internal block size of SHA224. Useful for some special constructions,
|
|
|
in particular HMAC-SHA224.
|
|
|
@end defvr
|
|
|
|
|
|
@deftypefun void sha224_init (struct sha224_ctx *@var{ctx})
|
|
|
Initialize the SHA224 state.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void sha224_update (struct sha224_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
Hash some more data.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void sha224_digest (struct sha224_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
Performs final processing and extracts the message digest, writing it
|
|
|
to @var{digest}. @var{length} may be smaller than
|
|
|
@code{SHA224_DIGEST_SIZE}, in which case only the first @var{length}
|
|
|
octets of the digest are written.
|
|
|
|
|
|
This function also resets the context in the same way as
|
|
|
@code{sha224_init}.
|
|
|
@end deftypefun
|
|
|
|
|
|
@subsubsection @acronym{SHA512}
|
|
|
|
|
|
SHA512 is a larger sibling to SHA256, with a very similar structure but
|
|
|
with both the output and the internal variables of twice the size. The
|
|
|
internal variables are 64 bits rather than 32, making it significantly
|
|
|
slower on 32-bit computers. It outputs hash values of 512 bits, or 64
|
|
|
octets. Nettle defines SHA512 in @file{<nettle/sha2.h>} (and in
|
|
|
@file{<nettle/sha.h>}, for backwards compatibility).
|
|
|
|
|
|
@deftp {Context struct} {struct sha512_ctx}
|
|
|
@end deftp
|
|
|
|
|
|
@defvr Constant SHA512_DIGEST_SIZE
|
|
|
The size of a SHA512 digest, i.e. 64.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant SHA512_BLOCK_SIZE
|
|
|
The internal block size of SHA512, 128. Useful for some special
|
|
|
constructions, in particular HMAC-SHA512.
|
|
|
@end defvr
|
|
|
|
|
|
@deftypefun void sha512_init (struct sha512_ctx *@var{ctx})
|
|
|
Initialize the SHA512 state.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void sha512_update (struct sha512_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
Hash some more data.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void sha512_digest (struct sha512_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
Performs final processing and extracts the message digest, writing it
|
|
|
to @var{digest}. @var{length} may be smaller than
|
|
|
@code{SHA512_DIGEST_SIZE}, in which case only the first @var{length}
|
|
|
octets of the digest are written.
|
|
|
|
|
|
This function also resets the context in the same way as
|
|
|
@code{sha512_init}.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void sha512_compress (const uint64_t *@var{state}, uint8_t *@var{input})
|
|
|
Perform a raw SHA512 compress on SHA512_BLOCK_SIZE bytes from
|
|
|
@var{input} using @var{state} as IV (an array of 8 uint64_t). The output is stored in @var{state}.
|
|
|
This function provides access to the underlying compression function,
|
|
|
for the rare applications that need that (e.g., using different IV from
|
|
|
standard SHA512).
|
|
|
@end deftypefun
|
|
|
|
|
|
@subsubsection @acronym{SHA384 and other variants of SHA512}
|
|
|
|
|
|
Several variants of SHA512 have been defined, with a different initial
|
|
|
state, and with the output truncated to shorter length than 512 bits.
|
|
|
Naming is a bit confused, these algorithms are called SHA512-224,
|
|
|
SHA512-256 and SHA384, for output sizes of 224, 256 and 384 bits,
|
|
|
respectively. Nettle defines these in @file{<nettle/sha2.h>} (and in
|
|
|
@file{<nettle/sha.h>}, for backwards compatibility).
|
|
|
|
|
|
@deftp {Context struct} {struct sha512_224_ctx}
|
|
|
@deftpx {Context struct} {struct sha512_256_ctx}
|
|
|
@deftpx {Context struct} {struct sha384_ctx}
|
|
|
These context structs are all the same as sha512_ctx. They are defined as
|
|
|
simple preprocessor aliases, which may cause some problems if used as
|
|
|
identifiers for other purposes. So avoid doing that.
|
|
|
@end deftp
|
|
|
|
|
|
@defvr Constant SHA512_224_DIGEST_SIZE
|
|
|
@defvrx Constant SHA512_256_DIGEST_SIZE
|
|
|
@defvrx Constant SHA384_DIGEST_SIZE
|
|
|
The digest size for each variant, i.e., 28, 32, and 48, respectively.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant SHA512_224_BLOCK_SIZE
|
|
|
@defvrx Constant SHA512_256_BLOCK_SIZE
|
|
|
@defvrx Constant SHA384_BLOCK_SIZE
|
|
|
The internal block size, same as SHA512_BLOCK_SIZE, i.e., 128. Useful for
|
|
|
some special constructions, in particular HMAC-SHA384.
|
|
|
@end defvr
|
|
|
|
|
|
@deftypefun void sha512_224_init (struct sha512_224_ctx *@var{ctx})
|
|
|
@deftypefunx void sha512_256_init (struct sha512_256_ctx *@var{ctx})
|
|
|
@deftypefunx void sha384_init (struct sha384_ctx *@var{ctx})
|
|
|
Initialize the context struct.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void sha512_224_update (struct sha512_224_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
@deftypefunx void sha512_256_update (struct sha512_256_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
@deftypefunx void sha384_update (struct sha384_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
Hash some more data. These are all aliases for sha512_update, which does
|
|
|
the same thing.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void sha512_224_digest (struct sha512_224_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
@deftypefunx void sha512_256_digest (struct sha512_256_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
@deftypefunx void sha384_digest (struct sha384_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
Performs final processing and extracts the message digest, writing it to
|
|
|
@var{digest}. @var{length} may be smaller than the specified digest
|
|
|
size, in which case only the first @var{length} octets of the digest are
|
|
|
written.
|
|
|
|
|
|
These function also reset the context in the same way as the
|
|
|
corresponding init function.
|
|
|
@end deftypefun
|
|
|
|
|
|
@subsubsection @acronym{SHA3-224}
|
|
|
@cindex SHA3
|
|
|
|
|
|
The SHA3 hash functions were specified by NIST in response to weaknesses
|
|
|
in SHA1, and doubts about SHA2 hash functions which structurally are
|
|
|
very similar to SHA1. SHA3 is a result of a competition, where the
|
|
|
winner, also known as Keccak, was designed by Guido Bertoni, Joan
|
|
|
Daemen, Michaël Peeters and Gilles Van Assche. It is structurally very
|
|
|
different from all widely used earlier hash functions. Like SHA2, there
|
|
|
are several variants, with output sizes of 224, 256, 384 and 512 bits
|
|
|
(28, 32, 48 and 64 octets, respectively). In August 2015, it was
|
|
|
formally standardized by NIST, as FIPS 202,
|
|
|
@url{https://dx.doi.org/10.6028/NIST.FIPS.202}.
|
|
|
|
|
|
Note that the SHA3 implementation in earlier versions of Nettle was
|
|
|
based on the specification at the time Keccak was announced as the
|
|
|
winner of the competition, which is incompatible with the final standard
|
|
|
and hence with current versions of Nettle. The @file{nette/sha3.h}
|
|
|
defines a preprocessor symbol @code{NETTLE_SHA3_FIPS202} to indicate
|
|
|
conformance with the standard.
|
|
|
|
|
|
@defvr Constant NETTLE_SHA3_FIPS202
|
|
|
Defined to 1 in Nettle versions supporting FIPS 202. Undefined in
|
|
|
earlier versions.
|
|
|
@end defvr
|
|
|
|
|
|
Nettle defines SHA3-224 in @file{<nettle/sha3.h>}.
|
|
|
|
|
|
@deftp {Context struct} {struct sha3_224_ctx}
|
|
|
@end deftp
|
|
|
|
|
|
@defvr Constant SHA3_224_DIGEST_SIZE
|
|
|
The size of a SHA3_224 digest, i.e., 28.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant SHA3_224_BLOCK_SIZE
|
|
|
The internal block size of SHA3_224.
|
|
|
@end defvr
|
|
|
|
|
|
@deftypefun void sha3_224_init (struct sha3_224_ctx *@var{ctx})
|
|
|
Initialize the SHA3-224 state.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void sha3_224_update (struct sha3_224_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
Hash some more data.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void sha3_224_digest (struct sha3_224_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
Performs final processing and extracts the message digest, writing it
|
|
|
to @var{digest}. @var{length} may be smaller than
|
|
|
@code{SHA3_224_DIGEST_SIZE}, in which case only the first @var{length}
|
|
|
octets of the digest are written.
|
|
|
|
|
|
This function also resets the context.
|
|
|
@end deftypefun
|
|
|
|
|
|
@subsubsection @acronym{SHA3-256}
|
|
|
|
|
|
This is SHA3 with 256-bit output size, and possibly the most useful
|
|
|
of the SHA3 hash functions.
|
|
|
|
|
|
Nettle defines SHA3-256 in @file{<nettle/sha3.h>}.
|
|
|
|
|
|
@deftp {Context struct} {struct sha3_256_ctx}
|
|
|
@end deftp
|
|
|
|
|
|
@defvr Constant SHA3_256_DIGEST_SIZE
|
|
|
The size of a SHA3_256 digest, i.e., 32.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant SHA3_256_BLOCK_SIZE
|
|
|
The internal block size of SHA3_256.
|
|
|
@end defvr
|
|
|
|
|
|
@deftypefun void sha3_256_init (struct sha3_256_ctx *@var{ctx})
|
|
|
Initialize the SHA3-256 state.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void sha3_256_update (struct sha3_256_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
Hash some more data.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void sha3_256_digest (struct sha3_256_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
Performs final processing and extracts the message digest, writing it
|
|
|
to @var{digest}. @var{length} may be smaller than
|
|
|
@code{SHA3_256_DIGEST_SIZE}, in which case only the first @var{length}
|
|
|
octets of the digest are written.
|
|
|
|
|
|
This function also resets the context.
|
|
|
@end deftypefun
|
|
|
|
|
|
@subsubsection @acronym{SHA3-384}
|
|
|
|
|
|
This is SHA3 with 384-bit output size.
|
|
|
|
|
|
Nettle defines SHA3-384 in @file{<nettle/sha3.h>}.
|
|
|
|
|
|
@deftp {Context struct} {struct sha3_384_ctx}
|
|
|
@end deftp
|
|
|
|
|
|
@defvr Constant SHA3_384_DIGEST_SIZE
|
|
|
The size of a SHA3_384 digest, i.e., 48.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant SHA3_384_BLOCK_SIZE
|
|
|
The internal block size of SHA3_384.
|
|
|
@end defvr
|
|
|
|
|
|
@deftypefun void sha3_384_init (struct sha3_384_ctx *@var{ctx})
|
|
|
Initialize the SHA3-384 state.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void sha3_384_update (struct sha3_384_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
Hash some more data.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void sha3_384_digest (struct sha3_384_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
Performs final processing and extracts the message digest, writing it
|
|
|
to @var{digest}. @var{length} may be smaller than
|
|
|
@code{SHA3_384_DIGEST_SIZE}, in which case only the first @var{length}
|
|
|
octets of the digest are written.
|
|
|
|
|
|
This function also resets the context.
|
|
|
@end deftypefun
|
|
|
|
|
|
@subsubsection @acronym{SHA3-512}
|
|
|
|
|
|
This is SHA3 with 512-bit output size.
|
|
|
|
|
|
Nettle defines SHA3-512 in @file{<nettle/sha3.h>}.
|
|
|
|
|
|
@deftp {Context struct} {struct sha3_512_ctx}
|
|
|
@end deftp
|
|
|
|
|
|
@defvr Constant SHA3_512_DIGEST_SIZE
|
|
|
The size of a SHA3_512 digest, i.e. 64.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant SHA3_512_BLOCK_SIZE
|
|
|
The internal block size of SHA3_512.
|
|
|
@end defvr
|
|
|
|
|
|
@deftypefun void sha3_512_init (struct sha3_512_ctx *@var{ctx})
|
|
|
Initialize the SHA3-512 state.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void sha3_512_update (struct sha3_512_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
Hash some more data.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void sha3_512_digest (struct sha3_512_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
Performs final processing and extracts the message digest, writing it
|
|
|
to @var{digest}. @var{length} may be smaller than
|
|
|
@code{SHA3_512_DIGEST_SIZE}, in which case only the first @var{length}
|
|
|
octets of the digest are written.
|
|
|
|
|
|
This function also resets the context.
|
|
|
@end deftypefun
|
|
|
|
|
|
@subsubsection @acronym{SHAKE}
|
|
|
@cindex SHAKE
|
|
|
|
|
|
In addition to those SHA-3 hash functions, Nettle also supports a
|
|
|
SHA-3 extendable-output function (XOF) called SHAKE. Unlike hash
|
|
|
functions, SHAKE can produce an output digest of any desired
|
|
|
length. There are two variants, SHAKE-128 and SHAKE-256, with
|
|
|
different security strengths in terms of collision or preimage
|
|
|
resistance: SHAKE-128 internally uses a SHA-3 hash function with
|
|
|
128-bit security, while SHAKE-256 corresponds to SHA3-256 which
|
|
|
provides 256-bit security.
|
|
|
|
|
|
To use SHAKE, the context struct needs to be initialized with the
|
|
|
@code{init} function and data is hashed using the @code{update}
|
|
|
function. Afterwards, a digest can be generated using either the
|
|
|
@code{shake} or @code{shake_ouput} function, where the former
|
|
|
generates the digest at once and resets the context, while the latter
|
|
|
can be called multiple times to generate the digest in an incremental
|
|
|
manner.
|
|
|
|
|
|
For SHAKE-128 they are defined as follows.
|
|
|
|
|
|
@deftp {Context struct} {struct sha3_128_ctx}
|
|
|
@end deftp
|
|
|
|
|
|
@deftypefun void sha3_128_init (struct sha3_128_ctx *@var{ctx})
|
|
|
Initialize the SHA3-256 state.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void sha3_128_update (struct sha3_128_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
Hash some more data.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void sha3_128_shake (struct sha3_128_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
Performs final processing and produces a SHAKE-128 digest, writing it
|
|
|
to @var{digest}. @var{length} can be of arbitrary size.
|
|
|
|
|
|
This function also resets the context.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void sha3_128_shake_output (struct sha3_128_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
Performs final processing and produces a SHAKE-128 digest, writing it
|
|
|
to @var{digest}. @var{length} can be of arbitrary size.
|
|
|
|
|
|
This function does not reset the context.
|
|
|
@end deftypefun
|
|
|
|
|
|
For SHAKE-256, the corresponding context struct and the @code{init}
|
|
|
and @code{update} functions are the same as SHA3-256. To generate a
|
|
|
digest, use either the @code{shake} or @code{shake_output} function.
|
|
|
|
|
|
@deftypefun void sha3_256_shake (struct sha3_256_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
Performs final processing and produces a SHAKE-256 digest, writing it
|
|
|
to @var{digest}. @var{length} can be of arbitrary size.
|
|
|
|
|
|
This function also resets the context.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void sha3_256_shake_output (struct sha3_256_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
Performs final processing and produces a SHAKE-256 digest, writing it
|
|
|
to @var{digest}. @var{length} can be of arbitrary size.
|
|
|
|
|
|
This function does not reset the context.
|
|
|
@end deftypefun
|
|
|
|
|
|
@node Miscellaneous hash functions
|
|
|
@subsection Miscellaneous hash functions
|
|
|
|
|
|
@subsubsection @acronym{STREEBOG512}
|
|
|
|
|
|
STREEBOG512 is a member of the Streebog (GOST R 34.11-2012) family. It outputs
|
|
|
hash values of 512 bits, or 64 octets. Nettle defines STREEBOG512 in
|
|
|
@file{<nettle/streebog.h>}.
|
|
|
|
|
|
@deftp {Context struct} {struct streebog512_ctx}
|
|
|
@end deftp
|
|
|
|
|
|
@defvr Constant STREEBOG512_DIGEST_SIZE
|
|
|
The size of a STREEBOG512 digest, i.e. 64.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant STREEBOG512_BLOCK_SIZE
|
|
|
The internal block size of STREEBOG512. Useful for some special constructions,
|
|
|
in particular HMAC-STREEBOG512.
|
|
|
@end defvr
|
|
|
|
|
|
@deftypefun void streebog512_init (struct streebog512_ctx *@var{ctx})
|
|
|
Initialize the STREEBOG512 state.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void streebog512_update (struct streebog512_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
Hash some more data.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void streebog512_digest (struct streebog512_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
Performs final processing and extracts the message digest, writing it
|
|
|
to @var{digest}. @var{length} may be smaller than
|
|
|
@code{STREEBOG512_DIGEST_SIZE}, in which case only the first @var{length}
|
|
|
octets of the digest are written.
|
|
|
|
|
|
This function also resets the context in the same way as
|
|
|
@code{streebog512_init}.
|
|
|
@end deftypefun
|
|
|
|
|
|
@subsubsection @acronym{STREEBOG256}
|
|
|
|
|
|
STREEBOG256 is a variant of STREEBOG512, with a different initial state, and with
|
|
|
the output truncated to 256 bits, or 32 octets. Nettle defines STREEBOG256 in
|
|
|
@file{<nettle/streebog.h>}.
|
|
|
|
|
|
@deftp {Context struct} {struct streebog256_ctx}
|
|
|
@end deftp
|
|
|
|
|
|
@defvr Constant STREEBOG256_DIGEST_SIZE
|
|
|
The size of a STREEBOG256 digest, i.e. 32.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant STREEBOG256_BLOCK_SIZE
|
|
|
The internal block size of STREEBOG256. Useful for some special constructions,
|
|
|
in particular HMAC-STREEBOG256.
|
|
|
@end defvr
|
|
|
|
|
|
@deftypefun void streebog256_init (struct streebog256_ctx *@var{ctx})
|
|
|
Initialize the STREEBOG256 state.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void streebog256_update (struct streebog256_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
Hash some more data.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void streebog256_digest (struct streebog256_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
Performs final processing and extracts the message digest, writing it
|
|
|
to @var{digest}. @var{length} may be smaller than
|
|
|
@code{STREEBOG256_DIGEST_SIZE}, in which case only the first @var{length}
|
|
|
octets of the digest are written.
|
|
|
|
|
|
This function also resets the context in the same way as
|
|
|
@code{streebog256_init}.
|
|
|
@end deftypefun
|
|
|
|
|
|
@subsubsection @acronym{SM3}
|
|
|
|
|
|
SM3 is a cryptographic hash function standard adopted by the government of the
|
|
|
People's Republic of China, which was issued by the Cryptography Standardization
|
|
|
Technical Committee of China on December 17, 2010. The corresponding standard
|
|
|
is GM/T 0004-2012 "SM3 Cryptographic Hash Algorithm".
|
|
|
|
|
|
SM3 algorithm is a hash algorithm in ShangMi cryptosystems. SM3 is mainly used
|
|
|
for digital signature and verification, message authentication code generation
|
|
|
and verification, random number generation, and the RFC 8998 specification
|
|
|
defines the usage of ShangMi algorithm suite in TLS 1.3, etc. According to the
|
|
|
State Cryptography Administration of China, its security and efficiency are
|
|
|
equivalent to SHA-256.
|
|
|
|
|
|
Nettle defines SM3 in @file{<nettle/sm3.h>}.
|
|
|
|
|
|
@deftp {Context struct} {struct sm3_ctx}
|
|
|
@end deftp
|
|
|
|
|
|
@defvr Constant SM3_DIGEST_SIZE
|
|
|
The size of a SM3 digest, i.e. 32.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant SM3_BLOCK_SIZE
|
|
|
The internal block size of SM3. Useful for some special constructions,
|
|
|
in particular HMAC-SM3.
|
|
|
@end defvr
|
|
|
|
|
|
@deftypefun void sm3_init (struct sm3_ctx *@var{ctx})
|
|
|
Initialize the SM3 state.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void sm3_update (struct sm3_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
Hash some more data.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void sm3_digest (struct sm3_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
Performs final processing and extracts the message digest, writing it
|
|
|
to @var{digest}. @var{length} may be smaller than
|
|
|
@code{SM3_DIGEST_SIZE}, in which case only the first @var{length}
|
|
|
octets of the digest are written.
|
|
|
|
|
|
This function also resets the context in the same way as
|
|
|
@code{sm3_init}.
|
|
|
@end deftypefun
|
|
|
|
|
|
|
|
|
@node Legacy hash functions
|
|
|
@subsection Legacy hash functions
|
|
|
|
|
|
The hash functions in this section all have some known weaknesses, and
|
|
|
should be avoided for new applications. These hash functions are mainly
|
|
|
useful for compatibility with old applications and protocols. Some are
|
|
|
still considered safe as building blocks for particular constructions,
|
|
|
e.g., there seems to be no known attacks against HMAC-SHA1 or even
|
|
|
HMAC-MD5. In some important cases, use of a ``legacy'' hash function
|
|
|
does not in itself make the application insecure; if a known weakness is
|
|
|
relevant depends on how the hash function is used, and on the threat
|
|
|
model.
|
|
|
|
|
|
@subsubsection @acronym{MD5}
|
|
|
|
|
|
MD5 is a message digest function constructed by Ronald Rivest, and
|
|
|
described in @cite{RFC 1321}. It outputs message digests of 128 bits, or
|
|
|
16 octets. Nettle defines MD5 in @file{<nettle/md5.h>}.
|
|
|
|
|
|
@deftp {Context struct} {struct md5_ctx}
|
|
|
@end deftp
|
|
|
|
|
|
@defvr Constant MD5_DIGEST_SIZE
|
|
|
The size of an MD5 digest, i.e. 16.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant MD5_BLOCK_SIZE
|
|
|
The internal block size of MD5. Useful for some special constructions,
|
|
|
in particular HMAC-MD5.
|
|
|
@end defvr
|
|
|
|
|
|
@deftypefun void md5_init (struct md5_ctx *@var{ctx})
|
|
|
Initialize the MD5 state.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void md5_update (struct md5_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
Hash some more data.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void md5_digest (struct md5_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
Performs final processing and extracts the message digest, writing it
|
|
|
to @var{digest}. @var{length} may be smaller than
|
|
|
@code{MD5_DIGEST_SIZE}, in which case only the first @var{length}
|
|
|
octets of the digest are written.
|
|
|
|
|
|
This function also resets the context in the same way as
|
|
|
@code{md5_init}.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void md5_compress (const uint32_t *@var{state}, uint8_t *@var{input})
|
|
|
Perform a raw MD5 compress on MD5_BLOCK_SIZE bytes from @var{input}
|
|
|
using @var{state} as IV (an array of 4 uint32_t). The output is stored in @var{state}.
|
|
|
This function provides access to the underlying compression function,
|
|
|
for the rare applications that need that (e.g., using different IV from
|
|
|
standard MD5).
|
|
|
@end deftypefun
|
|
|
|
|
|
The normal way to use MD5 is to call the functions in order: First
|
|
|
@code{md5_init}, then @code{md5_update} zero or more times, and finally
|
|
|
@code{md5_digest}. After @code{md5_digest}, the context is reset to
|
|
|
its initial state, so you can start over calling @code{md5_update} to
|
|
|
hash new data.
|
|
|
|
|
|
To start over, you can call @code{md5_init} at any time.
|
|
|
|
|
|
@subsubsection @acronym{MD2}
|
|
|
|
|
|
MD2 is another hash function of Ronald Rivest's, described in
|
|
|
@cite{RFC 1319}. It outputs message digests of 128 bits, or 16 octets.
|
|
|
Nettle defines MD2 in @file{<nettle/md2.h>}.
|
|
|
|
|
|
@deftp {Context struct} {struct md2_ctx}
|
|
|
@end deftp
|
|
|
|
|
|
@defvr Constant MD2_DIGEST_SIZE
|
|
|
The size of an MD2 digest, i.e. 16.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant MD2_BLOCK_SIZE
|
|
|
The internal block size of MD2.
|
|
|
@end defvr
|
|
|
|
|
|
@deftypefun void md2_init (struct md2_ctx *@var{ctx})
|
|
|
Initialize the MD2 state.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void md2_update (struct md2_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
Hash some more data.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void md2_digest (struct md2_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
Performs final processing and extracts the message digest, writing it
|
|
|
to @var{digest}. @var{length} may be smaller than
|
|
|
@code{MD2_DIGEST_SIZE}, in which case only the first @var{length}
|
|
|
octets of the digest are written.
|
|
|
|
|
|
This function also resets the context in the same way as
|
|
|
@code{md2_init}.
|
|
|
@end deftypefun
|
|
|
|
|
|
@subsubsection @acronym{MD4}
|
|
|
|
|
|
MD4 is a predecessor of MD5, described in @cite{RFC 1320}. Like MD5, it
|
|
|
is constructed by Ronald Rivest. It outputs message digests of 128 bits,
|
|
|
or 16 octets. Nettle defines MD4 in @file{<nettle/md4.h>}. Use of MD4 is
|
|
|
not recommended, but it is sometimes needed for compatibility with
|
|
|
existing applications and protocols.
|
|
|
|
|
|
@deftp {Context struct} {struct md4_ctx}
|
|
|
@end deftp
|
|
|
|
|
|
@defvr Constant MD4_DIGEST_SIZE
|
|
|
The size of an MD4 digest, i.e. 16.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant MD4_BLOCK_SIZE
|
|
|
The internal block size of MD4.
|
|
|
@end defvr
|
|
|
|
|
|
@deftypefun void md4_init (struct md4_ctx *@var{ctx})
|
|
|
Initialize the MD4 state.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void md4_update (struct md4_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
Hash some more data.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void md4_digest (struct md4_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
Performs final processing and extracts the message digest, writing it
|
|
|
to @var{digest}. @var{length} may be smaller than
|
|
|
@code{MD4_DIGEST_SIZE}, in which case only the first @var{length}
|
|
|
octets of the digest are written.
|
|
|
|
|
|
This function also resets the context in the same way as
|
|
|
@code{md4_init}.
|
|
|
@end deftypefun
|
|
|
|
|
|
@subsubsection @acronym{RIPEMD160}
|
|
|
|
|
|
RIPEMD160 is a hash function designed by Hans Dobbertin, Antoon
|
|
|
Bosselaers, and Bart Preneel, as a strengthened version of RIPEMD
|
|
|
(which, like MD4 and MD5, fails the collision-resistance requirement).
|
|
|
It produces message digests of 160 bits, or 20 octets. Nettle defined
|
|
|
RIPEMD160 in @file{nettle/ripemd160.h}.
|
|
|
|
|
|
@deftp {Context struct} {struct ripemd160_ctx}
|
|
|
@end deftp
|
|
|
|
|
|
@defvr Constant RIPEMD160_DIGEST_SIZE
|
|
|
The size of a RIPEMD160 digest, i.e. 20.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant RIPEMD160_BLOCK_SIZE
|
|
|
The internal block size of RIPEMD160.
|
|
|
@end defvr
|
|
|
|
|
|
@deftypefun void ripemd160_init (struct ripemd160_ctx *@var{ctx})
|
|
|
Initialize the RIPEMD160 state.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void ripemd160_update (struct ripemd160_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
Hash some more data.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void ripemd160_digest (struct ripemd160_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
Performs final processing and extracts the message digest, writing it
|
|
|
to @var{digest}. @var{length} may be smaller than
|
|
|
@code{RIPEMD160_DIGEST_SIZE}, in which case only the first @var{length}
|
|
|
octets of the digest are written.
|
|
|
|
|
|
This function also resets the context in the same way as
|
|
|
@code{ripemd160_init}.
|
|
|
@end deftypefun
|
|
|
|
|
|
@subsubsection @acronym{SHA1}
|
|
|
|
|
|
SHA1 is a hash function specified by @dfn{NIST} (The U.S. National
|
|
|
Institute for Standards and Technology). It outputs hash values of 160
|
|
|
bits, or 20 octets. Nettle defines SHA1 in @file{<nettle/sha1.h>} (and
|
|
|
in @file{<nettle/sha.h>}, for backwards compatibility).
|
|
|
|
|
|
@deftp {Context struct} {struct sha1_ctx}
|
|
|
@end deftp
|
|
|
|
|
|
@defvr Constant SHA1_DIGEST_SIZE
|
|
|
The size of a SHA1 digest, i.e. 20.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant SHA1_BLOCK_SIZE
|
|
|
The internal block size of SHA1. Useful for some special constructions,
|
|
|
in particular HMAC-SHA1.
|
|
|
@end defvr
|
|
|
|
|
|
@deftypefun void sha1_init (struct sha1_ctx *@var{ctx})
|
|
|
Initialize the SHA1 state.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void sha1_update (struct sha1_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
Hash some more data.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void sha1_digest (struct sha1_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
Performs final processing and extracts the message digest, writing it
|
|
|
to @var{digest}. @var{length} may be smaller than
|
|
|
@code{SHA1_DIGEST_SIZE}, in which case only the first @var{length}
|
|
|
octets of the digest are written.
|
|
|
|
|
|
This function also resets the context in the same way as
|
|
|
@code{sha1_init}.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void sha1_compress (const uint32_t *@var{state}, uint8_t *@var{input})
|
|
|
Perform a raw SHA1 compress on SHA1_BLOCK_SIZE bytes from @var{input}
|
|
|
using @var{state} as IV (an array of 5 uint32_t). The output is stored in @var{state}.
|
|
|
This function provides access to the underlying compression function,
|
|
|
for the rare applications that need that (e.g., using different IV from
|
|
|
standard SHA1).
|
|
|
@end deftypefun
|
|
|
|
|
|
@subsubsection @acronym{GOSTHASH94 and GOSTHASH94CP}
|
|
|
@cindex GOST hash
|
|
|
|
|
|
@anchor{GOSTHASH94CP}
|
|
|
The GOST94 or GOST R 34.11-94 hash algorithm is a Soviet-era algorithm
|
|
|
used in Russian government standards (see @cite{RFC 4357}).
|
|
|
It outputs message digests of 256 bits, or 32 octets. The standard itself
|
|
|
does not fix the S-box used by the hash algorith, so there are two popular
|
|
|
variants (the testing S-box from the standard itself and the S-box defined
|
|
|
by CryptoPro company, see RFC 4357). Nettle provides support for the former
|
|
|
S-box in the form of GOSTHASH94 hash algorithm and for the latter in the
|
|
|
form of GOSTHASH94CP hash algorithm.
|
|
|
Nettle defines GOSTHASH94 and GOSTHASH94CP in @file{<nettle/gosthash94.h>}.
|
|
|
|
|
|
@deftp {Context struct} {struct gosthash94_ctx}
|
|
|
@end deftp
|
|
|
|
|
|
@defvr Constant GOSTHASH94_DIGEST_SIZE
|
|
|
The size of a GOSTHASH94 digest, i.e. 32.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant GOSTHASH94_BLOCK_SIZE
|
|
|
The internal block size of GOSTHASH94, i.e., 32.
|
|
|
@end defvr
|
|
|
|
|
|
@deftypefun void gosthash94_init (struct gosthash94_ctx *@var{ctx})
|
|
|
Initialize the GOSTHASH94 state.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void gosthash94_update (struct gosthash94_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
Hash some more data.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void gosthash94_digest (struct gosthash94_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
Performs final processing and extracts the message digest, writing it
|
|
|
to @var{digest}. @var{length} may be smaller than
|
|
|
@code{GOSTHASH94_DIGEST_SIZE}, in which case only the first @var{length}
|
|
|
octets of the digest are written.
|
|
|
|
|
|
This function also resets the context in the same way as
|
|
|
@code{gosthash94_init}.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftp {Context struct} {struct gosthash94cp_ctx}
|
|
|
@end deftp
|
|
|
|
|
|
@defvr Constant GOSTHASH94CP_DIGEST_SIZE
|
|
|
The size of a GOSTHASH94CP digest, i.e. 32.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant GOSTHASH94CP_BLOCK_SIZE
|
|
|
The internal block size of GOSTHASH94CP, i.e., 32.
|
|
|
@end defvr
|
|
|
|
|
|
@deftypefun void gosthash94cp_init (struct gosthash94cp_ctx *@var{ctx})
|
|
|
Initialize the GOSTHASH94CP state.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void gosthash94cp_update (struct gosthash94cp_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
Hash some more data.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void gosthash94cp_digest (struct gosthash94cp_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
Performs final processing and extracts the message digest, writing it
|
|
|
to @var{digest}. @var{length} may be smaller than
|
|
|
@code{GOSTHASH94CP_DIGEST_SIZE}, in which case only the first @var{length}
|
|
|
octets of the digest are written.
|
|
|
|
|
|
This function also resets the context in the same way as
|
|
|
@code{gosthash94cp_init}.
|
|
|
@end deftypefun
|
|
|
|
|
|
@node nettle_hash abstraction
|
|
|
@subsection The @code{struct nettle_hash} abstraction
|
|
|
@cindex nettle_hash
|
|
|
|
|
|
Nettle includes a struct including information about the supported hash
|
|
|
functions. It is defined in @file{<nettle/nettle-meta.h>}, and is used
|
|
|
by Nettle's implementation of @acronym{HMAC} (@pxref{Keyed hash
|
|
|
functions}).
|
|
|
|
|
|
@deftp {Meta struct} @code{struct nettle_hash} name context_size digest_size block_size init update digest
|
|
|
The last three attributes are function pointers, of types
|
|
|
@code{nettle_hash_init_func *}, @code{nettle_hash_update_func *}, and
|
|
|
@code{nettle_hash_digest_func *}. The first argument to these functions is
|
|
|
@code{void *} pointer to a context struct, which is of size
|
|
|
@code{context_size}.
|
|
|
@end deftp
|
|
|
|
|
|
@deftypevr {Constant Struct} {struct nettle_hash} nettle_md2
|
|
|
@deftypevrx {Constant Struct} {struct nettle_hash} nettle_md4
|
|
|
@deftypevrx {Constant Struct} {struct nettle_hash} nettle_md5
|
|
|
@deftypevrx {Constant Struct} {struct nettle_hash} nettle_ripemd160
|
|
|
@deftypevrx {Constant Struct} {struct nettle_hash} nettle_sha1
|
|
|
@deftypevrx {Constant Struct} {struct nettle_hash} nettle_sha224
|
|
|
@deftypevrx {Constant Struct} {struct nettle_hash} nettle_sha256
|
|
|
@deftypevrx {Constant Struct} {struct nettle_hash} nettle_sha384
|
|
|
@deftypevrx {Constant Struct} {struct nettle_hash} nettle_sha512
|
|
|
@deftypevrx {Constant Struct} {struct nettle_hash} nettle_sha3_256
|
|
|
@deftypevrx {Constant Struct} {struct nettle_hash} nettle_gosthash94
|
|
|
@deftypevrx {Constant Struct} {struct nettle_hash} nettle_gosthash94cp
|
|
|
@deftypevrx {Constant Struct} {struct nettle_hash} nettle_sm3
|
|
|
These are all the hash functions that Nettle implements.
|
|
|
@end deftypevr
|
|
|
|
|
|
Nettle also exports a list of all these hashes.
|
|
|
|
|
|
@deftypefun {const struct nettle_hash **} nettle_get_hashes (void)
|
|
|
Returns a NULL-terminated list of pointers to supported hash functions.
|
|
|
This list can be used to dynamically enumerate or search the supported
|
|
|
algorithms.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deffn Macro nettle_hashes
|
|
|
A macro expanding to a call to nettle_get_hashes, so that one could
|
|
|
write, e.g., @code{nettle_hashes[0]->name} for the name of the first
|
|
|
hash function on the list. In earlier versions, this was not a macro but
|
|
|
the actual array of pointers. However, referring directly to the array
|
|
|
makes the array size leak into the ABI in some cases.
|
|
|
@end deffn
|
|
|
|
|
|
@node Cipher functions
|
|
|
@section Cipher functions
|
|
|
@cindex Cipher
|
|
|
|
|
|
A @dfn{cipher} is a function that takes a message or @dfn{plaintext}
|
|
|
and a secret @dfn{key} and transforms it to a @dfn{ciphertext}. Given
|
|
|
only the ciphertext, but not the key, it should be hard to find the
|
|
|
plaintext. Given matching pairs of plaintext and ciphertext, it should
|
|
|
be hard to find the key.
|
|
|
|
|
|
@cindex Block Cipher
|
|
|
@cindex Stream Cipher
|
|
|
|
|
|
There are two main classes of ciphers: Block ciphers and stream ciphers.
|
|
|
|
|
|
A block cipher can process data only in fixed size chunks, called
|
|
|
@dfn{blocks}. Typical block sizes are 8 or 16 octets. To encrypt
|
|
|
arbitrary messages, you usually have to pad it to an integral number of
|
|
|
blocks, split it into blocks, and then process each block. The simplest
|
|
|
way is to process one block at a time, independent of each other. That
|
|
|
mode of operation is called @dfn{ECB}, Electronic Code Book mode.
|
|
|
However, using @acronym{ECB} is usually a bad idea. For a start, plaintext blocks
|
|
|
that are equal are transformed to ciphertext blocks that are equal; that
|
|
|
leaks information about the plaintext. Usually you should apply the
|
|
|
cipher is some ``feedback mode'', @dfn{CBC} (Cipher Block Chaining) and
|
|
|
@dfn{CTR} (Counter mode) being two of
|
|
|
of the most popular. See @xref{Cipher modes}, for information on
|
|
|
how to apply @acronym{CBC} and @acronym{CTR} with Nettle.
|
|
|
|
|
|
A stream cipher can be used for messages of arbitrary length. A typical
|
|
|
stream cipher is a keyed pseudo-random generator. To encrypt a plaintext
|
|
|
message of @var{n} octets, you key the generator, generate @var{n}
|
|
|
octets of pseudo-random data, and XOR it with the plaintext. To decrypt,
|
|
|
regenerate the same stream using the key, XOR it to the ciphertext, and
|
|
|
the plaintext is recovered.
|
|
|
|
|
|
@strong{Caution:} The first rule for this kind of cipher is the
|
|
|
same as for a One Time Pad: @emph{never} ever use the same key twice.
|
|
|
|
|
|
A common misconception is that encryption, by itself, implies
|
|
|
authentication. Say that you and a friend share a secret key, and you
|
|
|
receive an encrypted message. You apply the key, and get a plaintext
|
|
|
message that makes sense to you. Can you then be sure that it really was
|
|
|
your friend that wrote the message you're reading? The answer is no. For
|
|
|
example, if you were using a block cipher in ECB mode, an attacker may
|
|
|
pick up the message on its way, and reorder, delete or repeat some of
|
|
|
the blocks. Even if the attacker can't decrypt the message, he can
|
|
|
change it so that you are not reading the same message as your friend
|
|
|
wrote. If you are using a block cipher in @acronym{CBC} mode rather than
|
|
|
ECB, or are using a stream cipher, the possibilities for this sort of
|
|
|
attack are different, but the attacker can still make predictable
|
|
|
changes to the message.
|
|
|
|
|
|
It is recommended to @emph{always} use an authentication mechanism in
|
|
|
addition to encrypting the messages. Popular choices are Message
|
|
|
Authentication Codes like @acronym{HMAC-SHA1} (@pxref{Keyed hash
|
|
|
functions}), or digital signatures like @acronym{RSA}.
|
|
|
|
|
|
Some ciphers have so called ``weak keys'', keys that results in
|
|
|
undesirable structure after the key setup processing, and should be
|
|
|
avoided. In Nettle, most key setup functions have no return value, but
|
|
|
for ciphers with weak keys, the return value indicates whether or not
|
|
|
the given key is weak. For good keys, key setup returns 1, and for weak
|
|
|
keys, it returns 0. When possible, avoid algorithms that
|
|
|
have weak keys. There are several good ciphers that don't have any weak
|
|
|
keys.
|
|
|
|
|
|
To encrypt a message, you first initialize a cipher context for
|
|
|
encryption or decryption with a particular key. You then use the context
|
|
|
to process plaintext or ciphertext messages. The initialization is known
|
|
|
as @dfn{key setup}. With Nettle, it is recommended to use each
|
|
|
context struct for only one direction, even if some of the ciphers use a
|
|
|
single key setup function that can be used for both encryption and
|
|
|
decryption.
|
|
|
|
|
|
@menu
|
|
|
* AES::
|
|
|
* Arcfour::
|
|
|
* Arctwo::
|
|
|
* Blowfish::
|
|
|
* Camellia::
|
|
|
* CAST128::
|
|
|
* ChaCha::
|
|
|
* DES::
|
|
|
* DES3::
|
|
|
* Salsa20::
|
|
|
* Serpent::
|
|
|
* SM4::
|
|
|
* Twofish::
|
|
|
* nettle_cipher abstraction::
|
|
|
@end menu
|
|
|
|
|
|
@node AES
|
|
|
@subsection AES
|
|
|
@cindex AES
|
|
|
|
|
|
AES is a block cipher, specified by NIST as a replacement for
|
|
|
the older DES standard. The standard is the result of a competition
|
|
|
between cipher designers. The winning design, also known as RIJNDAEL,
|
|
|
was constructed by Joan Daemen and Vincent Rijnmen.
|
|
|
|
|
|
Like all the AES candidates, the winning design uses a block size of 128
|
|
|
bits, or 16 octets, and three possible key-size, 128, 192 and 256 bits
|
|
|
(16, 24 and 32 octets) being the allowed key sizes. It does not have any
|
|
|
weak keys. Nettle defines AES in @file{<nettle/aes.h>}, and there is one
|
|
|
context struct for each key size. (Earlier versions of Nettle used a
|
|
|
single context struct, @code{struct aes_ctx}, for all key sizes. This
|
|
|
interface kept for backwards compatibility).
|
|
|
|
|
|
@deftp {Context struct} {struct aes128_ctx}
|
|
|
@deftpx {Context struct} {struct aes192_ctx}
|
|
|
@deftpx {Context struct} {struct aes256_ctx}
|
|
|
@end deftp
|
|
|
|
|
|
@deftp {Context struct} {struct aes_ctx}
|
|
|
Alternative struct, for the old AES interface.
|
|
|
@end deftp
|
|
|
|
|
|
@defvr Constant AES_BLOCK_SIZE
|
|
|
The AES block-size, 16.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant AES128_KEY_SIZE
|
|
|
@defvrx Constant AES192_KEY_SIZE
|
|
|
@defvrx Constant AES256_KEY_SIZE
|
|
|
@defvrx Constant AES_MIN_KEY_SIZE
|
|
|
@defvrx Constant AES_MAX_KEY_SIZE
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant AES_KEY_SIZE
|
|
|
Default AES key size, 32.
|
|
|
@end defvr
|
|
|
|
|
|
@deftypefun void aes128_set_encrypt_key (struct aes128_ctx *@var{ctx}, const uint8_t *@var{key})
|
|
|
@deftypefunx void aes128_set_decrypt_key (struct aes128_ctx *@var{ctx}, const uint8_t *@var{key})
|
|
|
@deftypefunx void aes192_set_encrypt_key (struct aes192_ctx *@var{ctx}, const uint8_t *@var{key})
|
|
|
@deftypefunx void aes192_set_decrypt_key (struct aes192_ctx *@var{ctx}, const uint8_t *@var{key})
|
|
|
@deftypefunx void aes256_set_encrypt_key (struct aes256_ctx *@var{ctx}, const uint8_t *@var{key})
|
|
|
@deftypefunx void aes256_set_decrypt_key (struct aes256_ctx *@var{ctx}, const uint8_t *@var{key})
|
|
|
@deftypefunx void aes_set_encrypt_key (struct aes_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{key})
|
|
|
@deftypefunx void aes_set_decrypt_key (struct aes_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{key})
|
|
|
Initialize the cipher, for encryption or decryption, respectively.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void aes128_invert_key (struct aes128_ctx *@var{dst}, const struct aes128_ctx *@var{src})
|
|
|
@deftypefunx void aes192_invert_key (struct aes192_ctx *@var{dst}, const struct aes192_ctx *@var{src})
|
|
|
@deftypefunx void aes256_invert_key (struct aes256_ctx *@var{dst}, const struct aes256_ctx *@var{src})
|
|
|
@deftypefunx void aes_invert_key (struct aes_ctx *@var{dst}, const struct aes_ctx *@var{src})
|
|
|
Given a context @var{src} initialized for encryption, initializes the
|
|
|
context struct @var{dst} for decryption, using the same key. If the same
|
|
|
context struct is passed for both @code{src} and @code{dst}, it is
|
|
|
converted in place. These functions are mainly useful for applications
|
|
|
which needs to both encrypt and decrypt using the @emph{same} key,
|
|
|
because calling, e.g., @code{aes128_set_encrypt_key} and
|
|
|
@code{aes128_invert_key}, is more efficient than calling
|
|
|
@code{aes128_set_encrypt_key} and @code{aes128_set_decrypt_key}.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void aes128_encrypt (struct aes128_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx void aes192_encrypt (struct aes192_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx void aes256_encrypt (struct aes256_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx void aes_encrypt (struct aes_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Encryption function. @var{length} must be an integral multiple of the
|
|
|
block size. If it is more than one block, the data is processed in ECB
|
|
|
mode. @code{src} and @code{dst} may be equal, but they must not overlap
|
|
|
in any other way.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void aes128_decrypt (struct aes128_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx void aes192_decrypt (struct aes192_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx void aes256_decrypt (struct aes256_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx void aes_decrypt (struct aes_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Analogous to the encryption functions above.
|
|
|
@end deftypefun
|
|
|
|
|
|
@node Arcfour
|
|
|
@subsection Arcfour
|
|
|
@cindex Arcfour
|
|
|
@cindex RC4
|
|
|
|
|
|
ARCFOUR is a historic stream cipher, also known under the trade marked
|
|
|
name RC4, and was a widely used fast stream cipher.
|
|
|
|
|
|
We do not recommend the use of ARCFOUR; the Nettle implementation is
|
|
|
provided primarily for interoperability with existing applications and
|
|
|
standards.
|
|
|
|
|
|
One problem is that the key setup of ARCFOUR is quite weak, you should
|
|
|
never use keys with structure, keys that are ordinary passwords, or
|
|
|
sequences of keys like ``secret:1'', ``secret:2'', @enddots{}. If you
|
|
|
have keys that don't look like random bit strings, and you want to use
|
|
|
ARCFOUR, always hash the key before feeding it to ARCFOUR.
|
|
|
|
|
|
Another problem is that the output is distinguishable from random data,
|
|
|
and that the initial bytes of the generated key stream leak information
|
|
|
about the key; for this reason, it was sometimes recommended to discard
|
|
|
the first 512, 768 or 1024 bytes of the key stream.
|
|
|
|
|
|
@example
|
|
|
/* A more robust key setup function for ARCFOUR */
|
|
|
void
|
|
|
arcfour_set_key_hashed(struct arcfour_ctx *ctx,
|
|
|
size_t length, const uint8_t *key)
|
|
|
@{
|
|
|
struct sha256_ctx hash;
|
|
|
uint8_t digest[SHA256_DIGEST_SIZE];
|
|
|
uint8_t buffer[0x200];
|
|
|
|
|
|
sha256_init(&hash);
|
|
|
sha256_update(&hash, length, key);
|
|
|
sha256_digest(&hash, SHA256_DIGEST_SIZE, digest);
|
|
|
|
|
|
arcfour_set_key(ctx, SHA256_DIGEST_SIZE, digest);
|
|
|
arcfour_crypt(ctx, sizeof(buffer), buffer, buffer);
|
|
|
@}
|
|
|
@end example
|
|
|
|
|
|
Nettle defines ARCFOUR in @file{<nettle/arcfour.h>}.
|
|
|
|
|
|
@deftp {Context struct} {struct arcfour_ctx}
|
|
|
@end deftp
|
|
|
|
|
|
@defvr Constant ARCFOUR_MIN_KEY_SIZE
|
|
|
Minimum key size, 1.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant ARCFOUR_MAX_KEY_SIZE
|
|
|
Maximum key size, 256.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant ARCFOUR_KEY_SIZE
|
|
|
Default ARCFOUR key size, 16.
|
|
|
@end defvr
|
|
|
|
|
|
@deftypefun void arcfour_set_key (struct arcfour_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{key})
|
|
|
Initialize the cipher. The same function is used for both encryption and
|
|
|
decryption.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void arcfour_crypt (struct arcfour_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Encrypt some data. The same function is used for both encryption and
|
|
|
decryption. Unlike the block ciphers, this function modifies the
|
|
|
context, so you can split the data into arbitrary chunks and encrypt
|
|
|
them one after another. The result is the same as if you had called
|
|
|
@code{arcfour_crypt} only once with all the data.
|
|
|
@end deftypefun
|
|
|
|
|
|
@node Arctwo
|
|
|
@subsection Arctwo
|
|
|
@cindex Arctwo
|
|
|
@cindex RC2
|
|
|
|
|
|
ARCTWO (also known as the trade marked name RC2) is a block cipher
|
|
|
specified in RFC 2268. Nettle also include a variation of the ARCTWO
|
|
|
set key operation that lack one step, to be compatible with the
|
|
|
reverse engineered RC2 cipher description, as described in a Usenet
|
|
|
post to @code{sci.crypt} by Peter Gutmann.
|
|
|
|
|
|
ARCTWO uses a block size of 64 bits, and variable key-size ranging
|
|
|
from 1 to 128 octets. Besides the key, ARCTWO also has a second
|
|
|
parameter to key setup, the number of effective key bits, @code{ekb}.
|
|
|
This parameter can be used to artificially reduce the key size. In
|
|
|
practice, @code{ekb} is usually set equal to the input key size.
|
|
|
Nettle defines ARCTWO in @file{<nettle/arctwo.h>}.
|
|
|
|
|
|
We do not recommend the use of ARCTWO; the Nettle implementation is
|
|
|
provided primarily for interoperability with existing applications and
|
|
|
standards.
|
|
|
|
|
|
@deftp {Context struct} {struct arctwo_ctx}
|
|
|
@end deftp
|
|
|
|
|
|
@defvr Constant ARCTWO_BLOCK_SIZE
|
|
|
The ARCTWO block-size, 8.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant ARCTWO_MIN_KEY_SIZE
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant ARCTWO_MAX_KEY_SIZE
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant ARCTWO_KEY_SIZE
|
|
|
Default ARCTWO key size, 8.
|
|
|
@end defvr
|
|
|
|
|
|
@deftypefun void arctwo_set_key_ekb (struct arctwo_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{key}, unsigned @var{ekb})
|
|
|
@deftypefunx void arctwo_set_key (struct arctwo_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{key})
|
|
|
@deftypefunx void arctwo_set_key_gutmann (struct arctwo_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{key})
|
|
|
Initialize the cipher. The same function is used for both encryption
|
|
|
and decryption. The first function is the most general one, which lets
|
|
|
you provide both the variable size key, and the desired effective key
|
|
|
size (in bits). The maximum value for @var{ekb} is 1024, and for
|
|
|
convenience, @code{ekb = 0} has the same effect as @code{ekb = 1024}.
|
|
|
|
|
|
@code{arctwo_set_key(ctx, length, key)} is equivalent to
|
|
|
@code{arctwo_set_key_ekb(ctx, length, key, 8*length)}, and
|
|
|
@code{arctwo_set_key_gutmann(ctx, length, key)} is equivalent to
|
|
|
@code{arctwo_set_key_ekb(ctx, length, key, 1024)}
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void arctwo_encrypt (struct arctwo_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Encryption function. @var{length} must be an integral multiple of the
|
|
|
block size. If it is more than one block, the data is processed in ECB
|
|
|
mode. @code{src} and @code{dst} may be equal, but they must not
|
|
|
overlap in any other way.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void arctwo_decrypt (struct arctwo_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Analogous to @code{arctwo_encrypt}
|
|
|
@end deftypefun
|
|
|
|
|
|
@node Blowfish
|
|
|
@subsection Blowfish
|
|
|
@cindex Blowfish
|
|
|
|
|
|
BLOWFISH is a block cipher designed by Bruce Schneier. It uses a block
|
|
|
size of 64 bits (8 octets), and a variable key size, up to 448 bits. It
|
|
|
has some weak keys. Nettle defines BLOWFISH in @file{<nettle/blowfish.h>}.
|
|
|
|
|
|
@deftp {Context struct} {struct blowfish_ctx}
|
|
|
@end deftp
|
|
|
|
|
|
@defvr Constant BLOWFISH_BLOCK_SIZE
|
|
|
The BLOWFISH block-size, 8.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant BLOWFISH_MIN_KEY_SIZE
|
|
|
Minimum BLOWFISH key size, 8.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant BLOWFISH_MAX_KEY_SIZE
|
|
|
Maximum BLOWFISH key size, 56.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant BLOWFISH_KEY_SIZE
|
|
|
Default BLOWFISH key size, 16.
|
|
|
@end defvr
|
|
|
|
|
|
@deftypefun int blowfish_set_key (struct blowfish_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{key})
|
|
|
Initialize the cipher. The same function is used for both encryption and
|
|
|
decryption. Checks for weak keys, returning 1
|
|
|
for good keys and 0 for weak keys. Applications that don't care about
|
|
|
weak keys can ignore the return value.
|
|
|
|
|
|
@code{blowfish_encrypt} or @code{blowfish_decrypt} with a weak key will
|
|
|
crash with an assert violation.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void blowfish_encrypt (struct blowfish_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Encryption function. @var{length} must be an integral multiple of the
|
|
|
block size. If it is more than one block, the data is processed in ECB
|
|
|
mode. @code{src} and @code{dst} may be equal, but they must not overlap
|
|
|
in any other way.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void blowfish_decrypt (struct blowfish_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Analogous to @code{blowfish_encrypt}
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun int blowfish_bcrypt_hash (char *@var{dst}, size_t @var{lenkey}, const char *@var{key}, size_t @var{lenscheme}, const char *@var{scheme}, int @var{log2rounds}, const uint8_t *@var{salt})
|
|
|
Compute the bcrypt password hash.
|
|
|
The function will return @code{0} if the hash cannot be computed
|
|
|
due to invalid input.
|
|
|
The function will return @code{1} and store the computed hash
|
|
|
in the array pointed to by @var{dst}. The hash is computed based
|
|
|
on the chosen @var{scheme}, number of rounds @var{log2rounds} and
|
|
|
specified @var{salt}.
|
|
|
|
|
|
@var{dst} must point to a character array of at least
|
|
|
@code{BLOWFISH_BCRYPT_HASH_SIZE} bytes.
|
|
|
|
|
|
@var{key} contains the plaintext password string of size @var{lenkey}.
|
|
|
|
|
|
@var{scheme} is of size @var{lenscheme} and contains either just the
|
|
|
chosen scheme (valid schemes
|
|
|
are: @code{2a}, @code{2b}, @code{2x} or @code{2y}), or
|
|
|
(the prefix of) an existing hashed password (typically @code{$2b$10$...}).
|
|
|
|
|
|
@var{log2rounds} contains the log2 of the number of encryption rounds
|
|
|
that must be used to compute the hash. If it is @code{-1} the value
|
|
|
will be extracted from @var{scheme}.
|
|
|
|
|
|
@var{salt} should point to an array of @code{BLOWFISH_BCRYPT_BINSALT_SIZE}
|
|
|
random bytes to be used to perturb the hash computation. If it is @code{NULL}
|
|
|
the salt will be extracted from @var{scheme}.
|
|
|
|
|
|
Sample code to generate a bcrypt hash:
|
|
|
@example
|
|
|
char password[] = "ExamplePassword";
|
|
|
char scheme[] = "2b";
|
|
|
uint8_t salt[BLOWFISH_BCRYPT_BINSALT_SIZE];
|
|
|
@dots{}
|
|
|
/* Make sure that salt is filled with random bytes */
|
|
|
@dots{}
|
|
|
char hash[BLOWFISH_BCRYPT_HASH_SIZE];
|
|
|
int result = blowfish_bcrypt(hash,
|
|
|
sizeof(password) - 1, password,
|
|
|
sizeof(scheme) - 1, scheme, 10, salt);
|
|
|
if (result)
|
|
|
printf("%s\n", hash);
|
|
|
@end example
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun int blowfish_bcrypt_verify (size_t @var{lenkey}, const char *@var{key}, size_t @var{lenhashed}, const char *@var{hashed})
|
|
|
Verifies the bcrypt password hash against the supplied plaintext password.
|
|
|
The function will return @code{0} if the password does not match.
|
|
|
The function will return @code{1} if the password matches.
|
|
|
|
|
|
@var{key} contains the plaintext password string of size @var{lenkey}.
|
|
|
|
|
|
@var{hashed} contains the hashed string of size @var{lenhashed} to compare with.
|
|
|
|
|
|
Sample code to verify a bcrypt hash:
|
|
|
@example
|
|
|
char password[] = "ExamplePassword";
|
|
|
char hash[] =
|
|
|
"$2y$" /* Hash algorithm version */
|
|
|
"10" /* 2^10 hash rounds (strength) */
|
|
|
"$" /* separator */
|
|
|
"1b2lPgo4XumibnJGN3r3sO" /* base64 encoded 16-byte salt */
|
|
|
"u7wE7xNfYDKlAxZffJDCJdVfFTAyevu"; /* Hashedpart */
|
|
|
if (blowfish_bcrypt_verify(sizeof(password) - 1, password,
|
|
|
sizeof(hash) - 1, hash))
|
|
|
printf("Password is correct.");
|
|
|
else
|
|
|
printf("Password is incorrect.");
|
|
|
@end example
|
|
|
@end deftypefun
|
|
|
|
|
|
@node Camellia
|
|
|
@subsection Camellia
|
|
|
@cindex Camellia
|
|
|
|
|
|
Camellia is a block cipher developed by Mitsubishi and Nippon Telegraph
|
|
|
and Telephone Corporation, described in @cite{RFC3713}. It is
|
|
|
recommended by some Japanese and European authorities as an alternative
|
|
|
to AES, and it is one of the selected algorithms in the New European
|
|
|
Schemes for Signatures, Integrity and Encryption (NESSIE) project. The
|
|
|
algorithm is patented. The implementation in Nettle is derived from the
|
|
|
implementation released by NTT under the GNU LGPL (v2.1 or later), and
|
|
|
relies on the implicit patent license of the LGPL. There is also a
|
|
|
statement of royalty-free licensing for Camellia at
|
|
|
@url{https://www.ntt.co.jp/news/news01e/0104/010417.html}, but this
|
|
|
statement has some limitations which seem problematic for free software.
|
|
|
|
|
|
Camellia uses a the same block size and key sizes as AES: The block size
|
|
|
is 128 bits (16 octets), and the supported key sizes are 128, 192, and
|
|
|
256 bits. The variants with 192 and 256 bit keys are identical, except
|
|
|
for the key setup. Nettle defines Camellia in
|
|
|
@file{<nettle/camellia.h>}, and there is one context struct for each key
|
|
|
size. (Earlier versions of Nettle used a single context struct,
|
|
|
@code{struct camellia_ctx}, for all key sizes. This interface kept for
|
|
|
backwards compatibility).
|
|
|
|
|
|
@deftp {Context struct} {struct camellia128_ctx}
|
|
|
@deftpx {Context struct} {struct camellia192_ctx}
|
|
|
@deftpx {Context struct} {struct camellia256_ctx}
|
|
|
Contexts structs. Actually, @code{camellia192_ctx} is an alias for
|
|
|
@code{camellia256_ctx}.
|
|
|
@end deftp
|
|
|
|
|
|
@deftp {Context struct} {struct camellia_ctx}
|
|
|
Alternative struct, for the old Camellia interface.
|
|
|
@end deftp
|
|
|
|
|
|
@defvr Constant CAMELLIA_BLOCK_SIZE
|
|
|
The CAMELLIA block-size, 16.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant CAMELLIA128_KEY_SIZE
|
|
|
@defvrx Constant CAMELLIA192_KEY_SIZE
|
|
|
@defvrx Constant CAMELLIA256_KEY_SIZE
|
|
|
@defvrx Constant CAMELLIA_MIN_KEY_SIZE
|
|
|
@defvrx Constant CAMELLIA_MAX_KEY_SIZE
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant CAMELLIA_KEY_SIZE
|
|
|
Default CAMELLIA key size, 32.
|
|
|
@end defvr
|
|
|
|
|
|
@deftypefun void camellia128_set_encrypt_key (struct camellia128_ctx *@var{ctx}, const uint8_t *@var{key})
|
|
|
@deftypefunx void camellia128_set_decrypt_key (struct camellia128_ctx *@var{ctx}, const uint8_t *@var{key})
|
|
|
@deftypefunx void camellia192_set_encrypt_key (struct camellia192_ctx *@var{ctx}, const uint8_t *@var{key})
|
|
|
@deftypefunx void camellia192_set_decrypt_key (struct camellia192_ctx *@var{ctx}, const uint8_t *@var{key})
|
|
|
@deftypefunx void camellia256_set_encrypt_key (struct camellia256_ctx *@var{ctx}, const uint8_t *@var{key})
|
|
|
@deftypefunx void camellia256_set_decrypt_key (struct camellia256_ctx *@var{ctx}, const uint8_t *@var{key})
|
|
|
@deftypefunx void camellia_set_encrypt_key (struct camellia_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{key})
|
|
|
@deftypefunx void camellia_set_decrypt_key (struct camellia_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{key})
|
|
|
Initialize the cipher, for encryption or decryption, respectively.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void camellia128_invert_key (struct camellia128_ctx *@var{dst}, const struct camellia128_ctx *@var{src})
|
|
|
@deftypefunx void camellia192_invert_key (struct camellia192_ctx *@var{dst}, const struct camellia192_ctx *@var{src})
|
|
|
@deftypefunx void camellia256_invert_key (struct camellia256_ctx *@var{dst}, const struct camellia256_ctx *@var{src})
|
|
|
@deftypefunx void camellia_invert_key (struct camellia_ctx *@var{dst}, const struct camellia_ctx *@var{src})
|
|
|
Given a context @var{src} initialized for encryption, initializes the
|
|
|
context struct @var{dst} for decryption, using the same key. If the same
|
|
|
context struct is passed for both @code{src} and @code{dst}, it is
|
|
|
converted in place. These functions are mainly useful for applications
|
|
|
which needs to both encrypt and decrypt using the @emph{same} key.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void camellia128_crypt (struct camellia128_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx void camellia192_crypt (struct camellia192_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx void camellia256_crypt (struct camellia256_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx void camellia_crypt (struct camellia_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
The same function is used for both encryption and decryption.
|
|
|
@var{length} must be an integral multiple of the block size. If it is
|
|
|
more than one block, the data is processed in ECB mode. @code{src} and
|
|
|
@code{dst} may be equal, but they must not overlap in any other way.
|
|
|
@end deftypefun
|
|
|
|
|
|
@node CAST128
|
|
|
@subsection CAST128
|
|
|
@cindex CAST
|
|
|
|
|
|
CAST-128 is a block cipher, specified in @cite{RFC 2144}. It uses a 64
|
|
|
bit (8 octets) block size, and a key size of 128 bits. It is possible,
|
|
|
but discouraged, to use the same algorithm with shorter keys. Nettle
|
|
|
refers to the variant with variable key size as CAST-5. Keys for CAST-5
|
|
|
are zero padded to 128 bits, and with very short keys, less than 80
|
|
|
bits, encryption also uses fewer rounds than CAST128. Nettle defines
|
|
|
cast128 in @file{<nettle/cast128.h>}.
|
|
|
|
|
|
@deftp {Context struct} {struct cast128_ctx}
|
|
|
@end deftp
|
|
|
|
|
|
@defvr Constant CAST128_BLOCK_SIZE
|
|
|
The CAST128 block-size, 8.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant CAST128_KEY_SIZE
|
|
|
The CAST128 key size, 16.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant CAST5_MIN_KEY_SIZE
|
|
|
Minimum CAST5 key size, 5.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant CAST5_MAX_KEY_SIZE
|
|
|
Maximum CAST5 key size, 16. With 16 octets key (128 bits), CAST-5 is the
|
|
|
same as CAST-128.
|
|
|
@end defvr
|
|
|
|
|
|
@deftypefun void cast128_set_key (struct cast128_ctx *@var{ctx}, const uint8_t *@var{key})
|
|
|
Initialize the cipher. The same function is used for both encryption and
|
|
|
decryption.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void cast128_encrypt (struct cast128_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Encryption function. @var{length} must be an integral multiple of the
|
|
|
block size. If it is more than one block, the data is processed in ECB
|
|
|
mode. @code{src} and @code{dst} may be equal, but they must not overlap
|
|
|
in any other way.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void cast128_decrypt (struct cast128_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Analogous to @code{cast128_encrypt}
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void cast5_set_key (struct cast128_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{key})
|
|
|
Initialize the cipher. This variant of the key setup takes the key size
|
|
|
as argument. The same function is used for both encryption and
|
|
|
decryption.
|
|
|
@end deftypefun
|
|
|
|
|
|
@node ChaCha
|
|
|
@subsection ChaCha
|
|
|
@cindex ChaCha
|
|
|
|
|
|
ChaCha is a variant of the stream cipher Salsa20 (@pxref{Salsa20}),
|
|
|
below, also designed by D. J. Bernstein. Nettle defines ChaCha in
|
|
|
@file{<nettle/chacha.h>}.
|
|
|
|
|
|
@deftp {Context struct} {struct chacha_ctx}
|
|
|
@end deftp
|
|
|
|
|
|
@defvr Constant CHACHA_KEY_SIZE
|
|
|
ChaCha key size, 32.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant CHACHA_BLOCK_SIZE
|
|
|
ChaCha block size, 64.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant CHACHA_NONCE_SIZE
|
|
|
Size of the nonce, 8.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant CHACHA_COUNTER_SIZE
|
|
|
Size of the counter, 8.
|
|
|
@end defvr
|
|
|
|
|
|
@deftypefun void chacha_set_key (struct chacha_ctx *@var{ctx}, const uint8_t *@var{key})
|
|
|
Initialize the cipher. The same function is used for both encryption and
|
|
|
decryption. Before using the cipher,
|
|
|
you @emph{must} also call @code{chacha_set_nonce}, see below.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void chacha_set_nonce (struct chacha_ctx *@var{ctx}, const uint8_t *@var{nonce})
|
|
|
Sets the nonce. It is always of size @code{CHACHA_NONCE_SIZE}, 8
|
|
|
octets. This function also initializes the block counter, setting it to
|
|
|
zero.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void chacha_set_counter (struct chacha_ctx *@var{ctx}, const uint8_t *@var{counter})
|
|
|
Sets the block counter. It is always of size @code{CHACHA_COUNTER_SIZE},
|
|
|
8 octets. This is rarely needed since @code{chacha_set_nonce}
|
|
|
initializes the block counter to zero. When it is still necessary, this
|
|
|
function must be called after @code{chacha_set_nonce}.
|
|
|
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void chacha_crypt (struct chacha_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Encrypts or decrypts the data of a message, using ChaCha. When a
|
|
|
message is encrypted using a sequence of calls to @code{chacha_crypt},
|
|
|
all but the last call @emph{must} use a length that is a multiple of
|
|
|
@code{CHACHA_BLOCK_SIZE}.
|
|
|
@end deftypefun
|
|
|
|
|
|
@subsubsection 32-bit counter variant
|
|
|
|
|
|
While the original paper uses 64-bit counter value, the variant defined
|
|
|
in @cite{RFC 8439} uses 32-bit counter value. This variant is
|
|
|
particularly useful for @pxref{ChaCha-Poly1305} AEAD construction, which
|
|
|
supports 12-octet nonces.
|
|
|
|
|
|
@defvr Constant CHACHA_NONCE96_SIZE
|
|
|
Size of the nonce, 12.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant CHACHA_COUNTER32_SIZE
|
|
|
Size of the counter, 4.
|
|
|
@end defvr
|
|
|
|
|
|
@deftypefun void chacha_set_nonce96 (struct chacha_ctx *@var{ctx}, const uint8_t *@var{nonce})
|
|
|
Sets the nonce. This is similar to the above @code{chacha_set_nonce},
|
|
|
but the input is always of size @code{CHACHA_NONCE96_SIZE}, 12 octets.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void chacha_set_counter32 (struct chacha_ctx *@var{ctx}, const uint8_t *@var{counter})
|
|
|
Sets the block counter. This is similar to the above @code{chacha_set_counter},
|
|
|
but the input is always of size @code{CHACHA_COUNTER32_SIZE}, 4 octets.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void chacha_crypt32 (struct chacha_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Encrypts or decrypts the data of a message, using ChaCha. This is similar to the
|
|
|
above @code{chacha_crypt}, but it assumes the internal counter value is 32-bit
|
|
|
long and the nonce is 96-bit long.
|
|
|
@end deftypefun
|
|
|
|
|
|
@node DES
|
|
|
@subsection DES
|
|
|
@cindex DES
|
|
|
|
|
|
DES is the old Data Encryption Standard, specified by NIST. It uses a
|
|
|
block size of 64 bits (8 octets), and a key size of 56 bits. However,
|
|
|
the key bits are distributed over 8 octets, where the least significant
|
|
|
bit of each octet may be used for parity. A common way to use DES is to
|
|
|
generate 8 random octets in some way, then set the least significant bit
|
|
|
of each octet to get odd parity, and initialize DES with the resulting
|
|
|
key.
|
|
|
|
|
|
The key size of DES is so small that keys can be found by brute force,
|
|
|
using specialized hardware or lots of ordinary work stations in
|
|
|
parallel. One shouldn't be using plain DES at all today, if one uses
|
|
|
DES at all one should be using ``triple DES'', see DES3 below.
|
|
|
|
|
|
DES also has some weak keys. Nettle defines DES in @file{<nettle/des.h>}.
|
|
|
|
|
|
@deftp {Context struct} {struct des_ctx}
|
|
|
@end deftp
|
|
|
|
|
|
@defvr Constant DES_BLOCK_SIZE
|
|
|
The DES block-size, 8.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant DES_KEY_SIZE
|
|
|
DES key size, 8.
|
|
|
@end defvr
|
|
|
|
|
|
@deftypefun int des_set_key (struct des_ctx *@var{ctx}, const uint8_t *@var{key})
|
|
|
Initialize the cipher. The same function is used for both encryption and
|
|
|
decryption. Parity bits are ignored. Checks for weak keys, returning 1
|
|
|
for good keys and 0 for weak keys. Applications that don't care about
|
|
|
weak keys can ignore the return value.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void des_encrypt (struct des_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Encryption function. @var{length} must be an integral multiple of the
|
|
|
block size. If it is more than one block, the data is processed in ECB
|
|
|
mode. @code{src} and @code{dst} may be equal, but they must not overlap
|
|
|
in any other way.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void des_decrypt (struct des_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Analogous to @code{des_encrypt}
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun int des_check_parity (size_t @var{length}, const uint8_t *@var{key})
|
|
|
Checks that the given key has correct, odd, parity. Returns 1 for
|
|
|
correct parity, and 0 for bad parity.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void des_fix_parity (size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Adjusts the parity bits to match DES's requirements. You need this
|
|
|
function if you have created a random-looking string by a key agreement
|
|
|
protocol, and want to use it as a DES key. @var{dst} and @var{src} may
|
|
|
be equal.
|
|
|
@end deftypefun
|
|
|
|
|
|
@node DES3
|
|
|
@subsection DES3
|
|
|
@cindex DES3
|
|
|
@cindex 3DES
|
|
|
@cindex Triple-DES
|
|
|
|
|
|
The inadequate key size of DES has already been mentioned. One way to
|
|
|
increase the key size is to pipe together several DES boxes with
|
|
|
independent keys. It turns out that using two DES ciphers is not as
|
|
|
secure as one might think, even if the key size of the combination is a
|
|
|
respectable 112 bits.
|
|
|
|
|
|
The standard way to increase DES's key size is to use three DES boxes.
|
|
|
The mode of operation is a little peculiar: the middle DES box is wired
|
|
|
in the reverse direction. To encrypt a block with DES3, you encrypt it
|
|
|
using the first 56 bits of the key, then @emph{decrypt} it using the
|
|
|
middle 56 bits of the key, and finally encrypt it again using the last
|
|
|
56 bits of the key. This is known as ``ede'' triple-DES, for
|
|
|
``encrypt-decrypt-encrypt''.
|
|
|
|
|
|
The ``ede'' construction provides some backward compatibility, as you get
|
|
|
plain single DES simply by feeding the same key to all three boxes. That
|
|
|
should help keeping down the gate count, and the price, of hardware
|
|
|
circuits implementing both plain DES and DES3.
|
|
|
|
|
|
DES3 has a key size of 168 bits, but just like plain DES, useless parity
|
|
|
bits are inserted, so that keys are represented as 24 octets (192 bits).
|
|
|
As a 112 bit key is large enough to make brute force attacks
|
|
|
impractical, some applications uses a ``two-key'' variant of triple-DES.
|
|
|
In this mode, the same key bits are used for the first and the last DES
|
|
|
box in the pipe, while the middle box is keyed independently. The
|
|
|
two-key variant is believed to be secure, i.e. there are no known
|
|
|
attacks significantly better than brute force.
|
|
|
|
|
|
Naturally, it's simple to implement triple-DES on top of Nettle's DES
|
|
|
functions. Nettle includes an implementation of three-key ``ede''
|
|
|
triple-DES, it is defined in the same place as plain DES,
|
|
|
@file{<nettle/des.h>}.
|
|
|
|
|
|
@deftp {Context struct} {struct des3_ctx}
|
|
|
@end deftp
|
|
|
|
|
|
@defvr Constant DES3_BLOCK_SIZE
|
|
|
The DES3 block-size is the same as DES_BLOCK_SIZE, 8.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant DES3_KEY_SIZE
|
|
|
DES key size, 24.
|
|
|
@end defvr
|
|
|
|
|
|
@deftypefun int des3_set_key (struct des3_ctx *@var{ctx}, const uint8_t *@var{key})
|
|
|
Initialize the cipher. The same function is used for both encryption and
|
|
|
decryption. Parity bits are ignored. Checks for weak keys, returning 1
|
|
|
if all three keys are good keys, and 0 if one or more key is weak.
|
|
|
Applications that don't care about weak keys can ignore the return
|
|
|
value.
|
|
|
@end deftypefun
|
|
|
|
|
|
For random-looking strings, you can use @code{des_fix_parity} to adjust
|
|
|
the parity bits before calling @code{des3_set_key}.
|
|
|
|
|
|
@deftypefun void des3_encrypt (struct des3_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Encryption function. @var{length} must be an integral multiple of the
|
|
|
block size. If it is more than one block, the data is processed in ECB
|
|
|
mode. @code{src} and @code{dst} may be equal, but they must not overlap
|
|
|
in any other way.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void des3_decrypt (struct des3_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Analogous to @code{des_encrypt}
|
|
|
@end deftypefun
|
|
|
|
|
|
@node Salsa20
|
|
|
@subsection Salsa20
|
|
|
@cindex Salsa20
|
|
|
|
|
|
Salsa20 is a fairly recent stream cipher designed by D. J. Bernstein. It
|
|
|
is built on the observation that a cryptographic hash function can be
|
|
|
used for encryption: Form the hash input from the secret key and a
|
|
|
counter, xor the hash output and the first block of the plaintext, then
|
|
|
increment the counter to process the next block (similar to CTR mode,
|
|
|
@pxref{CTR}). Bernstein defined an encryption algorithm, Snuffle,
|
|
|
in this way to ridicule United States export restrictions which treated hash
|
|
|
functions as nice and harmless, but ciphers as dangerous munitions.
|
|
|
|
|
|
Salsa20 uses the same idea, but with a new specialized hash function to
|
|
|
mix key, block counter, and a couple of constants. It's also designed
|
|
|
for speed; on x86_64, it is currently the fastest cipher offered by
|
|
|
nettle. It uses a block size of 512 bits (64 octets) and there are two
|
|
|
specified key sizes, 128 and 256 bits (16 and 32 octets).
|
|
|
|
|
|
@strong{Caution:} The hash function used in Salsa20 is @emph{not}
|
|
|
directly applicable for use as a general hash function. It's @emph{not}
|
|
|
collision resistant if arbitrary inputs are allowed, and furthermore,
|
|
|
the input and output is of fixed size.
|
|
|
|
|
|
When using Salsa20 to process a message, one specifies both a key and a
|
|
|
@dfn{nonce}, the latter playing a similar rôle to the initialization
|
|
|
vector (@acronym{IV}) used with @acronym{CBC} or @acronym{CTR} mode. One
|
|
|
can use the same key for several messages, provided one uses a unique
|
|
|
random @acronym{iv} for each message. The @acronym{iv} is 64 bits (8
|
|
|
octets). The block counter is initialized to zero for each message, and
|
|
|
is also 64 bits (8 octets). Nettle defines Salsa20 in
|
|
|
@file{<nettle/salsa20.h>}.
|
|
|
|
|
|
@deftp {Context struct} {struct salsa20_ctx}
|
|
|
@end deftp
|
|
|
|
|
|
@defvr Constant SALSA20_128_KEY_SIZE
|
|
|
@defvrx Constant SALSA20_256_KEY_SIZE
|
|
|
The two supported key sizes, 16 and 32 octets.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant SALSA20_KEY_SIZE
|
|
|
Recommended key size, 32.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant SALSA20_BLOCK_SIZE
|
|
|
Salsa20 block size, 64.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant SALSA20_NONCE_SIZE
|
|
|
Size of the nonce, 8.
|
|
|
@end defvr
|
|
|
|
|
|
@deftypefun void salsa20_128_set_key (struct salsa20_ctx *@var{ctx}, const uint8_t *@var{key})
|
|
|
@deftypefunx void salsa20_256_set_key (struct salsa20_ctx *@var{ctx}, const uint8_t *@var{key})
|
|
|
@deftypefunx void salsa20_set_key (struct salsa20_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{key})
|
|
|
Initialize the cipher. The same function is used for both encryption and
|
|
|
decryption. @code{salsa20_128_set_key} and @code{salsa20_128_set_key}
|
|
|
use a fix key size each, 16 and 32 octets, respectively. The function
|
|
|
@code{salsa20_set_key} is provided for backwards compatibility, and the
|
|
|
@var{length} argument must be either 16 or 32. Before using the cipher,
|
|
|
you @emph{must} also call @code{salsa20_set_nonce}, see below.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void salsa20_set_nonce (struct salsa20_ctx *@var{ctx}, const uint8_t *@var{nonce})
|
|
|
Sets the nonce. It is always of size @code{SALSA20_NONCE_SIZE}, 8
|
|
|
octets. This function also initializes the block counter, setting it to
|
|
|
zero.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void salsa20_crypt (struct salsa20_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Encrypts or decrypts the data of a message, using salsa20. When a
|
|
|
message is encrypted using a sequence of calls to @code{salsa20_crypt},
|
|
|
all but the last call @emph{must} use a length that is a multiple of
|
|
|
@code{SALSA20_BLOCK_SIZE}.
|
|
|
@end deftypefun
|
|
|
|
|
|
The full salsa20 cipher uses 20 rounds of mixing. Variants of Salsa20
|
|
|
with fewer rounds are possible, and the 12-round variant is specified by
|
|
|
eSTREAM, see @url{https://www.ecrypt.eu.org/stream/finallist.html}.
|
|
|
Nettle calls this variant @code{salsa20r12}. It uses the same context
|
|
|
struct and key setup as the full salsa20 cipher, but a separate function
|
|
|
for encryption and decryption.
|
|
|
|
|
|
@deftypefun void salsa20r12_crypt (struct salsa20_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Encrypts or decrypts the data of a message, using salsa20 reduced to 12
|
|
|
rounds.
|
|
|
@end deftypefun
|
|
|
|
|
|
@node Serpent
|
|
|
@subsection Serpent
|
|
|
@cindex Serpent
|
|
|
|
|
|
SERPENT is one of the AES finalists, designed by Ross Anderson, Eli
|
|
|
Biham and Lars Knudsen. Thus, the interface and properties are similar
|
|
|
to AES'. One peculiarity is that it is quite pointless to use it with
|
|
|
anything but the maximum key size, smaller keys are just padded to
|
|
|
larger ones. Nettle defines SERPENT in @file{<nettle/serpent.h>}.
|
|
|
|
|
|
@deftp {Context struct} {struct serpent_ctx}
|
|
|
@end deftp
|
|
|
|
|
|
@defvr Constant SERPENT_BLOCK_SIZE
|
|
|
The SERPENT block-size, 16.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant SERPENT_MIN_KEY_SIZE
|
|
|
Minimum SERPENT key size, 16.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant SERPENT_MAX_KEY_SIZE
|
|
|
Maximum SERPENT key size, 32.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant SERPENT_KEY_SIZE
|
|
|
Default SERPENT key size, 32.
|
|
|
@end defvr
|
|
|
|
|
|
@deftypefun void serpent_set_key (struct serpent_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{key})
|
|
|
Initialize the cipher. The same function is used for both encryption and
|
|
|
decryption.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void serpent_encrypt (struct serpent_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Encryption function. @var{length} must be an integral multiple of the
|
|
|
block size. If it is more than one block, the data is processed in ECB
|
|
|
mode. @code{src} and @code{dst} may be equal, but they must not overlap
|
|
|
in any other way.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void serpent_decrypt (struct serpent_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Analogous to @code{serpent_encrypt}
|
|
|
@end deftypefun
|
|
|
|
|
|
@node SM4
|
|
|
@subsection SM4
|
|
|
@cindex SM4
|
|
|
|
|
|
SM4 is a block cipher standard adopted by the government of the People's
|
|
|
Republic of China, and it was issued by the State Cryptography Administration
|
|
|
on March 21, 2012. The standard is GM/T 0002-2012 "SM4 block cipher algorithm".
|
|
|
Nettle defines it in @file{<nettle/sm4.h>}.
|
|
|
|
|
|
@deftp {Context struct} {struct sm4_ctx}
|
|
|
@end deftp
|
|
|
|
|
|
@defvr Constant SM4_BLOCK_SIZE
|
|
|
The SM4 block-size, 16.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant SM4_KEY_SIZE
|
|
|
Default SM4 key size, 16.
|
|
|
@end defvr
|
|
|
|
|
|
@deftypefun void sm4_set_encrypt_key (struct sm4_ctx *@var{ctx}, const uint8_t *@var{key})
|
|
|
Initialize the cipher. The function is used for encryption.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void sm4_set_decrypt_key (struct sm4_ctx *@var{ctx}, const uint8_t *@var{key})
|
|
|
Initialize the cipher. The function is used for decryption.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void sm4_crypt (const struct sm4_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Cryption function. @var{length} must be an integral multiple of the
|
|
|
block size. If it is more than one block, the data is processed in ECB
|
|
|
mode. @code{src} and @code{dst} may be equal, but they must not overlap
|
|
|
in any other way. The same function is used for both encryption and
|
|
|
decryption.
|
|
|
@end deftypefun
|
|
|
|
|
|
@node Twofish
|
|
|
@subsection Twofish
|
|
|
@cindex Twofish
|
|
|
|
|
|
Another AES finalist, this one designed by Bruce Schneier and others.
|
|
|
Nettle defines it in @file{<nettle/twofish.h>}.
|
|
|
|
|
|
@deftp {Context struct} {struct twofish_ctx}
|
|
|
@end deftp
|
|
|
|
|
|
@defvr Constant TWOFISH_BLOCK_SIZE
|
|
|
The TWOFISH block-size, 16.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant TWOFISH_MIN_KEY_SIZE
|
|
|
Minimum TWOFISH key size, 16.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant TWOFISH_MAX_KEY_SIZE
|
|
|
Maximum TWOFISH key size, 32.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant TWOFISH_KEY_SIZE
|
|
|
Default TWOFISH key size, 32.
|
|
|
@end defvr
|
|
|
|
|
|
@deftypefun void twofish_set_key (struct twofish_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{key})
|
|
|
Initialize the cipher. The same function is used for both encryption and
|
|
|
decryption.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void twofish_encrypt (struct twofish_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Encryption function. @var{length} must be an integral multiple of the
|
|
|
block size. If it is more than one block, the data is processed in ECB
|
|
|
mode. @code{src} and @code{dst} may be equal, but they must not overlap
|
|
|
in any other way.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void twofish_decrypt (struct twofish_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Analogous to @code{twofish_encrypt}
|
|
|
@end deftypefun
|
|
|
|
|
|
@node nettle_cipher abstraction
|
|
|
@subsection The @code{struct nettle_cipher} abstraction
|
|
|
@cindex nettle_cipher
|
|
|
|
|
|
Nettle includes a struct including information about some of the more
|
|
|
regular cipher functions. It can be useful for applications that need a
|
|
|
simple way to handle various algorithms. Nettle defines these structs in
|
|
|
@file{<nettle/nettle-meta.h>}.
|
|
|
|
|
|
@deftp {Meta struct} @code{struct nettle_cipher} name context_size block_size key_size set_encrypt_key set_decrypt_key encrypt decrypt
|
|
|
The last four attributes are function pointers, of types
|
|
|
@code{nettle_set_key_func *} and @code{nettle_cipher_func *}. The first
|
|
|
argument to these functions is a @code{const void *} pointer to a context
|
|
|
struct, which is of size @code{context_size}.
|
|
|
@end deftp
|
|
|
|
|
|
@deftypevr {Constant Struct} {struct nettle_cipher} nettle_aes128
|
|
|
@deftypevrx {Constant Struct} {struct nettle_cipher} nettle_aes192
|
|
|
@deftypevrx {Constant Struct} {struct nettle_cipher} nettle_aes256
|
|
|
|
|
|
@deftypevrx {Constant Struct} {struct nettle_cipher} nettle_arctwo40
|
|
|
@deftypevrx {Constant Struct} {struct nettle_cipher} nettle_arctwo64
|
|
|
@deftypevrx {Constant Struct} {struct nettle_cipher} nettle_arctwo128
|
|
|
@deftypevrx {Constant Struct} {struct nettle_cipher} nettle_arctwo_gutmann128
|
|
|
|
|
|
@deftypevrx {Constant Struct} {struct nettle_cipher} nettle_arcfour128
|
|
|
|
|
|
@deftypevrx {Constant Struct} {struct nettle_cipher} nettle_camellia128
|
|
|
@deftypevrx {Constant Struct} {struct nettle_cipher} nettle_camellia192
|
|
|
@deftypevrx {Constant Struct} {struct nettle_cipher} nettle_camellia256
|
|
|
|
|
|
@deftypevrx {Constant Struct} {struct nettle_cipher} nettle_cast128
|
|
|
|
|
|
@deftypevrx {Constant Struct} {struct nettle_cipher} nettle_serpent128
|
|
|
@deftypevrx {Constant Struct} {struct nettle_cipher} nettle_serpent192
|
|
|
@deftypevrx {Constant Struct} {struct nettle_cipher} nettle_serpent256
|
|
|
|
|
|
@deftypevrx {Constant Struct} {struct nettle_cipher} nettle_twofish128
|
|
|
@deftypevrx {Constant Struct} {struct nettle_cipher} nettle_twofish192
|
|
|
@deftypevrx {Constant Struct} {struct nettle_cipher} nettle_twofish256
|
|
|
Nettle includes such structs for all the @emph{regular} ciphers, i.e.
|
|
|
ones without weak keys or other oddities.
|
|
|
@end deftypevr
|
|
|
|
|
|
Nettle also exports a list of all these ciphers without weak keys or
|
|
|
other oddities.
|
|
|
|
|
|
@deftypefun {const struct nettle_cipher **} nettle_get_ciphers (void)
|
|
|
Returns a NULL-terminated list of pointers to supported block ciphers.
|
|
|
This list can be used to dynamically enumerate or search the supported
|
|
|
algorithms.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deffn Macro nettle_ciphers
|
|
|
A macro expanding to a call to nettle_get_ciphers. In earlier versions,
|
|
|
this was not a macro but the actual array of pointers.
|
|
|
@end deffn
|
|
|
|
|
|
@node Cipher modes
|
|
|
@section Cipher modes
|
|
|
|
|
|
Cipher modes of operation specifies the procedure to use when encrypting
|
|
|
a message that is larger than the cipher's block size. As explained in
|
|
|
@xref{Cipher functions}, splitting the message into blocks and
|
|
|
processing them independently with the block cipher (Electronic Code
|
|
|
Book mode, @acronym{ECB}), leaks information.
|
|
|
|
|
|
Besides @acronym{ECB}, Nettle provides several other modes of operation:
|
|
|
Cipher Block Chaining (@acronym{CBC}), Counter mode (@acronym{CTR}), Cipher
|
|
|
Feedback (@acronym{CFB} and @acronym{CFB8}), XEX-based tweaked-codebook mode
|
|
|
with ciphertext stealing (@acronym{XTS}) and a couple of @acronym{AEAD}
|
|
|
modes (@pxref{Authenticated encryption}). @acronym{CBC} is widely used, but
|
|
|
there are a few subtle issues of information leakage, see, e.g.,
|
|
|
@url{https://www.kb.cert.org/vuls/id/958563, @acronym{SSH} @acronym{CBC}
|
|
|
vulnerability}. Today, @acronym{CTR} is usually preferred over @acronym{CBC}.
|
|
|
|
|
|
Modes like @acronym{CBC}, @acronym{CTR}, @acronym{CFB} and @acronym{CFB8}
|
|
|
provide @emph{no} message authentication, and should always be used together
|
|
|
with a @acronym{MAC} (@pxref{Keyed hash functions}) or signature to
|
|
|
authenticate the message.
|
|
|
|
|
|
@menu
|
|
|
* CBC::
|
|
|
* CTR::
|
|
|
* CFB and CFB8::
|
|
|
* XTS::
|
|
|
@end menu
|
|
|
|
|
|
@node CBC
|
|
|
@subsection Cipher Block Chaining
|
|
|
|
|
|
@cindex Cipher Block Chaining
|
|
|
@cindex CBC Mode
|
|
|
|
|
|
When using @acronym{CBC} mode, plaintext blocks are not encrypted
|
|
|
independently of each other, like in Electronic Cook Book mode. Instead,
|
|
|
when encrypting a block in @acronym{CBC} mode, the previous ciphertext
|
|
|
block is XORed with the plaintext before it is fed to the block cipher.
|
|
|
When encrypting the first block, a random block called an @dfn{IV}, or
|
|
|
Initialization Vector, is used as the ``previous ciphertext block''. The
|
|
|
IV should be chosen randomly, but it need not be kept secret, and can
|
|
|
even be transmitted in the clear together with the encrypted data.
|
|
|
|
|
|
In symbols, if @code{E_k} is the encryption function of a block cipher,
|
|
|
and @code{IV} is the initialization vector, then @code{n} plaintext blocks
|
|
|
@code{M_1},@dots{} @code{M_n} are transformed into @code{n} ciphertext blocks
|
|
|
@code{C_1},@dots{} @code{C_n} as follows:
|
|
|
|
|
|
@example
|
|
|
C_1 = E_k(IV XOR M_1)
|
|
|
C_2 = E_k(C_1 XOR M_2)
|
|
|
|
|
|
@dots{}
|
|
|
|
|
|
C_n = E_k(C_(n-1) XOR M_n)
|
|
|
@end example
|
|
|
|
|
|
Nettle provides two main functions for applying a block cipher in
|
|
|
Cipher Block Chaining (@acronym{CBC}) mode, one for encryption and one
|
|
|
for decryption. These functions uses @code{const void *} to pass cipher
|
|
|
contexts around. The @acronym{CBC} interface is defined in
|
|
|
@file{<nettle/cbc.h>}.
|
|
|
|
|
|
@deftypefun {void} cbc_encrypt (const void *@var{ctx}, nettle_cipher_func *@var{f}, size_t @var{block_size}, uint8_t *@var{iv}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx {void} cbc_decrypt (const void *@var{ctx}, nettle_cipher_func *@var{f}, size_t @var{block_size}, uint8_t *@var{iv}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
|
|
|
Applies the encryption or decryption function @var{f} in @acronym{CBC}
|
|
|
mode. The final ciphertext block processed is copied into @var{iv}
|
|
|
before returning, so that a large message can be processed by a sequence of
|
|
|
calls to @code{cbc_encrypt}. The function @var{f} is of type
|
|
|
|
|
|
@code{void @var{f} (const void *@var{ctx}, size_t @var{length}, uint8_t @var{dst},
|
|
|
const uint8_t *@var{src})},
|
|
|
|
|
|
@noindent and the @code{cbc_encrypt} and @code{cbc_decrypt} functions pass their
|
|
|
argument @var{ctx} on to @var{f}.
|
|
|
@end deftypefun
|
|
|
|
|
|
@subsubsection Utility macros
|
|
|
|
|
|
There are also some macros to help use these functions correctly.
|
|
|
|
|
|
@deffn Macro CBC_CTX (@var{context_type}, @var{block_size})
|
|
|
Expands to
|
|
|
@example
|
|
|
@{
|
|
|
context_type ctx;
|
|
|
uint8_t iv[block_size];
|
|
|
@}
|
|
|
@end example
|
|
|
@end deffn
|
|
|
|
|
|
It can be used to define a @acronym{CBC} context struct, either directly,
|
|
|
|
|
|
@example
|
|
|
struct CBC_CTX(struct aes_ctx, AES_BLOCK_SIZE) ctx;
|
|
|
@end example
|
|
|
|
|
|
or to give it a struct tag,
|
|
|
|
|
|
@example
|
|
|
struct aes_cbc_ctx CBC_CTX (struct aes_ctx, AES_BLOCK_SIZE);
|
|
|
@end example
|
|
|
|
|
|
@deffn Macro CBC_SET_IV (@var{ctx}, @var{iv})
|
|
|
First argument is a pointer to a context struct as defined by @code{CBC_CTX},
|
|
|
and the second is a pointer to an Initialization Vector (IV) that is
|
|
|
copied into that context.
|
|
|
@end deffn
|
|
|
|
|
|
@deffn Macro CBC_ENCRYPT (@var{ctx}, @var{f}, @var{length}, @var{dst}, @var{src})
|
|
|
@deffnx Macro CBC_DECRYPT (@var{ctx}, @var{f}, @var{length}, @var{dst}, @var{src})
|
|
|
A simpler way to invoke @code{cbc_encrypt} and @code{cbc_decrypt}. The
|
|
|
first argument is a pointer to a context struct as defined by
|
|
|
@code{CBC_CTX}, and the second argument is an encryption or decryption
|
|
|
function following Nettle's conventions. The last three arguments define
|
|
|
the source and destination area for the operation.
|
|
|
@end deffn
|
|
|
|
|
|
These macros use some tricks to make the compiler display a warning if
|
|
|
the types of @var{f} and @var{ctx} don't match, e.g. if you try to use
|
|
|
an @code{struct aes_ctx} context with the @code{des_encrypt} function.
|
|
|
|
|
|
@subsubsection Cipher-specific functions
|
|
|
|
|
|
Encryption in @acronym{CBC} mode (but not decryption!) is inherently
|
|
|
serial. It can pass only one block at a time to the block cipher's
|
|
|
encrypt function. Optimizations to process several blocks in parallel
|
|
|
can't be applied, and on platforms where the underlying cipher is fast,
|
|
|
per-function-call overhead, e.g., loading subkeys from memory into
|
|
|
registers, can be significant. Depending on platform and cipher used,
|
|
|
@code{cbc_encrypt} can be considerably slower than both
|
|
|
@code{cbc_decrypt} and @acronym{CTR} mode. The second reason for poor
|
|
|
performance can be addressed by having a combined @acronym{CBC} and
|
|
|
encrypt function, for ciphers where the overhead is significant.
|
|
|
|
|
|
Nettle currently includes such special functions only for AES.
|
|
|
|
|
|
@deftypefun void cbc_aes128_encrypt (const struct aes128_ctx *@var{ctx}, uint8_t *@var{iv}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx void cbc_aes192_encrypt (const struct aes192_ctx *@var{ctx}, uint8_t *@var{iv}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx void cbc_aes256_encrypt (const struct aes256_ctx *@var{ctx}, uint8_t *@var{iv}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Calling @code{cbc_aes128_encrypt(ctx, iv, length, dst, src)} does the
|
|
|
same thing as calling @code{cbc_encrypt(ctx, aes128_encrypt,
|
|
|
AES_BLOCK_SIZE, iv, length, dst, src)}, but is more efficient on certain
|
|
|
platforms.
|
|
|
@end deftypefun
|
|
|
|
|
|
@node CTR
|
|
|
@subsection Counter mode
|
|
|
|
|
|
@cindex Counter Mode
|
|
|
@cindex CTR Mode
|
|
|
|
|
|
Counter mode (@acronym{CTR}) uses the block cipher as a keyed
|
|
|
pseudo-random generator. The output of the generator is XORed with the
|
|
|
data to be encrypted. It can be understood as a way to transform a block
|
|
|
cipher to a stream cipher.
|
|
|
|
|
|
The message is divided into @code{n} blocks @code{M_1},@dots{}
|
|
|
@code{M_n}, where @code{M_n} is of size @code{m} which may be smaller
|
|
|
than the block size. Except for the last block, all the message blocks
|
|
|
must be of size equal to the cipher's block size.
|
|
|
|
|
|
If @code{E_k} is the encryption function of a block cipher, @code{IC} is
|
|
|
the initial counter, then the @code{n} plaintext blocks are
|
|
|
transformed into @code{n} ciphertext blocks @code{C_1},@dots{}
|
|
|
@code{C_n} as follows:
|
|
|
|
|
|
@example
|
|
|
C_1 = E_k(IC) XOR M_1
|
|
|
C_2 = E_k(IC + 1) XOR M_2
|
|
|
|
|
|
@dots{}
|
|
|
|
|
|
C_(n-1) = E_k(IC + n - 2) XOR M_(n-1)
|
|
|
C_n = E_k(IC + n - 1) [1..m] XOR M_n
|
|
|
@end example
|
|
|
|
|
|
The @acronym{IC} is the initial value for the counter, it plays a
|
|
|
similar rôle as the @acronym{IV} for @acronym{CBC}. When adding,
|
|
|
@code{IC + x}, @acronym{IC} is interpreted as an integer, in network
|
|
|
byte order. For the last block, @code{E_k(IC + n - 1) [1..m]} means that
|
|
|
the cipher output is truncated to @code{m} bytes.
|
|
|
|
|
|
@deftypefun {void} ctr_crypt (const void *@var{ctx}, nettle_cipher_func *@var{f}, size_t @var{block_size}, uint8_t *@var{ctr}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
|
|
|
Applies the encryption function @var{f} in @acronym{CTR} mode. Note that
|
|
|
for @acronym{CTR} mode, encryption and decryption is the same operation,
|
|
|
and hence @var{f} should always be the encryption function for the
|
|
|
underlying block cipher.
|
|
|
|
|
|
When a message is encrypted using a sequence of calls to
|
|
|
@code{ctr_crypt}, all but the last call @emph{must} use a length that is
|
|
|
a multiple of the block size.
|
|
|
@end deftypefun
|
|
|
|
|
|
Like for @acronym{CBC}, there are also a couple of helper macros.
|
|
|
|
|
|
@deffn Macro CTR_CTX (@var{context_type}, @var{block_size})
|
|
|
Expands to
|
|
|
@example
|
|
|
@{
|
|
|
context_type ctx;
|
|
|
uint8_t ctr[block_size];
|
|
|
@}
|
|
|
@end example
|
|
|
@end deffn
|
|
|
|
|
|
@deffn Macro CTR_SET_COUNTER (@var{ctx}, @var{iv})
|
|
|
First argument is a pointer to a context struct as defined by
|
|
|
@code{CTR_CTX}, and the second is a pointer to an initial counter that
|
|
|
is copied into that context.
|
|
|
@end deffn
|
|
|
|
|
|
@deffn Macro CTR_CRYPT (@var{ctx}, @var{f}, @var{length}, @var{dst}, @var{src})
|
|
|
A simpler way to invoke @code{ctr_crypt}. The first argument is a
|
|
|
pointer to a context struct as defined by @code{CTR_CTX}, and the second
|
|
|
argument is an encryption function following Nettle's conventions. The
|
|
|
last three arguments define the source and destination area for the
|
|
|
operation.
|
|
|
@end deffn
|
|
|
|
|
|
@node CFB and CFB8
|
|
|
@subsection Cipher Feedback mode
|
|
|
|
|
|
@cindex Cipher Feedback Mode
|
|
|
@cindex Cipher Feedback 8-bit Mode
|
|
|
@cindex CFB Modes
|
|
|
@cindex CFB8 Mode
|
|
|
|
|
|
|
|
|
Cipher Feedback mode (@acronym{CFB}) and Cipher Feedback 8-bit mode
|
|
|
(@acronym{CFB8}) being close relatives to both @acronym{CBC} mode and
|
|
|
@acronym{CTR} mode borrow some characteristics from stream ciphers.
|
|
|
|
|
|
For CFB the message is divided into @code{n} blocks @code{M_1},@dots{}
|
|
|
@code{M_n}, where @code{M_n} is of size @code{m} which may be smaller
|
|
|
than the block size. Except for the last block, all the message blocks
|
|
|
must be of size equal to the cipher's block size.
|
|
|
|
|
|
If @code{E_k} is the encryption function of a block cipher, @code{IV} is
|
|
|
the initialization vector, then the @code{n} plaintext blocks are
|
|
|
transformed into @code{n} ciphertext blocks @code{C_1},@dots{}
|
|
|
@code{C_n} as follows:
|
|
|
|
|
|
@example
|
|
|
C_1 = E_k(IV) XOR M_1
|
|
|
C_2 = E_k(C_1) XOR M_2
|
|
|
|
|
|
@dots{}
|
|
|
|
|
|
C_(n-1) = E_k(C_(n - 2)) XOR M_(n-1)
|
|
|
C_n = E_k(C_(n - 1)) [1..m] XOR M_n
|
|
|
@end example
|
|
|
|
|
|
Cipher Feedback 8-bit mode (@acronym{CFB8}) transforms block cipher into a stream
|
|
|
cipher. The message is encrypted byte after byte, not requiring any padding.
|
|
|
|
|
|
If @code{E_k} is the encryption function of a block cipher, @code{b} is
|
|
|
@code{E_k} block size, @code{IV} is the initialization vector, then the
|
|
|
@code{n} plaintext bytes are transformed into @code{n} ciphertext bytes
|
|
|
@code{C_1},@dots{} @code{C_n} as follows:
|
|
|
|
|
|
@example
|
|
|
I_1 = IV
|
|
|
C_1 = E_k(I_1) [1..8] XOR M_1
|
|
|
I_2 = I_1 [9..b] << 8 | C_1
|
|
|
C_2 = E_k(I_2) [1..8] XOR M_2
|
|
|
|
|
|
@dots{}
|
|
|
|
|
|
I_(n-1) = I_(n-2) [9..b] << 8 | C_(n-2)
|
|
|
C_(n-1) = E_k(I_(n-1)) [1..8] XOR M_(n-1)
|
|
|
I_n = I_(n-1) [9..b] << 8 | C_(n-1)
|
|
|
C_n = E_k(I_n) [1..8] XOR M_n
|
|
|
@end example
|
|
|
|
|
|
Nettle's includes functions for applying a block cipher in Cipher
|
|
|
Feedback (@acronym{CFB}) and Cipher Feedback 8-bit (@acronym{CFB8})
|
|
|
modes. These functions uses @code{void *} to pass cipher contexts around.
|
|
|
|
|
|
@deftypefun {void} cfb_encrypt (const void *@var{ctx}, nettle_cipher_func *@var{f}, size_t @var{block_size}, uint8_t *@var{iv}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx {void} cfb_decrypt (const void *@var{ctx}, nettle_cipher_func *@var{f}, size_t @var{block_size}, uint8_t *@var{iv}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
|
|
|
Applies the encryption or decryption function @var{f} in @acronym{CFB}
|
|
|
mode. The final ciphertext block processed is copied into @var{iv}
|
|
|
before returning, so that a large message can be processed by a sequence
|
|
|
of calls to @code{cfb_encrypt}. Note that for @acronym{CFB} mode
|
|
|
internally uses encryption only function and hence @var{f} should always
|
|
|
be the encryption function for the underlying block cipher.
|
|
|
|
|
|
When a message is encrypted using a sequence of calls to
|
|
|
@code{cfb_encrypt}, all but the last call @emph{must} use a length that
|
|
|
is a multiple of the block size.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun {void} cfb8_encrypt (const void *@var{ctx}, nettle_cipher_func *@var{f}, size_t @var{block_size}, uint8_t *@var{iv}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx {void} cfb8_decrypt (const void *@var{ctx}, nettle_cipher_func *@var{f}, size_t @var{block_size}, uint8_t *@var{iv}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
|
|
|
Applies the encryption or decryption function @var{f} in @acronym{CFB8}
|
|
|
mode. The final IV block processed is copied into @var{iv}
|
|
|
before returning, so that a large message can be processed by a sequence of
|
|
|
calls to @code{cfb8_encrypt}. Note that for @acronym{CFB8} mode internally
|
|
|
uses encryption only function and hence @var{f} should always be the
|
|
|
encryption function for the underlying block cipher.
|
|
|
|
|
|
@end deftypefun
|
|
|
|
|
|
Like for @acronym{CBC}, there are also a couple of helper macros.
|
|
|
|
|
|
@deffn Macro CFB_CTX (@var{context_type}, @var{block_size})
|
|
|
Expands to
|
|
|
@example
|
|
|
@{
|
|
|
context_type ctx;
|
|
|
uint8_t iv[block_size];
|
|
|
@}
|
|
|
@end example
|
|
|
@end deffn
|
|
|
|
|
|
@deffn Macro CFB_SET_IV(@var{ctx}, @var{iv})
|
|
|
First argument is a pointer to a context struct as defined by
|
|
|
@code{CFB_CTX}, and the second is a pointer to an initialization vector
|
|
|
that is copied into that context.
|
|
|
@end deffn
|
|
|
|
|
|
@deffn Macro CFB_ENCRYPT (@var{ctx}, @var{f}, @var{length}, @var{dst}, @var{src})
|
|
|
A simpler way to invoke @code{cfb_encrypt}. The first argument is a
|
|
|
pointer to a context struct as defined by @code{CFB_CTX}, and the second
|
|
|
argument is an encryption function following Nettle's conventions. The
|
|
|
last three arguments define the source and destination area for the
|
|
|
operation.
|
|
|
@end deffn
|
|
|
|
|
|
@deffn Macro CFB_DECRYPT (@var{ctx}, @var{f}, @var{length}, @var{dst}, @var{src})
|
|
|
A simpler way to invoke @code{cfb_decrypt}. The first argument is a
|
|
|
pointer to a context struct as defined by @code{CFB_CTX}, and the second
|
|
|
argument is an encryption function following Nettle's conventions. The
|
|
|
last three arguments define the source and destination area for the
|
|
|
operation.
|
|
|
@end deffn
|
|
|
|
|
|
@deffn Macro CFB8_CTX (@var{context_type}, @var{block_size})
|
|
|
Expands to
|
|
|
@example
|
|
|
@{
|
|
|
context_type ctx;
|
|
|
uint8_t iv[block_size];
|
|
|
@}
|
|
|
@end example
|
|
|
@end deffn
|
|
|
|
|
|
@deffn Macro CFB8_SET_IV (@var{ctx}, @var{iv})
|
|
|
First argument is a pointer to a context struct as defined by
|
|
|
@code{CFB8_CTX}, and the second is a pointer to an initialization vector
|
|
|
that is copied into that context.
|
|
|
@end deffn
|
|
|
|
|
|
@deffn Macro CFB8_ENCRYPT (@var{ctx}, @var{f}, @var{length}, @var{dst}, @var{src})
|
|
|
A simpler way to invoke @code{cfb8_encrypt}. The first argument is a
|
|
|
pointer to a context struct as defined by @code{CFB8_CTX}, and the
|
|
|
second argument is an encryption function following Nettle's
|
|
|
conventions. The last three arguments define the source and destination
|
|
|
area for the operation.
|
|
|
@end deffn
|
|
|
|
|
|
@deffn Macro CFB8_DECRYPT (@var{ctx}, @var{f}, @var{length}, @var{dst}, @var{src})
|
|
|
A simpler way to invoke @code{cfb8_decrypt}. The first argument is a
|
|
|
pointer to a context struct as defined by @code{CFB8_CTX}, and the
|
|
|
second argument is an encryption function following Nettle's
|
|
|
conventions. The last three arguments define the source and destination
|
|
|
area for the operation.
|
|
|
@end deffn
|
|
|
|
|
|
@node XTS
|
|
|
@subsection XEX-based tweaked-codebook mode with ciphertext stealing
|
|
|
|
|
|
@cindex XEX-based tweaked-codebook mode with ciphertext stealing
|
|
|
@cindex XTS Mode
|
|
|
|
|
|
|
|
|
XEX-based tweaked-codebook mode with ciphertext stealing (@acronym{XTS}) is
|
|
|
a block mode like (@acronym{CBC}) but tweaked to be able to encrypt partial
|
|
|
blocks via a technique called ciphertext stealing, where the last complete
|
|
|
block of ciphertext is split and part returned as the last block and part
|
|
|
used as plaintext for the second to last block.
|
|
|
This mode is principally used to encrypt data at rest where it is not possible
|
|
|
to store additional metadata or blocks larger than the plain text. The most
|
|
|
common usage is for disk encryption. Due to the fact that ciphertext expansion
|
|
|
is not possible, data is not authenticated. This mode should not be used where
|
|
|
authentication is critical.
|
|
|
|
|
|
The message is divided into @code{n} blocks @code{M_1},@dots{} @code{M_n},
|
|
|
where @code{M_n} is of size @code{m} which may be smaller than the block size.
|
|
|
XTS always uses a fixed blocksize of 128 bit (16 bytes) length.
|
|
|
|
|
|
Unlike other modes, the key is double the size of that for the used cipher mode
|
|
|
(for example 256bit for AES-128 and 512bit for AES-256).
|
|
|
|
|
|
@acronym{XTS} encryption mode operates given:
|
|
|
@itemize
|
|
|
@item A multiplication by a primitive element alpha.
|
|
|
@code{MUL a^j} here represents the multiplication, where @code{j} is the power
|
|
|
of alpha, and the input value is converted into a 16 bytes array
|
|
|
@code{a_0[k], k = 0,1,..,15}. The multiplication is calculated as
|
|
|
@code{a_(j+1)[0] = (2(a_j[0] mod 128)) XOR (135 * floor(a_j[15]/128)}
|
|
|
@code{a_(j+1)[k] = (2(a_j[k] mod 128)) XOR (floor(a_j[k-1]/128), k = 1,2,..15}
|
|
|
Note that this operation is practically a 1 bit left shift operation with carry
|
|
|
propagating from one byte to the next, and if the last bit shift results in a
|
|
|
carry the decimal value 135 is XORed into the first byte.
|
|
|
|
|
|
@item The encryption key is provided as the @code{Key = K1 | K2}, where @code{|}
|
|
|
denotes string concatenation.
|
|
|
@code{E_k1} is the encryption function of the block cipher using @code{K1} as
|
|
|
the key, and @code{E_k2} is the same encryption function using @code{K2}
|
|
|
|
|
|
@item A 128 bit tweak value is provided as input and is denoted as @code{IV}
|
|
|
@end itemize
|
|
|
|
|
|
The @code{n} plaintext blocks are transformed into @code{n} ciphertext blocks
|
|
|
@code{C_1},@dots{} @code{C_n} as follows.
|
|
|
|
|
|
For a plaintext length that is a perfect multiple of the XTS block size:
|
|
|
@example
|
|
|
T_1 = E_k2(IV)
|
|
|
C_1 = E_k1(P_1 XOR T_1) XOR T_1
|
|
|
|
|
|
@dots{}
|
|
|
|
|
|
T_n = T_(n-1) MUL a
|
|
|
C_n = E_k1(P_n XOR T_n) XOR T_n
|
|
|
@end example
|
|
|
|
|
|
For any other plaintext lengths:
|
|
|
@example
|
|
|
T_1 = E_k2(IV)
|
|
|
C_1 = E_k1(P_1 XOR T_1) XOR T_1
|
|
|
|
|
|
@dots{}
|
|
|
|
|
|
T_(n-2) = T_(n-3) MUL a
|
|
|
C_(n-2) = E_k1(P_(n-2) XOR T_(n-2)) XOR T_(n-2)
|
|
|
|
|
|
T_(n-1) = T_(n-2) MUL a
|
|
|
CC_(n-1) = E_k1(P_(n-1) XOR T_(n-1)) XOR T_(n-1)
|
|
|
|
|
|
T_n = T_(n-1) MUL a
|
|
|
PP = [1..m]Pn | [m+1..128]CC_(n-1)
|
|
|
C_(n-1) = E_k1(PP XOR T_n) XOR T_n
|
|
|
|
|
|
C_n = [1..m]CC_(n-1)
|
|
|
@end example
|
|
|
|
|
|
@subsubsection General (@acronym{XTS}) interface.
|
|
|
|
|
|
The two general functions to encrypt and decrypt using the @acronym{XTS} block
|
|
|
cipher mode are the following:
|
|
|
|
|
|
@deftypefun void xts_encrypt_message (const void *@var{enc_ctx}, const void *@var{twk_ctx}, nettle_cipher_func *@var{encf}, const uint8_t *@var{tweak}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx void xts_decrypt_message (const void *@var{dec_ctx}, const void *@var{twk_ctx}, nettle_cipher_func *@var{decf}, nettle_cipher_func *@var{encf}, const uint8_t *@var{tweak}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
|
|
|
Applies the encryption function @var{encf} or the decryption function
|
|
|
@var{decf} in @acronym{XTS} mode. At least one block (16 bytes) worth
|
|
|
of data must be available therefore specifying a length less than 16
|
|
|
bytes is illegal.
|
|
|
|
|
|
The functions @var{encf} @var{decf} are of type
|
|
|
|
|
|
@code{void f (const void *@var{ctx}, size_t @var{length}, uint8_t *@var{dst},
|
|
|
const uint8_t *@var{src})},
|
|
|
|
|
|
@noindent and the @code{xts_encrypt_message} and @code{xts_decrypt_message}
|
|
|
functions pass their arguments @var{enc_ctx}, @var{twk_ctx} and @var{dec_ctx}
|
|
|
to the functions @var{encf}, @var{decf} as @var{ctx}.
|
|
|
@end deftypefun
|
|
|
|
|
|
@subsubsection @acronym{XTS}-@acronym{AES} interface
|
|
|
|
|
|
The @acronym{AES} @acronym{XTS} functions provide an API for using the
|
|
|
@acronym{XTS} mode with the @acronym{AES} block ciphers. The parameters
|
|
|
all have the same meaning as the general interface, except that the
|
|
|
@var{enc_ctx}, @var{dec_ctx}, @var{twk_ctx}, @var{encf} and @var{decf} are
|
|
|
replaced with an @acronym{AES} context structure called @var{ctx}, and a
|
|
|
appropriate set-key function must be called before using any of the encryption
|
|
|
or decryption functions in this interface.
|
|
|
|
|
|
@deftp {Context struct} {struct xts_aes128_key}
|
|
|
Holds state corresponding to the AES-128 block cipher.
|
|
|
@end deftp
|
|
|
|
|
|
@deftp {Context struct} {struct xts_aes256_key}
|
|
|
Holds state corresponding to the AES-256 block cipher.
|
|
|
@end deftp
|
|
|
|
|
|
@deftypefun void xts_aes128_set_encrypt_key (struct xts_aes128_key *@var{ctx}, const uint8_t *@var{key})
|
|
|
@deftypefunx void xts_aes256_set_encrypt_key (struct xts_aes256_key *@var{ctx}, const uint8_t *@var{key})
|
|
|
@deftypefunx void xts_aes128_set_decrypt_key (struct xts_aes128_key *@var{ctx}, const uint8_t *@var{key})
|
|
|
@deftypefunx void xts_aes256_set_decrypt_key (struct xts_aes256_key *@var{ctx}, const uint8_t *@var{key})
|
|
|
Initializes the encryption or decryption key for the AES block cipher. The
|
|
|
length of the key must be double the size of the key for the corresponding
|
|
|
cipher (256 bits for AES-128 and 512 bits for AES-256). One of
|
|
|
these functions must be called before any of the other functions.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void xts_aes128_encrypt_message (struct xts_aes128_key *@var{ctx}, uint8_t *@var{tweak}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx void xts_aes256_encrypt_message (struct xts_aes256_key *@var{ctx}, uint8_t *@var{tweak}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx void xts_aes128_decrypt_message (struct xts_aes128_key *@var{ctx}, uint8_t *@var{tweak}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx void xts_aes256_decrypt_message (struct xts_aes256_key *@var{ctx}, uint8_t *@var{tweak}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
These are identical to @code{xts_encrypt_message} and
|
|
|
@code{xts_decrypt_message}, except that @var{enc_ctx}, @var{dec_ctx},
|
|
|
@var{twk_ctx}, @var{encf} and @var{decf} are replaced by the @var{ctx} context
|
|
|
structure.
|
|
|
@end deftypefun
|
|
|
|
|
|
@node Authenticated encryption
|
|
|
@section Authenticated encryption with associated data
|
|
|
@cindex AEAD
|
|
|
@cindex Authenticated encryption
|
|
|
|
|
|
Since there are some subtle design choices to be made when combining a
|
|
|
block cipher mode with out authentication with a @acronym{MAC}. In
|
|
|
recent years, several constructions that combine encryption and
|
|
|
authentication have been defined. These constructions typically also
|
|
|
have an additional input, the ``associated data'', which is
|
|
|
authenticated but not included with the message. A simple example is an
|
|
|
implicit message number which is available at both sender and receiver,
|
|
|
and which needs authentication in order to detect deletions or replay of
|
|
|
messages. This family of building blocks are therefore called
|
|
|
@acronym{AEAD}, Authenticated encryption with associated data.
|
|
|
|
|
|
The aim is to provide building blocks that it is easier for designers of
|
|
|
protocols and applications to use correctly. There is also some
|
|
|
potential for improved performance, if encryption and authentication can
|
|
|
be done in a single step, although that potential is not realized for
|
|
|
the constructions currently supported by Nettle.
|
|
|
|
|
|
For encryption, the inputs are:
|
|
|
|
|
|
@itemize
|
|
|
@item
|
|
|
The key, which can be used for many messages.
|
|
|
@item
|
|
|
A nonce, which must be unique for each message using the same key.
|
|
|
@item
|
|
|
Additional associated data to be authenticated, but not included in the
|
|
|
message.
|
|
|
@item
|
|
|
The cleartext message to be encrypted.
|
|
|
@end itemize
|
|
|
|
|
|
The outputs are:
|
|
|
|
|
|
@itemize
|
|
|
@item
|
|
|
The ciphertext, of the same size as the cleartext.
|
|
|
@item
|
|
|
A digest or ``authentication tag''.
|
|
|
@end itemize
|
|
|
|
|
|
Decryption works the same, but with cleartext and ciphertext
|
|
|
interchanged. All currently supported @acronym{AEAD} algorithms always
|
|
|
use the encryption function of the underlying block cipher, for both
|
|
|
encryption and decryption.
|
|
|
|
|
|
Usually, the authentication tag should be appended at the end of the
|
|
|
ciphertext, producing an encrypted message which is slightly longer than
|
|
|
the cleartext. However, Nettle's low level @acronym{AEAD} functions
|
|
|
produce the authentication tag as a separate output for both encryption
|
|
|
and decryption.
|
|
|
|
|
|
Both associated data and the message data (cleartext or ciphertext) can
|
|
|
be processed incrementally. In general, all associated data must be
|
|
|
processed before the message data, and all calls but the last one must
|
|
|
use a length that is a multiple of the block size, although some
|
|
|
@acronym{AEAD} may implement more liberal conventions. The @acronym{CCM}
|
|
|
mode is a bit special in that it requires the message lengths up front,
|
|
|
other @acronym{AEAD} constructions don't have this restriction.
|
|
|
|
|
|
The supported @acronym{AEAD} constructions are Galois/Counter mode
|
|
|
(@acronym{GCM}), @acronym{EAX}, ChaCha-Poly1305, and Counter with
|
|
|
@acronym{CBC}-@acronym{MAC} (@acronym{CCM}). There are some weaknesses
|
|
|
in @acronym{GCM} authentication, see
|
|
|
@url{https://csrc.nist.gov/groups/ST/toolkit/BCM/documents/comments@//CWC-GCM/Ferguson2.pdf}.
|
|
|
@acronym{CCM} and @acronym{EAX} use the same building blocks, but the
|
|
|
@acronym{EAX} design is cleaner and avoids a couple of inconveniences of
|
|
|
@acronym{CCM}. Therefore, @acronym{EAX} seems like a good conservative
|
|
|
choice. The more recent ChaCha-Poly1305 may also be an attractive but
|
|
|
more adventurous alternative, in particular if performance is important.
|
|
|
|
|
|
@menu
|
|
|
* EAX::
|
|
|
* GCM::
|
|
|
* CCM::
|
|
|
* ChaCha-Poly1305::
|
|
|
* OCB::
|
|
|
* SIV-CMAC::
|
|
|
* SIV-GCM::
|
|
|
* nettle_aead abstraction::
|
|
|
@end menu
|
|
|
|
|
|
@node EAX
|
|
|
@subsection EAX
|
|
|
|
|
|
The @acronym{EAX} mode is an @acronym{AEAD} mode which combines
|
|
|
@acronym{CTR} mode encryption, @xref{CTR}, with a message authentication
|
|
|
based on @acronym{CBC}, @xref{CBC}. The implementation in Nettle is
|
|
|
restricted to ciphers with a block size of 128 bits (16 octets).
|
|
|
@acronym{EAX} was defined as a reaction to the @acronym{CCM} mode,
|
|
|
@xref{CCM}, which uses the same primitives but has some undesirable and
|
|
|
inelegant properties.
|
|
|
|
|
|
@acronym{EAX} supports arbitrary nonce size; it's even possible to use
|
|
|
an empty nonce in case only a single message is encrypted for each key.
|
|
|
|
|
|
Nettle's support for @acronym{EAX} consists of a low-level general
|
|
|
interface, some convenience macros, and specific functions for
|
|
|
@acronym{EAX} using @acronym{AES}-128 as the underlying cipher. These
|
|
|
interfaces are defined in @file{<nettle/eax.h>}
|
|
|
|
|
|
@subsubsection General @acronym{EAX} interface
|
|
|
|
|
|
@deftp {Context struct} {struct eax_key}
|
|
|
@acronym{EAX} state which depends only on the key, but not on the nonce
|
|
|
or the message.
|
|
|
@end deftp
|
|
|
|
|
|
@deftp {Context struct} {struct eax_ctx}
|
|
|
Holds state corresponding to a particular message.
|
|
|
@end deftp
|
|
|
|
|
|
@defvr Constant EAX_BLOCK_SIZE
|
|
|
@acronym{EAX}'s block size, 16.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant EAX_DIGEST_SIZE
|
|
|
Size of the @acronym{EAX} digest, also 16.
|
|
|
@end defvr
|
|
|
|
|
|
@deftypefun void eax_set_key (struct eax_key *@var{key}, const void *@var{cipher}, nettle_cipher_func *@var{f})
|
|
|
Initializes @var{key}. @var{cipher} gives a context struct for the
|
|
|
underlying cipher, which must have been previously initialized for
|
|
|
encryption, and @var{f} is the encryption function.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void eax_set_nonce (struct eax_ctx *@var{eax}, const struct eax_key *@var{key}, const void *@var{cipher}, nettle_cipher_func *@var{f}, size_t @var{nonce_length}, const uint8_t *@var{nonce})
|
|
|
Initializes @var{ctx} for processing a new message, using the given
|
|
|
nonce.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void eax_update (struct eax_ctx *@var{eax}, const struct eax_key *@var{key}, const void *@var{cipher}, nettle_cipher_func *@var{f}, size_t @var{data_length}, const uint8_t *@var{data})
|
|
|
Process associated data for authentication. All but the last call for
|
|
|
each message @emph{must} use a length that is a multiple of the block
|
|
|
size. Unlike many other @acronym{AEAD} constructions, for @acronym{EAX}
|
|
|
it's not necessary to complete the processing of all associated data
|
|
|
before encrypting or decrypting the message data.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void eax_encrypt (struct eax_ctx *@var{eax}, const struct eax_key *@var{key}, const void *@var{cipher}, nettle_cipher_func *@var{f}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx void eax_decrypt (struct eax_ctx *@var{eax}, const struct eax_key *@var{key}, const void *@var{cipher}, nettle_cipher_func *@var{f}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Encrypts or decrypts the data of a message. @var{cipher} is the context
|
|
|
struct for the underlying cipher and @var{f} is the encryption function.
|
|
|
All but the last call for each message @emph{must} use a length that is
|
|
|
a multiple of the block size.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void eax_digest (struct eax_ctx *@var{eax}, const struct eax_key *@var{key}, const void *@var{cipher}, nettle_cipher_func *@var{f}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
Extracts the message digest (also known ``authentication tag''). This is
|
|
|
the final operation when processing a message. If @var{length} is
|
|
|
smaller than @code{EAX_DIGEST_SIZE}, only the first @var{length} octets
|
|
|
of the digest are written.
|
|
|
@end deftypefun
|
|
|
|
|
|
|
|
|
@subsubsection @acronym{EAX} helper macros
|
|
|
|
|
|
The following macros are defined.
|
|
|
|
|
|
@deffn Macro EAX_CTX (@var{context_type})
|
|
|
This defines an all-in-one context struct, including the context of the
|
|
|
underlying cipher and all @acronym{EAX} state. It expands
|
|
|
to
|
|
|
@example
|
|
|
@{
|
|
|
struct eax_key key;
|
|
|
struct eax_ctx eax;
|
|
|
context_type cipher;
|
|
|
@}
|
|
|
@end example
|
|
|
@end deffn
|
|
|
|
|
|
For all these macros, @var{ctx}, is a context struct as defined by
|
|
|
@code{EAX_CTX}, and @var{encrypt} is the encryption function of the
|
|
|
underlying cipher.
|
|
|
|
|
|
@deffn Macro EAX_SET_KEY (@var{ctx}, @var{set_key}, @var{encrypt}, @var{key})
|
|
|
@var{set_key} is the function for setting the encryption key for the
|
|
|
underlying cipher, and @var{key} is the key.
|
|
|
@end deffn
|
|
|
|
|
|
@deffn Macro EAX_SET_NONCE (@var{ctx}, @var{encrypt}, @var{length}, @var{nonce})
|
|
|
Sets the nonce to be used for the message.
|
|
|
@end deffn
|
|
|
|
|
|
@deffn Macro EAX_UPDATE (@var{ctx}, @var{encrypt}, @var{length}, @var{data})
|
|
|
Process associated data for authentication.
|
|
|
@end deffn
|
|
|
|
|
|
@deffn Macro EAX_ENCRYPT (@var{ctx}, @var{encrypt}, @var{length}, @var{dst}, @var{src})
|
|
|
@deffnx Macro EAX_DECRYPT (@var{ctx}, @var{encrypt}, @var{length}, @var{dst}, @var{src})
|
|
|
Process message data for encryption or decryption.
|
|
|
@end deffn
|
|
|
|
|
|
@deffn Macro EAX_DIGEST (@var{ctx}, @var{encrypt}, @var{length}, @var{digest})
|
|
|
Extract the authentication tag for the message.
|
|
|
@end deffn
|
|
|
|
|
|
|
|
|
@subsubsection @acronym{EAX}-@acronym{AES}128 interface
|
|
|
|
|
|
The following functions implement @acronym{EAX} using @acronym{AES}-128
|
|
|
as the underlying cipher.
|
|
|
|
|
|
@deftp {Context struct} {struct eax_aes128_ctx}
|
|
|
The context struct, defined using @code{EAX_CTX}.
|
|
|
@end deftp
|
|
|
|
|
|
@deftypefun void eax_aes128_set_key (struct eax_aes128_ctx *@var{ctx}, const uint8_t *@var{key})
|
|
|
Initializes @var{ctx} using the given key.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void eax_aes128_set_nonce (struct eax_aes128_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{iv})
|
|
|
Initializes the per-message state, using the given nonce.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void eax_aes128_update (struct eax_aes128_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
Process associated data for authentication. All but the last call for
|
|
|
each message @emph{must} use a length that is a multiple of the block
|
|
|
size.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void eax_aes128_encrypt (struct eax_aes128_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx void eax_aes128_decrypt (struct eax_aes128_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Encrypts or decrypts the data of a message. All but the last call for
|
|
|
each message @emph{must} use a length that is a multiple of the block
|
|
|
size.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void eax_aes128_digest (struct eax_aes128_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
Extracts the message digest (also known ``authentication tag''). This is
|
|
|
the final operation when processing a message. If @var{length} is
|
|
|
smaller than @code{EAX_DIGEST_SIZE}, only the first @var{length} octets
|
|
|
of the digest are written.
|
|
|
@end deftypefun
|
|
|
|
|
|
@node GCM
|
|
|
@subsection Galois counter mode
|
|
|
|
|
|
@cindex Galois Counter Mode
|
|
|
@cindex GCM
|
|
|
|
|
|
Galois counter mode is an @acronym{AEAD} constructions combining counter
|
|
|
mode with message authentication based on universal hashing. The main
|
|
|
objective of the design is to provide high performance for hardware
|
|
|
implementations, where other popular @acronym{MAC} algorithms
|
|
|
(@pxref{Keyed hash functions}) become a bottleneck for high-speed
|
|
|
hardware implementations. It was proposed by David A. McGrew and John
|
|
|
Viega in 2005, and recommended by NIST in 2007,
|
|
|
@url{https://csrc.nist.gov/publications/nistpubs/800-38D/SP-800-38D.pdf,
|
|
|
NIST Special Publication 800-38D}. It is constructed on top of a block
|
|
|
cipher which must have a block size of 128 bits.
|
|
|
|
|
|
The authentication in @acronym{GCM} has some known weaknesses, see
|
|
|
@url{https://csrc.nist.gov@//groups/ST/toolkit/BCM/documents/comments/CWC-GCM/Ferguson2.pdf}.
|
|
|
In particular, don't use @acronym{GCM} with short authentication tags.
|
|
|
|
|
|
Nettle's support for @acronym{GCM} consists of a low-level general
|
|
|
interface, some convenience macros, and specific functions for
|
|
|
@acronym{GCM} using @acronym{AES} or Camellia as the underlying cipher.
|
|
|
These interfaces are defined in @file{<nettle/gcm.h>}
|
|
|
|
|
|
@subsubsection General @acronym{GCM} interface
|
|
|
|
|
|
@deftp {Context struct} {struct gcm_key}
|
|
|
Message independent hash sub-key, and related tables.
|
|
|
@end deftp
|
|
|
|
|
|
@deftp {Context struct} {struct gcm_ctx}
|
|
|
Holds state corresponding to a particular message.
|
|
|
@end deftp
|
|
|
|
|
|
@defvr Constant GCM_BLOCK_SIZE
|
|
|
@acronym{GCM}'s block size, 16.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant GCM_DIGEST_SIZE
|
|
|
Size of the @acronym{GCM} digest, also 16.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant GCM_IV_SIZE
|
|
|
Recommended size of the @acronym{IV}, 12. Arbitrary sizes are allowed.
|
|
|
@end defvr
|
|
|
|
|
|
@deftypefun void gcm_set_key (struct gcm_key *@var{key}, const void *@var{cipher}, nettle_cipher_func *@var{f})
|
|
|
Initializes @var{key}. @var{cipher} gives a context struct for the
|
|
|
underlying cipher, which must have been previously initialized for
|
|
|
encryption, and @var{f} is the encryption function.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void gcm_set_iv (struct gcm_ctx *@var{ctx}, const struct gcm_key *@var{key}, size_t @var{length}, const uint8_t *@var{iv})
|
|
|
Initializes @var{ctx} using the given @acronym{IV}. The @var{key}
|
|
|
argument is actually needed only if @var{length} differs from
|
|
|
@code{GCM_IV_SIZE}.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void gcm_update (struct gcm_ctx *@var{ctx}, const struct gcm_key *@var{key}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
Provides associated data to be authenticated. If used, must be called
|
|
|
before @code{gcm_encrypt} or @code{gcm_decrypt}. All but the last call
|
|
|
for each message @emph{must} use a length that is a multiple of the
|
|
|
block size.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void gcm_encrypt (struct gcm_ctx *@var{ctx}, const struct gcm_key *@var{key}, const void *@var{cipher}, nettle_cipher_func *@var{f}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx void gcm_decrypt (struct gcm_ctx *@var{ctx}, const struct gcm_key *@var{key}, const void *@var{cipher}, nettle_cipher_func *@var{f}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Encrypts or decrypts the data of a message. @var{cipher} is the context
|
|
|
struct for the underlying cipher and @var{f} is the encryption function.
|
|
|
All but the last call for each message @emph{must} use a length that is
|
|
|
a multiple of the block size.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void gcm_digest (struct gcm_ctx *@var{ctx}, const struct gcm_key *@var{key}, const void *@var{cipher}, nettle_cipher_func *@var{f}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
Extracts the message digest (also known ``authentication tag''). This is
|
|
|
the final operation when processing a message. It's strongly recommended
|
|
|
that @var{length} is @code{GCM_DIGEST_SIZE}, but if you provide a smaller
|
|
|
value, only the first @var{length} octets of the digest are written.
|
|
|
@end deftypefun
|
|
|
|
|
|
To encrypt a message using @acronym{GCM}, first initialize a context for
|
|
|
the underlying block cipher with a key to use for encryption. Then call
|
|
|
the above functions in the following order: @code{gcm_set_key},
|
|
|
@code{gcm_set_iv}, @code{gcm_update}, @code{gcm_encrypt},
|
|
|
@code{gcm_digest}. The decryption procedure is analogous, just calling
|
|
|
@code{gcm_decrypt} instead of @code{gcm_encrypt} (note that
|
|
|
@acronym{GCM} decryption still uses the encryption function of the
|
|
|
underlying block cipher). To process a new message, using the same key,
|
|
|
call @code{gcm_set_iv} with a new @acronym{iv}.
|
|
|
|
|
|
@subsubsection @acronym{GCM} helper macros
|
|
|
|
|
|
The following macros are defined.
|
|
|
|
|
|
@deffn Macro GCM_CTX (@var{context_type})
|
|
|
This defines an all-in-one context struct, including the context of the
|
|
|
underlying cipher, the hash sub-key, and the per-message state. It expands
|
|
|
to
|
|
|
@example
|
|
|
@{
|
|
|
struct gcm_key key;
|
|
|
struct gcm_ctx gcm;
|
|
|
context_type cipher;
|
|
|
@}
|
|
|
@end example
|
|
|
@end deffn
|
|
|
|
|
|
Example use:
|
|
|
@example
|
|
|
struct gcm_aes128_ctx GCM_CTX(struct aes128_ctx);
|
|
|
@end example
|
|
|
|
|
|
The following macros operate on context structs of this form.
|
|
|
|
|
|
@deffn Macro GCM_SET_KEY (@var{ctx}, @var{set_key}, @var{encrypt}, @var{key})
|
|
|
First argument, @var{ctx}, is a context struct as defined
|
|
|
by @code{GCM_CTX}. @var{set_key} and @var{encrypt} are functions for
|
|
|
setting the encryption key and for encrypting data using the underlying
|
|
|
cipher.
|
|
|
@end deffn
|
|
|
|
|
|
@deffn Macro GCM_SET_IV (@var{ctx}, @var{length}, @var{data})
|
|
|
First argument is a context struct as defined by
|
|
|
@code{GCM_CTX}. @var{length} and @var{data} give the initialization
|
|
|
vector (@acronym{IV}).
|
|
|
@end deffn
|
|
|
|
|
|
@deffn Macro GCM_UPDATE (@var{ctx}, @var{length}, @var{data})
|
|
|
Simpler way to call @code{gcm_update}. First argument is a context
|
|
|
struct as defined by @code{GCM_CTX}
|
|
|
@end deffn
|
|
|
|
|
|
@deffn Macro GCM_ENCRYPT (@var{ctx}, @var{encrypt}, @var{length}, @var{dst}, @var{src})
|
|
|
@deffnx Macro GCM_DECRYPT (@var{ctx}, @var{encrypt}, @var{length}, @var{dst}, @var{src})
|
|
|
@deffnx Macro GCM_DIGEST (@var{ctx}, @var{encrypt}, @var{length}, @var{digest})
|
|
|
Simpler way to call @code{gcm_encrypt}, @code{gcm_decrypt} or
|
|
|
@code{gcm_digest}. First argument is a context struct as defined by
|
|
|
@code{GCM_CTX}. Second argument, @var{encrypt}, is the encryption
|
|
|
function of the underlying cipher.
|
|
|
@end deffn
|
|
|
|
|
|
@subsubsection @acronym{GCM}-@acronym{AES} interface
|
|
|
|
|
|
The following functions implement the common case of @acronym{GCM} using
|
|
|
@acronym{AES} as the underlying cipher. The variants with a specific
|
|
|
@acronym{AES} flavor are recommended, while the fucntinos using
|
|
|
@code{struct gcm_aes_ctx} are kept for compatibility with older versiosn
|
|
|
of Nettle.
|
|
|
|
|
|
@deftp {Context struct} {struct gcm_aes128_ctx}
|
|
|
@deftpx {Context struct} {struct gcm_aes192_ctx}
|
|
|
@deftpx {Context struct} {struct gcm_aes256_ctx}
|
|
|
Context structs, defined using @code{GCM_CTX}.
|
|
|
@end deftp
|
|
|
|
|
|
@deftp {Context struct} {struct gcm_aes_ctx}
|
|
|
Alternative context struct, using the old @acronym{AES} interface.
|
|
|
@end deftp
|
|
|
|
|
|
@deftypefun void gcm_aes128_set_key (struct gcm_aes128_ctx *@var{ctx}, const uint8_t *@var{key})
|
|
|
@deftypefunx void gcm_aes192_set_key (struct gcm_aes192_ctx *@var{ctx}, const uint8_t *@var{key})
|
|
|
@deftypefunx void gcm_aes256_set_key (struct gcm_aes256_ctx *@var{ctx}, const uint8_t *@var{key})
|
|
|
Initializes @var{ctx} using the given key.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void gcm_aes_set_key (struct gcm_aes_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{key})
|
|
|
Corresponding function, using the old @acronym{AES} interface. All valid
|
|
|
@acronym{AES} key sizes can be used.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void gcm_aes128_set_iv (struct gcm_aes128_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{iv})
|
|
|
@deftypefunx void gcm_aes192_set_iv (struct gcm_aes192_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{iv})
|
|
|
@deftypefunx void gcm_aes256_set_iv (struct gcm_aes256_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{iv})
|
|
|
@deftypefunx void gcm_aes_set_iv (struct gcm_aes_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{iv})
|
|
|
Initializes the per-message state, using the given @acronym{IV}.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void gcm_aes128_update (struct gcm_aes128_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
@deftypefunx void gcm_aes192_update (struct gcm_aes192_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
@deftypefunx void gcm_aes256_update (struct gcm_aes256_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
@deftypefunx void gcm_aes_update (struct gcm_aes_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
Provides associated data to be authenticated. If used, must be called
|
|
|
before @code{gcm_aes_encrypt} or @code{gcm_aes_decrypt}. All but the
|
|
|
last call for each message @emph{must} use a length that is a multiple
|
|
|
of the block size.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void gcm_aes128_encrypt (struct gcm_aes128_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx void gcm_aes192_encrypt (struct gcm_aes192_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx void gcm_aes256_encrypt (struct gcm_aes256_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx void gcm_aes_encrypt (struct gcm_aes_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx void gcm_aes128_decrypt (struct gcm_aes128_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx void gcm_aes192_decrypt (struct gcm_aes192_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx void gcm_aes256_decrypt (struct gcm_aes256_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx void gcm_aes_decrypt (struct gcm_aes_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Encrypts or decrypts the data of a message. All but the last call for
|
|
|
each message @emph{must} use a length that is a multiple of the block
|
|
|
size.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void gcm_aes128_digest (struct gcm_aes128_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
@deftypefunx void gcm_aes192_digest (struct gcm_aes192_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
@deftypefunx void gcm_aes256_digest (struct gcm_aes256_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
@deftypefunx void gcm_aes_digest (struct gcm_aes_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
Extracts the message digest (also known ``authentication tag''). This is
|
|
|
the final operation when processing a message. It's strongly recommended
|
|
|
that @var{length} is @code{GCM_DIGEST_SIZE}, but if you provide a smaller
|
|
|
value, only the first @var{length} octets of the digest are written.
|
|
|
@end deftypefun
|
|
|
|
|
|
@subsubsection @acronym{GCM}-Camellia interface
|
|
|
|
|
|
The following functions implement the case of @acronym{GCM} using
|
|
|
Camellia as the underlying cipher.
|
|
|
|
|
|
@deftp {Context struct} {struct gcm_camellia128_ctx}
|
|
|
@deftpx {Context struct} {struct gcm_camellia256_ctx}
|
|
|
Context structs, defined using @code{GCM_CTX}.
|
|
|
@end deftp
|
|
|
|
|
|
@deftypefun void gcm_camellia128_set_key (struct gcm_camellia128_ctx *@var{ctx}, const uint8_t *@var{key})
|
|
|
@deftypefunx void gcm_camellia256_set_key (struct gcm_camellia256_ctx *@var{ctx}, const uint8_t *@var{key})
|
|
|
Initializes @var{ctx} using the given key.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void gcm_camellia128_set_iv (struct gcm_camellia128_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{iv})
|
|
|
@deftypefunx void gcm_camellia256_set_iv (struct gcm_camellia256_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{iv})
|
|
|
Initializes the per-message state, using the given @acronym{IV}.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void gcm_camellia128_update (struct gcm_camellia128_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
@deftypefunx void gcm_camellia256_update (struct gcm_camellia256_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
Provides associated data to be authenticated. If used, must be called
|
|
|
before @code{gcm_camellia_encrypt} or @code{gcm_camellia_decrypt}. All but the
|
|
|
last call for each message @emph{must} use a length that is a multiple
|
|
|
of the block size.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void gcm_camellia128_encrypt (struct gcm_camellia128_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx void gcm_camellia256_encrypt (struct gcm_camellia256_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx void gcm_camellia128_decrypt (struct gcm_camellia128_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx void gcm_camellia256_decrypt (struct gcm_camellia256_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Encrypts or decrypts the data of a message. All but the last call for
|
|
|
each message @emph{must} use a length that is a multiple of the block
|
|
|
size.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void gcm_camellia128_digest (struct gcm_camellia128_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
@deftypefunx void gcm_camellia192_digest (struct gcm_camellia192_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
@deftypefunx void gcm_camellia256_digest (struct gcm_camellia256_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
@deftypefunx void gcm_camellia_digest (struct gcm_camellia_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
Extracts the message digest (also known ``authentication tag''). This is
|
|
|
the final operation when processing a message. It's strongly recommended
|
|
|
that @var{length} is @code{GCM_DIGEST_SIZE}, but if you provide a smaller
|
|
|
value, only the first @var{length} octets of the digest are written.
|
|
|
@end deftypefun
|
|
|
|
|
|
@subsubsection @acronym{GCM}-SM4 interface
|
|
|
|
|
|
The following functions implement the case of @acronym{GCM} using
|
|
|
SM4 as the underlying cipher.
|
|
|
|
|
|
@deftp {Context struct} {struct gcm_sm4_ctx}
|
|
|
Context structs, defined using @code{GCM_CTX}.
|
|
|
@end deftp
|
|
|
|
|
|
@deftypefun void gcm_sm4_set_key (struct gcm_sm4_ctx *@var{ctx}, const uint8_t *@var{key})
|
|
|
Initializes @var{ctx} using the given key.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void gcm_sm4_set_iv (struct gcm_sm4_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{iv})
|
|
|
Initializes the per-message state, using the given @acronym{IV}.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void gcm_sm4_update (struct gcm_sm4_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
Provides associated data to be authenticated. If used, must be called
|
|
|
before @code{gcm_sm4_encrypt} or @code{gcm_sm4_decrypt}. All but the
|
|
|
last call for each message @emph{must} use a length that is a multiple
|
|
|
of the block size.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void gcm_sm4_encrypt (struct gcm_sm4_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx void gcm_sm4_decrypt (struct gcm_sm4_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Encrypts or decrypts the data of a message. All but the last call for
|
|
|
each message @emph{must} use a length that is a multiple of the block
|
|
|
size.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void gcm_sm4_digest (struct gcm_sm4_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
Extracts the message digest (also known ``authentication tag''). This is
|
|
|
the final operation when processing a message. It's strongly recommended
|
|
|
that @var{length} is @code{GCM_DIGEST_SIZE}, but if you provide a smaller
|
|
|
value, only the first @var{length} octets of the digest are written.
|
|
|
@end deftypefun
|
|
|
|
|
|
@node CCM
|
|
|
@subsection Counter with CBC-MAC mode
|
|
|
|
|
|
@cindex Counter with CBC-MAC Mode
|
|
|
@cindex CCM Mode
|
|
|
|
|
|
@acronym{CCM} mode is a combination of counter mode with message
|
|
|
authentication based on cipher block chaining, the same building blocks
|
|
|
as @acronym{EAX}, @pxref{EAX}. It is constructed on top of a block cipher
|
|
|
which must have a block size of 128 bits. @acronym{CCM} mode is
|
|
|
recommended by NIST in
|
|
|
@url{https://csrc.nist.gov/publications/nistpubs/800-38C/SP800-38C_updated-July20_2007.pdf,
|
|
|
NIST Special Publication 800-38C}. Nettle's support for CCM consists of
|
|
|
a low-level general interface, a message encryption and authentication
|
|
|
interface, and specific functions for CCM using AES as the underlying
|
|
|
block cipher. These interfaces are defined in @file{<nettle/ccm.h>}.
|
|
|
|
|
|
In @acronym{CCM}, the length of the message must be known before
|
|
|
processing. The maximum message size depends on the size of the nonce,
|
|
|
since the message size is encoded in a field which must fit in a single
|
|
|
block, together with the nonce and a flag byte. E.g., with a nonce size
|
|
|
of 12 octets, there are three octets left for encoding the message
|
|
|
length, the maximum message length is @math{2^24 - 1} octets.
|
|
|
|
|
|
@acronym{CCM} mode encryption operates as follows:
|
|
|
@itemize
|
|
|
@item The nonce and message length are concatenated to create
|
|
|
@code{B_0 = flags | nonce | mlength}
|
|
|
|
|
|
@item The authenticated data and plaintext is formatted into the string
|
|
|
@code{B = L(adata) | adata | padding | plaintext | padding} with
|
|
|
@code{padding} being the shortest string of zero bytes such that the
|
|
|
length of the string is a multiple of the block size, and
|
|
|
@code{L(adata)} is an encoding of the length of @code{adata}.
|
|
|
|
|
|
@item The string @code{B} is separated into blocks @code{B_1} ...
|
|
|
@code{B_n}
|
|
|
@item The authentication tag @code{T} is calculated as
|
|
|
@code{T=0, for i=0 to n, do T = E_k(B_i XOR T)}
|
|
|
|
|
|
@item An initial counter is then initialized from the nonce to create
|
|
|
@code{IC = flags | nonce | padding}, where @code{padding} is the
|
|
|
shortest string of zero bytes such that @code{IC} is exactly one block
|
|
|
in length.
|
|
|
|
|
|
@item The authentication tag is encrypted using using @acronym{CTR} mode:
|
|
|
@code{MAC = E_k(IC) XOR T}
|
|
|
|
|
|
@item The plaintext is then encrypted using @acronym{CTR} mode with an
|
|
|
initial counter of @code{IC+1}.
|
|
|
@end itemize
|
|
|
|
|
|
@acronym{CCM} mode decryption operates similarly, except that the
|
|
|
ciphertext and @acronym{MAC} are first decrypted using CTR mode to
|
|
|
retrieve the plaintext and authentication tag. The authentication tag
|
|
|
can then be recalculated from the authenticated data and plaintext, and
|
|
|
compared to the value in the message to check for authenticity.
|
|
|
|
|
|
@subsubsection General @acronym{CCM} interface
|
|
|
|
|
|
For all of the functions in the @acronym{CCM} interface, @var{cipher} is
|
|
|
the context struct for the underlying cipher and @var{f} is the
|
|
|
encryption function. The cipher's encryption key must be set before
|
|
|
calling any of the @acronym{CCM} functions. The cipher's decryption
|
|
|
function and key are never used.
|
|
|
|
|
|
@deftp {Context struct} {struct ccm_ctx}
|
|
|
Holds state corresponding to a particular message.
|
|
|
@end deftp
|
|
|
|
|
|
@defvr Constant CCM_BLOCK_SIZE
|
|
|
@acronym{CCM}'s block size, 16.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant CCM_DIGEST_SIZE
|
|
|
Size of the @acronym{CCM} digest, 16.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant CCM_MIN_NONCE_SIZE
|
|
|
@defvrx Constant CCM_MAX_NONCE_SIZE
|
|
|
The the minimum and maximum sizes for an @acronym{CCM} nonce, 7 and 14,
|
|
|
respectively.
|
|
|
@end defvr
|
|
|
|
|
|
@deffn Macro CCM_MAX_MSG_SIZE (@var{nonce_size})
|
|
|
The largest allowed plaintext length, when using @acronym{CCM} with a
|
|
|
nonce of the given size.
|
|
|
@end deffn
|
|
|
|
|
|
@deftypefun void ccm_set_nonce (struct ccm_ctx *@var{ctx}, const void *@var{cipher}, nettle_cipher_func *@var{f}, size_t @var{noncelen}, const uint8_t *@var{nonce}, size_t @var{authlen}, size_t @var{msglen}, size_t @var{taglen})
|
|
|
Initializes @var{ctx} using the given nonce and the sizes of the
|
|
|
authenticated data, message, and @acronym{MAC} to be processed.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void ccm_update (struct ccm_ctx *@var{ctx}, const void *@var{cipher}, nettle_cipher_func *@var{f}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
Provides associated data to be authenticated. Must be called after
|
|
|
@code{ccm_set_nonce}, and before @code{ccm_encrypt}, @code{ccm_decrypt}, or
|
|
|
@code{ccm_digest}.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void ccm_encrypt (struct ccm_ctx *@var{ctx}, const void *@var{cipher}, nettle_cipher_func *@var{f}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx void ccm_decrypt (struct ccm_ctx *@var{ctx}, const void *@var{cipher}, nettle_cipher_func *@var{f}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Encrypts or decrypts the message data. Must be called after
|
|
|
@code{ccm_set_nonce} and before @code{ccm_digest}. All but the last call
|
|
|
for each message @emph{must} use a length that is a multiple of the
|
|
|
block size.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void ccm_digest (struct ccm_ctx *@var{ctx}, const void *@var{cipher}, nettle_cipher_func *@var{f}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
Extracts the message digest (also known ``authentication tag''). This is
|
|
|
the final operation when processing a message. @var{length} is usually
|
|
|
equal to the @var{taglen} parameter supplied to @code{ccm_set_nonce},
|
|
|
but if you provide a smaller value, only the first @var{length} octets
|
|
|
of the digest are written.
|
|
|
@end deftypefun
|
|
|
|
|
|
To encrypt a message using the general @acronym{CCM} interface, set the
|
|
|
message nonce and length using @code{ccm_set_nonce} and then call
|
|
|
@code{ccm_update} to generate the digest of any authenticated data.
|
|
|
After all of the authenticated data has been digested use
|
|
|
@code{ccm_encrypt} to encrypt the plaintext. Finally, use
|
|
|
@code{ccm_digest} to return the encrypted @acronym{MAC}.
|
|
|
|
|
|
To decrypt a message, use @code{ccm_set_nonce} and @code{ccm_update} the
|
|
|
same as you would for encryption, and then call @code{ccm_decrypt} to
|
|
|
decrypt the ciphertext. After decrypting the ciphertext
|
|
|
@code{ccm_digest} will return the encrypted @acronym{MAC} which should
|
|
|
be identical to the @acronym{MAC} in the received message.
|
|
|
|
|
|
@subsubsection @acronym{CCM} message interface
|
|
|
|
|
|
The @acronym{CCM} message fuctions provides a simple interface that will
|
|
|
perform authentication and message encryption in a single function call.
|
|
|
The length of the cleartext is given by @var{mlength} and the length of
|
|
|
the ciphertext is given by @var{clength}, always exactly @var{tlength}
|
|
|
bytes longer than the corresponding plaintext. The length argument
|
|
|
passed to a function is always the size for the result, @var{clength}
|
|
|
for the encryption functions, and @var{mlength} for the decryption
|
|
|
functions.
|
|
|
|
|
|
@deftypefun void ccm_encrypt_message (void *@var{cipher}, nettle_cipher_func *@var{f}, size_t @var{nlength}, const uint8_t *@var{nonce}, size_t @var{alength}, const uint8_t *@var{adata}, size_t @var{tlength}, size_t @var{clength}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Computes the message digest from the @var{adata} and @var{src}
|
|
|
parameters, encrypts the plaintext from @var{src}, appends the encrypted
|
|
|
@acronym{MAC} to ciphertext and outputs it to @var{dst}.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun int ccm_decrypt_message (void *@var{cipher}, nettle_cipher_func *@var{f}, size_t @var{nlength}, const uint8_t *@var{nonce}, size_t @var{alength}, const uint8_t *@var{adata}, size_t @var{tlength}, size_t @var{mlength}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Decrypts the ciphertext from @var{src}, outputs the plaintext to
|
|
|
@var{dst}, recalculates the @acronym{MAC} from @var{adata} and the
|
|
|
plaintext, and compares it to the final @var{tlength} bytes of
|
|
|
@var{src}. If the values of the received and calculated @acronym{MAC}s
|
|
|
are equal, this will return 1 indicating a valid and authenticated
|
|
|
message. Otherwise, this function will return zero.
|
|
|
@end deftypefun
|
|
|
|
|
|
@subsubsection @acronym{CCM}-@acronym{AES} interface
|
|
|
|
|
|
The @acronym{AES} @acronym{CCM} functions provide an API for using
|
|
|
@acronym{CCM} mode with the @acronym{AES} block ciphers. The parameters
|
|
|
all have the same meaning as the general and message interfaces, except
|
|
|
that the @var{cipher}, @var{f}, and @var{ctx} parameters are replaced
|
|
|
with an @acronym{AES} context structure, and a set-key function must be
|
|
|
called before using any of the other functions in this interface.
|
|
|
|
|
|
@deftp {Context struct} {struct ccm_aes128_ctx}
|
|
|
Holds state corresponding to a particular message encrypted using the
|
|
|
AES-128 block cipher.
|
|
|
@end deftp
|
|
|
|
|
|
@deftp {Context struct} {struct ccm_aes192_ctx}
|
|
|
Holds state corresponding to a particular message encrypted using the
|
|
|
AES-192 block cipher.
|
|
|
@end deftp
|
|
|
|
|
|
@deftp {Context struct} {struct ccm_aes256_ctx}
|
|
|
Holds state corresponding to a particular message encrypted using the
|
|
|
AES-256 block cipher.
|
|
|
@end deftp
|
|
|
|
|
|
@deftypefun void ccm_aes128_set_key (struct ccm_aes128_ctx *@var{ctx}, const uint8_t *@var{key})
|
|
|
@deftypefunx void ccm_aes192_set_key (struct ccm_aes192_ctx *@var{ctx}, const uint8_t *@var{key})
|
|
|
@deftypefunx void ccm_aes256_set_key (struct ccm_aes256_ctx *@var{ctx}, const uint8_t *@var{key})
|
|
|
Initializes the encryption key for the AES block cipher. One of these
|
|
|
functions must be called before any of the other functions in the
|
|
|
@acronym{AES} @acronym{CCM} interface.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void ccm_aes128_set_nonce (struct ccm_aes128_ctx *@var{ctx}, size_t @var{noncelen}, const uint8_t *@var{nonce}, size_t @var{authlen}, size_t @var{msglen}, size_t @var{taglen})
|
|
|
@deftypefunx void ccm_aes192_set_nonce (struct ccm_aes192_ctx *@var{ctx}, size_t @var{noncelen}, const uint8_t *@var{nonce}, size_t @var{authlen}, size_t @var{msglen}, size_t @var{taglen})
|
|
|
@deftypefunx void ccm_aes256_set_nonce (struct ccm_aes256_ctx *@var{ctx}, size_t @var{noncelen}, const uint8_t *@var{nonce}, size_t @var{authlen}, size_t @var{msglen}, size_t @var{taglen})
|
|
|
These are identical to @code{ccm_set_nonce}, except that @var{cipher},
|
|
|
@var{f}, and @var{ctx} are replaced with a context structure.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void ccm_aes128_update (struct ccm_aes128_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
@deftypefunx void ccm_aes192_update (struct ccm_aes192_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
@deftypefunx void ccm_aes256_update (struct ccm_aes256_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
These are identical to @code{ccm_set_update}, except that @var{cipher},
|
|
|
@var{f}, and @var{ctx} are replaced with a context structure.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void ccm_aes128_encrypt (struct ccm_aes128_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx void ccm_aes192_encrypt (struct ccm_aes192_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx void ccm_aes256_encrypt (struct ccm_aes256_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx void ccm_aes128_decrypt (struct ccm_aes128_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx void ccm_aes192_decrypt (struct ccm_aes192_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx void ccm_aes256_decrypt (struct ccm_aes256_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
These are identical to @code{ccm_set_encrypt} and @code{ccm_set_decrypt}, except
|
|
|
that @var{cipher}, @var{f}, and @var{ctx} are replaced with a context structure.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void ccm_aes128_digest (struct ccm_aes128_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
@deftypefunx void ccm_aes192_digest (struct ccm_aes192_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
@deftypefunx void ccm_aes256_digest (struct ccm_aes256_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
These are identical to @code{ccm_set_digest}, except that @var{cipher},
|
|
|
@var{f}, and @var{ctx} are replaced with a context structure.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void ccm_aes128_encrypt_message (struct ccm_aes128_ctx *@var{ctx}, size_t @var{nlength}, const uint8_t *@var{nonce}, size_t @var{alength}, const uint8_t *@var{adata}, size_t @var{tlength}, size_t @var{clength}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx void ccm_aes192_encrypt_message (struct ccm_aes192_ctx *@var{ctx}, size_t @var{nlength}, const uint8_t *@var{nonce}, size_t @var{alength}, const uint8_t *@var{adata}, size_t @var{tlength}, size_t @var{clength}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx void ccm_aes256_encrypt_message (struct ccm_aes256_ctx *@var{ctx}, size_t @var{nlength}, const uint8_t *@var{nonce}, size_t @var{alength}, const uint8_t *@var{adata}, size_t @var{tlength}, size_t @var{clength}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx int ccm_aes128_decrypt_message (struct ccm_aes128_ctx *@var{ctx}, size_t @var{nlength}, const uint8_t *@var{nonce}, size_t @var{alength}, const uint8_t *@var{adata}, size_t @var{tlength}, size_t @var{mlength}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx int ccm_aes192_decrypt_message (struct ccm_aes192_ctx *@var{ctx}, size_t @var{nlength}, const uint8_t *@var{nonce}, size_t @var{alength}, const uint8_t *@var{adata}, size_t @var{tlength}, size_t @var{mlength}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx int ccm_aes192_decrypt_message (struct ccm_aes256_ctx *@var{ctx}, size_t @var{nlength}, const uint8_t *@var{nonce}, size_t @var{alength}, const uint8_t *@var{adata}, size_t @var{tlength}, size_t @var{mlength}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
These are identical to @code{ccm_encrypt_message} and @code{ccm_decrypt_message}
|
|
|
except that @var{cipher} and @var{f} are replaced with a context structure.
|
|
|
@end deftypefun
|
|
|
|
|
|
@node ChaCha-Poly1305
|
|
|
@subsection ChaCha-Poly1305
|
|
|
|
|
|
ChaCha-Poly1305 is a combination of the ChaCha stream cipher and the
|
|
|
poly1305 message authentication code (@pxref{Poly1305}). It originates
|
|
|
from the NaCl cryptographic library by D. J. Bernstein et al, which
|
|
|
defines a similar construction but with Salsa20 instead of ChaCha.
|
|
|
|
|
|
Nettle's implementation of ChaCha-Poly1305 follows @cite{RFC 8439},
|
|
|
where the ChaCha cipher is initialized with a 12-byte nonce and a 4-byte
|
|
|
block counter. This allows up to 256 gigabytes of data to be encrypted
|
|
|
using the same key and nonce.
|
|
|
|
|
|
For ChaCha-Poly1305, the ChaCha cipher is initialized with a key, of 256
|
|
|
bits, and a per-message nonce. The first block of the key stream
|
|
|
(counter all zero) is set aside for the authentication subkeys. Of this
|
|
|
64-octet block, the first 16 octets specify the poly1305 evaluation
|
|
|
point, and the next 16 bytes specify the value to add in for the final
|
|
|
digest. The final 32 bytes of this block are unused. Note that unlike
|
|
|
poly1305-aes, the evaluation point depends on the nonce. This is
|
|
|
preferable, because it leaks less information in case the attacker for
|
|
|
some reason is lucky enough to forge a valid authentication tag, and
|
|
|
observe (from the receiver's behaviour) that the forgery succeeded.
|
|
|
|
|
|
The ChaCha key stream, starting with counter value 1, is then used to
|
|
|
encrypt the message. For authentication, poly1305 is applied to the
|
|
|
concatenation of the associated data, the cryptotext, and the lengths of
|
|
|
the associated data and the message, each a 64-bit number (eight octets,
|
|
|
little-endian). Nettle defines ChaCha-Poly1305 in
|
|
|
@file{<nettle/chacha-poly1305.h>}.
|
|
|
|
|
|
@defvr Constant CHACHA_POLY1305_BLOCK_SIZE
|
|
|
Same as the ChaCha block size, 64.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant CHACHA_POLY1305_KEY_SIZE
|
|
|
ChaCha-Poly1305 key size, 32.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant CHACHA_POLY1305_NONCE_SIZE
|
|
|
ChaCha-Poly1305 nonce size, 12.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant CHACHA_POLY1305_DIGEST_SIZE
|
|
|
Digest size, 16.
|
|
|
@end defvr
|
|
|
|
|
|
@deftp {Context struct} {struct chacha_poly1305_ctx}
|
|
|
@end deftp
|
|
|
|
|
|
@deftypefun void chacha_poly1305_set_key (struct chacha_poly1305_ctx *@var{ctx}, const uint8_t *@var{key})
|
|
|
Initializes @var{ctx} using the given key. Before using the context, you
|
|
|
@emph{must} also call @code{chacha_poly1305_set_nonce}, see below.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void chacha_poly1305_set_nonce (struct chacha_poly1305_ctx *@var{ctx}, const uint8_t *@var{nonce})
|
|
|
Initializes the per-message state, using the given nonce.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void chacha_poly1305_update (struct chacha_poly1305_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
Process associated data for authentication.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void chacha_poly1305_encrypt (struct chacha_poly1305_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx void chacha_poly1305_decrypt (struct chacha_poly1305_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Encrypts or decrypts the data of a message. All but the last call for
|
|
|
each message @emph{must} use a length that is a multiple of the block
|
|
|
size.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void chacha_poly1305_digest (struct chacha_poly1305_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
Extracts the message digest (also known ``authentication tag''). This is
|
|
|
the final operation when processing a message. If @var{length} is
|
|
|
smaller than @code{CHACHA_POLY1305_DIGEST_SIZE}, only the first
|
|
|
@var{length} octets of the digest are written.
|
|
|
@end deftypefun
|
|
|
|
|
|
@node OCB
|
|
|
@subsection @acronym{OCB} (Offset Code Book) Mode
|
|
|
|
|
|
@cindex OCB
|
|
|
@cindex OCB mode
|
|
|
@cindex Offset Code Book
|
|
|
|
|
|
The @acronym{OCB} mode is an @acronym{AEAD} construction, featuring
|
|
|
particularly fast and simple authentication; it needs one block cipher
|
|
|
operation per data block, and almost free authentication. It is
|
|
|
constructed on top of a block cipher which must have a block size of 128
|
|
|
bits.
|
|
|
|
|
|
There have been several versions of the OCB scheme, the implementation
|
|
|
in Nettle follows @cite{RFC 7253}, which is almost the same as the
|
|
|
scheme OCB3.
|
|
|
|
|
|
@subsubsection General interface
|
|
|
|
|
|
@deftp {Context struct} {struct ocb_key}
|
|
|
@acronym{OCB} state which depends only on the key, but not on the nonce
|
|
|
or the message.
|
|
|
@end deftp
|
|
|
|
|
|
@deftp {Context struct} {struct ocb_ctx}
|
|
|
Holds state corresponding to a particular message.
|
|
|
@end deftp
|
|
|
|
|
|
@defvr Constant OCB_BLOCK_SIZE
|
|
|
The block size for @acronym{OCB}'s block size, 16.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant OCB_MAX_NONCE_SIZE
|
|
|
The maximum nonce size for @acronym{OCB}, 15.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant OCB_DIGEST_SIZE
|
|
|
Size of the @acronym{OCB} authentication tag.
|
|
|
@end defvr
|
|
|
|
|
|
@deftypefun void ocb_set_key (struct ocb_key *@var{key}, const void *@var{cipher}, nettle_cipher_func *@var{f})
|
|
|
Initializes the @var{key} struct. The @var{cipher} context must be
|
|
|
initialized for encryption, and @var{f} should be the corresponding
|
|
|
encryption function.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void ocb_set_nonce (struct ocb_ctx *@var{ctx}, const void *@var{cipher}, nettle_cipher_func *@var{f}, size_t @var{tag_length}, size_t @var{nonce_length}, const uint8_t *@var{nonce})
|
|
|
Initializes @var{ctx} for processing a new message, using the given
|
|
|
nonce. The @var{cipher} must be initialized for encryption, and @var{f}
|
|
|
should be the corresponding encryption function. The @var{tag_length}
|
|
|
(non-zero, and at most 16) is included when initializing the state, and
|
|
|
should be the same value later passed to @code{ocb_digest}. Nonce is
|
|
|
optional, and length at most 15 bytes.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void ocb_update (struct ocb_ctx *@var{ctx}, const struct ocb_key *@var{key}, const void *@var{cipher}, nettle_cipher_func *@var{f}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
Process associated data for authentication. All but the last call for
|
|
|
each message @emph{must} use a length that is a multiple of the block
|
|
|
size.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void ocb_encrypt (struct ocb_ctx *@var{ctx}, const struct ocb_key *@var{key}, const void *@var{cipher}, nettle_cipher_func *@var{f}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Encrypts the data of a message. @var{cipher} is the context struct for
|
|
|
the underlying cipher and @var{f} is the encryption function. All but
|
|
|
the last call for each message @emph{must} use a length that is a
|
|
|
multiple of the block size.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void ocb_decrypt (struct ocb_ctx *@var{ctx}, const struct ocb_key *@var{key}, const void *@var{encrypt_ctx}, nettle_cipher_func *@var{encrypt}, const void *@var{decrypt_ctx}, nettle_cipher_func *@var{decrypt}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Decrypts the data of a message. @var{encrypt_ctx} and @var{encrypt}
|
|
|
define the encryption operation of the underlying cipher, while
|
|
|
@var{decrypt_ctx} and @var{decrypt} represent the decryption operation
|
|
|
(for some ciphers, one of context pointer and function pointer may be
|
|
|
the same). All but the last call for each message @emph{must} use a
|
|
|
length that is a multiple of the block size.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void ocb_digest (const struct ocb_ctx *@var{ctx}, const struct ocb_key *@var{key}, const void *@var{cipher}, nettle_cipher_func *@var{f}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
Extracts the message digest (also known ``authentication tag''). This is
|
|
|
the final operation when processing a message. The @var{length} value
|
|
|
@emph{should} be the same as the tag length passed to the preceding
|
|
|
@code{ocb_set_nonce} call (using a different length is possible, but
|
|
|
incompatible with @cite{RFC 7253}).
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void ocb_encrypt_message (const struct ocb_key *@var{ocb_key}, const void *@var{cipher}, nettle_cipher_func *@var{f}, size_t @var{nlength}, const uint8_t *@var{nonce}, size_t @var{alength}, const uint8_t *@var{adata}, size_t @var{tlength}, size_t @var{clength}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Computes the message digest from the @var{adata} and @var{src}
|
|
|
parameters, encrypts the plaintext from @var{src}, appends the tag to
|
|
|
the ciphertext and writes it to @var{dst}. The @var{clength} variable
|
|
|
must be equal to the length of @var{src} plus @var{tlength}.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun int ocb_decrypt_message (const struct ocb_key *@var{ocb_key}, const void *@var{encrypt_ctx}, nettle_cipher_func *@var{encrypt}, const void *@var{decrypt_ctx}, nettle_cipher_func *@var{decrypt}, size_t @var{nlength}, const uint8_t *@var{nonce}, size_t @var{alength}, const uint8_t *@var{adata}, size_t @var{tlength}, size_t @var{mlength}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Decrypts the ciphertext from @var{src}, outputs the plaintext to
|
|
|
@var{dst}. Like @code{ocb_decrypt}, it needs both the encrypt and the
|
|
|
decrypt function of the underlying cipher. It also recalculates the
|
|
|
authentication tag from @var{adata} and the plaintext, and compares it
|
|
|
to the final @var{tlength} bytes of @var{src}. If the values of the
|
|
|
received and calculated tags are equal, this will return 1 indicating a
|
|
|
valid and authenticated message. Otherwise, this function will return
|
|
|
zero.
|
|
|
@end deftypefun
|
|
|
|
|
|
@subsubsection @acronym{OCB-AES} interface
|
|
|
|
|
|
|
|
|
@deftp {Context struct} {struct ocb_aes128_encrypt_key}
|
|
|
Key-dependent state for encryption using @acronym{OCB-AES128}. For
|
|
|
decryption, a separate @code{struct aes128_ctx}, initialized for
|
|
|
decryption, is needed as well.
|
|
|
@end deftp
|
|
|
|
|
|
@deftypefun void ocb_aes128_set_encrypt_key (struct ocb_aes128_encrypt_key *@var{ocb}, const uint8_t *@var{key})
|
|
|
Initializes @var{ocb} and the underlying AES cipher with the given key.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void ocb_aes128_set_decrypt_key (struct ocb_aes128_encrypt_key *@var{ocb}, struct aes128_ctx *@var{decrypt}, const uint8_t *@var{key})
|
|
|
Initializes @var{ocb} and the underlying AES cipher with the given key.
|
|
|
In addition, initialize @var{decrypt} for decryption using the same key;
|
|
|
this is needed for @code{ocb_aes128_decrypt} and
|
|
|
@code{ocb_aes128_decrypt_message}.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void ocb_aes128_set_nonce (struct ocb_ctx *@var{ctx}, const struct ocb_aes128_encrypt_key *@var{key}, size_t @var{tag_length}, size_t @var{nonce_length}, const uint8_t *@var{nonce})
|
|
|
Initializes @var{ctx} for processing a new message, using the given
|
|
|
nonce and key. The @var{tag_length} (non-zero, and at most 16) is
|
|
|
included when initializing the state, and should be the same value later
|
|
|
passed to @code{ocb_digest}. Nonce is optional, and length at most 15
|
|
|
bytes.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void ocb_aes128_update (struct ocb_ctx *@var{ctx}, const struct ocb_aes128_encrypt_key *@var{key}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
Process associated data for authentication. All but the last call for
|
|
|
each message @emph{must} use a length that is a multiple of the block
|
|
|
size.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void ocb_aes128_encrypt (struct ocb_ctx *@var{ctx}, const struct ocb_aes128_encrypt_key *@var{key}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Encrypts the data of a message. All but the last call for each message
|
|
|
@emph{must} use a length that is a multiple of the block size.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void ocb_aes128_decrypt (struct ocb_ctx *@var{ctx}, const struct ocb_aes128_encrypt_key *@var{key}, const struct aes128_ctx *@var{decrypt}, size_t @var{length}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Decrypts the data of a message. @var{decrypt} is an AES context
|
|
|
initialized for decryption using the same key. All but the last call for
|
|
|
each message @emph{must} use a length that is a multiple of the block
|
|
|
size.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void ocb_aes128_digest (struct ocb_ctx *@var{ctx}, const struct ocb_aes128_encrypt_key *@var{key}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
Extracts the message digest (also known ``authentication tag''). This is
|
|
|
the final operation when processing a message. The @var{length} value
|
|
|
@emph{should} be the same as the tag length passed to the preceding
|
|
|
@code{ocb_aes128_set_nonce} call (using a different length is possible, but
|
|
|
incompatible with @cite{RFC 7253}).
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void ocb_aes128_encrypt_message (const struct ocb_aes128_encrypt_key *@var{key}, size_t @var{nlength}, const uint8_t *@var{nonce}, size_t @var{alength}, const uint8_t *@var{adata}, size_t @var{tlength}, size_t @var{clength}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Computes the message digest from the @var{adata} and @var{src}
|
|
|
parameters, encrypts the plaintext from @var{src}, appends the tag to
|
|
|
the ciphertext and writes it to @var{dst}. The @var{clength} variable
|
|
|
must be equal to the length of @var{src} plus @var{tlength}.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun int ocb_aes128_decrypt_message (const struct ocb_aes128_encrypt_key *@var{key}, const struct aes128_ctx *@var{decrypt}, size_t @var{nlength}, const uint8_t *@var{nonce}, size_t @var{alength}, const uint8_t *@var{adata}, size_t @var{tlength}, size_t @var{mlength}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Decrypts the ciphertext from @var{src}, outputs the plaintext to
|
|
|
@var{dst}. Like @code{ocb_aes128_decrypt}, it needs an AES context
|
|
|
initialized for decryption using the same key. It also recalculates the
|
|
|
authentication tag from @var{adata} and the plaintext, and compares it
|
|
|
to the final @var{tlength} bytes of @var{src}. If the values of the
|
|
|
received and calculated tags are equal, this will return 1 indicating a
|
|
|
valid and authenticated message. Otherwise, this function will return
|
|
|
zero.
|
|
|
@end deftypefun
|
|
|
|
|
|
@node SIV-CMAC
|
|
|
@subsection Synthetic Initialization Vector AEAD
|
|
|
|
|
|
@cindex SIV mode
|
|
|
@cindex SIV-CMAC mode
|
|
|
|
|
|
@acronym{SIV-CMAC} mode is a combination of counter mode with message
|
|
|
authentication based on @acronym{CMAC}. Unlike other counter @acronym{AEAD}
|
|
|
modes, it provides protection against accidental nonce misuse, making it
|
|
|
a good choice for stateless-servers that cannot ensure nonce uniqueness.
|
|
|
It is constructed on top of a block cipher which must have a block size of
|
|
|
128 bits. Nettle's support for @acronym{SIV-CMAC} consists of
|
|
|
a message encryption and authentication interface, for
|
|
|
@acronym{SIV-CMAC} using AES as the underlying block cipher.
|
|
|
When a nonce is re-used with this mode, message authenticity is retained
|
|
|
however an attacker can determine whether the same plaintext was protected
|
|
|
with the two messages sharing the nonce.
|
|
|
These interfaces are defined in @file{<nettle/siv-cmac.h>}.
|
|
|
|
|
|
Unlike other @acronym{AEAD} mode in @acronym{SIV-CMAC} the initialization
|
|
|
vector serves as the tag. That means that in the generated ciphertext
|
|
|
the tag precedes the ciphertext.
|
|
|
|
|
|
Note also, that the @acronym{SIV-CMAC} algorithm, as specified in
|
|
|
@cite{RFC 5297}, introduces the notion of authenticated data which
|
|
|
consist of multiple components. For example with @acronym{SIV-CMAC} the
|
|
|
authentication tag of data @code{X} followed by @code{Y}, is different
|
|
|
than the concatenated data @code{X || Y}. The interfaces described below
|
|
|
follow the @acronym{AEAD} paradigm and do not allow access to this
|
|
|
feature and also require the use of a non-empty nonce. In the
|
|
|
terminology of the RFC, the input to the S2V function is always a vector
|
|
|
of three elements, where S1 is the authenticated data, S2 is the nonce,
|
|
|
and S3 is the plaintext.
|
|
|
|
|
|
|
|
|
@subsubsection General interface
|
|
|
|
|
|
@defvr Constant SIV_BLOCK_SIZE
|
|
|
@acronym{SIV-CMAC}'s block size, 16.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant SIV_DIGEST_SIZE
|
|
|
Size of the @acronym{SIV-CMAC} digest or initialization vector, 16.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant SIV_MIN_NONCE_SIZE
|
|
|
The the minimum size for an @acronym{SIV-CMAC} nonce, 1.
|
|
|
@end defvr
|
|
|
|
|
|
@subsubsection @acronym{SIV-CMAC}-@acronym{AES} interface
|
|
|
|
|
|
The @acronym{AES} @acronym{SIV-CMAC} functions provide an API for using
|
|
|
@acronym{SIV-CMAC} mode with the @acronym{AES} block ciphers. The parameters
|
|
|
all have the same meaning as the general and message interfaces, except
|
|
|
that the @var{cipher}, @var{f}, and @var{ctx} parameters are replaced
|
|
|
with an @acronym{AES} context structure, and a set-key function must be
|
|
|
called before using any of the other functions in this interface.
|
|
|
|
|
|
@deftp {Context struct} {struct siv_cmac_aes128_ctx}
|
|
|
Holds state corresponding to a particular message encrypted using the
|
|
|
AES-128 block cipher.
|
|
|
@end deftp
|
|
|
|
|
|
@deftp {Context struct} {struct siv_cmac_aes256_ctx}
|
|
|
Holds state corresponding to a particular message encrypted using the
|
|
|
AES-256 block cipher.
|
|
|
@end deftp
|
|
|
|
|
|
@deftypefun void siv_cmac_aes128_set_key (struct siv_cmac_aes128_ctx *@var{ctx}, const uint8_t *@var{key})
|
|
|
@deftypefunx void siv_cmac_aes256_set_key (struct siv_cmac_aes256_ctx *@var{ctx}, const uint8_t *@var{key})
|
|
|
Initializes the encryption key for the AES block cipher. One of these
|
|
|
functions must be called before any of the other functions in the
|
|
|
@acronym{AES} @acronym{SIV-CMAC} interface.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void siv_cmac_aes128_encrypt_message (struct siv_cmac_aes128_ctx *@var{ctx}, size_t @var{nlength}, const uint8_t *@var{nonce}, size_t @var{alength}, const uint8_t *@var{adata}, size_t @var{clength}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx void siv_cmac_aes256_encrypt_message (struct siv_cmac_aes256_ctx *@var{ctx}, size_t @var{nlength}, const uint8_t *@var{nonce}, size_t @var{alength}, const uint8_t *@var{adata}, size_t @var{clength}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Computes the message digest from the @var{adata} and @var{src}
|
|
|
parameters, encrypts the plaintext from @var{src}, prepends the
|
|
|
initialization vector to the ciphertext and outputs it to @var{dst}.
|
|
|
The @var{clength} variable must be equal to the length of @var{src}
|
|
|
plus @code{SIV_DIGEST_SIZE}.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun int siv_cmac_aes128_decrypt_message (struct siv_cmac_aes128_ctx *@var{ctx}, size_t @var{nlength}, const uint8_t *@var{nonce}, size_t @var{alength}, const uint8_t *@var{adata}, size_t @var{mlength}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx int siv_cmac_aes256_decrypt_message (struct siv_cmac_aes128_ctx *@var{ctx}, size_t @var{nlength}, const uint8_t *@var{nonce}, size_t @var{alength}, const uint8_t *@var{adata}, size_t @var{mlength}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Decrypts the ciphertext from @var{src}, outputs the plaintext to
|
|
|
@var{dst}, recalculates the initialization vector from @var{adata} and the
|
|
|
plaintext. If the values of the received and calculated initialization vector
|
|
|
are equal, this will return 1 indicating a valid and authenticated
|
|
|
message. Otherwise, this function will return zero.
|
|
|
@end deftypefun
|
|
|
|
|
|
@node SIV-GCM
|
|
|
@subsection SIV-GCM
|
|
|
|
|
|
@acronym{SIV-GCM}, described in @cite{RFC 8452}, is an @acronym{AEAD}
|
|
|
construction similar to @acronym{AES-GCM}, but provides protection against
|
|
|
accidental nonce misuse like @acronym{SIV-CMAC} mode.
|
|
|
|
|
|
It is constructed on top of a block cipher which must have a block size of 128
|
|
|
bits and a nonce size of 12 bytes. Nettle's support for @acronym{SIV-GCM}
|
|
|
consists of a message encryption and authentication interface, for
|
|
|
@acronym{SIV-GCM} using AES as the underlying block cipher. These
|
|
|
interfaces are defined in @file{<nettle/siv-gcm.h>}.
|
|
|
|
|
|
Unlike other @acronym{AEAD} mode in @acronym{SIV-GCM} the tag is calculated
|
|
|
over the encoded additional authentication data and plaintext instead of the
|
|
|
ciphertext.
|
|
|
|
|
|
@subsubsection General interface
|
|
|
|
|
|
@defvr Constant SIV_GCM_BLOCK_SIZE
|
|
|
@acronym{SIV-GCM}'s block size, 16.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant SIV_GCM_DIGEST_SIZE
|
|
|
Size of the @acronym{SIV-GCM} digest for tags, 16.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant SIV_GCM_NONCE_SIZE
|
|
|
Size of the @acronym{SIV-GCM} nonce, 12.
|
|
|
@end defvr
|
|
|
|
|
|
@deftypefun void siv_gcm_encrypt_message (const struct nettle_cipher *@var{nc}, const void *@var{ctx}, void *@var{ctr_ctx}, size_t @var{nlength}, const uint8_t *@var{nonce}, size_t @var{alength}, const uint8_t *@var{adata}, size_t @var{clength}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Computes the message digest from the @var{adata} and @var{src}
|
|
|
parameters, encrypts the plaintext from @var{src}, appends the
|
|
|
authentication tag to the ciphertext and outputs it to @var{dst}. The
|
|
|
@var{clength} variable must be equal to the length of @var{src} plus
|
|
|
@code{SIV_GCM_DIGEST_SIZE}.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun int siv_gcm_decrypt_message (const struct nettle_cipher *@var{nc}, const void *@var{ctx}, void *@var{ctr_ctx}, size_t @var{nlength}, const uint8_t *@var{nonce}, size_t @var{alength}, const uint8_t *@var{adata}, size_t @var{mlength}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Decrypts the ciphertext from @var{src}, outputs the plaintext to
|
|
|
@var{dst}, recalculates the initialization vector from @var{adata} and the
|
|
|
plaintext. If the values of the received and calculated initialization vector
|
|
|
are equal, this will return 1 indicating a valid and authenticated
|
|
|
message. Otherwise, this function will return zero.
|
|
|
@end deftypefun
|
|
|
|
|
|
In the above interface, @var{nc} must point to a cipher that works
|
|
|
with 16-byte block size and the key sizes that are multiple of
|
|
|
8-bytes. The @var{ctx} context structure must be initialized for
|
|
|
encryption mode using a set-key function, before using any of the
|
|
|
functions in this interface. While the @var{ctr_ctx} context
|
|
|
structure must have the same size as @var{ctx}, it does not need to be
|
|
|
initialized before calling those functions as it is used as working
|
|
|
storage. These structures can point to the same area; in that case
|
|
|
the contents of *@var{ctx} is destroyed by the call.
|
|
|
|
|
|
For convenience, Nettle provides wrapper functions that works with
|
|
|
@acronym{AES} described in the following section.
|
|
|
|
|
|
@subsubsection @acronym{SIV-GCM}-@acronym{AES} interface
|
|
|
|
|
|
The @acronym{SIV-GCM} functions provide an API for using @acronym{SIV-GCM}
|
|
|
mode with the @acronym{AES} block ciphers. The parameters all have the same
|
|
|
meaning as the general and message interfaces, except that the @var{cipher},
|
|
|
@var{f}, and @var{ctx} parameters are replaced with an @acronym{AES} context
|
|
|
structure. The @acronym{AES} context structure must be initialized for
|
|
|
encryption mode using a set-key function, before using any of the functions in
|
|
|
this interface.
|
|
|
|
|
|
@deftypefun void siv_gcm_aes128_encrypt_message (const struct aes128_ctx *@var{ctx}, size_t @var{nlength}, const uint8_t *@var{nonce}, size_t @var{alength}, const uint8_t *@var{adata}, size_t @var{clength}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx void siv_gcm_aes256_encrypt_message (const struct aes256_ctx *@var{ctx}, size_t @var{nlength}, const uint8_t *@var{nonce}, size_t @var{alength}, const uint8_t *@var{adata}, size_t @var{clength}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Computes the message digest from the @var{adata} and @var{src}
|
|
|
parameters, encrypts the plaintext from @var{src}, appends the
|
|
|
authentication tag to the ciphertext and outputs it to @var{dst}.
|
|
|
The @var{clength} variable must be equal to the length of @var{src}
|
|
|
plus @code{SIV_GCM_DIGEST_SIZE}.
|
|
|
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun int siv_gcm_aes128_decrypt_message (const struct aes128_ctx *@var{ctx}, size_t @var{nlength}, const uint8_t *@var{nonce}, size_t @var{alength}, const uint8_t *@var{adata}, size_t @var{mlength}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
@deftypefunx int siv_gcm_aes256_decrypt_message (const struct aes256_ctx *@var{ctx}, size_t @var{nlength}, const uint8_t *@var{nonce}, size_t @var{alength}, const uint8_t *@var{adata}, size_t @var{mlength}, uint8_t *@var{dst}, const uint8_t *@var{src})
|
|
|
Decrypts the ciphertext from @var{src}, outputs the plaintext to
|
|
|
@var{dst}, recalculates the initialization vector from @var{adata} and the
|
|
|
plaintext. If the values of the received and calculated initialization vector
|
|
|
are equal, this will return 1 indicating a valid and authenticated
|
|
|
message. Otherwise, this function will return zero.
|
|
|
@end deftypefun
|
|
|
|
|
|
@node nettle_aead abstraction
|
|
|
@subsection The @code{struct nettle_aead} abstraction
|
|
|
@cindex nettle_aead
|
|
|
|
|
|
Nettle includes a struct including information about the supported hash
|
|
|
functions. It is defined in @file{<nettle/nettle-meta.h>}.
|
|
|
|
|
|
@deftp {Meta struct} @code{struct nettle_aead} name context_size block_size key_size nonce_size digest_size set_encrypt_key set_decrypt_key set_nonce update encrypt decrypt digest
|
|
|
The last seven attributes are function pointers.
|
|
|
@end deftp
|
|
|
|
|
|
@deftypevr {Constant Struct} {struct nettle_aead} nettle_gcm_aes128
|
|
|
@deftypevrx {Constant Struct} {struct nettle_aead} nettle_gcm_aes192
|
|
|
@deftypevrx {Constant Struct} {struct nettle_aead} nettle_gcm_aes256
|
|
|
@deftypevrx {Constant Struct} {struct nettle_aead} nettle_gcm_camellia128
|
|
|
@deftypevrx {Constant Struct} {struct nettle_aead} nettle_gcm_camellia256
|
|
|
@deftypevrx {Constant Struct} {struct nettle_aead} nettle_eax_aes128
|
|
|
@deftypevrx {Constant Struct} {struct nettle_aead} nettle_chacha_poly1305
|
|
|
These are most of the @acronym{AEAD} constructions that Nettle
|
|
|
implements. Note that @acronym{CCM} is missing; it requirement that the
|
|
|
message size is specified in advance makes it incompatible with the
|
|
|
@code{nettle_aead} abstraction.
|
|
|
@end deftypevr
|
|
|
|
|
|
Nettle also exports a list of all these constructions.
|
|
|
|
|
|
@deftypefun {const struct nettle_aead **} nettle_get_aeads (void)
|
|
|
Returns a NULL-terminated list of pointers to supported algorithms.This
|
|
|
list can be used to dynamically enumerate or search the supported
|
|
|
algorithms.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deffn Macro nettle_aeads
|
|
|
A macro expanding to a call to nettle_get_aeads. In earlier versions,
|
|
|
this was not a macro but the actual array of pointers.
|
|
|
@end deffn
|
|
|
|
|
|
@node Keyed hash functions
|
|
|
@section Keyed Hash Functions
|
|
|
|
|
|
@cindex Keyed Hash Function
|
|
|
@cindex Message Authentication Code
|
|
|
@cindex MAC
|
|
|
|
|
|
A @dfn{keyed hash function}, or @dfn{Message Authentication Code}
|
|
|
(@acronym{MAC}) is a function that takes a key and a message, and
|
|
|
produces fixed size @acronym{MAC}. It should be hard to compute a
|
|
|
message and a matching @acronym{MAC} without knowledge of the key. It
|
|
|
should also be hard to compute the key given only messages and
|
|
|
corresponding @acronym{MAC}s.
|
|
|
|
|
|
Keyed hash functions are useful primarily for message authentication,
|
|
|
when Alice and Bob shares a secret: The sender, Alice, computes the
|
|
|
@acronym{MAC} and attaches it to the message. The receiver, Bob, also computes
|
|
|
the @acronym{MAC} of the message, using the same key, and compares that
|
|
|
to Alice's value. If they match, Bob can be assured that
|
|
|
the message has not been modified on its way from Alice.
|
|
|
|
|
|
However, unlike digital signatures, this assurance is not transferable.
|
|
|
Bob can't show the message and the @acronym{MAC} to a third party and
|
|
|
prove that Alice sent that message. Not even if he gives away the key to
|
|
|
the third party. The reason is that the @emph{same} key is used on both
|
|
|
sides, and anyone knowing the key can create a correct @acronym{MAC} for
|
|
|
any message. If Bob believes that only he and Alice knows the key, and
|
|
|
he knows that he didn't attach a @acronym{MAC} to a particular message,
|
|
|
he knows it must be Alice who did it. However, the third party can't
|
|
|
distinguish between a @acronym{MAC} created by Alice and one created by
|
|
|
Bob.
|
|
|
|
|
|
Keyed hash functions are typically a lot faster than digital signatures
|
|
|
as well.
|
|
|
|
|
|
@menu
|
|
|
* HMAC::
|
|
|
* UMAC::
|
|
|
* CMAC::
|
|
|
* Poly1305::
|
|
|
@end menu
|
|
|
|
|
|
@node HMAC
|
|
|
@subsection @acronym{HMAC}
|
|
|
@cindex HMAC
|
|
|
|
|
|
One can build keyed hash functions from ordinary hash functions. Older
|
|
|
constructions simply concatenate secret key and message and hashes that, but
|
|
|
such constructions have weaknesses. A better construction is
|
|
|
@acronym{HMAC}, described in @cite{RFC 2104}.
|
|
|
|
|
|
For an underlying hash function @code{H}, with digest size @code{l} and
|
|
|
internal block size @code{b}, @acronym{HMAC-H} is constructed as
|
|
|
follows: From a given key @code{k}, two distinct subkeys @code{k_i} and
|
|
|
@code{k_o} are constructed, both of length @code{b}. The
|
|
|
@acronym{HMAC-H} of a message @code{m} is then computed as @code{H(k_o |
|
|
|
H(k_i | m))}, where @code{|} denotes string concatenation.
|
|
|
|
|
|
@acronym{HMAC} keys can be of any length, but it is recommended to use
|
|
|
keys of length @code{l}, the digest size of the underlying hash function
|
|
|
@code{H}. Keys that are longer than @code{b} are shortened to length
|
|
|
@code{l} by hashing with @code{H}, so arbitrarily long keys aren't
|
|
|
very useful.
|
|
|
|
|
|
Nettle's @acronym{HMAC} functions are defined in @file{<nettle/hmac.h>}.
|
|
|
There are abstract functions that use a pointer to a @code{struct
|
|
|
nettle_hash} to represent the underlying hash function and @code{void *}
|
|
|
pointers that point to three different context structs for that hash
|
|
|
function. There are also concrete functions for @acronym{HMAC-MD5},
|
|
|
@acronym{HMAC-RIPEMD160} @acronym{HMAC-SHA1}, @acronym{HMAC-SHA256},
|
|
|
@acronym{HMAC-SHA512}, and @acronym{HMAC-SM3}. First, the abstract functions:
|
|
|
|
|
|
@deftypefun void hmac_set_key (void *@var{outer}, void *@var{inner}, void *@var{state}, const struct nettle_hash *@var{H}, size_t @var{length}, const uint8_t *@var{key})
|
|
|
Initializes the three context structs from the key. The @var{outer} and
|
|
|
@var{inner} contexts corresponds to the subkeys @code{k_o} and
|
|
|
@code{k_i}. @var{state} is used for hashing the message, and is
|
|
|
initialized as a copy of the @var{inner} context.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void hmac_update (void *@var{state}, const struct nettle_hash *@var{H}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
This function is called zero or more times to process the message.
|
|
|
Actually, @code{hmac_update(state, H, length, data)} is equivalent to
|
|
|
@code{H->update(state, length, data)}, so if you wish you can use the
|
|
|
ordinary update function of the underlying hash function instead.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void hmac_digest (const void *@var{outer}, const void *@var{inner}, void *@var{state}, const struct nettle_hash *@var{H}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
Extracts the @acronym{MAC} of the message, writing it to @var{digest}.
|
|
|
@var{outer} and @var{inner} are not modified. @var{length} is usually
|
|
|
equal to @code{H->digest_size}, but if you provide a smaller value,
|
|
|
only the first @var{length} octets of the @acronym{MAC} are written.
|
|
|
|
|
|
This function also resets the @var{state} context so that you can start
|
|
|
over processing a new message (with the same key).
|
|
|
@end deftypefun
|
|
|
|
|
|
Like for @acronym{CBC}, there are some macros to help use these
|
|
|
functions correctly.
|
|
|
|
|
|
@deffn Macro HMAC_CTX (@var{type})
|
|
|
Expands to
|
|
|
@example
|
|
|
@{
|
|
|
type outer;
|
|
|
type inner;
|
|
|
type state;
|
|
|
@}
|
|
|
@end example
|
|
|
@end deffn
|
|
|
|
|
|
It can be used to define a @acronym{HMAC} context struct, either
|
|
|
directly,
|
|
|
|
|
|
@example
|
|
|
struct HMAC_CTX(struct md5_ctx) ctx;
|
|
|
@end example
|
|
|
|
|
|
or to give it a struct tag,
|
|
|
|
|
|
@example
|
|
|
struct hmac_md5_ctx HMAC_CTX (struct md5_ctx);
|
|
|
@end example
|
|
|
|
|
|
@deffn Macro HMAC_SET_KEY (@var{ctx}, @var{H}, @var{length}, @var{key})
|
|
|
@var{ctx} is a pointer to a context struct as defined by
|
|
|
@code{HMAC_CTX}, @var{H} is a pointer to a @code{const struct
|
|
|
nettle_hash} describing the underlying hash function (so it must match
|
|
|
the type of the components of @var{ctx}). The last two arguments specify
|
|
|
the secret key.
|
|
|
@end deffn
|
|
|
|
|
|
@deffn Macro HMAC_DIGEST (@var{ctx}, @var{H}, @var{length}, @var{digest})
|
|
|
@var{ctx} is a pointer to a context struct as defined by
|
|
|
@code{HMAC_CTX}, @var{H} is a pointer to a @code{const struct
|
|
|
nettle_hash} describing the underlying hash function. The last two
|
|
|
arguments specify where the digest is written.
|
|
|
@end deffn
|
|
|
|
|
|
Note that there is no @code{HMAC_UPDATE} macro; simply call
|
|
|
@code{hmac_update} function directly, or the update function of the
|
|
|
underlying hash function.
|
|
|
|
|
|
Now we come to the specialized @acronym{HMAC} functions, which are
|
|
|
easier to use than the general @acronym{HMAC} functions.
|
|
|
|
|
|
@subsubsection @acronym{HMAC-MD5}
|
|
|
|
|
|
@deftp {Context struct} {struct hmac_md5_ctx}
|
|
|
@end deftp
|
|
|
|
|
|
@deftypefun void hmac_md5_set_key (struct hmac_md5_ctx *@var{ctx}, size_t @var{key_length}, const uint8_t *@var{key})
|
|
|
Initializes the context with the key.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void hmac_md5_update (struct hmac_md5_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
Process some more data.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void hmac_md5_digest (struct hmac_md5_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
Extracts the @acronym{MAC}, writing it to @var{digest}. @var{length} may be smaller than
|
|
|
@code{MD5_DIGEST_SIZE}, in which case only the first @var{length}
|
|
|
octets of the @acronym{MAC} are written.
|
|
|
|
|
|
This function also resets the context for processing new messages, with
|
|
|
the same key.
|
|
|
@end deftypefun
|
|
|
|
|
|
@subsubsection @acronym{HMAC-RIPEMD160}
|
|
|
|
|
|
@deftp {Context struct} {struct hmac_ripemd160_ctx}
|
|
|
@end deftp
|
|
|
|
|
|
@deftypefun void hmac_ripemd160_set_key (struct hmac_ripemd160_ctx *@var{ctx}, size_t @var{key_length}, const uint8_t *@var{key})
|
|
|
Initializes the context with the key.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void hmac_ripemd160_update (struct hmac_ripemd160_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
Process some more data.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void hmac_ripemd160_digest (struct hmac_ripemd160_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
Extracts the @acronym{MAC}, writing it to @var{digest}. @var{length} may be smaller than
|
|
|
@code{RIPEMD160_DIGEST_SIZE}, in which case only the first @var{length}
|
|
|
octets of the @acronym{MAC} are written.
|
|
|
|
|
|
This function also resets the context for processing new messages, with
|
|
|
the same key.
|
|
|
@end deftypefun
|
|
|
|
|
|
@subsubsection @acronym{HMAC-SHA1}
|
|
|
|
|
|
@deftp {Context struct} {struct hmac_sha1_ctx}
|
|
|
@end deftp
|
|
|
|
|
|
@deftypefun void hmac_sha1_set_key (struct hmac_sha1_ctx *@var{ctx}, size_t @var{key_length}, const uint8_t *@var{key})
|
|
|
Initializes the context with the key.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void hmac_sha1_update (struct hmac_sha1_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
Process some more data.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void hmac_sha1_digest (struct hmac_sha1_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
Extracts the @acronym{MAC}, writing it to @var{digest}. @var{length} may be smaller than
|
|
|
@code{SHA1_DIGEST_SIZE}, in which case only the first @var{length}
|
|
|
octets of the @acronym{MAC} are written.
|
|
|
|
|
|
This function also resets the context for processing new messages, with
|
|
|
the same key.
|
|
|
@end deftypefun
|
|
|
|
|
|
|
|
|
@subsubsection @acronym{HMAC-SHA256}
|
|
|
|
|
|
@deftp {Context struct} {struct hmac_sha256_ctx}
|
|
|
@end deftp
|
|
|
|
|
|
@deftypefun void hmac_sha256_set_key (struct hmac_sha256_ctx *@var{ctx}, size_t @var{key_length}, const uint8_t *@var{key})
|
|
|
Initializes the context with the key.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void hmac_sha256_update (struct hmac_sha256_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
Process some more data.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void hmac_sha256_digest (struct hmac_sha256_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
Extracts the @acronym{MAC}, writing it to @var{digest}. @var{length} may be smaller than
|
|
|
@code{SHA256_DIGEST_SIZE}, in which case only the first @var{length}
|
|
|
octets of the @acronym{MAC} are written.
|
|
|
|
|
|
This function also resets the context for processing new messages, with
|
|
|
the same key.
|
|
|
@end deftypefun
|
|
|
|
|
|
|
|
|
@subsubsection @acronym{HMAC-SHA512}
|
|
|
|
|
|
@deftp {Context struct} {struct hmac_sha512_ctx}
|
|
|
@end deftp
|
|
|
|
|
|
@deftypefun void hmac_sha512_set_key (struct hmac_sha512_ctx *@var{ctx}, size_t @var{key_length}, const uint8_t *@var{key})
|
|
|
Initializes the context with the key.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void hmac_sha512_update (struct hmac_sha512_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
Process some more data.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void hmac_sha512_digest (struct hmac_sha512_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
Extracts the @acronym{MAC}, writing it to @var{digest}. @var{length} may be smaller than
|
|
|
@code{SHA512_DIGEST_SIZE}, in which case only the first @var{length}
|
|
|
octets of the @acronym{MAC} are written.
|
|
|
|
|
|
This function also resets the context for processing new messages, with
|
|
|
the same key.
|
|
|
@end deftypefun
|
|
|
|
|
|
|
|
|
@subsubsection @acronym{HMAC-SM3}
|
|
|
|
|
|
@deftp {Context struct} {struct hmac_sm3_ctx}
|
|
|
@end deftp
|
|
|
|
|
|
@deftypefun void hmac_sm3_set_key (struct hmac_sm3_ctx *@var{ctx}, size_t @var{key_length}, const uint8_t *@var{key})
|
|
|
Initializes the context with the key.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void hmac_sm3_update (struct hmac_sm3_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
Process some more data.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void hmac_sm3_digest (struct hmac_sm3_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
Extracts the @acronym{MAC}, writing it to @var{digest}. @var{length} may be smaller than
|
|
|
@code{SM3_DIGEST_SIZE}, in which case only the first @var{length}
|
|
|
octets of the @acronym{MAC} are written.
|
|
|
|
|
|
This function also resets the context for processing new messages, with
|
|
|
the same key.
|
|
|
@end deftypefun
|
|
|
|
|
|
@node UMAC
|
|
|
@subsection @acronym{UMAC}
|
|
|
@cindex UMAC
|
|
|
|
|
|
@acronym{UMAC} is a message authentication code based on universal
|
|
|
hashing, and designed for high performance on modern processors (in
|
|
|
contrast to GCM, @xref{GCM}, which is designed primarily for hardware
|
|
|
performance). On processors with good integer multiplication
|
|
|
performance, it can be 10 times faster than SHA256 and SHA512.
|
|
|
@acronym{UMAC} is specified in @cite{RFC 4418}.
|
|
|
|
|
|
The secret key is always 128 bits (16 octets). The key is used as an
|
|
|
encryption key for the @acronym{AES} block cipher. This cipher is used
|
|
|
in counter mode to generate various internal subkeys needed in
|
|
|
@acronym{UMAC}. Messages are of arbitrary size, and for each message,
|
|
|
@acronym{UMAC} also needs a unique nonce. Nonce values must not be
|
|
|
reused for two messages with the same key, but they need not be kept
|
|
|
secret.
|
|
|
|
|
|
The nonce must be at least one octet, and at most 16; nonces shorter
|
|
|
than 16 octets are zero-padded. Nettle's implementation of
|
|
|
@acronym{UMAC} increments the nonce automatically for each message, so
|
|
|
explicitly setting the nonce for each message is optional. This
|
|
|
auto-increment uses network byte order and it takes the length of the
|
|
|
nonce into account. E.g., if the initial nonce is ``abc'' (3 octets),
|
|
|
this value is zero-padded to 16 octets for the first message. For the
|
|
|
next message, the nonce is incremented to ``abd'', and this incremented
|
|
|
value is zero-padded to 16 octets.
|
|
|
|
|
|
@acronym{UMAC} is defined in four variants, for different output sizes:
|
|
|
32 bits (4 octets), 64 bits (8 octets), 96 bits (12 octets) and 128 bits
|
|
|
(16 octets), corresponding to different trade-offs between speed and
|
|
|
security. Using a shorter output size sometimes (but not always!) gives
|
|
|
the same result as using a longer output size and truncating the result.
|
|
|
So it is important to use the right variant. For consistency with other
|
|
|
hash and @acronym{MAC} functions, Nettle's @code{_digest} functions for
|
|
|
@acronym{UMAC} accept a length parameter so that the output can be
|
|
|
truncated to any desired size, but it is recommended to stick to the
|
|
|
specified output size and select the @acronym{umac} variant
|
|
|
corresponding to the desired size.
|
|
|
|
|
|
The internal block size of @acronym{UMAC} is 1024 octets, and it also
|
|
|
generates more than 1024 bytes of subkeys. This makes the size of the
|
|
|
context struct quite a bit larger than other hash functions and
|
|
|
@acronym{MAC} algorithms in Nettle.
|
|
|
|
|
|
Nettle defines @acronym{UMAC} in @file{<nettle/umac.h>}.
|
|
|
|
|
|
@deftp {Context struct} {struct umac32_ctx}
|
|
|
@deftpx {Context struct} {struct umac64_ctx}
|
|
|
@deftpx {Context struct} {struct umac96_ctx}
|
|
|
@deftpx {Context struct} {struct umac128_ctx}
|
|
|
Each @acronym{UMAC} variant uses its own context struct.
|
|
|
@end deftp
|
|
|
|
|
|
@defvr Constant UMAC_KEY_SIZE
|
|
|
The UMAC key size, 16.
|
|
|
@end defvr
|
|
|
@defvr Constant UMAC_MIN_NONCE_SIZE
|
|
|
@defvrx Constant UMAC_MAX_NONCE_SIZE
|
|
|
The the minimum and maximum sizes for an UMAC nonce, 1 and 16,
|
|
|
respectively.
|
|
|
@end defvr
|
|
|
@defvr Constant UMAC32_DIGEST_SIZE
|
|
|
The size of an UMAC32 digest, 4.
|
|
|
@end defvr
|
|
|
@defvr Constant UMAC64_DIGEST_SIZE
|
|
|
The size of an UMAC64 digest, 8.
|
|
|
@end defvr
|
|
|
@defvr Constant UMAC96_DIGEST_SIZE
|
|
|
The size of an UMAC96 digest, 12.
|
|
|
@end defvr
|
|
|
@defvr Constant UMAC128_DIGEST_SIZE
|
|
|
The size of an UMAC128 digest, 16.
|
|
|
@end defvr
|
|
|
@defvr Constant UMAC_BLOCK_SIZE
|
|
|
The internal block size of UMAC.
|
|
|
@end defvr
|
|
|
|
|
|
@deftypefun void umac32_set_key (struct umac32_ctx *@var{ctx}, const uint8_t *@var{key})
|
|
|
@deftypefunx void umac64_set_key (struct umac64_ctx *@var{ctx}, const uint8_t *@var{key})
|
|
|
@deftypefunx void umac96_set_key (struct umac96_ctx *@var{ctx}, const uint8_t *@var{key})
|
|
|
@deftypefunx void umac128_set_key (struct umac128_ctx *@var{ctx}, const uint8_t *@var{key})
|
|
|
These functions initialize the @acronym{UMAC} context struct. They also
|
|
|
initialize the nonce to zero (with length 16, for auto-increment).
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void umac32_set_nonce (struct umac32_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{nonce})
|
|
|
@deftypefunx void umac64_set_nonce (struct umac64_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{nonce})
|
|
|
@deftypefunx void umac96_set_nonce (struct umac96_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{nonce})
|
|
|
@deftypefunx void umac128_set_nonce (struct umac128_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{nonce})
|
|
|
Sets the nonce to be used for the next message. In general, nonces
|
|
|
should be set before processing of the message. This is not strictly
|
|
|
required for @acronym{UMAC} (the nonce only affects the final processing
|
|
|
generating the digest), but it is nevertheless recommended that this
|
|
|
function is called @emph{before} the first @code{_update} call for the
|
|
|
message.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void umac32_update (struct umac32_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
@deftypefunx void umac64_update (struct umac64_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
@deftypefunx void umac96_update (struct umac96_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
@deftypefunx void umac128_update (struct umac128_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
These functions are called zero or more times to process the message.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void umac32_digest (struct umac32_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
@deftypefunx void umac64_digest (struct umac64_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
@deftypefunx void umac96_digest (struct umac96_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
@deftypefunx void umac128_digest (struct umac128_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
Extracts the @acronym{MAC} of the message, writing it to @var{digest}.
|
|
|
@var{length} is usually equal to the specified output size, but if you
|
|
|
provide a smaller value, only the first @var{length} octets of the
|
|
|
@acronym{MAC} are written. These functions reset the context for
|
|
|
processing of a new message with the same key. The nonce is incremented
|
|
|
as described above, the new value is used unless you call the
|
|
|
@code{_set_nonce} function explicitly for each message.
|
|
|
@end deftypefun
|
|
|
|
|
|
@node CMAC
|
|
|
@subsection @acronym{CMAC}
|
|
|
@cindex CMAC
|
|
|
@cindex CMAC-128
|
|
|
@cindex CMAC-64
|
|
|
|
|
|
@acronym{CMAC} is a message authentication code based on CBC encryption
|
|
|
mode. It is suitable for systems where block ciphers are preferrable
|
|
|
and perform better than hash functions. @acronym{CMAC-128} is specified in
|
|
|
@cite{RFC4493}. The block size is always 128 bits (16 octets).
|
|
|
@acronym{CMAC-64} is specified by
|
|
|
@url{https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-38B.pdf,
|
|
|
NIST Special Publication 800-38B}. The block size is always 64 bits
|
|
|
(8 octets).
|
|
|
|
|
|
Nettle provides helper functions for @acronym{CMAC-128} with
|
|
|
the @acronym{AES} block cipher and for @acronym{CMAC-64} with
|
|
|
the @acronym{Tripple-DES} block cipher.
|
|
|
|
|
|
Nettle defines @acronym{CMAC} in @file{<nettle/cmac.h>}.
|
|
|
|
|
|
@deftp {Context struct} {struct cmac_aes128_ctx}
|
|
|
@deftpx {Context struct} {struct cmac_aes256_ctx}
|
|
|
@end deftp
|
|
|
|
|
|
@defvr Constant CMAC128_DIGEST_SIZE
|
|
|
The size of an CMAC-128 digest, 16.
|
|
|
@end defvr
|
|
|
|
|
|
@deftypefun void cmac_aes128_set_key (struct cmac_aes128_ctx *@var{ctx}, const uint8_t *@var{key})
|
|
|
This function initializes the @acronym{CMAC} context struct for AES-128.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void cmac_aes128_update (struct cmac_aes128_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
This function is called zero or more times to process the message.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void cmac_aes128_digest (struct cmac_aes128_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
Extracts the @acronym{MAC} of the message, writing it to @var{digest}.
|
|
|
@var{length} is usually equal to the specified output size, but if you
|
|
|
provide a smaller value, only the first @var{length} octets of the
|
|
|
@acronym{MAC} are written. This function resets the context for
|
|
|
processing of a new message with the same key.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void cmac_aes256_set_key (struct cmac_aes256_ctx *@var{ctx}, const uint8_t *@var{key})
|
|
|
This function initializes the @acronym{CMAC} context struct for AES-256.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void cmac_aes256_update (struct cmac_aes256_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
This function is called zero or more times to process the message.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void cmac_aes256_digest (struct cmac_aes256_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
Extracts the @acronym{MAC} of the message, writing it to @var{digest}.
|
|
|
@var{length} is usually equal to the specified output size, but if you
|
|
|
provide a smaller value, only the first @var{length} octets of the
|
|
|
@acronym{MAC} are written. This function resets the context for
|
|
|
processing of a new message with the same key.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftp {Context struct} {struct cmac_des3_ctx}
|
|
|
@end deftp
|
|
|
|
|
|
@defvr Constant CMAC64_DIGEST_SIZE
|
|
|
The size of an CMAC-64 digest, 8.
|
|
|
@end defvr
|
|
|
|
|
|
@deftypefun void cmac_des3_set_key (struct cmac_des3_ctx *@var{ctx}, const uint8_t *@var{key})
|
|
|
This function initializes the @acronym{CMAC} context struct for @acronym{Tripple-DES}.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void cmac_des3_update (struct cmac_des3_ctx *@var{ctx},size_t @var{length}, const uint8_t *@var{data})
|
|
|
This function is called zero or more times to process the message.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void cmac_des3_digest (struct cmac_des3_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
Extracts the @acronym{MAC} of the message, writing it to @var{digest}.
|
|
|
@var{length} is usually equal to the specified output size, but if you
|
|
|
provide a smaller value, only the first @var{length} octets of the
|
|
|
@acronym{MAC} are written. This function resets the context for
|
|
|
processing of a new message with the same key.
|
|
|
@end deftypefun
|
|
|
|
|
|
@node Poly1305
|
|
|
@subsection Poly1305
|
|
|
|
|
|
Poly1305-@acronym{AES} is a message authentication code designed by D. J.
|
|
|
Bernstein. It treats the message as a polynomial modulo the prime number
|
|
|
@math{2^130 - 5}.
|
|
|
|
|
|
The key, 256 bits, consists of two parts, where the first half is an
|
|
|
@acronym{AES}-128 key, and the second half specifies the point where the
|
|
|
polynomial is evaluated. Of the latter half, 22 bits are set to zero, to
|
|
|
enable high-performance implementation, leaving 106 bits for specifying
|
|
|
an evaluation point @code{r}. For each message, one must also provide a
|
|
|
128-bit nonce. The nonce is encrypted using the @acronym{AES} key, and
|
|
|
that's the only thing @acronym{AES} is used for.
|
|
|
|
|
|
The message is split into 128-bit chunks (with final chunk possibly
|
|
|
being shorter), each read as a little-endian integer. Each chunk has a
|
|
|
one-bit appended at the high end. The resulting integers are treated as
|
|
|
polynomial coefficients modulo @math{2^130 - 5}, and the polynomial is
|
|
|
evaluated at the point @code{r}. Finally, this value is reduced modulo
|
|
|
@math{2^128}, and added (also modulo @math{2^128}) to the encrypted
|
|
|
nonce, to produce an 128-bit authenticator for the message. See
|
|
|
@url{https://cr.yp.to/mac/poly1305-20050329.pdf} for further details.
|
|
|
|
|
|
Clearly, variants using a different cipher than @acronym{AES} could be
|
|
|
defined. Another variant is the ChaCha-Poly1305 @acronym{AEAD}
|
|
|
construction (@pxref{ChaCha-Poly1305}). Nettle defines
|
|
|
Poly1305-@acronym{AES} in @file{nettle/poly1305.h}.
|
|
|
|
|
|
@defvr Constant POLY1305_AES_KEY_SIZE
|
|
|
Key size, 32 octets.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant POLY1305_AES_DIGEST_SIZE
|
|
|
Size of the digest or ``authenticator'', 16 octets.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant POLY1305_AES_NONCE_SIZE
|
|
|
Nonce size, 16 octets.
|
|
|
@end defvr
|
|
|
|
|
|
@deftp {Context struct} {struct poly1305_aes_ctx}
|
|
|
The poly1305-aes context struct.
|
|
|
@end deftp
|
|
|
|
|
|
@deftypefun void poly1305_aes_set_key (struct poly1305_aes_ctx *@var{ctx}, const uint8_t *@var{key})
|
|
|
Initialize the context struct. Also sets the nonce to zero.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void poly1305_aes_set_nonce (struct poly1305_aes_ctx *@var{ctx}, const uint8_t *@var{nonce})
|
|
|
Sets the nonce. Calling this function is optional, since the nonce is
|
|
|
incremented automatically for each message.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void poly1305_aes_update (struct poly1305_aes_ctx *@var{ctx}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
Process more data.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void poly1305_aes_digest (struct poly1305_aes_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{digest})
|
|
|
Extracts the digest. If @var{length} is smaller than
|
|
|
@code{POLY1305_AES_DIGEST_SIZE}, only the first @var{length} octets are
|
|
|
written. Also increments the nonce, and prepares the context for
|
|
|
processing a new message.
|
|
|
@end deftypefun
|
|
|
|
|
|
|
|
|
@node Key derivation functions
|
|
|
@section Key derivation Functions
|
|
|
@cindex Key Derivation Function
|
|
|
|
|
|
A @dfn{key derivation function} (@acronym{KDF}) is a function that from
|
|
|
a given symmetric key derives other symmetric keys. A sub-class of KDFs
|
|
|
is the @dfn{password-based key derivation functions} (@acronym{PBKDFs}),
|
|
|
which take as input a password or passphrase, and its purpose is
|
|
|
typically to strengthen it and protect against certain pre-computation
|
|
|
attacks by using salting and expensive computation.
|
|
|
|
|
|
@subsection HKDF: HMAC-based Extract-and-Expand
|
|
|
@cindex HKDF
|
|
|
|
|
|
HKDF is a key derivation function used as a building block of
|
|
|
higher-level protocols like TLS 1.3. It is a derivation function
|
|
|
based on HMAC described in @cite{RFC 5869},
|
|
|
and is split into two logical modules, called 'extract' and 'expand'.
|
|
|
The extract module takes an initial secret and a random
|
|
|
salt to "extract" a fixed-length pseudorandom key (PRK). The second stage
|
|
|
takes as input the previous PRK and some informational data (e.g.,
|
|
|
text) and expands them into multiple keys.
|
|
|
|
|
|
Nettle's @acronym{HKDF} functions are defined in
|
|
|
@file{<nettle/hkdf.h>}. There are two abstract functions for the extract
|
|
|
and expand operations that operate on any HMAC implemented via the @code{nettle_hash_update_func},
|
|
|
and @code{nettle_hash_digest_func} interfaces.
|
|
|
|
|
|
@deftypefun void hkdf_extract (void *mac_ctx, nettle_hash_update_func *update, nettle_hash_digest_func *digest, size_t digest_size,size_t secret_size, const uint8_t *secret, uint8_t *dst)
|
|
|
Extract a Pseudorandom Key (PRK) from a secret and a salt according
|
|
|
to HKDF. The HMAC must have been initialized, with its key being the
|
|
|
salt for the Extract operation. This function will call the
|
|
|
@var{update} and @var{digest} functions passing the @var{mac_ctx}
|
|
|
context parameter as an argument in order to compute digest of size
|
|
|
@var{digest_size}. Inputs are the secret @var{secret} of length
|
|
|
@var{secret_length}. The output length is fixed to @var{digest_size} octets,
|
|
|
thus the output buffer @var{dst} must have room for at least @var{digest_size} octets.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void hkdf_expand (void *mac_ctx, nettle_hash_update_func *update, nettle_hash_digest_func *digest, size_t digest_size, size_t info_size, const uint8_t *info, size_t length, uint8_t *dst)
|
|
|
Expand a Pseudorandom Key (PRK) to an arbitrary size according to HKDF.
|
|
|
The HMAC must have been initialized, with its key being the
|
|
|
PRK from the Extract operation. This function will call the
|
|
|
@var{update} and @var{digest} functions passing the @var{mac_ctx}
|
|
|
context parameter as an argument in order to compute digest of size
|
|
|
@var{digest_size}. Inputs are the info @var{info} of length
|
|
|
@var{info_length}, and the desired derived output length @var{length}.
|
|
|
The output buffer is @var{dst} which must have room for at least @var{length} octets.
|
|
|
@end deftypefun
|
|
|
|
|
|
|
|
|
@subsection @acronym{PBKDF2}
|
|
|
@cindex Password Based Key Derivation Function
|
|
|
@cindex PKCS #5
|
|
|
@cindex KDF
|
|
|
@cindex PBKDF
|
|
|
The most well known PBKDF is the @code{PKCS #5 PBKDF2} described in
|
|
|
@cite{RFC 2898} which uses a pseudo-random function such as
|
|
|
@acronym{HMAC-SHA1}.
|
|
|
|
|
|
Nettle's @acronym{PBKDF2} functions are defined in
|
|
|
@file{<nettle/pbkdf2.h>}. There is an abstract function that operate on
|
|
|
any PRF implemented via the @code{nettle_hash_update_func},
|
|
|
@code{nettle_hash_digest_func} interfaces. There is also helper macros
|
|
|
and concrete functions PBKDF2-HMAC-SHA1, PBKDF2-HMAC-SHA256, PBKDF2-HMAC-SHA384
|
|
|
and PBKDF2-HMAC-SHA512. First, the abstract function:
|
|
|
|
|
|
@deftypefun void pbkdf2 (void *mac_ctx, nettle_hash_update_func *update, nettle_hash_digest_func *digest, size_t digest_size, unsigned iterations, size_t salt_length, const uint8_t *salt, size_t length, uint8_t *dst)
|
|
|
Derive symmetric key from a password according to PKCS #5 PBKDF2. The
|
|
|
PRF is assumed to have been initialized and this function will call the
|
|
|
@var{update} and @var{digest} functions passing the @var{mac_ctx}
|
|
|
context parameter as an argument in order to compute digest of size
|
|
|
@var{digest_size}. Inputs are the salt @var{salt} of length
|
|
|
@var{salt_length}, the iteration counter @var{iterations} (> 0), and the
|
|
|
desired derived output length @var{length}. The output buffer is
|
|
|
@var{dst} which must have room for at least @var{length} octets.
|
|
|
@end deftypefun
|
|
|
|
|
|
Like for CBC and HMAC, there is a macro to help use the function
|
|
|
correctly.
|
|
|
|
|
|
@deffn Macro PBKDF2 (@var{ctx}, @var{update}, @var{digest}, @var{digest_size}, @var{iterations}, @var{salt_length}, @var{salt}, @var{length}, @var{dst})
|
|
|
@var{ctx} is a pointer to a context struct passed to the @var{update}
|
|
|
and @var{digest} functions (of the types @code{nettle_hash_update_func}
|
|
|
and @code{nettle_hash_digest_func} respectively) to implement the
|
|
|
underlying PRF with digest size of @var{digest_size}. Inputs are the
|
|
|
salt @var{salt} of length @var{salt_length}, the iteration counter
|
|
|
@var{iterations} (> 0), and the desired derived output length
|
|
|
@var{length}. The output buffer is @var{dst} which must have room for
|
|
|
at least @var{length} octets.
|
|
|
@end deffn
|
|
|
|
|
|
@subsection Concrete @acronym{PBKDF2} functions
|
|
|
Now we come to the specialized @acronym{PBKDF2} functions, which are
|
|
|
easier to use than the general @acronym{PBKDF2} function.
|
|
|
|
|
|
@subsubsection @acronym{PBKDF2-HMAC-SHA1}
|
|
|
|
|
|
@deftypefun void pbkdf2_hmac_sha1 (size_t @var{key_length}, const uint8_t *@var{key}, unsigned @var{iterations}, size_t @var{salt_length}, const uint8_t *@var{salt}, size_t @var{length}, uint8_t *@var{dst})
|
|
|
PBKDF2 with HMAC-SHA1. Derive @var{length} bytes of key into buffer
|
|
|
@var{dst} using the password @var{key} of length @var{key_length} and
|
|
|
salt @var{salt} of length @var{salt_length}, with iteration counter
|
|
|
@var{iterations} (> 0). The output buffer is @var{dst} which must have
|
|
|
room for at least @var{length} octets.
|
|
|
@end deftypefun
|
|
|
|
|
|
@subsubsection @acronym{PBKDF2-HMAC-SHA256}
|
|
|
|
|
|
@deftypefun void pbkdf2_hmac_sha256 (size_t @var{key_length}, const uint8_t *@var{key}, unsigned @var{iterations}, size_t @var{salt_length}, const uint8_t *@var{salt}, size_t @var{length}, uint8_t *@var{dst})
|
|
|
PBKDF2 with HMAC-SHA256. Derive @var{length} bytes of key into buffer
|
|
|
@var{dst} using the password @var{key} of length @var{key_length} and
|
|
|
salt @var{salt} of length @var{salt_length}, with iteration counter
|
|
|
@var{iterations} (> 0). The output buffer is @var{dst} which must have
|
|
|
room for at least @var{length} octets.
|
|
|
@end deftypefun
|
|
|
|
|
|
@subsubsection @acronym{PBKDF2-HMAC-SHA384}
|
|
|
|
|
|
@deftypefun void pbkdf2_hmac_sha384 (size_t @var{key_length}, const uint8_t *@var{key}, unsigned @var{iterations}, size_t @var{salt_length}, const uint8_t *@var{salt}, size_t @var{length}, uint8_t *@var{dst})
|
|
|
PBKDF2 with HMAC-SHA384. Derive @var{length} bytes of key into buffer
|
|
|
@var{dst} using the password @var{key} of length @var{key_length} and
|
|
|
salt @var{salt} of length @var{salt_length}, with iteration counter
|
|
|
@var{iterations} (> 0). The output buffer is @var{dst} which must have
|
|
|
room for at least @var{length} octets.
|
|
|
@end deftypefun
|
|
|
|
|
|
@subsubsection @acronym{PBKDF2-HMAC-SHA512}
|
|
|
|
|
|
@deftypefun void pbkdf2_hmac_sha512 (size_t @var{key_length}, const uint8_t *@var{key}, unsigned @var{iterations}, size_t @var{salt_length}, const uint8_t *@var{salt}, size_t @var{length}, uint8_t *@var{dst})
|
|
|
PBKDF2 with HMAC-SHA512. Derive @var{length} bytes of key into buffer
|
|
|
@var{dst} using the password @var{key} of length @var{key_length} and
|
|
|
salt @var{salt} of length @var{salt_length}, with iteration counter
|
|
|
@var{iterations} (> 0). The output buffer is @var{dst} which must have
|
|
|
room for at least @var{length} octets.
|
|
|
@end deftypefun
|
|
|
|
|
|
|
|
|
@subsection @acronym{BALLOON}
|
|
|
@cindex Balloon password-hashing algorithm
|
|
|
Balloon is a memory-hard password-hashing algorithm. An in-depth description
|
|
|
of the algorithm and its properties can be found in an online research paper:
|
|
|
Boneh, D., Corrigan-Gibbs, H., Schechter, S. (2017, May 12). Balloon Hashing:
|
|
|
A Memory-Hard Function Providing Provable Protection Against Sequential Attacks.
|
|
|
Retrieved Sep 1, 2022, from @url{https://eprint.iacr.org/2016/027.pdf}
|
|
|
|
|
|
Nettle's definition of the @acronym{BALLOON} algorithm can be found in
|
|
|
@file{<nettle/balloon.h>}. There is a general @acronym{BALLOON} function where
|
|
|
the user can specify desired hash algorithm that will be used by the function.
|
|
|
There are also concrete, more user-friendly functions that use common hash algorithms
|
|
|
like SHA1, SHA256, SHA384 and SHA512. There is also a utility function which helps to
|
|
|
determine the size of the working buffer that must be provided as one of the inputs.
|
|
|
|
|
|
Each @acronym{BALLOON} function takes as an input a password and a salt of arbitrary
|
|
|
lengths, a time and a space parameters, and a scratch buffer. The space parameter
|
|
|
@var{s_cost} determines how many blocks of working space the algorithm will require
|
|
|
during its computation. It is common to set @var{s_cost} to a high value in order
|
|
|
to increase the cost of hardware accelerators built by the adversary. The time
|
|
|
parameter @var{t_cost} determines the number of rounds of computation that the algorithm
|
|
|
will perform. This can be used to further increase the cost of computation without raising
|
|
|
the memory requirement. Scratch buffer @var{scratch} is a user allocated working space
|
|
|
required by the algorithm. To determine the required size of the scratch buffer use the
|
|
|
utility function @code{balloon_itch}. Output of @acronym{BALLOON} algorithm will be
|
|
|
written into the output buffer @var{dst} that has to be at least @var{digest_size} bytes
|
|
|
long. Note that it is safe to use the same buffer for both @var{scratch} and @var{dst}.
|
|
|
Next follows the description of the general @acronym{BALLOON} function.
|
|
|
|
|
|
@deftypefun void balloon (void *@var{hash_ctx}, nettle_hash_update_func *@var{update}, nettle_hash_digest_func *@var{digest}, size_t @var{digest_size}, size_t @var{s_cost}, size_t @var{t_cost}, size_t @var{passwd_length}, const uint8_t *@var{passwd}, size_t @var{salt_length}, const uint8_t *@var{salt}, uint8_t *@var{scratch}, uint8_t *@var{dst})
|
|
|
Compute hash of given password @var{passwd} of length @var{passwd_length} salted
|
|
|
with @var{salt} of length @var{salt_length} and write @var{digest_size} bytes into
|
|
|
the output buffer @var{dst}. Parameter @var{hash_ctx} is a context for the
|
|
|
underlying hash function, which much be initialized by the caller. @var{update}
|
|
|
and @var{digest} are the update and digest functions of the chosen hash algorithm.
|
|
|
@var{digest_size} is the digest size of the chosen hash algorithm and determines
|
|
|
the size of the output.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun size_t balloon_itch (size_t @var{digest_size}, size_t @var{s_cost})
|
|
|
Compute the size of the scratch buffer @var{scratch}. @var{digest_size} is the
|
|
|
digest size of the chosen hash algorithm. @var{s_cost} is the space parameter
|
|
|
used by the @code{balloon} function.
|
|
|
@end deftypefun
|
|
|
|
|
|
@subsection Concrete @acronym{BALLOON} functions
|
|
|
Here follows a list of the specialized @acronym{BALLOON} functions, which are
|
|
|
more user-friendly variants of the general function.
|
|
|
|
|
|
@subsubsection @acronym{BALLOON-SHA1}
|
|
|
|
|
|
@deftypefun void balloon_sha1 (size_t @var{s_cost}, size_t @var{t_cost}, size_t @var{passwd_length}, const uint8_t *@var{passwd}, size_t @var{salt_length}, const uint8_t *@var{salt}, uint8_t *@var{scratch}, uint8_t *@var{dst})
|
|
|
@acronym{BALLOON} algorithm using SHA1 as the underlying hash function.
|
|
|
@end deftypefun
|
|
|
|
|
|
@subsubsection @acronym{BALLOON-SHA256}
|
|
|
|
|
|
@deftypefun void balloon_sha256 (size_t @var{s_cost}, size_t @var{t_cost}, size_t @var{passwd_length}, const uint8_t *@var{passwd}, size_t @var{salt_length}, const uint8_t *@var{salt}, uint8_t *@var{scratch}, uint8_t *@var{dst})
|
|
|
@acronym{BALLOON} algorithm using SHA256 as the underlying hash function.
|
|
|
@end deftypefun
|
|
|
|
|
|
@subsubsection @acronym{BALLOON-SHA384}
|
|
|
|
|
|
@deftypefun void balloon_sha384 (size_t @var{s_cost}, size_t @var{t_cost}, size_t @var{passwd_length}, const uint8_t *@var{passwd}, size_t @var{salt_length}, const uint8_t *@var{salt}, uint8_t *@var{scratch}, uint8_t *@var{dst})
|
|
|
@acronym{BALLOON} algorithm using SHA384 as the underlying hash function.
|
|
|
@end deftypefun
|
|
|
|
|
|
@subsubsection @acronym{BALLOON-SHA512}
|
|
|
|
|
|
@deftypefun void balloon_sha512 (size_t @var{s_cost}, size_t @var{t_cost}, size_t @var{passwd_length}, const uint8_t *@var{passwd}, size_t @var{salt_length}, const uint8_t *@var{salt}, uint8_t *@var{scratch}, uint8_t *@var{dst})
|
|
|
@acronym{BALLOON} algorithm using SHA512 as the underlying hash function.
|
|
|
@end deftypefun
|
|
|
|
|
|
|
|
|
@node Public-key algorithms
|
|
|
@section Public-key algorithms
|
|
|
|
|
|
Nettle uses @acronym{GMP}, the GNU bignum library, for all calculations
|
|
|
with large numbers. In order to use the public-key features of Nettle,
|
|
|
you must install @acronym{GMP}, at least version 3.0, before compiling
|
|
|
Nettle, and you need to link your programs with @code{-lhogweed -lnettle
|
|
|
-lgmp}.
|
|
|
|
|
|
The concept of @dfn{Public-key} encryption and digital signatures was
|
|
|
discovered by Whitfield Diffie and Martin E. Hellman and described in a
|
|
|
paper 1976. In traditional, ``symmetric'', cryptography, sender and
|
|
|
receiver share the same keys, and these keys must be distributed in a
|
|
|
secure way. And if there are many users or entities that need to
|
|
|
communicate, each @emph{pair} needs a shared secret key known by nobody
|
|
|
else.
|
|
|
|
|
|
@cindex Public Key Cryptography
|
|
|
@cindex One-way function
|
|
|
|
|
|
Public-key cryptography uses trapdoor one-way functions. A
|
|
|
@dfn{one-way function} is a function @code{F} such that it is easy to
|
|
|
compute the value @code{F(x)} for any @code{x}, but given a value
|
|
|
@code{y}, it is hard to compute a corresponding @code{x} such that
|
|
|
@code{y = F(x)}. Two examples are cryptographic hash functions, and
|
|
|
exponentiation in certain groups.
|
|
|
|
|
|
A @dfn{trapdoor one-way function} is a function @code{F} that is
|
|
|
one-way, unless one knows some secret information about @code{F}. If one
|
|
|
knows the secret, it is easy to compute both @code{F} and it's inverse.
|
|
|
If this sounds strange, look at the @acronym{RSA} example below.
|
|
|
|
|
|
Two important uses for one-way functions with trapdoors are public-key
|
|
|
encryption, and digital signatures. The public-key encryption functions
|
|
|
in Nettle are not yet documented; the rest of this chapter is about
|
|
|
digital signatures.
|
|
|
|
|
|
To use a digital signature algorithm, one must first create a
|
|
|
@dfn{key-pair}: A public key and a corresponding private key. The private
|
|
|
key is used to sign messages, while the public key is used for verifying
|
|
|
that that signatures and messages match. Some care must be taken when
|
|
|
distributing the public key; it need not be kept secret, but if a bad
|
|
|
guy is able to replace it (in transit, or in some user's list of known
|
|
|
public keys), bad things may happen.
|
|
|
|
|
|
There are two operations one can do with the keys. The signature
|
|
|
operation takes a message and a private key, and creates a signature for
|
|
|
the message. A signature is some string of bits, usually at most a few
|
|
|
thousand bits or a few hundred octets. Unlike paper-and-ink signatures,
|
|
|
the digital signature depends on the message, so one can't cut it out of
|
|
|
context and glue it to a different message.
|
|
|
|
|
|
The verification operation takes a public key, a message, and a string
|
|
|
that is claimed to be a signature on the message, and returns true or
|
|
|
false. If it returns true, that means that the three input values
|
|
|
matched, and the verifier can be sure that someone went through with the
|
|
|
signature operation on that very message, and that the ``someone'' also
|
|
|
knows the private key corresponding to the public key.
|
|
|
|
|
|
The desired properties of a digital signature algorithm are as follows:
|
|
|
Given the public key and pairs of messages and valid signatures on them,
|
|
|
it should be hard to compute the private key, and it should also be hard
|
|
|
to create a new message and signature that is accepted by the
|
|
|
verification operation.
|
|
|
|
|
|
Besides signing meaningful messages, digital signatures can be used for
|
|
|
authorization. A server can be configured with a public key, such that
|
|
|
any client that connects to the service is given a random nonce message.
|
|
|
If the server gets a reply with a correct signature matching the nonce
|
|
|
message and the configured public key, the client is granted access. So
|
|
|
the configuration of the server can be understood as ``grant access to
|
|
|
whoever knows the private key corresponding to this particular public
|
|
|
key, and to no others''.
|
|
|
|
|
|
|
|
|
@menu
|
|
|
* RSA:: The RSA public key algorithm.
|
|
|
* DSA:: The DSA digital signature algorithm.
|
|
|
* Elliptic curves:: Elliptic curves and ECDSA
|
|
|
@end menu
|
|
|
|
|
|
@node RSA
|
|
|
@subsection @acronym{RSA}
|
|
|
|
|
|
The @acronym{RSA} algorithm was the first practical digital signature
|
|
|
algorithm that was constructed. It was described 1978 in a paper by
|
|
|
Ronald Rivest, Adi Shamir and L.M. Adleman, and the technique was also
|
|
|
patented in the @acronym{USA} in 1983. The patent expired on September 20, 2000, and since
|
|
|
that day, @acronym{RSA} can be used freely, even in the @acronym{USA}.
|
|
|
|
|
|
It's remarkably simple to describe the trapdoor function behind
|
|
|
@acronym{RSA}. The ``one-way''-function used is
|
|
|
|
|
|
@example
|
|
|
F(x) = x^e mod n
|
|
|
@end example
|
|
|
|
|
|
I.e. raise x to the @code{e}'th power, while discarding all multiples of
|
|
|
@code{n}. The pair of numbers @code{n} and @code{e} is the public key.
|
|
|
@code{e} can be quite small, even @code{e = 3} has been used, although
|
|
|
slightly larger numbers are recommended. @code{n} should be about 2000
|
|
|
bits or larger.
|
|
|
|
|
|
If @code{n} is large enough, and properly chosen, the inverse of F,
|
|
|
the computation of @code{e}'th roots modulo @code{n}, is very difficult.
|
|
|
But, where's the trapdoor?
|
|
|
|
|
|
Let's first look at how @acronym{RSA} key-pairs are generated. First
|
|
|
@code{n} is chosen as the product of two large prime numbers @code{p}
|
|
|
and @code{q} of roughly the same size (so if @code{n} is 2000 bits,
|
|
|
@code{p} and @code{q} are about 1000 bits each). One also computes the
|
|
|
number @code{phi = (p-1)(q-1)}, in mathematical speak, @code{phi} is the
|
|
|
order of the multiplicative group of integers modulo n.
|
|
|
|
|
|
Next, @code{e} is chosen. It must have no factors in common with @code{phi} (in
|
|
|
particular, it must be odd), but can otherwise be chosen more or less
|
|
|
randomly. @code{e = 65537} is a popular choice, because it makes raising
|
|
|
to the @code{e}'th power particularly efficient, and being prime, it
|
|
|
usually has no factors common with @code{phi}.
|
|
|
|
|
|
Finally, a number @code{d}, @code{d < n} is computed such that @code{e d
|
|
|
mod phi = 1}. It can be shown that such a number exists (this is why
|
|
|
@code{e} and @code{phi} must have no common factors), and that for all x,
|
|
|
|
|
|
@example
|
|
|
(x^e)^d mod n = x^(ed) mod n = (x^d)^e mod n = x
|
|
|
@end example
|
|
|
|
|
|
Using Euclid's algorithm, @code{d} can be computed quite easily from
|
|
|
@code{phi} and @code{e}. But it is still hard to get @code{d} without
|
|
|
knowing @code{phi}, which depends on the factorization of @code{n}.
|
|
|
|
|
|
So @code{d} is the trapdoor, if we know @code{d} and @code{y = F(x)}, we can
|
|
|
recover x as @code{y^d mod n}. @code{d} is also the private half of
|
|
|
the @acronym{RSA} key-pair.
|
|
|
|
|
|
The most common signature operation for @acronym{RSA} is defined in
|
|
|
@cite{PKCS#1}, a specification by RSA Laboratories. The message to be
|
|
|
signed is first hashed using a cryptographic hash function, e.g.
|
|
|
@acronym{MD5} or @acronym{SHA1}. Next, some padding, the @acronym{ASN.1}
|
|
|
``Algorithm Identifier'' for the hash function, and the message digest
|
|
|
itself, are concatenated and converted to a number @code{x}. The
|
|
|
signature is computed from @code{x} and the private key as @code{s = x^d
|
|
|
mod n}@footnote{Actually, the computation is not done like this, it is
|
|
|
done more efficiently using @code{p}, @code{q} and the Chinese remainder
|
|
|
theorem (@acronym{CRT}). But the result is the same.}. The signature, @code{s} is a
|
|
|
number of about the same size of @code{n}, and it usually encoded as a
|
|
|
sequence of octets, most significant octet first.
|
|
|
|
|
|
The verification operation is straight-forward, @code{x} is computed
|
|
|
from the message in the same way as above. Then @code{s^e mod n} is
|
|
|
computed, the operation returns true if and only if the result equals
|
|
|
@code{x}.
|
|
|
|
|
|
The @acronym{RSA} algorithm can also be used for encryption. RSA encryption uses
|
|
|
the public key @code{(n,e)} to compute the ciphertext @code{m^e mod n}.
|
|
|
The @cite{PKCS#1} padding scheme will use at least 8 random and non-zero
|
|
|
octets, using @var{m} of the form @code{[00 02 padding 00 plaintext]}.
|
|
|
It is required that @code{m < n}, and therefor the plaintext must be
|
|
|
smaller than the octet size of the modulo @code{n}, with some margin.
|
|
|
|
|
|
To decrypt the message, one needs the private key to compute @code{m =
|
|
|
c^e mod n} followed by checking and removing the padding.
|
|
|
|
|
|
@subsubsection Nettle's @acronym{RSA} support
|
|
|
|
|
|
Nettle represents @acronym{RSA} keys using two structures that contain
|
|
|
large numbers (of type @code{mpz_t}).
|
|
|
|
|
|
@deftp {Context struct} {rsa_public_key} size n e
|
|
|
@code{size} is the size, in octets, of the modulo, and is used internally.
|
|
|
@code{n} and @code{e} is the public key.
|
|
|
@end deftp
|
|
|
|
|
|
@deftp {Context struct} {rsa_private_key} size d p q a b c
|
|
|
@code{size} is the size, in octets, of the modulo, and is used internally.
|
|
|
@code{d} is the secret exponent, but it is not actually used when
|
|
|
signing. Instead, the factors @code{p} and @code{q}, and the parameters
|
|
|
@code{a}, @code{b} and @code{c} are used. They are computed from @code{p},
|
|
|
@code{q} and @code{e} such that @code{a e mod (p - 1) = 1, b e mod (q -
|
|
|
1) = 1, c q mod p = 1}.
|
|
|
@end deftp
|
|
|
|
|
|
Before use, these structs must be initialized by calling one of
|
|
|
|
|
|
@deftypefun void rsa_public_key_init (struct rsa_public_key *@var{pub})
|
|
|
@deftypefunx void rsa_private_key_init (struct rsa_private_key *@var{key})
|
|
|
Calls @code{mpz_init} on all numbers in the key struct.
|
|
|
@end deftypefun
|
|
|
|
|
|
and when finished with them, the space for the numbers must be
|
|
|
deallocated by calling one of
|
|
|
|
|
|
@deftypefun void rsa_public_key_clear (struct rsa_public_key *@var{pub})
|
|
|
@deftypefunx void rsa_private_key_clear (struct rsa_private_key *@var{key})
|
|
|
Calls @code{mpz_clear} on all numbers in the key struct.
|
|
|
@end deftypefun
|
|
|
|
|
|
In general, Nettle's @acronym{RSA} functions deviates from Nettle's ``no
|
|
|
memory allocation''-policy. Space for all the numbers, both in the key structs
|
|
|
above, and temporaries, are allocated dynamically. For information on how
|
|
|
to customize allocation, see
|
|
|
@xref{Custom Allocation,,GMP Allocation,gmp, GMP Manual}.
|
|
|
|
|
|
When you have assigned values to the attributes of a key, you must call
|
|
|
|
|
|
@deftypefun int rsa_public_key_prepare (struct rsa_public_key *@var{pub})
|
|
|
@deftypefunx int rsa_private_key_prepare (struct rsa_private_key *@var{key})
|
|
|
Computes the octet size of the key (stored in the @code{size} attribute,
|
|
|
and may also do other basic sanity checks. Returns one if successful, or
|
|
|
zero if the key can't be used, for instance if the modulo is smaller
|
|
|
than the minimum size needed for @acronym{RSA} operations specified by PKCS#1.
|
|
|
@end deftypefun
|
|
|
|
|
|
For each operation using the private key, there are two variants, e.g.,
|
|
|
@code{rsa_sha256_sign} and @code{rsa_sha256_sign_tr}. The former
|
|
|
function is older, and it should be avoided, because it provides no
|
|
|
defenses against side-channel attacks. The latter function use
|
|
|
randomized @acronym{RSA} blinding, which defends against timing attacks
|
|
|
using chosen-ciphertext, and it also checks the correctness of the
|
|
|
private key computation using the public key, which defends against
|
|
|
software or hardware errors which could leak the private key.
|
|
|
|
|
|
Before signing or verifying a message, you first hash it with the
|
|
|
appropriate hash function. You pass the hash function's context struct
|
|
|
to the @acronym{RSA} signature function, and it will extract the message
|
|
|
digest and do the rest of the work. There are also alternative functions
|
|
|
that take the hash digest as argument.
|
|
|
|
|
|
There is currently no support for using SHA224 or SHA384 with
|
|
|
@acronym{RSA} signatures, since there's no gain in either computation
|
|
|
time nor message size compared to using SHA256 and SHA512, respectively.
|
|
|
|
|
|
Creating an @acronym{RSA} signature is done with one of the following
|
|
|
functions:
|
|
|
|
|
|
@deftypefun int rsa_md5_sign_tr (const struct rsa_public_key *@var{pub}, const struct rsa_private_key *@var{key}, void *@var{random_ctx}, nettle_random_func *@var{random}, struct md5_ctx *@var{hash}, mpz_t @var{signature})
|
|
|
@deftypefunx int rsa_sha1_sign_tr (const struct rsa_public_key *@var{pub}, const struct rsa_private_key *@var{key}, void *@var{random_ctx}, nettle_random_func *@var{random}, struct sha1_ctx *@var{hash}, mpz_t @var{signature})
|
|
|
@deftypefunx int rsa_sha256_sign_tr (const struct rsa_public_key *@var{pub}, const struct rsa_private_key *@var{key}, void *@var{random_ctx}, nettle_random_func *@var{random}, struct sha256_ctx *@var{hash}, mpz_t @var{signature})
|
|
|
@deftypefunx int rsa_sha512_sign_tr (const struct rsa_public_key *@var{pub}, const struct rsa_private_key *@var{key}, void *@var{random_ctx}, nettle_random_func *@var{random}, struct sha512_ctx *@var{hash}, mpz_t @var{signature})
|
|
|
The signature is stored in @var{signature} (which must have been
|
|
|
@code{mpz_init}'ed earlier). The hash context is reset so that it can be
|
|
|
used for new messages. The @var{random_ctx} and @var{random} pointers
|
|
|
are used to generate the @acronym{RSA} blinding. Returns one on success,
|
|
|
or zero on failure. Signing fails if an error in the computation was
|
|
|
detected, or if the key is too small for the given hash size, e.g., it's
|
|
|
not possible to create a signature using SHA512 and a 512-bit
|
|
|
@acronym{RSA} key.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun int rsa_md5_sign_digest_tr (const struct rsa_public_key *@var{pub}, const struct rsa_private_key *@var{key}, void *@var{random_ctx}, nettle_random_func *@var{random}, const uint8_t *@var{digest}, mpz_t @var{signature})
|
|
|
@deftypefunx int rsa_sha1_sign_digest_tr (const struct rsa_public_key *@var{pub}, const struct rsa_private_key *@var{key}, void *@var{random_ctx}, nettle_random_func *@var{random}, const uint8_t *@var{digest}, mpz_t @var{signature})
|
|
|
@deftypefunx int rsa_sha256_sign_digest_tr (const struct rsa_public_key *@var{pub}, const struct rsa_private_key *@var{key}, void *@var{random_ctx}, nettle_random_func *@var{random}, const uint8_t *@var{digest}, mpz_t @var{signature})
|
|
|
@deftypefunx int rsa_sha512_sign_digest_tr (const struct rsa_public_key *@var{pub}, const struct rsa_private_key *@var{key}, void *@var{random_ctx}, nettle_random_func *@var{random}, const uint8_t *@var{digest}, mpz_t @var{signature})
|
|
|
Creates a signature from the given hash digest. @var{digest} should
|
|
|
point to a digest of size @code{MD5_DIGEST_SIZE},
|
|
|
@code{SHA1_DIGEST_SIZE}, @code{SHA256_DIGEST_SIZE}, or
|
|
|
@code{SHA512_DIGEST_SIZE}respectively. The signature is stored in
|
|
|
@var{signature} (which must have been @code{mpz_init}:ed earlier).
|
|
|
Returns one on success, or zero on failure.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun int rsa_pkcs1_sign_tr (const struct rsa_public_key *@var{pub}, const struct rsa_private_key *@var{key}, void *@var{random_ctx}, nettle_random_func *@var{random}, size_t @var{length}, const uint8_t *@var{digest_info}, mpz_t @var{signature})
|
|
|
Similar to the above @code{_sign_digest_tr} functions, but the input is not the
|
|
|
plain hash digest, but a PKCS#1 ``DigestInfo'', an ASN.1 DER-encoding
|
|
|
of the digest together with an object identifier for the used hash
|
|
|
algorithm.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun int rsa_md5_sign (const struct rsa_private_key *@var{key}, struct md5_ctx *@var{hash}, mpz_t @var{signature})
|
|
|
@deftypefunx int rsa_sha1_sign (const struct rsa_private_key *@var{key}, struct sha1_ctx *@var{hash}, mpz_t @var{signature})
|
|
|
@deftypefunx int rsa_sha256_sign (const struct rsa_private_key *@var{key}, struct sha256_ctx *@var{hash}, mpz_t @var{signature})
|
|
|
@deftypefunx int rsa_sha512_sign (const struct rsa_private_key *@var{key}, struct sha512_ctx *@var{hash}, mpz_t @var{signature})
|
|
|
The signature is stored in @var{signature} (which must have been
|
|
|
@code{mpz_init}'ed earlier). The hash context is reset so that it can be
|
|
|
used for new messages. Returns one on success, or zero on failure.
|
|
|
Signing fails if the key is too small for the given hash size, e.g.,
|
|
|
it's not possible to create a signature using SHA512 and a 512-bit
|
|
|
@acronym{RSA} key.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun int rsa_md5_sign_digest (const struct rsa_private_key *@var{key}, const uint8_t *@var{digest}, mpz_t @var{signature})
|
|
|
@deftypefunx int rsa_sha1_sign_digest (const struct rsa_private_key *@var{key}, const uint8_t *@var{digest}, mpz_t @var{signature})
|
|
|
@deftypefunx int rsa_sha256_sign_digest (const struct rsa_private_key *@var{key}, const uint8_t *@var{digest}, mpz_t @var{signature})
|
|
|
@deftypefunx int rsa_sha512_sign_digest (const struct rsa_private_key *@var{key}, const uint8_t *@var{digest}, mpz_t @var{signature})
|
|
|
Creates a signature from the given hash digest; otherwise analoguous to
|
|
|
the above signing functions. @var{digest} should point to a digest of
|
|
|
size @code{MD5_DIGEST_SIZE}, @code{SHA1_DIGEST_SIZE},
|
|
|
@code{SHA256_DIGEST_SIZE}, or @code{SHA512_DIGEST_SIZE}, respectively.
|
|
|
The signature is stored in @var{signature} (which must have been
|
|
|
@code{mpz_init}:ed earlier). Returns one on success, or zero on failure.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun int rsa_pkcs1_sign (const struct rsa_private_key *@var{key}, size_t @var{length}, const uint8_t *@var{digest_info}, mpz_t @var{s})
|
|
|
Similar to the above _sign_digest functions, but the input is not the
|
|
|
plain hash digest, but a PKCS#1 ``DigestInfo'', an ASN.1 DER-encoding
|
|
|
of the digest together with an object identifier for the used hash
|
|
|
algorithm.
|
|
|
@end deftypefun
|
|
|
|
|
|
Verifying an RSA signature is done with one of the following functions:
|
|
|
|
|
|
@deftypefun int rsa_md5_verify (const struct rsa_public_key *@var{key}, struct md5_ctx *@var{hash}, const mpz_t @var{signature})
|
|
|
@deftypefunx int rsa_sha1_verify (const struct rsa_public_key *@var{key}, struct sha1_ctx *@var{hash}, const mpz_t @var{signature})
|
|
|
@deftypefunx int rsa_sha256_verify (const struct rsa_public_key *@var{key}, struct sha256_ctx *@var{hash}, const mpz_t @var{signature})
|
|
|
@deftypefunx int rsa_sha512_verify (const struct rsa_public_key *@var{key}, struct sha512_ctx *@var{hash}, const mpz_t @var{signature})
|
|
|
Returns 1 if the signature is valid, or 0 if it isn't. In either case,
|
|
|
the hash context is reset so that it can be used for new messages.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun int rsa_md5_verify_digest (const struct rsa_public_key *@var{key}, const uint8_t *@var{digest}, const mpz_t @var{signature})
|
|
|
@deftypefunx int rsa_sha1_verify_digest (const struct rsa_public_key *@var{key}, const uint8_t *@var{digest}, const mpz_t @var{signature})
|
|
|
@deftypefunx int rsa_sha256_verify_digest (const struct rsa_public_key *@var{key}, const uint8_t *@var{digest}, const mpz_t @var{signature})
|
|
|
@deftypefunx int rsa_sha512_verify_digest (const struct rsa_public_key *@var{key}, const uint8_t *@var{digest}, const mpz_t @var{signature})
|
|
|
Returns 1 if the signature is valid, or 0 if it isn't. @var{digest}
|
|
|
should point to a digest of size @code{MD5_DIGEST_SIZE},
|
|
|
@code{SHA1_DIGEST_SIZE}, @code{SHA256_DIGEST_SIZE}, or
|
|
|
@code{SHA512_DIGEST_SIZE} respectively.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun int rsa_pkcs1_verify (const struct rsa_public_key *@var{key}, size_t @var{length}, const uint8_t *@var{digest_info}, const mpz_t @var{signature})
|
|
|
Similar to the above _verify_digest functions, but the input is not the
|
|
|
plain hash digest, but a PKCS#1 ``DigestInfo'', and ASN.1 DER-encoding
|
|
|
of the digest together with an object identifier for the used hash
|
|
|
algorithm.
|
|
|
@end deftypefun
|
|
|
|
|
|
While the above functions for the RSA signature operations use the
|
|
|
@cite{PKCS#1} padding scheme, Nettle also provides the variants based on
|
|
|
the PSS padding scheme, specified in @cite{RFC 8017}. These variants
|
|
|
take advantage of a randomly choosen salt value, which could enhance the
|
|
|
security by causing output to be different for equivalent inputs.
|
|
|
However, assuming the same security level as inverting the @acronym{RSA}
|
|
|
algorithm, a longer salt value does not always mean a better security
|
|
|
@url{https://www.iacr.org/archive/eurocrypt2002/23320268/coron.pdf}.
|
|
|
The typical choices of the length are between 0 and the digest size of
|
|
|
the underlying hash function.
|
|
|
|
|
|
Creating an RSA signature with the PSS padding scheme is done with one
|
|
|
of the following functions:
|
|
|
|
|
|
@deftypefun int rsa_pss_sha256_sign_digest_tr (const struct rsa_public_key *@var{pub}, const struct rsa_private_key *@var{key}, void *@var{random_ctx}, nettle_random_func *@var{random}, size_t @var{salt_length}, const uint8_t *@var{salt}, const uint8_t *@var{digest}, mpz_t @var{signature})
|
|
|
@deftypefunx int rsa_pss_sha384_sign_digest_tr (const struct rsa_public_key *@var{pub}, const struct rsa_private_key *@var{key}, void *@var{random_ctx}, nettle_random_func *@var{random}, size_t @var{salt_length}, const uint8_t *@var{salt}, const uint8_t *@var{digest}, mpz_t @var{signature})
|
|
|
@deftypefunx int rsa_pss_sha512_sign_digest_tr (const struct rsa_public_key *@var{pub}, const struct rsa_private_key *@var{key}, void *@var{random_ctx}, nettle_random_func *@var{random}, size_t @var{salt_length}, const uint8_t *@var{salt}, const uint8_t *@var{digest}, mpz_t @var{signature})
|
|
|
Creates a signature using the PSS padding scheme. @var{salt} should
|
|
|
point to a salt string of size @var{salt_length}. @var{digest} should
|
|
|
point to a digest of size @code{SHA256_DIGEST_SIZE},
|
|
|
@code{SHA384_DIGEST_SIZE}, or @code{SHA512_DIGEST_SIZE}respectively. The
|
|
|
signature is stored in @var{signature} (which must have been
|
|
|
@code{mpz_init}:ed earlier).
|
|
|
Returns one on success, or zero on failure.
|
|
|
@end deftypefun
|
|
|
|
|
|
Verifying an RSA signature with the PSS padding scheme is done with one
|
|
|
of the following functions:
|
|
|
|
|
|
@deftypefun int rsa_pss_sha256_verify_digest (const struct rsa_public_key *@var{key}, size_t @var{salt_length}, const uint8_t *@var{digest}, const mpz_t @var{signature})
|
|
|
@deftypefunx int rsa_pss_sha384_verify_digest (const struct rsa_public_key *@var{key}, size_t @var{salt_length}, const uint8_t *@var{digest}, const mpz_t @var{signature})
|
|
|
@deftypefunx int rsa_pss_sha512_verify_digest (const struct rsa_public_key *@var{key}, size_t @var{salt_length}, const uint8_t *@var{digest}, const mpz_t @var{signature})
|
|
|
Returns 1 if the signature is valid, or 0 if it isn't. @var{digest}
|
|
|
should point to a digest of size @code{SHA256_DIGEST_SIZE},
|
|
|
@code{SHA384_DIGEST_SIZE}, or @code{SHA512_DIGEST_SIZE} respectively.
|
|
|
@end deftypefun
|
|
|
|
|
|
The following function is used to encrypt a clear text message using RSA.
|
|
|
@deftypefun int rsa_encrypt (const struct rsa_public_key *@var{key}, void *@var{random_ctx}, nettle_random_func *@var{random}, size_t @var{length}, const uint8_t *@var{cleartext}, mpz_t @var{ciphertext})
|
|
|
Returns 1 on success, 0 on failure. If the message is too long then this
|
|
|
will lead to a failure.
|
|
|
@end deftypefun
|
|
|
The following function is used to decrypt a cipher text message using RSA.
|
|
|
@deftypefun int rsa_decrypt (const struct rsa_private_key *@var{key}, size_t *@var{length}, uint8_t *@var{cleartext}, const mpz_t @var{ciphertext})
|
|
|
Returns 1 on success, 0 on failure. Causes of failure include decryption
|
|
|
failing or the resulting message being to large. The message buffer
|
|
|
pointed to by @var{cleartext} must be of size *@var{length}. After
|
|
|
decryption, *@var{length} will be updated with the size of the
|
|
|
message.
|
|
|
@end deftypefun
|
|
|
There is also a timing resistant version of decryption that utilizes
|
|
|
randomized RSA blinding.
|
|
|
@deftypefun int rsa_decrypt_tr (const struct rsa_public_key *@var{pub}, const struct rsa_private_key *@var{key}, void *@var{random_ctx}, nettle_random_func *@var{random}, size_t *@var{length}, uint8_t *@var{message}, const mpz_t @var{ciphertext})
|
|
|
Returns 1 on success, 0 on failure.
|
|
|
@end deftypefun
|
|
|
|
|
|
While the above functions for the RSA encryption operations use the
|
|
|
@cite{PKCS#1} padding scheme, Nettle also provides the variants based
|
|
|
on the OAEP padding scheme, specified in @cite{RFC 8017}. These
|
|
|
variants take advantage of a randomly choosen seed value, which could
|
|
|
enhance the security by causing output to be different for equivalent
|
|
|
inputs.
|
|
|
|
|
|
Encrypting a clear text message using RSA with the OAEP padding scheme
|
|
|
is done with one of the following functions:
|
|
|
|
|
|
@deftypefun int rsa_oaep_sha256_encrypt (const struct rsa_public_key *@var{key}, void *@var{random_ctx}, nettle_random_func *@var{random}, size_t @var{label_length}, const uint8_t *@var{label}, size_t @var{length}, const uint8_t *@var{message}, uint8_t *@var{ciphertext})
|
|
|
@deftypefunx int rsa_oaep_sha384_encrypt (const struct rsa_public_key *@var{key}, void *@var{random_ctx}, nettle_random_func *@var{random}, size_t @var{label_length}, const uint8_t *@var{label}, size_t @var{length}, const uint8_t *@var{message}, uint8_t *@var{ciphertext})
|
|
|
@deftypefunx int rsa_oaep_sha512_encrypt (const struct rsa_public_key *@var{key}, void *@var{random_ctx}, nettle_random_func *@var{random}, size_t @var{label_length}, const uint8_t *@var{label}, size_t @var{length}, const uint8_t *@var{message}, uint8_t *@var{ciphertext})
|
|
|
Returns 1 on success, 0 on failure. The label is optional and if
|
|
|
omitted, @var{label_length} and @var{label} is set to 0 and
|
|
|
@code{NULL} respectively. The maximum size of @var{message} can be
|
|
|
calculated with @code{k - 2 * hLen - 2}, where @code{k} is the key
|
|
|
size in octets obtained with @var{key}->size, and @code{hLen} is the
|
|
|
output size of the underlying hash function (e.g.,
|
|
|
@code{SHA256_DIGEST_SIZE} for @code{rsa_oaep_sha256_encrypt}).
|
|
|
@end deftypefun
|
|
|
|
|
|
Decrypting a cipher text message using RSA with the OAEP padding
|
|
|
scheme is done with one of the following functions:
|
|
|
|
|
|
@deftypefun int rsa_oaep_sha256_decrypt (const struct rsa_public_key *@var{pub}, const struct rsa_private_key *@var{key}, void *@var{random_ctx}, nettle_random_func *@var{random}, size_t @var{label_length}, const uint8_t *@var{label}, size_t *@var{length}, uint8_t *@var{message}, const uint8_t *@var{ciphertext})
|
|
|
@deftypefunx int rsa_oaep_sha384_decrypt (const struct rsa_public_key *@var{pub}, const struct rsa_private_key *@var{key}, void *@var{random_ctx}, nettle_random_func *@var{random}, size_t @var{label_length}, const uint8_t *@var{label}, size_t *@var{length}, uint8_t *@var{message}, const uint8_t *@var{ciphertext})
|
|
|
@deftypefunx int rsa_oaep_sha512_decrypt (const struct rsa_public_key *@var{pub}, const struct rsa_private_key *@var{key}, void *@var{random_ctx}, nettle_random_func *@var{random}, size_t @var{label_length}, const uint8_t *@var{label}, size_t *@var{length}, uint8_t *@var{message}, const uint8_t *@var{ciphertext})
|
|
|
Returns 1 on success, 0 on failure. These function utilize randomized
|
|
|
RSA blinding similarly to @code{rsa_decrypt_tr}. The message buffer
|
|
|
pointed to by @var{cleartext} must be of size *@var{length}. After
|
|
|
decryption, *@var{length} will be updated with the size of the
|
|
|
message.
|
|
|
@end deftypefun
|
|
|
|
|
|
|
|
|
If you need to use the @acronym{RSA} trapdoor, the private key, in a way
|
|
|
that isn't supported by the above functions Nettle also includes a
|
|
|
function that computes @code{x^d mod n} and nothing more, using the
|
|
|
@acronym{CRT} optimization.
|
|
|
|
|
|
@deftypefun int rsa_compute_root_tr (const struct rsa_public_key *@var{pub}, const struct rsa_private_key *@var{key}, void *@var{random_ctx}, nettle_random_func *@var{random}, mpz_t @var{x}, const mpz_t @var{m})
|
|
|
Computes @code{x = m^d}. Returns one on success, or zero if a failure in
|
|
|
the computation was detected.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void rsa_compute_root (struct rsa_private_key *@var{key}, mpz_t @var{x}, const mpz_t @var{m})
|
|
|
Computes @code{x = m^d}.
|
|
|
@end deftypefun
|
|
|
|
|
|
At last, how do you create new keys?
|
|
|
|
|
|
@deftypefun int rsa_generate_keypair (struct rsa_public_key *@var{pub}, struct rsa_private_key *@var{key}, void *@var{random_ctx}, nettle_random_func @var{random}, void *@var{progress_ctx}, nettle_progress_func @var{progress}, unsigned @var{n_size}, unsigned @var{e_size})
|
|
|
There are lots of parameters. @var{pub} and @var{key} is where the
|
|
|
resulting key pair is stored. The structs should be initialized, but you
|
|
|
don't need to call @code{rsa_public_key_prepare} or
|
|
|
@code{rsa_private_key_prepare} after key generation.
|
|
|
|
|
|
@var{random_ctx} and @var{random} is a randomness generator.
|
|
|
@code{random(random_ctx, length, dst)} should generate @code{length}
|
|
|
random octets and store them at @code{dst}. For advice, see
|
|
|
@xref{Randomness}.
|
|
|
|
|
|
@var{progress} and @var{progress_ctx} can be used to get callbacks
|
|
|
during the key generation process, in order to uphold an illusion of
|
|
|
progress. @var{progress} can be NULL, in that case there are no
|
|
|
callbacks.
|
|
|
|
|
|
@var{size_n} is the desired size of the modulo, in bits. If @var{size_e}
|
|
|
is non-zero, it is the desired size of the public exponent and a random
|
|
|
exponent of that size is selected. But if @var{e_size} is zero, it is
|
|
|
assumed that the caller has already chosen a value for @code{e}, and
|
|
|
stored it in @var{pub}.
|
|
|
Returns one on success, and zero on failure. The function can fail for
|
|
|
example if if @var{n_size} is too small, or if @var{e_size} is zero and
|
|
|
@code{pub->e} is an even number.
|
|
|
@end deftypefun
|
|
|
|
|
|
@node DSA
|
|
|
@subsection @acronym{DSA}
|
|
|
|
|
|
The @acronym{DSA} digital signature algorithm is more complex than
|
|
|
@acronym{RSA}. It was specified during the early 1990s, and in 1994 NIST
|
|
|
published @acronym{FIPS} 186 which is the authoritative specification.
|
|
|
Sometimes @acronym{DSA} is referred to using the acronym @acronym{DSS},
|
|
|
for Digital Signature Standard. The most recent revision of the
|
|
|
specification, FIPS186-3, was issued in 2009, and it adds support for
|
|
|
larger hash functions than @acronym{sha1}.
|
|
|
|
|
|
For @acronym{DSA}, the underlying mathematical problem is the
|
|
|
computation of discrete logarithms. The public key consists of a large
|
|
|
prime @code{p}, a small prime @code{q} which is a factor of @code{p-1},
|
|
|
a number @code{g} which generates a subgroup of order @code{q} modulo
|
|
|
@code{p}, and an element @code{y} in that subgroup.
|
|
|
|
|
|
In the original @acronym{DSA}, the size of @code{q} is fixed to 160
|
|
|
bits, to match with the @acronym{SHA1} hash algorithm. The size of
|
|
|
@code{p} is in principle unlimited, but the
|
|
|
standard specifies only nine specific sizes: @code{512 + l*64}, where
|
|
|
@code{l} is between 0 and 8. Thus, the maximum size of @code{p} is 1024
|
|
|
bits, and sizes less than 1024 bits are considered obsolete and not
|
|
|
secure.
|
|
|
|
|
|
The subgroup requirement means that if you compute
|
|
|
|
|
|
@example
|
|
|
g^t mod p
|
|
|
@end example
|
|
|
|
|
|
for all possible integers @code{t}, you will get precisely @code{q}
|
|
|
distinct values.
|
|
|
|
|
|
The private key is a secret exponent @code{x}, such that
|
|
|
|
|
|
@example
|
|
|
g^x = y mod p
|
|
|
@end example
|
|
|
|
|
|
In mathematical speak, @code{x} is the @dfn{discrete logarithm} of
|
|
|
@code{y} mod @code{p}, with respect to the generator @code{g}. The size
|
|
|
of @code{x} will also be about the same size as @code{q}. The security of the
|
|
|
@acronym{DSA} algorithm relies on the difficulty of the discrete
|
|
|
logarithm problem. Current algorithms to compute discrete logarithms in
|
|
|
this setting, and hence crack @acronym{DSA}, are of two types. The first
|
|
|
type works directly in the (multiplicative) group of integers mod
|
|
|
@code{p}. The best known algorithm of this type is the Number Field
|
|
|
Sieve, and it's complexity is similar to the complexity of factoring
|
|
|
numbers of the same size as @code{p}. The other type works in the
|
|
|
smaller @code{q}-sized subgroup generated by @code{g}, which has a more
|
|
|
difficult group structure. One good algorithm is Pollard-rho, which has
|
|
|
complexity @code{sqrt(q)}.
|
|
|
|
|
|
The important point is that security depends on the size of @emph{both}
|
|
|
@code{p} and @code{q}, and they should be chosen so that the difficulty
|
|
|
of both discrete logarithm methods are comparable. Today, the security
|
|
|
margin of the original @acronym{DSA} may be uncomfortably small. Using a
|
|
|
@code{p} of 1024 bits implies that cracking using the number field sieve
|
|
|
is expected to take about the same time as factoring a 1024-bit
|
|
|
@acronym{RSA} modulo, and using a @code{q} of size 160 bits implies
|
|
|
that cracking using Pollard-rho will take roughly @code{2^80} group
|
|
|
operations. With the size of @code{q} fixed, tied to the @acronym{SHA1}
|
|
|
digest size, it may be tempting to increase the size of @code{p} to,
|
|
|
say, 4096 bits. This will provide excellent resistance against attacks
|
|
|
like the number field sieve which works in the large group. But it will
|
|
|
do very little to defend against Pollard-rho attacking the small
|
|
|
subgroup; the attacker is slowed down at most by a single factor of 10
|
|
|
due to the more expensive group operation. And the attacker will surely
|
|
|
choose the latter attack.
|
|
|
|
|
|
The signature generation algorithm is randomized; in order to create a
|
|
|
@acronym{DSA} signature, you need a good source for random numbers
|
|
|
(@pxref{Randomness}). Let us describe the common case of a 160-bit
|
|
|
@code{q}.
|
|
|
|
|
|
To create a signature, one starts with the hash digest of the message,
|
|
|
@code{h}, which is a 160 bit number, and a random number @code{k,
|
|
|
0<k<q}, also 160 bits. Next, one computes
|
|
|
|
|
|
@example
|
|
|
r = (g^k mod p) mod q
|
|
|
s = k^-1 (h + x r) mod q
|
|
|
@end example
|
|
|
|
|
|
The signature is the pair @code{(r, s)}, two 160 bit numbers. Note the
|
|
|
two different mod operations when computing @code{r}, and the use of the
|
|
|
secret exponent @code{x}.
|
|
|
|
|
|
To verify a signature, one first checks that @code{0 < r,s < q}, and
|
|
|
then one computes backwards,
|
|
|
|
|
|
@example
|
|
|
w = s^-1 mod q
|
|
|
v = (g^(w h) y^(w r) mod p) mod q
|
|
|
@end example
|
|
|
|
|
|
The signature is valid if @code{v = r}. This works out because @code{w =
|
|
|
s^-1 mod q = k (h + x r)^-1 mod q}, so that
|
|
|
|
|
|
@example
|
|
|
g^(w h) y^(w r) = g^(w h) (g^x)^(w r) = g^(w (h + x r)) = g^k
|
|
|
@end example
|
|
|
|
|
|
When reducing mod @code{q} this yields @code{r}. Note that when
|
|
|
verifying a signature, we don't know either @code{k} or @code{x}: those
|
|
|
numbers are secret.
|
|
|
|
|
|
If you can choose between @acronym{RSA} and @acronym{DSA}, which one is
|
|
|
best? Both are believed to be secure. @acronym{DSA} gained popularity in
|
|
|
the late 1990s, as a patent free alternative to @acronym{RSA}. Now that
|
|
|
the @acronym{RSA} patents have expired, there's no compelling reason to
|
|
|
want to use @acronym{DSA}. Today, the original @acronym{DSA} key size
|
|
|
does not provide a large security margin, and it should probably be
|
|
|
phased out together with @acronym{RSA} keys of 1024 bits. Using the
|
|
|
revised @acronym{DSA} algorithm with a larger hash function, in
|
|
|
particular, @acronym{SHA256}, a 256-bit @code{q}, and @code{p} of size
|
|
|
2048 bits or more, should provide for a more comfortable security
|
|
|
margin, but these variants are not yet in wide use.
|
|
|
|
|
|
@acronym{DSA} signatures are smaller than @acronym{RSA} signatures,
|
|
|
which is important for some specialized applications.
|
|
|
|
|
|
From a practical point of view, @acronym{DSA}'s need for a good
|
|
|
randomness source is a serious disadvantage. If you ever use the same
|
|
|
@code{k} (and @code{r}) for two different message, you leak your private
|
|
|
key.
|
|
|
|
|
|
@subsubsection Nettle's @acronym{DSA} support
|
|
|
|
|
|
Like for @acronym{RSA}, Nettle represents @acronym{DSA} keys using two
|
|
|
structures, containing values of type @code{mpz_t}. For information on
|
|
|
how to customize allocation, see @xref{Custom Allocation,,GMP
|
|
|
Allocation,gmp, GMP Manual}. Nettle's @acronym{DSA} interface is defined
|
|
|
in @file{<nettle/dsa.h>}.
|
|
|
|
|
|
A @acronym{DSA} group is represented using the following struct.
|
|
|
|
|
|
@deftp {Context struct} {dsa_params} p q g
|
|
|
Parameters of the @acronym{DSA} group.
|
|
|
@end deftp
|
|
|
|
|
|
@deftypefun void dsa_params_init (struct dsa_params *@var{params})
|
|
|
Calls @code{mpz_init} on all numbers in the struct.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void dsa_params_clear (struct dsa_params *@var{params}params)
|
|
|
Calls @code{mpz_clear} on all numbers in the struct.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun int dsa_generate_params (struct dsa_params *@var{params}, void *@var{random_ctx}, nettle_random_func *@var{random}, void *@var{progress_ctx}, nettle_progress_func *@var{progress}, unsigned @var{p_bits}, unsigned @var{q_bits})
|
|
|
Generates parameters of a new group. The @var{params} struct should be
|
|
|
initialized before you call this function.
|
|
|
|
|
|
@var{random_ctx} and @var{random} is a randomness generator.
|
|
|
@code{random(random_ctx, length, dst)} should generate @code{length}
|
|
|
random octets and store them at @code{dst}. For advice, see
|
|
|
@xref{Randomness}.
|
|
|
|
|
|
@var{progress} and @var{progress_ctx} can be used to get callbacks
|
|
|
during the key generation process, in order to uphold an illusion of
|
|
|
progress. @var{progress} can be NULL, in that case there are no
|
|
|
callbacks.
|
|
|
|
|
|
@var{p_bits} and @var{q_bits} are the desired sizes of @code{p} and
|
|
|
@code{q}. To generate keys that conform to the original @acronym{DSA}
|
|
|
standard, you must use @code{q_bits = 160} and select @var{p_bits} of
|
|
|
the form @code{p_bits = 512 + l*64}, for @code{0 <= l <= 8}, where the
|
|
|
smaller sizes are no longer recommended, so you should most likely stick
|
|
|
to @code{p_bits = 1024}. Non-standard sizes are possible, in particular
|
|
|
@code{p_bits} larger than 1024, although @acronym{DSA} implementations
|
|
|
can not in general be expected to support such keys. Also note that
|
|
|
using very large @var{p_bits}, with @var{q_bits} fixed at 160, doesn't
|
|
|
make much sense, because the security is also limited by the size of the
|
|
|
smaller prime. To generate @acronym{DSA} keys for use with
|
|
|
@acronym{SHA256}, use @code{q_bits = 256} and, e.g., @code{p_bits =
|
|
|
2048}.
|
|
|
|
|
|
Returns one on success, and zero on failure. The function will fail if
|
|
|
@var{q_bits} is too small, or too close to @var{p_bits}.
|
|
|
@end deftypefun
|
|
|
|
|
|
Signatures are represented using the structure below.
|
|
|
|
|
|
@deftp {Context struct} {dsa_signature} r s
|
|
|
The @var{r} and @var{s} fields are both of type @code{mpz_t}.
|
|
|
@end deftp
|
|
|
|
|
|
@deftypefun void dsa_signature_init (struct dsa_signature *@var{signature})
|
|
|
@deftypefunx void dsa_signature_clear (struct dsa_signature *@var{signature})
|
|
|
You must call @code{dsa_signature_init} before creating or using a
|
|
|
signature, and call @code{dsa_signature_clear} when you are finished
|
|
|
with it.
|
|
|
@end deftypefun
|
|
|
|
|
|
Keys are represented as bignums, of type @code{mpz_t}. A public key
|
|
|
represents a group element, and is of the same size as @code{p}, while a
|
|
|
private key is an exponent, of the same size as @code{q}.
|
|
|
|
|
|
@deftypefun int dsa_sign (const struct dsa_params *@var{params}, const mpz_t @var{x}, void *@var{random_ctx}, nettle_random_func *@var{random}, size_t @var{digest_size}, const uint8_t *@var{digest}, struct dsa_signature *@var{signature})
|
|
|
Creates a signature from the given hash digest, using the private key
|
|
|
@var{x}. @var{random_ctx} and @var{random} is a randomness generator.
|
|
|
@code{random(random_ctx, length, dst)} should generate @code{length}
|
|
|
random octets and store them at @code{dst}. For advice, see
|
|
|
@xref{Randomness}. Returns one on success, or zero on failure. Signing
|
|
|
can fail only if the key is invalid, so that inversion modulo @code{q}
|
|
|
fails.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun int dsa_verify (const struct dsa_params *@var{params}, const mpz_t @var{y}, size_t @var{digest_size}, const uint8_t *@var{digest}, const struct dsa_signature *@var{signature})
|
|
|
Verifies a signature, using the public key y. Returns 1 if the signature
|
|
|
is valid, otherwise 0.
|
|
|
@end deftypefun
|
|
|
|
|
|
To generate a keypair, first generate a @acronym{DSA} group using
|
|
|
@code{dsa_generate_params}. A keypair in this group is then created
|
|
|
using
|
|
|
|
|
|
@deftypefun void dsa_generate_keypair (const struct dsa_params *@var{params}, mpz_t @var{pub}, mpz_t @var{key}, void *@var{random_ctx}, nettle_random_func *@var{random})
|
|
|
Generates a new keypair, using the group @var{params}. The public key is
|
|
|
stored in @var{pub}, and the private key in @var{key}. Both variables
|
|
|
must be initialized using @code{mpz_init} before this call.
|
|
|
|
|
|
@var{random_ctx} and @var{random} is a randomness generator.
|
|
|
@code{random(random_ctx, length, dst)} should generate @code{length}
|
|
|
random octets and store them at @code{dst}. For advice, see
|
|
|
@xref{Randomness}.
|
|
|
@end deftypefun
|
|
|
|
|
|
@subsubsection Old, deprecated, @acronym{DSA} interface
|
|
|
|
|
|
Versions before nettle-3.0 used a different interface for @acronym{DSA}
|
|
|
signatures, where the group parameters and the public key was packed
|
|
|
together as @code{struct dsa_public_key}. Most of this interface is kept
|
|
|
for backwards compatibility, and declared in @file{nettle/dsa-compat.h}.
|
|
|
Below is the old documentation. The old and new interface use distinct
|
|
|
names and don't confict, with one exception: The key generation
|
|
|
function. The @file{nettle/dsa-compat.h} redefines
|
|
|
@code{dsa_generate_keypair} as an alias for
|
|
|
@code{dsa_compat_generate_keypair}, compatible with the old interface
|
|
|
and documented below.
|
|
|
|
|
|
The old @acronym{DSA} functions are very similar to the corresponding
|
|
|
@acronym{RSA} functions, but there are a few differences pointed out
|
|
|
below. For a start, there are no functions corresponding to
|
|
|
@code{rsa_public_key_prepare} and @code{rsa_private_key_prepare}.
|
|
|
|
|
|
@deftp {Context struct} {dsa_public_key} p q g y
|
|
|
The public parameters described above.
|
|
|
@end deftp
|
|
|
|
|
|
@deftp {Context struct} {dsa_private_key} x
|
|
|
The private key @code{x}.
|
|
|
@end deftp
|
|
|
|
|
|
Before use, these structs must be initialized by calling one of
|
|
|
|
|
|
@deftypefun void dsa_public_key_init (struct dsa_public_key *@var{pub})
|
|
|
@deftypefunx void dsa_private_key_init (struct dsa_private_key *@var{key})
|
|
|
Calls @code{mpz_init} on all numbers in the key struct.
|
|
|
@end deftypefun
|
|
|
|
|
|
When finished with them, the space for the numbers must be
|
|
|
deallocated by calling one of
|
|
|
|
|
|
@deftypefun void dsa_public_key_clear (struct dsa_public_key *@var{pub})
|
|
|
@deftypefunx void dsa_private_key_clear (struct dsa_private_key *@var{key})
|
|
|
Calls @code{mpz_clear} on all numbers in the key struct.
|
|
|
@end deftypefun
|
|
|
|
|
|
Signatures are represented using @code{struct dsa_signature}, described
|
|
|
earlier.
|
|
|
|
|
|
For signing, you need to provide both the public and the private key
|
|
|
(unlike @acronym{RSA}, where the private key struct includes all
|
|
|
information needed for signing), and a source for random numbers.
|
|
|
Signatures can use the @acronym{SHA1} or the @acronym{SHA256} hash
|
|
|
function, although the implementation of @acronym{DSA} with
|
|
|
@acronym{SHA256} should be considered somewhat experimental due to lack
|
|
|
of official test vectors and interoperability testing.
|
|
|
|
|
|
@deftypefun int dsa_sha1_sign (const struct dsa_public_key *@var{pub}, const struct dsa_private_key *@var{key}, void *@var{random_ctx}, nettle_random_func @var{random}, struct sha1_ctx *@var{hash}, struct dsa_signature *@var{signature})
|
|
|
@deftypefunx int dsa_sha1_sign_digest (const struct dsa_public_key *@var{pub}, const struct dsa_private_key *@var{key}, void *@var{random_ctx}, nettle_random_func @var{random}, const uint8_t *@var{digest}, struct dsa_signature *@var{signature})
|
|
|
@deftypefunx int dsa_sha256_sign (const struct dsa_public_key *@var{pub}, const struct dsa_private_key *@var{key}, void *@var{random_ctx}, nettle_random_func @var{random}, struct sha256_ctx *@var{hash}, struct dsa_signature *@var{signature})
|
|
|
@deftypefunx int dsa_sha256_sign_digest (const struct dsa_public_key *@var{pub}, const struct dsa_private_key *@var{key}, void *@var{random_ctx}, nettle_random_func @var{random}, const uint8_t *@var{digest}, struct dsa_signature *@var{signature})
|
|
|
Creates a signature from the given hash context or digest.
|
|
|
@var{random_ctx} and @var{random} is a randomness generator.
|
|
|
@code{random(random_ctx, length, dst)} should generate @code{length}
|
|
|
random octets and store them at @code{dst}. For advice, see
|
|
|
@xref{Randomness}. Returns one on success, or zero on failure.
|
|
|
Signing fails if the key size and the hash size don't match.
|
|
|
@end deftypefun
|
|
|
|
|
|
Verifying signatures is a little easier, since no randomness generator is
|
|
|
needed. The functions are
|
|
|
|
|
|
@deftypefun int dsa_sha1_verify (const struct dsa_public_key *@var{key}, struct sha1_ctx *@var{hash}, const struct dsa_signature *@var{signature})
|
|
|
@deftypefunx int dsa_sha1_verify_digest (const struct dsa_public_key *@var{key}, const uint8_t *@var{digest}, const struct dsa_signature *@var{signature})
|
|
|
@deftypefunx int dsa_sha256_verify (const struct dsa_public_key *@var{key}, struct sha256_ctx *@var{hash}, const struct dsa_signature *@var{signature})
|
|
|
@deftypefunx int dsa_sha256_verify_digest (const struct dsa_public_key *@var{key}, const uint8_t *@var{digest}, const struct dsa_signature *@var{signature})
|
|
|
Verifies a signature. Returns 1 if the signature is valid, otherwise 0.
|
|
|
@end deftypefun
|
|
|
|
|
|
Key generation uses mostly the same parameters as the corresponding
|
|
|
@acronym{RSA} function.
|
|
|
|
|
|
@deftypefun int dsa_compat_generate_keypair (struct dsa_public_key *@var{pub}, struct dsa_private_key *@var{key}, void *@var{random_ctx}, nettle_random_func @var{random}, void *@var{progress_ctx}, nettle_progress_func @var{progress}, unsigned @var{p_bits}, unsigned @var{q_bits})
|
|
|
@var{pub} and @var{key} is where the resulting key pair is stored. The
|
|
|
structs should be initialized before you call this function.
|
|
|
|
|
|
@var{random_ctx} and @var{random} is a randomness generator.
|
|
|
@code{random(random_ctx, length, dst)} should generate @code{length}
|
|
|
random octets and store them at @code{dst}. For advice, see
|
|
|
@xref{Randomness}.
|
|
|
|
|
|
@var{progress} and @var{progress_ctx} can be used to get callbacks
|
|
|
during the key generation process, in order to uphold an illusion of
|
|
|
progress. @var{progress} can be NULL, in that case there are no
|
|
|
callbacks.
|
|
|
|
|
|
@var{p_bits} and @var{q_bits} are the desired sizes of @code{p} and
|
|
|
@code{q}. See @code{dsa_generate_keypair} for details.
|
|
|
@end deftypefun
|
|
|
|
|
|
@node Elliptic curves
|
|
|
@subsection Elliptic curves
|
|
|
|
|
|
For cryptographic purposes, an elliptic curve is a mathematical group of
|
|
|
points, and computing logarithms in this group is computationally
|
|
|
difficult problem. Nettle uses additive notation for elliptic curve
|
|
|
groups. If @math{P} and @math{Q} are two points, and @math{k} is an
|
|
|
integer, the point sum, @math{P + Q}, and the multiple @math{k P} can be
|
|
|
computed efficiently, but given only two points @math{P} and @math{Q},
|
|
|
finding an integer @math{k} such that @math{Q = k P} is the elliptic
|
|
|
curve discrete logarithm problem.
|
|
|
|
|
|
Nettle supports standard curves which are all of the form @math{y^2 =
|
|
|
x^3 - 3 x + b @pmod{p}}, i.e., the points have coordinates @math{(x,y)},
|
|
|
both considered as integers modulo a specified prime @math{p}. Curves
|
|
|
are represented as a @code{struct ecc_curve}. It also supports
|
|
|
curve25519, which uses a different form of curve. Supported curves are
|
|
|
declared in @file{<nettle/ecc-curve.h>}, e.g., call
|
|
|
@code{nettle_get_secp_256r1} for a standardized curve using the 256-bit
|
|
|
prime @math{p = 2^{256} - 2^{224} + 2^{192} + 2^{96} - 1}. The contents
|
|
|
of these structs is not visible to nettle users. The ``bitsize of the
|
|
|
curve'' is used as a shorthand for the bitsize of the curve's prime
|
|
|
@math{p}, e.g., 256 bits for the SECP 256R1 curve.
|
|
|
|
|
|
@menu
|
|
|
* Side-channel silence::
|
|
|
* ECDSA::
|
|
|
* GOSTDSA::
|
|
|
* Curve 25519 and Curve 448::
|
|
|
@end menu
|
|
|
|
|
|
@node Side-channel silence
|
|
|
@subsubsection Side-channel silence
|
|
|
@cindex Side-channel attack
|
|
|
|
|
|
Nettle's implementation of the elliptic curve operations is intended to
|
|
|
be side-channel silent. The side-channel attacks considered are:
|
|
|
|
|
|
@itemize
|
|
|
@item Timing attacks
|
|
|
If the timing of operations depends on secret values, an attacker
|
|
|
interacting with your system can measure the response time, and infer
|
|
|
information about your secrets, e.g., a private signature key.
|
|
|
|
|
|
@item Attacks using memory caches
|
|
|
Assume you have some secret data on a multi-user system, and that this
|
|
|
data is properly protected so that other users get no direct access to
|
|
|
it. If you have a process operating on the secret data, and this process
|
|
|
does memory accesses depending on the data, e.g, an internal lookup
|
|
|
table in some cryptographic algorithm, an attacker running a separate
|
|
|
process on the same system may use behavior of internal CPU caches to
|
|
|
get information about your secrets. This type of attack can even cross
|
|
|
virtual machine boundaries.
|
|
|
@end itemize
|
|
|
|
|
|
Nettle's ECC implementation is designed to be @dfn{side-channel silent},
|
|
|
and not leak any information to these attacks. Timing and memory
|
|
|
accesses depend only on the size of the input data and its location in
|
|
|
memory, not on the actual data bits. This implies a performance penalty
|
|
|
in several of the building blocks.
|
|
|
|
|
|
@node ECDSA
|
|
|
@subsubsection ECDSA
|
|
|
|
|
|
ECDSA is a variant of the DSA digital signature scheme (@pxref{DSA}),
|
|
|
which works over an elliptic curve group rather than over a (subgroup
|
|
|
of) integers modulo @math{p}. Like DSA, creating a signature requires a unique
|
|
|
random nonce (repeating the nonce with two different messages reveals
|
|
|
the private key, and any leak or bias in the generation of the nonce
|
|
|
also leaks information about the key).
|
|
|
|
|
|
Unlike DSA, signatures are in general not tied to any particular hash
|
|
|
function or even hash size. Any hash function can be used, and the hash
|
|
|
value is truncated or padded as needed to get a size matching the curve
|
|
|
being used. It is recommended to use a strong cryptographic hash
|
|
|
function with digest size close to the bit size of the curve, e.g.,
|
|
|
SHA256 is a reasonable choice when using ECDSA signature over the curve
|
|
|
secp256r1. A protocol or application using ECDSA has to specify which
|
|
|
curve and which hash function to use, or provide some mechanism for
|
|
|
negotiating.
|
|
|
|
|
|
Nettle defines ECDSA in @file{<nettle/ecdsa.h>}. We first need
|
|
|
to define the data types used to represent public and private keys.
|
|
|
|
|
|
@deftp {struct} {struct ecc_point}
|
|
|
Represents a point on an elliptic curve. In particular, it is used to
|
|
|
represent an ECDSA public key.
|
|
|
@end deftp
|
|
|
|
|
|
@deftypefun void ecc_point_init (struct ecc_point *@var{p}, const struct ecc_curve *@var{ecc})
|
|
|
Initializes @var{p} to represent points on the given curve @var{ecc}.
|
|
|
Allocates storage for the coordinates, using the same allocation
|
|
|
functions as GMP.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void ecc_point_clear (struct ecc_point *@var{p})
|
|
|
Deallocate storage allocated by previous ecc_point_init.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun int ecc_point_set (struct ecc_point *@var{p}, const mpz_t @var{x}, const mpz_t @var{y})
|
|
|
Check that the given coordinates represent a point on the curve. If so,
|
|
|
the coordinates are copied and converted to internal representation, and
|
|
|
the function returns 1. Otherwise, it returns 0. Currently, the
|
|
|
infinity point (or zero point, with additive notation) is not allowed.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void ecc_point_get (const struct ecc_point *@var{p}, mpz_t @var{x}, mpz_t @var{y})
|
|
|
Extracts the coordinate of the point @var{p}. The output parameters
|
|
|
@var{x} or @var{y} may be NULL if the caller doesn't want that
|
|
|
coordinate.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftp {struct} {struct ecc_scalar}
|
|
|
Represents an integer in the range @math{0 < x < group order}, where the
|
|
|
``group order'' refers to the order of an ECC group. In particular, it
|
|
|
is used to represent an ECDSA private key.
|
|
|
@end deftp
|
|
|
|
|
|
@deftypefun void ecc_scalar_init (struct ecc_scalar *@var{s}, const struct ecc_curve *@var{ecc})
|
|
|
Initializes @var{s} to represent a scalar suitable for the given curve
|
|
|
@var{ecc}. Allocates storage using the same allocation functions as GMP.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void ecc_scalar_clear (struct ecc_scalar *@var{s})
|
|
|
Deallocate the storage allocated by previous ecc_scalar_init.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun int ecc_scalar_set (struct ecc_scalar *@var{s}, const mpz_t @var{z})
|
|
|
Check that @var{z} is in the correct range. If so, copies the value to
|
|
|
@var{s} and returns 1, otherwise returns 0.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void ecc_scalar_get (const struct ecc_scalar *@var{s}, mpz_t @var{z})
|
|
|
Extracts the scalar, in GMP @code{mpz_t} representation.
|
|
|
@end deftypefun
|
|
|
|
|
|
To create and verify ECDSA signatures, the following functions are used.
|
|
|
|
|
|
@deftypefun void ecdsa_sign (const struct ecc_scalar *@var{key}, void *@var{random_ctx}, nettle_random_func *@var{random}, size_t @var{digest_length}, const uint8_t *@var{digest}, struct dsa_signature *@var{signature})
|
|
|
Uses the private key @var{key} to create a signature of @var{digest}.
|
|
|
@var{random_ctx} and @var{random} is a randomness generator.
|
|
|
@code{random(random_ctx, length, dst)} should generate @code{length}
|
|
|
random octets and store them at @code{dst}. The signature is stored in
|
|
|
@var{signature}, in the same way as for plain DSA.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun int ecdsa_verify (const struct ecc_point *@var{pub}, size_t @var{length}, const uint8_t *@var{digest}, const struct dsa_signature *@var{signature})
|
|
|
Uses the public key @var{pub} to verify that @var{signature} is a valid
|
|
|
signature for the message digest @var{digest} (of @var{length} octets).
|
|
|
Returns 1 if the signature is valid, otherwise 0.
|
|
|
@end deftypefun
|
|
|
|
|
|
Finally, generating a new ECDSA key pair:
|
|
|
|
|
|
@deftypefun void ecdsa_generate_keypair (struct ecc_point *@var{pub}, struct ecc_scalar *@var{key}, void *@var{random_ctx}, nettle_random_func *@var{random})
|
|
|
@var{pub} and @var{key} is where the resulting key pair is stored. The
|
|
|
structs should be initialized, for the desired ECC curve, before you call this function.
|
|
|
|
|
|
@var{random_ctx} and @var{random} is a randomness generator.
|
|
|
@code{random(random_ctx, length, dst)} should generate @code{length}
|
|
|
random octets and store them at @code{dst}. For advice, see
|
|
|
@xref{Randomness}.
|
|
|
@end deftypefun
|
|
|
|
|
|
@node GOSTDSA
|
|
|
@subsubsection GOSTDSA
|
|
|
@cindex GOST DSA
|
|
|
|
|
|
GOSTDSA (GOST R 34.10-2001, GOST R 34.10-2012) is a variant of the DSA
|
|
|
(@pxref{DSA}) and ECDSA (@pxref{ECDSA}) digital signature schemes, which works
|
|
|
over an elliptic curve group. Original documents are written in Russian.
|
|
|
English translations are provided in @cite{RFC 5832} and @cite{RFC 7091}.
|
|
|
While technically nothing stops one from using GOSTDSA over any curve, it
|
|
|
is defined only over several 256 and 512-bit curves. Like DSA and ECDSA,
|
|
|
creating a signature requires a unique random nonce (repeating the nonce
|
|
|
with two different messages reveals the private key, and any leak or bias
|
|
|
in the generation of the nonce also leaks information about the key).
|
|
|
|
|
|
GOST R 34.10-2001 was defined to use GOST R 34.11-94 hash function
|
|
|
(GOSTHASH94 and GOSTHASH94CP, @cite{RFC 5831}). GOST R 34.10-2012 is
|
|
|
defined to use GOST R 34.11-2012 hash function (Streebog, @cite{RFC
|
|
|
6986}) of corresponding size (256 or 512) depending on curve size.
|
|
|
|
|
|
Nettle defines GOSTDSA in @file{<nettle/gostdsa.h>}. GOSTDSA reuses ECDSA
|
|
|
data types (@code{struct ecc_point}, @code{struct ecc_scalar}) to
|
|
|
represent public and private keys. Also to generate a new GOSTDSA key
|
|
|
pair one has to use @code{ecdsa_generate_keypair()} function.
|
|
|
|
|
|
To create and verify GOSTDSA signatures, the following functions are used.
|
|
|
|
|
|
@deftypefun void gostdsa_sign (const struct ecc_scalar *@var{key}, void *@var{random_ctx}, nettle_random_func *@var{random}, size_t @var{digest_length}, const uint8_t *@var{digest}, struct dsa_signature *@var{signature})
|
|
|
Uses the private key @var{key} to create a signature of @var{digest}.
|
|
|
@var{random_ctx} and @var{random} is a randomness generator.
|
|
|
@code{random(random_ctx, length, dst)} should generate @code{length}
|
|
|
random octets and store them at @code{dst}. The signature is stored in
|
|
|
@var{signature}, in the same was as for plain DSA.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun int gostdsa_verify (const struct ecc_point *@var{pub}, size_t @var{length}, const uint8_t *@var{digest}, const struct dsa_signature *@var{signature})
|
|
|
Uses the public key @var{pub} to verify that @var{signature} is a valid
|
|
|
signature for the message digest @var{digest} (of @var{length} octets).
|
|
|
Returns 1 if the signature is valid, otherwise 0.
|
|
|
@end deftypefun
|
|
|
|
|
|
For historical reason several curve IDs (OIDs) may correspond to a single
|
|
|
curve/generator combination. Following list defines correspondence
|
|
|
between nettle's view on curves and actual identifiers defined in @cite{RFC
|
|
|
4357} and @cite{RFC 7836}.
|
|
|
|
|
|
@deftypefun {const struct ecc_curve} nettle_get_gost_gc256b (void)
|
|
|
Returns curve corresponding to following identifiers:
|
|
|
@itemize
|
|
|
@item id-GostR3410-2001-CryptoPro-A-ParamSet (@cite{RFC 4357})
|
|
|
@item id-GostR3410-2001-CryptoPro-XchA-ParamSet (@cite{RFC 4357})
|
|
|
@item id-tc26-gost-3410-12-256-paramSetB
|
|
|
@end itemize
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun {const struct ecc_curve} nettle_get_gost_gc512a (void)
|
|
|
Returns curve corresponding to following identifiers:
|
|
|
@itemize
|
|
|
@item id-tc26-gost-3410-12-512-paramSetA (@cite{RFC 7836})
|
|
|
@end itemize
|
|
|
@end deftypefun
|
|
|
|
|
|
For GOST key pairs key derivation/key agreement function (VKO) is defined in
|
|
|
@cite{RFC 4357} and @cite{RFC 7836}. Basically shared key is equal to
|
|
|
hash(cofactor * ukm * priv * pub). Nettle library provides a function that does
|
|
|
multiplication. Caller should do hashing on his own (it will be either
|
|
|
GOST R 34.11-94 (@pxref{GOSTHASH94CP}) or GOST R 34.11-2012, Streebog, which nor part of the library yet).
|
|
|
|
|
|
@deftypefun void gostdsa_vko (const struct ecc_scalar *@var{priv}, const struct ecc_point *@var{pub}, size_t @var{ukm_length}, const uint8_t *@var{ukm}, uint8_t *@var{out})
|
|
|
Uses private key @var{priv}, public ket @var{pub} and shared key material
|
|
|
@var{ukm} to generate shared secret, written to buffer @var{out}. The buffer
|
|
|
should be of the size equal to 2 private key lengths: 64 bytes for 256 bit
|
|
|
curves and 128 bytes for 512 bit ones. UKM is a shared key material, usually
|
|
|
transferred in cleartext. It does not have to be secret.
|
|
|
@end deftypefun
|
|
|
|
|
|
@node Curve 25519 and Curve 448
|
|
|
@subsubsection Curve25519 and Curve448
|
|
|
@cindex Curve 25519
|
|
|
@cindex Curve 448
|
|
|
|
|
|
@c FIXME: Make 2^255 pretty in all output formats. Use @sup?
|
|
|
@c There are other places too (2^32, 2^130).
|
|
|
|
|
|
Curve25519 is an elliptic curve of Montgomery type, @math{y^2 = x^3 +
|
|
|
486662 x^2 + x @pmod{p}}, with @math{p = 2^255 - 19}. Montgomery curves
|
|
|
have the advantage of simple and efficient point addition based on the
|
|
|
x-coordinate only. This particular curve was proposed by D. J. Bernstein
|
|
|
in 2006, for fast Diffie-Hellman key exchange, and is also described in
|
|
|
@cite{RFC 7748}. The group generator is defined by @math{x = 9} (there
|
|
|
are actually two points with @math{x = 9}, differing by the sign of the
|
|
|
y-coordinate, but that doesn't matter for the curve25519 operations
|
|
|
which work with the x-coordinate only).
|
|
|
|
|
|
The curve25519 functions are defined as operations on octet strings,
|
|
|
representing 255-bit scalars or x-coordinates, in little-endian byte
|
|
|
order. The most significant input bit, i.e, the most significant bit of
|
|
|
the last octet, is always ignored.
|
|
|
|
|
|
For scalars, in addition, the least significant three bits are ignored,
|
|
|
and treated as zero, and the second most significant bit is ignored too,
|
|
|
and treated as one. Then the scalar input string always represents 8
|
|
|
times a number in the range @math{2^251 <= s < 2^252}.
|
|
|
|
|
|
Of all the possible input strings, only about half correspond to
|
|
|
x-coordinates of points on curve25519, i.e., a value @math{x} for which
|
|
|
the the curve equation can be solved for @math{y}. The other half
|
|
|
correspond to points on a related ``twist curve''. The function
|
|
|
@code{curve25519_mul} uses a Montgomery ladder for the scalar
|
|
|
multiplication, as suggested in the curve25519 literature, and required
|
|
|
by @cite{RFC 7748}. The output is therefore well defined for
|
|
|
@emph{all} possible inputs, no matter if the input string represents a
|
|
|
valid point on the curve or not.
|
|
|
|
|
|
Note that the curve25519 implementation in earlier versions of Nettle
|
|
|
deviates slightly from @cite{RFC 7748}, in that bit 255 of the @math{x}
|
|
|
coordinate of the point input to curve25519_mul was not ignored. The
|
|
|
@file{nette/curve25519.h} defines a preprocessor symbol
|
|
|
@code{NETTLE_CURVE25519_RFC7748} to indicate conformance with the
|
|
|
standard.
|
|
|
|
|
|
Nettle defines Curve 25519 in @file{<nettle/curve25519.h>}.
|
|
|
|
|
|
@defvr Constant NETTLE_CURVE25519_RFC7748
|
|
|
Defined to 1 in Nettle versions conforming to RFC 7748. Undefined in
|
|
|
earlier versions.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant CURVE25519_SIZE
|
|
|
The size of the strings representing curve25519 points and scalars, 32.
|
|
|
@end defvr
|
|
|
|
|
|
@deftypefun void curve25519_mul_g (uint8_t *@var{q}, const uint8_t *@var{n})
|
|
|
Computes @math{Q = N G}, where @math{G} is the group generator and
|
|
|
@math{N} is an integer. The input argument @var{n} and the output
|
|
|
argument @var{q} use a little-endian representation of the scalar and
|
|
|
the x-coordinate, respectively. They are both of size
|
|
|
@code{CURVE25519_SIZE}.
|
|
|
|
|
|
This function is intended to be compatible with the function
|
|
|
@code{crypto_scalar_mult_base} in the NaCl library.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void curve25519_mul (uint8_t *@var{q}, const uint8_t *@var{n}, const uint8_t *@var{p})
|
|
|
Computes @math{Q = N P}, where @math{P} is an input point and @math{N}
|
|
|
is an integer. The input arguments @var{n} and @var{p} and the output
|
|
|
argument @var{q} use a little-endian representation of the scalar and
|
|
|
the x-coordinates, respectively. They are all of size
|
|
|
@code{CURVE25519_SIZE}.
|
|
|
|
|
|
This function is intended to be compatible with the function
|
|
|
@code{crypto_scalar_mult} in the NaCl library.
|
|
|
@end deftypefun
|
|
|
|
|
|
Similarly, Nettle also implements Curve448, an elliptic curve of
|
|
|
Montgomery type, @math{y^2 = x^3 + 156326 x^2 + x @pmod{p}}, with
|
|
|
@math{p = 2^448 - 2^224 - 1}. This particular curve was proposed by
|
|
|
Mike Hamburg in 2015, for fast Diffie-Hellman key exchange, and is also
|
|
|
described in @cite{RFC 7748}.
|
|
|
|
|
|
Nettle defines Curve 448 in @file{<nettle/curve448.h>}.
|
|
|
|
|
|
@defvr Constant CURVE448_SIZE
|
|
|
The octet length of the strings representing curve448 points and scalars, 56.
|
|
|
@end defvr
|
|
|
|
|
|
@deftypefun void curve448_mul_g (uint8_t *@var{q}, const uint8_t *@var{n})
|
|
|
Computes @math{Q = N G}, where @math{G} is the group generator and
|
|
|
@math{N} is an integer. The input argument @var{n} and the output
|
|
|
argument @var{q} use a little-endian representation of the scalar and
|
|
|
the x-coordinate, respectively. They are both of size
|
|
|
@code{CURVE448_SIZE}.
|
|
|
|
|
|
This function is intended to be compatible with the function
|
|
|
@code{crypto_scalar_mult_base} in the NaCl library.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void curve448_mul (uint8_t *@var{q}, const uint8_t *@var{n}, const uint8_t *@var{p})
|
|
|
Computes @math{Q = N P}, where @math{P} is an input point and @math{N}
|
|
|
is an integer. The input arguments @var{n} and @var{p} and the output
|
|
|
argument @var{q} use a little-endian representation of the scalar and
|
|
|
the x-coordinates, respectively. They are all of size
|
|
|
@code{CURVE448_SIZE}.
|
|
|
|
|
|
This function is intended to be compatible with the function
|
|
|
@code{crypto_scalar_mult} in the NaCl library.
|
|
|
@end deftypefun
|
|
|
|
|
|
@subsubsection EdDSA
|
|
|
@cindex eddsa
|
|
|
|
|
|
EdDSA is a signature scheme proposed by D. J. Bernstein et al. in 2011.
|
|
|
It is defined using a ``Twisted Edwards curve'', of the form @math{-x^2
|
|
|
+ y^2 = 1 + d x^2 y^2}. The specific signature scheme Ed25519 uses a
|
|
|
curve which is equivalent to curve25519: The two groups used differ only
|
|
|
by a simple change of coordinates, so that the discrete logarithm
|
|
|
problem is of equal difficulty in both groups.
|
|
|
|
|
|
Unlike other signature schemes in Nettle, the input to the EdDSA sign
|
|
|
and verify functions is the possibly large message itself, not a hash
|
|
|
digest. EdDSA is a variant of Schnorr signatures, where the message is
|
|
|
hashed together with other data during the signature process, providing
|
|
|
resilience to hash-collisions: A successful attack finding collisions in
|
|
|
the hash function does not automatically translate into an attack to
|
|
|
forge signatures. EdDSA also avoids the use of a randomness source by
|
|
|
generating the needed signature nonce from a hash of the private key and
|
|
|
the message, which means that the message is actually hashed twice when
|
|
|
creating a signature. If signing huge messages, it is possible to hash
|
|
|
the message first and pass the short message digest as input to the sign
|
|
|
and verify functions, however, the resilience to hash collision is then
|
|
|
lost.
|
|
|
|
|
|
@defvr Constant ED25519_KEY_SIZE
|
|
|
The size of a private or public Ed25519 key, 32 octets.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant ED25519_SIGNATURE_SIZE
|
|
|
The size of an Ed25519 signature, 64 octets.
|
|
|
@end defvr
|
|
|
|
|
|
@deftypefun void ed25519_sha512_public_key (uint8_t *@var{pub}, const uint8_t *@var{priv})
|
|
|
Computes the public key corresponding to the given private key. Both
|
|
|
input and output are of size @code{ED25519_KEY_SIZE}.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void ed25519_sha512_sign (const uint8_t *@var{pub}, const uint8_t *@var{priv}, size_t @var{length}, const uint8_t *@var{msg}, uint8_t *@var{signature})
|
|
|
Signs a message using the provided key pair.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun int ed25519_sha512_verify (const uint8_t *@var{pub}, size_t @var{length}, const uint8_t *@var{msg}, const uint8_t *@var{signature})
|
|
|
Verifies a message using the provided public key. Returns 1 if the
|
|
|
signature is valid, otherwise 0.
|
|
|
@end deftypefun
|
|
|
|
|
|
Nettle also provides Ed448, an EdDSA signature scheme based on an
|
|
|
Edwards curve equivalent to curve448.
|
|
|
|
|
|
@defvr Constant ED448_KEY_SIZE
|
|
|
The size of a private or public Ed448 key, 57 octets.
|
|
|
@end defvr
|
|
|
|
|
|
@defvr Constant ED448_SIGNATURE_SIZE
|
|
|
The size of an Ed448 signature, 114 octets.
|
|
|
@end defvr
|
|
|
|
|
|
@deftypefun void ed448_shake256_public_key (uint8_t *@var{pub}, const uint8_t *@var{priv})
|
|
|
Computes the public key corresponding to the given private key. Both
|
|
|
input and output are of size @code{ED448_KEY_SIZE}.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void ed448_shake256_sign (const uint8_t *@var{pub}, const uint8_t *@var{priv}, size_t @var{length}, const uint8_t *@var{msg}, uint8_t *@var{signature})
|
|
|
Signs a message using the provided key pair.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun int ed448_shake256_verify (const uint8_t *@var{pub}, size_t @var{length}, const uint8_t *@var{msg}, const uint8_t *@var{signature})
|
|
|
Verifies a message using the provided public key. Returns 1 if the
|
|
|
signature is valid, otherwise 0.
|
|
|
@end deftypefun
|
|
|
|
|
|
@node Randomness
|
|
|
@section Randomness
|
|
|
|
|
|
@cindex Randomness
|
|
|
|
|
|
A crucial ingredient in many cryptographic contexts is randomness: Let
|
|
|
@code{p} be a random prime, choose a random initialization vector
|
|
|
@code{iv}, a random key @code{k} and a random exponent @code{e}, etc. In
|
|
|
the theories, it is assumed that you have plenty of randomness around.
|
|
|
If this assumption is not true in practice, systems that are otherwise
|
|
|
perfectly secure, can be broken. Randomness has often turned out to be
|
|
|
the weakest link in the chain.
|
|
|
|
|
|
In non-cryptographic applications, such as games as well as scientific
|
|
|
simulation, a good randomness generator usually means a generator that
|
|
|
has good statistical properties, and is seeded by some simple function
|
|
|
of things like the current time, process id, and host name.
|
|
|
|
|
|
However, such a generator is inadequate for cryptography, for at least
|
|
|
two reasons:
|
|
|
|
|
|
|
|
|
@itemize
|
|
|
|
|
|
@item
|
|
|
It's too easy for an attacker to guess the initial seed. Even if it will
|
|
|
take some 2^32 tries before he guesses right, that's far too easy. For
|
|
|
example, if the process id is 16 bits, the resolution of ``current time''
|
|
|
is one second, and the attacker knows what day the generator was seeded,
|
|
|
there are only about 2^32 possibilities to try if all possible values
|
|
|
for the process id and time-of-day are tried.
|
|
|
|
|
|
@item
|
|
|
The generator output reveals too much. By observing only a small segment
|
|
|
of the generator's output, its internal state can be recovered, and from
|
|
|
there, all previous output and all future output can be computed by the
|
|
|
attacker.
|
|
|
@end itemize
|
|
|
|
|
|
A randomness generator that is used for cryptographic purposes must have
|
|
|
better properties. Let's first look at the seeding, as the issues here
|
|
|
are mostly independent of the rest of the generator. The initial state
|
|
|
of the generator (its seed) must be unguessable by the attacker. So
|
|
|
what's unguessable? It depends on what the attacker already knows. The
|
|
|
concept used in information theory to reason about such things is called
|
|
|
``entropy'', or ``conditional entropy'' (not to be confused with the
|
|
|
thermodynamic concept with the same name). A reasonable requirement is
|
|
|
that the seed contains a conditional entropy of at least some 80-100
|
|
|
bits. This property can be explained as follows: Allow the attacker to
|
|
|
ask @code{n} yes-no-questions, of his own choice, about the seed. If
|
|
|
the attacker, using this question-and-answer session, as well as any
|
|
|
other information he knows about the seeding process, still can't guess
|
|
|
the seed correctly, then the conditional entropy is more than @code{n}
|
|
|
bits.
|
|
|
|
|
|
@cindex Entropy
|
|
|
@cindex Conditional entropy
|
|
|
|
|
|
Let's look at an example. Say information about timing of received
|
|
|
network packets is used in the seeding process. If there is some random
|
|
|
network traffic going on, this will contribute some bits of entropy or
|
|
|
``unguessability'' to the seed. However, if the attacker can listen in to
|
|
|
the local network, or if all but a small number of the packets were
|
|
|
transmitted by machines that the attacker can monitor, this additional
|
|
|
information makes the seed easier for the attacker to figure out. Even
|
|
|
if the information is exactly the same, the conditional entropy, or
|
|
|
unguessability, is smaller for an attacker that knows some of it already
|
|
|
before the hypothetical question-and-answer session.
|
|
|
|
|
|
Seeding of good generators is usually based on several sources. The key
|
|
|
point here is that the amount of unguessability that each source
|
|
|
contributes, depends on who the attacker is. Some sources that have been
|
|
|
used are:
|
|
|
|
|
|
@table @asis
|
|
|
@item High resolution timing of i/o activities
|
|
|
Such as completed blocks from spinning hard disks, network packets, etc.
|
|
|
Getting access to such information is quite system dependent, and not
|
|
|
all systems include suitable hardware. If available, it's one of the
|
|
|
better randomness source one can find in a digital, mostly predictable,
|
|
|
computer.
|
|
|
|
|
|
@item User activity
|
|
|
Timing and contents of user interaction events is another popular source
|
|
|
that is available for interactive programs (even if I suspect that it is
|
|
|
sometimes used in order to make the user feel good, not because the
|
|
|
quality of the input is needed or used properly). Obviously, not
|
|
|
available when a machine is unattended. Also beware of networks: User
|
|
|
interaction that happens across a long serial cable, @acronym{TELNET}
|
|
|
session, or even @acronym{SSH} session may be visible to an attacker, in
|
|
|
full or partially.
|
|
|
|
|
|
@item Audio input
|
|
|
Any room, or even a microphone input that's left unconnected, is a
|
|
|
source of some random background noise, which can be fed into the
|
|
|
seeding process.
|
|
|
|
|
|
@item Specialized hardware
|
|
|
Hardware devices with the sole purpose of generating random data have
|
|
|
been designed. They range from radioactive samples with an attached
|
|
|
Geiger counter, to amplification of the inherent noise in electronic
|
|
|
components such as diodes and resistors, to low-frequency sampling of
|
|
|
chaotic systems. Hashing successive images of a Lava lamp is a
|
|
|
spectacular example of the latter type.
|
|
|
|
|
|
@item Secret information
|
|
|
Secret information, such as user passwords or keys, or private files
|
|
|
stored on disk, can provide some unguessability. A problem is that if
|
|
|
the information is revealed at a later time, the unguessability
|
|
|
vanishes. Another problem is that this kind of information tends to be
|
|
|
fairly constant, so if you rely on it and seed your generator regularly,
|
|
|
you risk constructing almost similar seeds or even constructing the same
|
|
|
seed more than once.
|
|
|
@end table
|
|
|
|
|
|
For all practical sources, it's difficult but important to provide a
|
|
|
reliable lower bound on the amount of unguessability that it provides.
|
|
|
Two important points are to make sure that the attacker can't observe
|
|
|
your sources (so if you like the Lava lamp idea, remember that you have
|
|
|
to get your own lamp, and not put it by a window or anywhere else where
|
|
|
strangers can see it), and that hardware failures are detected. What if
|
|
|
the bulb in the Lava lamp, which you keep locked into a cupboard
|
|
|
following the above advice, breaks after a few months?
|
|
|
|
|
|
So let's assume that we have been able to find an unguessable seed,
|
|
|
which contains at least 80 bits of conditional entropy, relative to all
|
|
|
attackers that we care about (typically, we must at the very least
|
|
|
assume that no attacker has root privileges on our machine).
|
|
|
|
|
|
How do we generate output from this seed, and how much can we get? Some
|
|
|
generators (notably the Linux @file{/dev/random} generator) tries to
|
|
|
estimate available entropy and restrict the amount of output. The goal
|
|
|
is that if you read 128 bits from @file{/dev/random}, you should get 128
|
|
|
``truly random'' bits. This is a property that is useful in some
|
|
|
specialized circumstances, for instance when generating key material for
|
|
|
a one time pad, or when working with unconditional blinding, but in most
|
|
|
cases, it doesn't matter much. For most application, there's no limit on
|
|
|
the amount of useful ``random'' data that we can generate from a small
|
|
|
seed; what matters is that the seed is unguessable and that the
|
|
|
generator has good cryptographic properties.
|
|
|
|
|
|
At the heart of all generators lies its internal state. Future output
|
|
|
is determined by the internal state alone. Let's call it the generator's
|
|
|
key. The key is initialized from the unguessable seed. Important
|
|
|
properties of a generator are:
|
|
|
|
|
|
@table @dfn
|
|
|
|
|
|
@item Key-hiding
|
|
|
An attacker observing the output should not be able to recover the
|
|
|
generator's key.
|
|
|
|
|
|
@item Independence of outputs
|
|
|
Observing some of the output should not help the attacker to guess
|
|
|
previous or future output.
|
|
|
|
|
|
@item Forward secrecy
|
|
|
Even if an attacker compromises the generator's key, he should not be
|
|
|
able to guess the generator output @emph{before} the key compromise.
|
|
|
|
|
|
@item Recovery from key compromise
|
|
|
If an attacker compromises the generator's key, he can compute
|
|
|
@emph{all} future output. This is inevitable if the generator is seeded
|
|
|
only once, at startup. However, the generator can provide a reseeding
|
|
|
mechanism, to achieve recovery from key compromise. More precisely: If
|
|
|
the attacker compromises the key at a particular time @code{t_1}, there
|
|
|
is another later time @code{t_2}, such that if the attacker observes all
|
|
|
output generated between @code{t_1} and @code{t_2}, he still can't guess
|
|
|
what output is generated after @code{t_2}.
|
|
|
|
|
|
@end table
|
|
|
|
|
|
Nettle includes one randomness generator that is believed to have all
|
|
|
the above properties, and two simpler ones.
|
|
|
|
|
|
@acronym{ChaCha} (@pxref{ChaCha}), like any stream cipher, can be used
|
|
|
as a randomness generator. Its output should be of reasonable
|
|
|
quality. There's no single natural way to reseed it, but if you need
|
|
|
reseeding, you should be using Yarrow instead. Historically ARCFOUR
|
|
|
(@pxref{Arcfour}) has been used as a randomness generator, however it is
|
|
|
known to be distinguishable from random data and the output leaks
|
|
|
information about the key.
|
|
|
|
|
|
The ``lagged Fibonacci'' generator in @file{<nettle/knuth-lfib.h>} is a
|
|
|
fast generator with good statistical properties, but is @strong{not} for
|
|
|
cryptographic use, and therefore not documented here. It is included
|
|
|
mostly because the Nettle test suite needs to generate some test data
|
|
|
from a small seed.
|
|
|
|
|
|
The recommended generator to use is Yarrow, described below.
|
|
|
|
|
|
@subsection Yarrow
|
|
|
|
|
|
Yarrow is a family of pseudo-randomness generators, designed for
|
|
|
cryptographic use, by John Kelsey, Bruce Schneier and Niels Ferguson.
|
|
|
Yarrow-160 is described in a paper at
|
|
|
@url{https://www.schneier.com/academic/yarrow/}, and it uses @acronym{SHA1}
|
|
|
and triple-DES, and has a 160-bit internal state. Nettle implements
|
|
|
Yarrow-256, which is similar, but uses @acronym{SHA256} and
|
|
|
@acronym{AES} to get an internal state of 256 bits.
|
|
|
|
|
|
Yarrow was an almost finished project, the paper mentioned above is the
|
|
|
closest thing to a specification for it, but some smaller details are
|
|
|
left out. There is no official reference implementation or test cases.
|
|
|
This section includes an overview of Yarrow, but for the details of
|
|
|
Yarrow-256, as implemented by Nettle, you have to consult the source
|
|
|
code. Maybe a complete specification can be written later.
|
|
|
|
|
|
Yarrow can use many sources (at least two are needed for proper
|
|
|
reseeding), and two randomness ``pools'', referred to as the ``slow pool'' and
|
|
|
the ``fast pool''. Input from the sources is fed alternatingly into the
|
|
|
two pools. When one of the sources has contributed 100 bits of entropy
|
|
|
to the fast pool, a ``fast reseed'' happens and the fast pool is mixed
|
|
|
into the internal state. When at least two of the sources have
|
|
|
contributed at least 160 bits each to the slow pool, a ``slow reseed''
|
|
|
takes place. The contents of both pools are mixed into the internal
|
|
|
state. These procedures should ensure that the generator will eventually
|
|
|
recover after a key compromise.
|
|
|
|
|
|
The output is generated by using @acronym{AES} to encrypt a counter,
|
|
|
using the generator's current key. After each request for output,
|
|
|
another 256 bits are generated which replace the key. This ensures
|
|
|
forward secrecy.
|
|
|
|
|
|
Yarrow can also use a @dfn{seed file} to save state across restarts.
|
|
|
Yarrow is seeded by either feeding it the contents of the previous seed
|
|
|
file, or feeding it input from its sources until a slow reseed happens.
|
|
|
|
|
|
Nettle defines Yarrow-256 in @file{<nettle/yarrow.h>}.
|
|
|
|
|
|
@deftp {Context struct} {struct yarrow256_ctx}
|
|
|
@end deftp
|
|
|
|
|
|
@deftp {Context struct} {struct yarrow_source}
|
|
|
Information about a single source.
|
|
|
@end deftp
|
|
|
|
|
|
@defvr Constant YARROW256_SEED_FILE_SIZE
|
|
|
Recommended size of the Yarrow-256 seed file.
|
|
|
@end defvr
|
|
|
|
|
|
@deftypefun void yarrow256_init (struct yarrow256_ctx *@var{ctx}, unsigned @var{nsources}, struct yarrow_source *@var{sources})
|
|
|
Initializes the yarrow context, and its @var{nsources} sources. It's
|
|
|
possible to call it with @var{nsources}=0 and @var{sources}=NULL, if
|
|
|
you don't need the update features.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void yarrow256_seed (struct yarrow256_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{seed_file})
|
|
|
Seeds Yarrow-256 from a previous seed file. @var{length} should be at least
|
|
|
@code{YARROW256_SEED_FILE_SIZE}, but it can be larger.
|
|
|
|
|
|
The generator will trust you that the @var{seed_file} data really is
|
|
|
unguessable. After calling this function, you @emph{must} overwrite the old
|
|
|
seed file with newly generated data from @code{yarrow256_random}. If it's
|
|
|
possible for several processes to read the seed file at about the same
|
|
|
time, access must be coordinated using some locking mechanism.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun int yarrow256_update (struct yarrow256_ctx *@var{ctx}, unsigned @var{source}, unsigned @var{entropy}, size_t @var{length}, const uint8_t *@var{data})
|
|
|
Updates the generator with data from source @var{SOURCE} (an index that
|
|
|
must be smaller than the number of sources). @var{entropy} is your
|
|
|
estimated lower bound for the entropy in the data, measured in bits.
|
|
|
Calling update with zero @var{entropy} is always safe, no matter if the
|
|
|
data is random or not.
|
|
|
|
|
|
Returns 1 if a reseed happened, in which case an application using a
|
|
|
seed file may want to generate new seed data with
|
|
|
@code{yarrow256_random} and overwrite the seed file. Otherwise, the
|
|
|
function returns 0.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void yarrow256_random (struct yarrow256_ctx *@var{ctx}, size_t @var{length}, uint8_t *@var{dst})
|
|
|
Generates @var{length} octets of output. The generator must be seeded
|
|
|
before you call this function.
|
|
|
|
|
|
If you don't need forward secrecy, e.g. if you need non-secret
|
|
|
randomness for initialization vectors or padding, you can gain some
|
|
|
efficiency by buffering, calling this function for reasonably large
|
|
|
blocks of data, say 100-1000 octets at a time.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun int yarrow256_is_seeded (struct yarrow256_ctx *@var{ctx})
|
|
|
Returns 1 if the generator is seeded and ready to generate output,
|
|
|
otherwise 0.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun unsigned yarrow256_needed_sources (struct yarrow256_ctx *@var{ctx})
|
|
|
Returns the number of sources that must reach the threshold before a
|
|
|
slow reseed will happen. Useful primarily when the generator is unseeded.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void yarrow256_fast_reseed (struct yarrow256_ctx *@var{ctx})
|
|
|
@deftypefunx void yarrow256_slow_reseed (struct yarrow256_ctx *@var{ctx})
|
|
|
Causes a fast or slow reseed to take place immediately, regardless of the
|
|
|
current entropy estimates of the two pools. Use with care.
|
|
|
@end deftypefun
|
|
|
|
|
|
Nettle includes an entropy estimator for one kind of input source: User
|
|
|
keyboard input.
|
|
|
|
|
|
@deftp {Context struct} {struct yarrow_key_event_ctx}
|
|
|
Information about recent key events.
|
|
|
@end deftp
|
|
|
|
|
|
@deftypefun void yarrow_key_event_init (struct yarrow_key_event_ctx *@var{ctx})
|
|
|
Initializes the context.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun unsigned yarrow_key_event_estimate (struct yarrow_key_event_ctx *@var{ctx}, unsigned @var{key}, unsigned @var{time})
|
|
|
@var{key} is the id of the key (ASCII value, hardware key code, X
|
|
|
keysym, @dots{}, it doesn't matter), and @var{time} is the timestamp of
|
|
|
the event. The time must be given in units matching the resolution by
|
|
|
which you read the clock. If you read the clock with microsecond
|
|
|
precision, @var{time} should be provided in units of microseconds. But
|
|
|
if you use @code{gettimeofday} on a typical Unix system where the clock
|
|
|
ticks 10 or so microseconds at a time, @var{time} should be given in
|
|
|
units of 10 microseconds.
|
|
|
|
|
|
Returns an entropy estimate, in bits, suitable for calling
|
|
|
@code{yarrow256_update}. Usually, 0, 1 or 2 bits.
|
|
|
@end deftypefun
|
|
|
|
|
|
@subsection DRBG-CTR
|
|
|
|
|
|
The Deterministic Random Bit Generator (DRBG) family is a complex family
|
|
|
of deterministic randomness generators published by NIST in SP 800-90A.
|
|
|
|
|
|
We support what we believe is the reasonable parts of the CTR_DRBG
|
|
|
algorithm for AES256. Re-seeding, personalization strings, derivation
|
|
|
functions and support for non-AES256 is not implemented.
|
|
|
Personalization strings can be implemented by the caller, if desired,
|
|
|
with xor. If you need re-seeding or entropy derivation, we suggest that
|
|
|
you use Yarrow instead.
|
|
|
|
|
|
The security bounds of DRBG-CTR are not intuitive, see ``Security Bounds
|
|
|
for the NIST Codebook-based Deterministic Random Bit Generator'' by
|
|
|
Matthew J. Campagna, from @url{https://eprint.iacr.org/2006/379.pdf}.
|
|
|
|
|
|
Our suggested use-case for DRBG-CTR is to deterministically generate
|
|
|
known values from a seed when comparing against expected values for some
|
|
|
other algorithm.
|
|
|
|
|
|
Nettle defines DRBG-CTR in @file{<nettle/drbg-ctr.h>}.
|
|
|
|
|
|
@deftp {Context struct} {struct drbg_ctr_aes256_ctx}
|
|
|
@end deftp
|
|
|
|
|
|
@defvr Constant DRBG_CTR_AES256_SEED_SIZE
|
|
|
The size of the seeding material.
|
|
|
@end defvr
|
|
|
|
|
|
@deftypefun void drbg_ctr_aes256_init (struct drbg_ctr_aes256_ctx *@var{ctx}, uint8_t *@var{seed_material})
|
|
|
Initialize the DRBG-CTR-AES256 context using
|
|
|
@code{DRBG_CTR_AES256_SEED_SIZE} bytes of @var{seed_material}.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun void drbg_ctr_aes256_random (struct drbg_ctr_aes256_ctx *@var{ctx}, size_t n, uint8_t *@var{dst})
|
|
|
Generates @var{n} octets of output into @var{dst}. The generator must
|
|
|
be initialized before you call this function.
|
|
|
@end deftypefun
|
|
|
|
|
|
@node ASCII encoding
|
|
|
@section ASCII encoding
|
|
|
|
|
|
Encryption will transform your data from text into binary format, and that
|
|
|
may be a problem if, for example, you want to send the data as if it was
|
|
|
plain text in an email, or store it along with descriptive text in a
|
|
|
file. You may then use an encoding from binary to text: each binary byte
|
|
|
is translated into a number of bytes of plain text.
|
|
|
|
|
|
A base-N encoding of data is one representation of data that only uses N
|
|
|
different symbols (instead of the 256 possible values of a byte).
|
|
|
|
|
|
The base64 encoding will always use alphanumeric (upper and lower case)
|
|
|
characters and the '+', '/' and '=' symbols to represent the data. Four
|
|
|
output characters are generated for each three bytes of input. In case
|
|
|
the length of the input is not a multiple of three, padding characters
|
|
|
are added at the end. There's also a ``URL safe'' variant, which is
|
|
|
useful for encoding binary data into URLs and filenames. See @cite{RFC
|
|
|
4648}.
|
|
|
|
|
|
The base16 encoding, also known as ``hexadecimal'', uses the decimal
|
|
|
digits and the letters from A to F. Two hexadecimal digits are generated
|
|
|
for each input byte.
|
|
|
|
|
|
Nettle supports both base64 and base16 encoding and decoding.
|
|
|
|
|
|
Encoding and decoding uses a context struct to maintain its state (with
|
|
|
the exception of base16 encoding, which doesn't need any). To encode or
|
|
|
decode the data, first initialize the context, then call the update
|
|
|
function as many times as necessary, and complete the operation by
|
|
|
calling the final function.
|
|
|
|
|
|
The following functions can be used to perform base64 encoding and decoding.
|
|
|
They are defined in @file{<nettle/base64.h>}.
|
|
|
|
|
|
@deftp {Context struct} {struct base64_encode_ctx}
|
|
|
@end deftp
|
|
|
|
|
|
@deftypefun {void} base64_encode_init (struct base64_encode_ctx *@var{ctx})
|
|
|
@deftypefunx {void} base64url_encode_init (struct base64_encode_ctx *@var{ctx})
|
|
|
Initializes a base64 context. This is necessary before starting an
|
|
|
encoding session. @code{base64_encode_init} selects the standard base64
|
|
|
alphabet, while @code{base64url_encode_init} selects the URL safe
|
|
|
alphabet.
|
|
|
@end deftypefun
|
|
|
|
|
|
|
|
|
@deftypefun {size_t} base64_encode_single (struct base64_encode_ctx *@var{ctx}, uint8_t *@var{dst}, uint8_t @var{src})
|
|
|
Encodes a single byte. Returns amount of output (always 1 or 2).
|
|
|
@end deftypefun
|
|
|
|
|
|
@deffn Macro BASE64_ENCODE_LENGTH (@var{length})
|
|
|
The maximum number of output bytes when passing @var{length} input bytes
|
|
|
to @code{base64_encode_update}.
|
|
|
@end deffn
|
|
|
|
|
|
@deftypefun {size_t} base64_encode_update (struct base64_encode_ctx *@var{ctx}, uint8_t *@var{dst}, size_t @var{length}, const uint8_t *@var{src})
|
|
|
After @var{ctx} is initialized, this function may be called to encode @var{length}
|
|
|
bytes from @var{src}. The result will be placed in @var{dst}, and the return value
|
|
|
will be the number of bytes generated. Note that @var{dst} must be at least of size
|
|
|
BASE64_ENCODE_LENGTH(@var{length}).
|
|
|
@end deftypefun
|
|
|
|
|
|
@defvr Constant BASE64_ENCODE_FINAL_LENGTH
|
|
|
The maximum amount of output from @code{base64_encode_final}.
|
|
|
@end defvr
|
|
|
|
|
|
@deftypefun {size_t} base64_encode_final (struct base64_encode_ctx *@var{ctx}, uint8_t *@var{dst})
|
|
|
After calling base64_encode_update one or more times, this function
|
|
|
should be called to generate the final output bytes, including any
|
|
|
needed paddding. The return value is the number of output bytes
|
|
|
generated.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftp {Context struct} {struct base64_decode_ctx}
|
|
|
@end deftp
|
|
|
|
|
|
@deftypefun {void} base64_decode_init (struct base64_decode_ctx *@var{ctx})
|
|
|
@deftypefunx {void} base64url_decode_init (struct base64_decode_ctx *@var{ctx})
|
|
|
Initializes a base64 decoding context. This is necessary before starting
|
|
|
a decoding session. @code{base64_decode_init} selects the standard
|
|
|
base64 alphabet, while @code{base64url_decode_init} selects the URL safe
|
|
|
alphabet.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun {int} base64_decode_single (struct base64_decode_ctx *@var{ctx}, uint8_t *@var{dst}, uint8_t @var{src})
|
|
|
Decodes a single byte (@var{src}) and stores the result in @var{dst}.
|
|
|
Returns amount of output (0 or 1), or -1 on errors.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deffn Macro BASE64_DECODE_LENGTH (@var{length})
|
|
|
The maximum number of output bytes when passing @var{length} input bytes
|
|
|
to @code{base64_decode_update}.
|
|
|
@end deffn
|
|
|
|
|
|
@deftypefun {void} base64_decode_update (struct base64_decode_ctx *@var{ctx}, size_t *@var{dst_length}, uint8_t *@var{dst}, size_t @var{src_length}, const uint8_t *@var{src})
|
|
|
After @var{ctx} is initialized, this function may be called to decode
|
|
|
@var{src_length} bytes from @var{src}. @var{dst} should point to an area
|
|
|
of size at least BASE64_DECODE_LENGTH(@var{src_length}). The amount of data
|
|
|
generated is returned in *@var{dst_length}. Returns 1 on success
|
|
|
and 0 on error.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun {int} base64_decode_final (struct base64_decode_ctx *@var{ctx})
|
|
|
Check that final padding is correct. Returns 1 on success, and 0 on
|
|
|
error.
|
|
|
@end deftypefun
|
|
|
|
|
|
Similarly to the base64 functions, the following functions perform base16 encoding,
|
|
|
and are defined in @file{<nettle/base16.h>}. Note that there is no encoding context
|
|
|
necessary for doing base16 encoding.
|
|
|
|
|
|
@deftypefun {void} base16_encode_single (uint8_t *@var{dst}, uint8_t @var{src})
|
|
|
Encodes a single byte. Always stores two digits in @var{dst}[0] and @var{dst}[1].
|
|
|
@end deftypefun
|
|
|
|
|
|
@deffn Macro BASE16_ENCODE_LENGTH (@var{length})
|
|
|
The number of output bytes when passing @var{length} input bytes to
|
|
|
@code{base16_encode_update}.
|
|
|
@end deffn
|
|
|
|
|
|
@deftypefun {void} base16_encode_update (uint8_t *@var{dst}, size_t @var{length}, const uint8_t *@var{src})
|
|
|
Always stores BASE16_ENCODE_LENGTH(@var{length}) digits in @var{dst}.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftp {Context struct} {struct base16_decode_ctx}
|
|
|
@end deftp
|
|
|
|
|
|
@deftypefun {void} base16_decode_init (struct base16_decode_ctx *@var{ctx})
|
|
|
Initializes a base16 decoding context. This is necessary before starting a decoding
|
|
|
session.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun {int} base16_decode_single (struct base16_decode_ctx *@var{ctx}, uint8_t *@var{dst}, uint8_t @var{src})
|
|
|
Decodes a single byte from @var{src} into @var{dst}. Returns amount of output (0 or 1), or -1 on errors.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deffn Macro BASE16_DECODE_LENGTH (@var{length})
|
|
|
The maximum number of output bytes when passing @var{length} input bytes
|
|
|
to @code{base16_decode_update}.
|
|
|
@end deffn
|
|
|
|
|
|
@deftypefun {int} base16_decode_update (struct base16_decode_ctx *@var{ctx}, size_t *@var{dst_length}, uint8_t *@var{dst}, size_t @var{src_length}, const uint8_t *@var{src})
|
|
|
After @var{ctx} is initialized, this function may be called to decode
|
|
|
@var{src_length} bytes from @var{src}. @var{dst} should point to an area
|
|
|
of size at least BASE16_DECODE_LENGTH(@var{src_length}). The amount of data
|
|
|
generated is returned in *@var{dst_length}. Returns 1 on success
|
|
|
and 0 on error.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun {int} base16_decode_final (struct base16_decode_ctx *@var{ctx})
|
|
|
Checks that the end of data is correct (i.e., an even number of
|
|
|
hexadecimal digits have been seen). Returns 1 on success, and 0 on
|
|
|
error.
|
|
|
@end deftypefun
|
|
|
|
|
|
@node Miscellaneous functions
|
|
|
@section Miscellaneous functions
|
|
|
|
|
|
@deftypefun {void *} memxor (void *@var{dst}, const void *@var{src}, size_t @var{n})
|
|
|
XORs the source area on top of the destination area. The interface
|
|
|
doesn't follow the Nettle conventions, because it is intended to be
|
|
|
similar to the ANSI-C @code{memcpy} function.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun {void *} memxor3 (void *@var{dst}, const void *@var{a}, const void *@var{b}, size_t @var{n})
|
|
|
Like @code{memxor}, but takes two source areas and separate
|
|
|
destination area.
|
|
|
@end deftypefun
|
|
|
|
|
|
@deftypefun int memeql_sec (const void *@var{a}, const void *@var{b}, size_t @var{n})
|
|
|
Side-channel silent comparison of the @var{n} bytes at @var{a} and
|
|
|
@var{b}. I.e., instructions executed and memory accesses are identical
|
|
|
no matter where the areas differ, @pxref{Side-channel silence}. Return
|
|
|
non-zero if the areas are equal, and zero if they differ.
|
|
|
@end deftypefun
|
|
|
|
|
|
These functions are declared in @file{<nettle/memops.h>}. For
|
|
|
compatibility with earlier versions of Nettle, @code{memxor} and
|
|
|
@code{memxor3} are also declared in @file{<nettle/memxor.h>}.
|
|
|
|
|
|
@node Compatibility functions
|
|
|
@section Compatibility functions
|
|
|
|
|
|
For convenience, Nettle includes alternative interfaces to some
|
|
|
algorithms, for compatibility with some other popular crypto toolkits.
|
|
|
These are not fully documented here; refer to the source or to the
|
|
|
documentation for the original implementation.
|
|
|
|
|
|
MD5 is defined in [RFC 1321], which includes a reference implementation.
|
|
|
Nettle defines a compatible interface to MD5 in
|
|
|
@file{<nettle/md5-compat.h>}. This file defines the typedef
|
|
|
@code{MD5_CTX}, and declares the functions @code{MD5Init}, @code{MD5Update} and
|
|
|
@code{MD5Final}.
|
|
|
|
|
|
@node Nettle soup
|
|
|
@chapter Traditional Nettle Soup
|
|
|
For the serious nettle hacker, here is a recipe for nettle soup. 4 servings.
|
|
|
|
|
|
@itemize @w{}
|
|
|
@item
|
|
|
1 liter fresh nettles (urtica dioica)
|
|
|
@item
|
|
|
2 tablespoons butter
|
|
|
@item
|
|
|
3 tablespoons flour
|
|
|
@item
|
|
|
1 liter stock (meat or vegetable)
|
|
|
@item
|
|
|
1/2 teaspoon salt
|
|
|
@item
|
|
|
a tad white pepper
|
|
|
@item
|
|
|
some cream or milk
|
|
|
@end itemize
|
|
|
|
|
|
Gather 1 liter fresh nettles. Use gloves! Small, tender shoots are
|
|
|
preferable but the tops of larger nettles can also be used.
|
|
|
|
|
|
Rinse the nettles very well. Boil them for 10 minutes in lightly salted
|
|
|
water. Strain the nettles and save the water. Hack the nettles. Melt the
|
|
|
butter and mix in the flour. Dilute with stock and the nettle-water you
|
|
|
saved earlier. Add the hacked nettles. If you wish you can add some milk
|
|
|
or cream at this stage. Bring to a boil and let boil for a few minutes.
|
|
|
Season with salt and pepper.
|
|
|
|
|
|
Serve with boiled egg-halves.
|
|
|
|
|
|
@c And the original Swedish version.
|
|
|
@ignore
|
|
|
|
|
|
Recept på nässelsoppa
|
|
|
4 portioner
|
|
|
|
|
|
1 l färska nässlor
|
|
|
2 msk smör
|
|
|
3 msk vetemjöl
|
|
|
1 l kött- eller grönsaksbuljong
|
|
|
1/2 tsk salt
|
|
|
1-2 krm peppar
|
|
|
(lite grädde eller mjölk)
|
|
|
|
|
|
Plocka 1 liter färska nässlor. Använd handskar! Helst små och späda
|
|
|
skott, men topparna av större nässlor går också bra.
|
|
|
|
|
|
Skölj nässlorna väl. Förväll dem ca 10 minuter i lätt saltat vatten.
|
|
|
Häll av och spara spadet. Hacka nässlorna. Smält smöret, rör i mjöl och
|
|
|
späd med buljong och nässelspad. Lägg i de hackade nässlorna. Om så
|
|
|
önskas, häll i en skvätt mjölk eller grädde. Koka några minuter, och
|
|
|
smaksätt med salt och peppar.
|
|
|
|
|
|
Servera med kokta ägghalvor.
|
|
|
@end ignore
|
|
|
|
|
|
@node Installation
|
|
|
@chapter Installation
|
|
|
|
|
|
Nettle uses @command{autoconf}. To build it, unpack the source and run
|
|
|
|
|
|
@example
|
|
|
./configure
|
|
|
make
|
|
|
make check
|
|
|
make install
|
|
|
@end example
|
|
|
|
|
|
@noindent
|
|
|
to install it under the default prefix, @file{/usr/local}. Using GNU
|
|
|
make is strongly recommended. By default, both static and shared
|
|
|
libraries are built and installed.
|
|
|
|
|
|
To get a list of configure options, use @code{./configure --help}. Some
|
|
|
of the more interesting are:
|
|
|
|
|
|
@table @option
|
|
|
@item --enable-fat
|
|
|
Include multiple versions of certain functions in the library, and
|
|
|
select the ones to use at run-time, depending on available processor
|
|
|
features. Supported for ARM and x86_64.
|
|
|
|
|
|
@item --enable-mini-gmp
|
|
|
Use the smaller and slower ``mini-gmp'' implementation of the bignum
|
|
|
functions needed for public-key cryptography, instead of the real GNU
|
|
|
GMP library. This option is intended primarily for smaller embedded
|
|
|
systems. Note that builds using mini-gmp are @strong{not} binary compatible
|
|
|
with regular builds of Nettle, and more likely to leak side-channel
|
|
|
information.
|
|
|
|
|
|
@item --disable-shared
|
|
|
Omit building the shared libraries.
|
|
|
|
|
|
@item --disable-dependency-tracking
|
|
|
Disable the automatic dependency tracking. You will likely need this
|
|
|
option to be able to build with BSD make.
|
|
|
|
|
|
@end table
|
|
|
|
|
|
@node Index
|
|
|
@unnumbered Function and Concept Index
|
|
|
|
|
|
@printindex cp
|
|
|
|
|
|
@bye
|
|
|
|
|
|
Local Variables:
|
|
|
ispell-local-dictionary: "american"
|
|
|
End:
|
|
|
|
|
|
@c LocalWords: cryptographics crypto LSH GNUPG API GPL LGPL aes rijndael ller
|
|
|
@c LocalWords: Sevilla arcfour RC Niels Dassen Colin Kuchling Biham sha Ruud
|
|
|
@c LocalWords: Gutmann twofish de Rooij struct MB Rivest RFC Nettle's ECB CBC
|
|
|
@c LocalWords: RSA Daemen Rijnmen Schneier DES's ede structs oddnesses HMAC
|
|
|
@c LocalWords: NIST Alice's GMP bignum Diffie Adi Shamir Adleman Euclid's ASN
|
|
|
@c LocalWords: PKCS callbacks Young's urtica dioica autoconf SSH tad
|
|
|
@c LocalWords: unguessability reseeding reseed alternatingly keysym subkeys
|
|
|
@c LocalWords: DSA gmp FIPS DSS libdes OpenSSL ARCTWO Josefsson Nikos Andreas
|
|
|
@c LocalWords: Mavroyanopoulos Sigfridsson Comstedt interoperability Sparc IC
|
|
|
@c LocalWords: DES FIXME Rivest's plaintext ciphertext CTR XORed timestamp
|
|
|
@c LocalWords: XORs cryptologists libnettle libhogweed GCM ECDSA NTT
|
|
|
@c LocalWords: toolkits BLOWFISH Möller RIPEMD libgcrypt PBKDF Shishi
|
|
|
@c LocalWords: GnuTLS Gutmann's GOSTHASH GOST Aleksey Kravchenko ECC
|
|
|
@c LocalWords: rhash Mavrogiannopoulos Keccak Bertoni
|
|
|
@c LocalWords: Michaël Peeters Assche Dobbertin Antoon Bosselaers KDF
|
|
|
@c LocalWords: Preneel rôle McGrew Viega KDFs PBKDFs passphrase PRF
|
|
|
@c LocalWords: th deallocate pre bitsize multi lookup secp startup
|
|
|
@c LocalWords: typedef typedef
|