Full Code of rweather/noise-c for AI

master cfe25410979a cached
296 files
9.3 MB
2.5M tokens
1815 symbols
1 requests
Download .txt
Showing preview only (9,845K chars total). Download the full file or copy to clipboard to get everything.
Repository: rweather/noise-c
Branch: master
Commit: cfe25410979a
Files: 296
Total size: 9.3 MB

Directory structure:
gitextract_kqrwds77/

├── .gitignore
├── AUTHORS
├── COPYING
├── ChangeLog
├── Makefile.am
├── NEWS
├── README
├── README.md
├── autogen.sh
├── configure.ac
├── doc/
│   ├── .gitignore
│   ├── Doxyfile
│   ├── Makefile.am
│   ├── buffer.dox
│   ├── cert-key-format.dox
│   ├── constants.dox
│   ├── example-echo.dox
│   ├── mainpage.dox
│   ├── noise-certificate.dox
│   └── noise-certificate.proto
├── examples/
│   ├── Makefile.am
│   └── echo/
│       └── Makefile.am
├── include/
│   ├── Makefile.am
│   └── noise/
│       ├── Makefile.am
│       ├── keys/
│       │   ├── Makefile.am
│       │   ├── certificate.h
│       │   └── loader.h
│       ├── keys.h
│       ├── protobufs.h
│       ├── protocol/
│       │   ├── Makefile.am
│       │   ├── buffer.h
│       │   ├── cipherstate.h
│       │   ├── constants.h
│       │   ├── dhstate.h
│       │   ├── errors.h
│       │   ├── handshakestate.h
│       │   ├── hashstate.h
│       │   ├── names.h
│       │   ├── randstate.h
│       │   ├── signstate.h
│       │   ├── symmetricstate.h
│       │   └── util.h
│       └── protocol.h
├── m4/
│   ├── ax_pthread.m4
│   └── pkg.m4
├── src/
│   ├── Makefile.am
│   ├── backend/
│   │   ├── openssl/
│   │   │   └── cipher-aesgcm.c
│   │   ├── ref/
│   │   │   ├── cipher-aesgcm.c
│   │   │   ├── cipher-chachapoly.c
│   │   │   ├── dh-curve25519.c
│   │   │   ├── dh-curve448.c
│   │   │   ├── dh-newhope.c
│   │   │   ├── hash-blake2b.c
│   │   │   ├── hash-blake2s.c
│   │   │   ├── hash-sha256.c
│   │   │   ├── hash-sha512.c
│   │   │   └── sign-ed25519.c
│   │   └── sodium/
│   │       ├── cipher-aesgcm.c
│   │       ├── cipher-chachapoly.c
│   │       ├── dh-curve25519.c
│   │       ├── hash-blake2b.c
│   │       ├── hash-sha256.c
│   │       ├── hash-sha512.c
│   │       └── sign-ed25519.c
│   ├── crypto/
│   │   ├── README
│   │   ├── aes/
│   │   │   ├── rijndael-alg-fst.c
│   │   │   └── rijndael-alg-fst.h
│   │   ├── blake2/
│   │   │   ├── blake2-endian.h
│   │   │   ├── blake2b.c
│   │   │   ├── blake2b.h
│   │   │   ├── blake2s.c
│   │   │   └── blake2s.h
│   │   ├── chacha/
│   │   │   ├── chacha.c
│   │   │   └── chacha.h
│   │   ├── curve448/
│   │   │   ├── curve448.c
│   │   │   └── curve448.h
│   │   ├── donna/
│   │   │   ├── curve25519-donna-c64.c
│   │   │   ├── curve25519-donna.c
│   │   │   ├── poly1305-donna-16.h
│   │   │   ├── poly1305-donna-32.h
│   │   │   ├── poly1305-donna-64.h
│   │   │   ├── poly1305-donna-8.h
│   │   │   ├── poly1305-donna.c
│   │   │   └── poly1305-donna.h
│   │   ├── ed25519/
│   │   │   ├── README.md
│   │   │   ├── curve25519-donna-32bit.h
│   │   │   ├── curve25519-donna-64bit.h
│   │   │   ├── curve25519-donna-helpers.h
│   │   │   ├── curve25519-donna-sse2.h
│   │   │   ├── ed25519-donna-32bit-sse2.h
│   │   │   ├── ed25519-donna-32bit-tables.h
│   │   │   ├── ed25519-donna-64bit-sse2.h
│   │   │   ├── ed25519-donna-64bit-tables.h
│   │   │   ├── ed25519-donna-64bit-x86-32bit.h
│   │   │   ├── ed25519-donna-64bit-x86.h
│   │   │   ├── ed25519-donna-basepoint-table.h
│   │   │   ├── ed25519-donna-batchverify.h
│   │   │   ├── ed25519-donna-impl-base.h
│   │   │   ├── ed25519-donna-impl-sse2.h
│   │   │   ├── ed25519-donna-portable-identify.h
│   │   │   ├── ed25519-donna-portable.h
│   │   │   ├── ed25519-donna.h
│   │   │   ├── ed25519-hash-custom.h
│   │   │   ├── ed25519-hash.h
│   │   │   ├── ed25519-randombytes-custom.h
│   │   │   ├── ed25519-randombytes.h
│   │   │   ├── ed25519.c
│   │   │   ├── ed25519.h
│   │   │   ├── fuzz/
│   │   │   │   ├── README.md
│   │   │   │   ├── build-nix.php
│   │   │   │   ├── curve25519-ref10.c
│   │   │   │   ├── curve25519-ref10.h
│   │   │   │   ├── ed25519-donna-sse2.c
│   │   │   │   ├── ed25519-donna.c
│   │   │   │   ├── ed25519-donna.h
│   │   │   │   ├── ed25519-ref10.c
│   │   │   │   ├── ed25519-ref10.h
│   │   │   │   ├── fuzz-curve25519.c
│   │   │   │   └── fuzz-ed25519.c
│   │   │   ├── modm-donna-32bit.h
│   │   │   ├── modm-donna-64bit.h
│   │   │   ├── regression.h
│   │   │   ├── test-internals.c
│   │   │   ├── test-ticks.h
│   │   │   └── test.c
│   │   ├── ghash/
│   │   │   ├── ghash.c
│   │   │   └── ghash.h
│   │   ├── goldilocks/
│   │   │   ├── Doxyfile
│   │   │   ├── HISTORY.txt
│   │   │   ├── LICENSE.txt
│   │   │   ├── README.txt
│   │   │   ├── TODO.txt
│   │   │   ├── include/
│   │   │   │   ├── goldilocks.h
│   │   │   │   └── ridinghood.h
│   │   │   ├── src/
│   │   │   │   ├── arithmetic.c
│   │   │   │   ├── barrett_field.c
│   │   │   │   ├── bat/
│   │   │   │   │   ├── api_dh.h
│   │   │   │   │   ├── api_sign.h
│   │   │   │   │   ├── dh.c
│   │   │   │   │   └── sign.c
│   │   │   │   ├── crandom.c
│   │   │   │   ├── ec_point.c
│   │   │   │   ├── goldilocks.c
│   │   │   │   ├── include/
│   │   │   │   │   ├── barrett_field.h
│   │   │   │   │   ├── constant_time.h
│   │   │   │   │   ├── crandom.h
│   │   │   │   │   ├── ec_point.h
│   │   │   │   │   ├── field.h
│   │   │   │   │   ├── intrinsics.h
│   │   │   │   │   ├── magic.h
│   │   │   │   │   ├── scalarmul.h
│   │   │   │   │   ├── sha512.h
│   │   │   │   │   └── word.h
│   │   │   │   ├── p448/
│   │   │   │   │   ├── arch_32/
│   │   │   │   │   │   ├── arch_config.h
│   │   │   │   │   │   ├── p448.c
│   │   │   │   │   │   └── p448.h
│   │   │   │   │   ├── arch_arm_32/
│   │   │   │   │   │   ├── arch_config.h
│   │   │   │   │   │   ├── p448.c
│   │   │   │   │   │   └── p448.h
│   │   │   │   │   ├── arch_neon_experimental/
│   │   │   │   │   │   ├── arch_config.h
│   │   │   │   │   │   ├── p448.c
│   │   │   │   │   │   └── p448.h
│   │   │   │   │   ├── arch_ref64/
│   │   │   │   │   │   ├── arch_config.h
│   │   │   │   │   │   ├── p448.c
│   │   │   │   │   │   └── p448.h
│   │   │   │   │   ├── arch_x86_64/
│   │   │   │   │   │   ├── arch_config.h
│   │   │   │   │   │   ├── p448.c
│   │   │   │   │   │   ├── p448.h
│   │   │   │   │   │   └── x86-64-arith.h
│   │   │   │   │   ├── f_arithmetic.c
│   │   │   │   │   ├── f_field.h
│   │   │   │   │   ├── f_magic.h
│   │   │   │   │   └── magic.c
│   │   │   │   ├── p480/
│   │   │   │   │   ├── arch_x86_64/
│   │   │   │   │   │   ├── arch_config.h
│   │   │   │   │   │   ├── p480.c
│   │   │   │   │   │   ├── p480.h
│   │   │   │   │   │   └── x86-64-arith.h
│   │   │   │   │   ├── f_arithmetic.c
│   │   │   │   │   ├── f_field.h
│   │   │   │   │   ├── f_magic.h
│   │   │   │   │   └── magic.c
│   │   │   │   ├── p521/
│   │   │   │   │   ├── arch_ref64/
│   │   │   │   │   │   ├── arch_config.h
│   │   │   │   │   │   ├── p521.c
│   │   │   │   │   │   └── p521.h
│   │   │   │   │   ├── arch_x86_64_r12/
│   │   │   │   │   │   ├── arch_config.h
│   │   │   │   │   │   ├── p521.c
│   │   │   │   │   │   └── p521.h
│   │   │   │   │   ├── f_arithmetic.c
│   │   │   │   │   ├── f_field.h
│   │   │   │   │   ├── f_magic.h
│   │   │   │   │   └── magic.c
│   │   │   │   ├── scalarmul.c
│   │   │   │   └── sha512.c
│   │   │   └── test/
│   │   │       ├── bench.c
│   │   │       ├── test.c
│   │   │       ├── test.h
│   │   │       ├── test_arithmetic.c
│   │   │       ├── test_goldilocks.c
│   │   │       ├── test_pointops.c
│   │   │       ├── test_scalarmul.c
│   │   │       └── test_sha512.c
│   │   ├── newhope/
│   │   │   ├── LICENSE
│   │   │   ├── batcher.c
│   │   │   ├── batcher.h
│   │   │   ├── cpucycles.c
│   │   │   ├── cpucycles.h
│   │   │   ├── crypto_stream_chacha20.c
│   │   │   ├── crypto_stream_chacha20.h
│   │   │   ├── error_correction.c
│   │   │   ├── error_correction.h
│   │   │   ├── fips202.c
│   │   │   ├── fips202.h
│   │   │   ├── newhope.c
│   │   │   ├── newhope.h
│   │   │   ├── ntt.c
│   │   │   ├── ntt.h
│   │   │   ├── params.h
│   │   │   ├── poly.c
│   │   │   ├── poly.h
│   │   │   ├── precomp.c
│   │   │   ├── randombytes.c
│   │   │   ├── randombytes.h
│   │   │   ├── reduce.c
│   │   │   └── reduce.h
│   │   └── sha2/
│   │       ├── sha256.c
│   │       ├── sha256.h
│   │       ├── sha512.c
│   │       └── sha512.h
│   ├── keys/
│   │   ├── Makefile.am
│   │   ├── certificate.c
│   │   └── loader.c
│   ├── protobufs/
│   │   ├── Makefile.am
│   │   └── protobufs.c
│   └── protocol/
│       ├── Makefile.am
│       ├── cipherstate.c
│       ├── dhstate.c
│       ├── errors.c
│       ├── handshakestate.c
│       ├── hashstate.c
│       ├── internal.c
│       ├── internal.h
│       ├── names.c
│       ├── patterns.c
│       ├── rand_os.c
│       ├── rand_sodium.c
│       ├── randstate.c
│       ├── signstate.c
│       ├── symmetricstate.c
│       └── util.c
├── tests/
│   ├── Makefile.am
│   ├── performance/
│   │   ├── .gitignore
│   │   ├── Makefile.am
│   │   ├── md5.c
│   │   ├── md5.h
│   │   └── test-performance.c
│   ├── unit/
│   │   ├── .gitignore
│   │   ├── Makefile.am
│   │   ├── test-cipherstate.c
│   │   ├── test-dhstate.c
│   │   ├── test-errors.c
│   │   ├── test-handshakestate.c
│   │   ├── test-hashstate.c
│   │   ├── test-helpers.h
│   │   ├── test-main.c
│   │   ├── test-names.c
│   │   ├── test-patterns.c
│   │   ├── test-protobufs.c
│   │   ├── test-randstate.c
│   │   ├── test-signstate.c
│   │   └── test-symmetricstate.c
│   └── vector/
│       ├── .gitignore
│       ├── Makefile.am
│       ├── cacophony.txt
│       ├── json-reader.c
│       ├── json-reader.h
│       ├── noise-c-basic.txt
│       ├── noise-c-fallback.txt
│       ├── noise-c-hybrid.txt
│       └── test-vector.c
└── tools/
    ├── Makefile.am
    ├── keytool/
    │   ├── .gitignore
    │   ├── Makefile.am
    │   ├── generate.c
    │   ├── keytool.c
    │   ├── keytool.h
    │   ├── show.c
    │   └── sign.c
    └── protoc/
        ├── .gitignore
        ├── Makefile.am
        ├── main.c
        ├── proto3-ast.c
        ├── proto3-ast.h
        ├── proto3-generate-c.c
        ├── proto3-grammar.y
        ├── proto3-lexer.l
        └── test.proto

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
*.o
*.a
.depend
.*.swp
aclocal.m4
autom4te.cache
configure
Makefile.in
Makefile
.deps
config.*
INSTALL
compile
depcomp
install-sh
missing
test-driver
.dirstamp
ylwrap


================================================
FILE: AUTHORS
================================================
Rhys Weatherley <rhys.weatherley@gmail.com>
Eli Fidler <efidler@topologyinc.com>


================================================
FILE: COPYING
================================================
Copyright (C) 2016 Southern Storm Software, Pty Ltd.

Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.


================================================
FILE: ChangeLog
================================================


================================================
FILE: Makefile.am
================================================

SUBDIRS = include src tools tests examples doc

EXTRA_DIST = README.md

docs:
	(cd $(srcdir)/doc; $(DOXYGEN))


================================================
FILE: NEWS
================================================


================================================
FILE: README
================================================

See README.md


================================================
FILE: README.md
================================================

Noise-C Library
===============

Noise-C is a plain C implementation of the
[Noise Protocol](http://noiseprotocol.org), intended as a
reference implementation.  It can also be referred to as "Noisy",
which is what you get when you say "Noise-C" too fast.  The code is
distributed under the terms of the MIT license.

The [documentation](http://rweather.github.io/noise-c/index.html)
contains more information on the library, examples, and how to build it.

For more information on this library, to report bugs, to contribute,
or to suggest improvements, please contact the author Rhys Weatherley via
[email](mailto:rhys.weatherley@gmail.com).


================================================
FILE: autogen.sh
================================================
#! /bin/sh

if [ -x "`which autoreconf 2>/dev/null`" ] ; then
  exec autoreconf -ivf
fi

if glibtoolize --version > /dev/null 2>&1; then
  LIBTOOLIZE='glibtoolize'
else
  LIBTOOLIZE='libtoolize'
fi

$LIBTOOLIZE && \
aclocal && \
automake --add-missing --force-missing --include-deps && \
autoconf


================================================
FILE: configure.ac
================================================

AC_INIT([noise-c], [0.0.1])
AM_INIT_AUTOMAKE
AC_CONFIG_MACRO_DIR([m4])

AC_PROG_CC
AC_PROG_CC_STDC
AC_PROG_RANLIB
AC_PROG_LEX
AC_PROG_YACC
AC_PATH_PROG(DOXYGEN, doxygen)

dnl Determine the default Ed448-Goldilocks architecture to use.
AC_CHECK_DECL([__x86_64__])
AC_CHECK_SIZEOF(void *)
if test "x$ac_cv_have_decl___x86_64__" = "xyes" ; then
    ED448_DEFAULT_ARCH=arch_x86_64
else
    if test "x$ac_cv_sizeof_void_p" = "x8" ; then
        ED448_DEFAULT_ARCH=arch_ref64
    else
        ED448_DEFAULT_ARCH=arch_32
    fi
fi

AC_ARG_WITH([ed448-arch],
    [AS_HELP_STRING([--with-ed448-arch=ARCH],
                    [specify the Ed448-Goldilocks architecture])],
    [],
    [with_ed448_arch=${ED448_DEFAULT_ARCH}])

AC_CHECK_LIB(rt, clock_gettime)

dnl Try to detect winsock2 on mingw32/64 systems.
AC_CHECK_LIB(ws2_32, [_head_libws2_32_a])
AC_CHECK_LIB(ws2_32, [_head_lib32_libws2_32_a])
AC_CHECK_LIB(ws2_32, [_head_lib64_libws2_32_a])

AC_CHECK_FUNCS([poll])

AX_PTHREAD([LIBS="$PTHREAD_LIBS $LIBS"
    CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
    CC="$PTHREAD_CC"],[])

AC_SUBST([WARNING_FLAGS],[-Wall])
AC_SUBST([GOLDILOCKS_ARCH],[$with_ed448_arch])

AC_CONFIG_FILES([Makefile
include/Makefile
include/noise/Makefile
include/noise/protocol/Makefile
include/noise/keys/Makefile
src/Makefile
src/protocol/Makefile
src/protobufs/Makefile
src/keys/Makefile
tests/Makefile
tests/unit/Makefile
tests/vector/Makefile
tests/vector-gen/Makefile
tests/performance/Makefile
tools/Makefile
tools/keytool/Makefile
tools/protoc/Makefile
examples/Makefile
examples/echo/Makefile
examples/echo/echo-client/Makefile
examples/echo/echo-keygen/Makefile
examples/echo/echo-server/Makefile
doc/Makefile])

AC_ARG_WITH([libsodium],
  [AS_HELP_STRING([--with-libsodium],
    [use libsodium for crypto @<:@default=check@:>@])],
  [],
  [with_libsodium=no])
AC_ARG_WITH([openssl],
  [AS_HELP_STRING([--with-openssl],
    [use openssl for crypto @<:@default=check@:>@])],
  [],
  [with_openssl=no])

PKG_PROG_PKG_CONFIG
AS_IF([test -n "$PKG_CONFIG"], [
  AS_CASE(["$with_libsodium"],
    [yes], [PKG_CHECK_MODULES_STATIC([libsodium], [libsodium], [HAVE_LIBSODIUM=1])],
    [no], [HAVE_LIBSODIUM=0],
    [PKG_CHECK_MODULES_STATIC([libsodium], [libsodium], [HAVE_LIBSODIUM=1], [HAVE_LIBSODIUM=0])])
  AM_CONDITIONAL([USE_LIBSODIUM], [test "$with_libsodium" != no -a "$HAVE_LIBSODIUM" -eq 1])

  AS_CASE(["$with_openssl"],
    [yes], [PKG_CHECK_MODULES_STATIC([openssl], [openssl], [HAVE_OPENSSL=1])],
    [no], [HAVE_OPENSSL=0],
    [PKG_CHECK_MODULES_STATIC([openssl], [openssl], [HAVE_OPENSSL=1], [HAVE_OPENSSL=0])])
  AM_CONDITIONAL([USE_OPENSSL], [test "$with_openssl" != no -a "$HAVE_OPENSSL" -eq 1])
], [
  AC_MSG_WARN([Can't find pkg-config. Using built-in reference crypto backend.])
  AM_CONDITIONAL([USE_LIBSODIUM],[false])
  AM_CONDITIONAL([USE_OPENSSL],[false])
])

AC_ARG_ENABLE(asan, AC_HELP_STRING([--enable-asan],
			[Compile with Address Sanitizer]), [
	if (test "${enableval}" = "yes"); then
		CFLAGS="$CFLAGS -fsanitize=address";
		LDFLAGS="$LDFLAGS -fsanitize=address"
	fi
])

AC_ARG_ENABLE(ubsan, AC_HELP_STRING([--enable-ubsan],
			[Compile with Undefined Behavior Sanitizer]), [
	if (test "${enableval}" = "yes"); then
		CFLAGS="$CFLAGS -fsanitize=undefined";
		LDFLAGS="$LDFLAGS -fsanitize=undefined"
	fi
])

AC_OUTPUT


================================================
FILE: doc/.gitignore
================================================
html


================================================
FILE: doc/Doxyfile
================================================
# Doxyfile 1.8.6

# This file describes the settings to be used by the documentation system
# doxygen (www.doxygen.org) for a project.
#
# All text after a double hash (##) is considered a comment and is placed in
# front of the TAG it is preceding.
#
# All text after a single hash (#) is considered a comment and will be ignored.
# The format is:
# TAG = value [value, ...]
# For lists, items can also be appended using:
# TAG += value [value, ...]
# Values that contain spaces should be placed between quotes (\" \").

#---------------------------------------------------------------------------
# Project related configuration options
#---------------------------------------------------------------------------

# This tag specifies the encoding used for all characters in the config file
# that follow. The default is UTF-8 which is also the encoding used for all text
# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
# for the list of possible encodings.
# The default value is: UTF-8.

DOXYFILE_ENCODING      = UTF-8

# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
# double-quotes, unless you are using Doxywizard) that should identify the
# project for which the documentation is generated. This name is used in the
# title of most generated pages and in a few other places.
# The default value is: My Project.

PROJECT_NAME           = "Noise-C"

# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
# could be handy for archiving the generated documentation or if some version
# control system is used.

PROJECT_NUMBER         =

# Using the PROJECT_BRIEF tag one can provide an optional one line description
# for a project that appears at the top of each page and should give viewer a
# quick idea about the purpose of the project. Keep the description short.

PROJECT_BRIEF          =

# With the PROJECT_LOGO tag one can specify an logo or icon that is included in
# the documentation. The maximum height of the logo should not exceed 55 pixels
# and the maximum width should not exceed 200 pixels. Doxygen will copy the logo
# to the output directory.

PROJECT_LOGO           =

# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
# into which the generated documentation will be written. If a relative path is
# entered, it will be relative to the location where doxygen was started. If
# left blank the current directory will be used.

OUTPUT_DIRECTORY       = .

# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub-
# directories (in 2 levels) under the output directory of each output format and
# will distribute the generated files over these directories. Enabling this
# option can be useful when feeding doxygen a huge amount of source files, where
# putting all generated files in the same directory would otherwise causes
# performance problems for the file system.
# The default value is: NO.

CREATE_SUBDIRS         = NO

# The OUTPUT_LANGUAGE tag is used to specify the language in which all
# documentation generated by doxygen is written. Doxygen will use this
# information to generate all constant output in the proper language.
# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
# Ukrainian and Vietnamese.
# The default value is: English.

OUTPUT_LANGUAGE        = English

# If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member
# descriptions after the members that are listed in the file and class
# documentation (similar to Javadoc). Set to NO to disable this.
# The default value is: YES.

BRIEF_MEMBER_DESC      = YES

# If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief
# description of a member or function before the detailed description
#
# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
# brief descriptions will be completely suppressed.
# The default value is: YES.

REPEAT_BRIEF           = YES

# This tag implements a quasi-intelligent brief description abbreviator that is
# used to form the text in various listings. Each string in this list, if found
# as the leading text of the brief description, will be stripped from the text
# and the result, after processing the whole list, is used as the annotated
# text. Otherwise, the brief description is used as-is. If left blank, the
# following values are used ($name is automatically replaced with the name of
# the entity):The $name class, The $name widget, The $name file, is, provides,
# specifies, contains, represents, a, an and the.

ABBREVIATE_BRIEF       =

# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
# doxygen will generate a detailed section even if there is only a brief
# description.
# The default value is: NO.

ALWAYS_DETAILED_SEC    = NO

# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
# inherited members of a class in the documentation of that class as if those
# members were ordinary class members. Constructors, destructors and assignment
# operators of the base classes will not be shown.
# The default value is: NO.

INLINE_INHERITED_MEMB  = NO

# If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path
# before files name in the file list and in the header files. If set to NO the
# shortest path that makes the file name unique will be used
# The default value is: YES.

FULL_PATH_NAMES        = NO

# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
# Stripping is only done if one of the specified strings matches the left-hand
# part of the path. The tag can be used to show relative paths in the file list.
# If left blank the directory from which doxygen is run is used as the path to
# strip.
#
# Note that you can specify absolute paths here, but also relative paths, which
# will be relative from the directory where doxygen is started.
# This tag requires that the tag FULL_PATH_NAMES is set to YES.

STRIP_FROM_PATH        =

# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
# path mentioned in the documentation of a class, which tells the reader which
# header file to include in order to use a class. If left blank only the name of
# the header file containing the class definition is used. Otherwise one should
# specify the list of include paths that are normally passed to the compiler
# using the -I flag.

STRIP_FROM_INC_PATH    =

# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
# less readable) file names. This can be useful is your file systems doesn't
# support long names like on DOS, Mac, or CD-ROM.
# The default value is: NO.

SHORT_NAMES            = NO

# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
# first line (until the first dot) of a Javadoc-style comment as the brief
# description. If set to NO, the Javadoc-style will behave just like regular Qt-
# style comments (thus requiring an explicit @brief command for a brief
# description.)
# The default value is: NO.

JAVADOC_AUTOBRIEF      = NO

# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
# line (until the first dot) of a Qt-style comment as the brief description. If
# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
# requiring an explicit \brief command for a brief description.)
# The default value is: NO.

QT_AUTOBRIEF           = NO

# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
# a brief description. This used to be the default behavior. The new default is
# to treat a multi-line C++ comment block as a detailed description. Set this
# tag to YES if you prefer the old behavior instead.
#
# Note that setting this tag to YES also means that rational rose comments are
# not recognized any more.
# The default value is: NO.

MULTILINE_CPP_IS_BRIEF = NO

# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
# documentation from any documented member that it re-implements.
# The default value is: YES.

INHERIT_DOCS           = YES

# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a
# new page for each member. If set to NO, the documentation of a member will be
# part of the file/class/namespace that contains it.
# The default value is: NO.

SEPARATE_MEMBER_PAGES  = NO

# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
# uses this value to replace tabs by spaces in code fragments.
# Minimum value: 1, maximum value: 16, default value: 4.

TAB_SIZE               = 4

# This tag can be used to specify a number of aliases that act as commands in
# the documentation. An alias has the form:
# name=value
# For example adding
# "sideeffect=@par Side Effects:\n"
# will allow you to put the command \sideeffect (or @sideeffect) in the
# documentation, which will result in a user-defined paragraph with heading
# "Side Effects:". You can put \n's in the value part of an alias to insert
# newlines.

ALIASES                =

# This tag can be used to specify a number of word-keyword mappings (TCL only).
# A mapping has the form "name=value". For example adding "class=itcl::class"
# will allow you to use the command class in the itcl::class meaning.

TCL_SUBST              =

# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
# only. Doxygen will then generate output that is more tailored for C. For
# instance, some of the names that are used will be different. The list of all
# members will be omitted, etc.
# The default value is: NO.

OPTIMIZE_OUTPUT_FOR_C  = YES

# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
# Python sources only. Doxygen will then generate output that is more tailored
# for that language. For instance, namespaces will be presented as packages,
# qualified scopes will look different, etc.
# The default value is: NO.

OPTIMIZE_OUTPUT_JAVA   = NO

# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
# sources. Doxygen will then generate output that is tailored for Fortran.
# The default value is: NO.

OPTIMIZE_FOR_FORTRAN   = NO

# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
# sources. Doxygen will then generate output that is tailored for VHDL.
# The default value is: NO.

OPTIMIZE_OUTPUT_VHDL   = NO

# Doxygen selects the parser to use depending on the extension of the files it
# parses. With this tag you can assign which parser to use for a given
# extension. Doxygen has a built-in mapping, but you can override or extend it
# using this tag. The format is ext=language, where ext is a file extension, and
# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
# C#, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL. For instance to make
# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C
# (default is Fortran), use: inc=Fortran f=C.
#
# Note For files without extension you can use no_extension as a placeholder.
#
# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
# the files are not read by doxygen.

EXTENSION_MAPPING      =

# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
# according to the Markdown format, which allows for more readable
# documentation. See http://daringfireball.net/projects/markdown/ for details.
# The output of markdown processing is further processed by doxygen, so you can
# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
# case of backward compatibilities issues.
# The default value is: YES.

MARKDOWN_SUPPORT       = YES

# When enabled doxygen tries to link words that correspond to documented
# classes, or namespaces to their corresponding documentation. Such a link can
# be prevented in individual cases by by putting a % sign in front of the word
# or globally by setting AUTOLINK_SUPPORT to NO.
# The default value is: YES.

AUTOLINK_SUPPORT       = YES

# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
# to include (a tag file for) the STL sources as input, then you should set this
# tag to YES in order to let doxygen match functions declarations and
# definitions whose arguments contain STL classes (e.g. func(std::string);
# versus func(std::string) {}). This also make the inheritance and collaboration
# diagrams that involve STL classes more complete and accurate.
# The default value is: NO.

BUILTIN_STL_SUPPORT    = NO

# If you use Microsoft's C++/CLI language, you should set this option to YES to
# enable parsing support.
# The default value is: NO.

CPP_CLI_SUPPORT        = NO

# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
# will parse them like normal C++ but will assume all classes use public instead
# of private inheritance when no explicit protection keyword is present.
# The default value is: NO.

SIP_SUPPORT            = NO

# For Microsoft's IDL there are propget and propput attributes to indicate
# getter and setter methods for a property. Setting this option to YES will make
# doxygen to replace the get and set methods by a property in the documentation.
# This will only work if the methods are indeed getting or setting a simple
# type. If this is not the case, or you want to show the methods anyway, you
# should set this option to NO.
# The default value is: YES.

IDL_PROPERTY_SUPPORT   = YES

# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
# tag is set to YES, then doxygen will reuse the documentation of the first
# member in the group (if any) for the other members of the group. By default
# all members of a group must be documented explicitly.
# The default value is: NO.

DISTRIBUTE_GROUP_DOC   = NO

# Set the SUBGROUPING tag to YES to allow class member groups of the same type
# (for instance a group of public functions) to be put as a subgroup of that
# type (e.g. under the Public Functions section). Set it to NO to prevent
# subgrouping. Alternatively, this can be done per class using the
# \nosubgrouping command.
# The default value is: YES.

SUBGROUPING            = YES

# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
# are shown inside the group in which they are included (e.g. using \ingroup)
# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
# and RTF).
#
# Note that this feature does not work in combination with
# SEPARATE_MEMBER_PAGES.
# The default value is: NO.

INLINE_GROUPED_CLASSES = NO

# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
# with only public data fields or simple typedef fields will be shown inline in
# the documentation of the scope in which they are defined (i.e. file,
# namespace, or group documentation), provided this scope is documented. If set
# to NO, structs, classes, and unions are shown on a separate page (for HTML and
# Man pages) or section (for LaTeX and RTF).
# The default value is: NO.

INLINE_SIMPLE_STRUCTS  = YES

# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
# enum is documented as struct, union, or enum with the name of the typedef. So
# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
# with name TypeT. When disabled the typedef will appear as a member of a file,
# namespace, or class. And the struct will be named TypeS. This can typically be
# useful for C code in case the coding convention dictates that all compound
# types are typedef'ed and only the typedef is referenced, never the tag name.
# The default value is: NO.

TYPEDEF_HIDES_STRUCT   = NO

# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
# cache is used to resolve symbols given their name and scope. Since this can be
# an expensive process and often the same symbol appears multiple times in the
# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
# doxygen will become slower. If the cache is too large, memory is wasted. The
# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
# symbols. At the end of a run doxygen will report the cache usage and suggest
# the optimal cache size from a speed point of view.
# Minimum value: 0, maximum value: 9, default value: 0.

LOOKUP_CACHE_SIZE      = 0

#---------------------------------------------------------------------------
# Build related configuration options
#---------------------------------------------------------------------------

# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
# documentation are documented, even if no documentation was available. Private
# class members and static file members will be hidden unless the
# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
# Note: This will also disable the warnings about undocumented members that are
# normally produced when WARNINGS is set to YES.
# The default value is: NO.

EXTRACT_ALL            = YES

# If the EXTRACT_PRIVATE tag is set to YES all private members of a class will
# be included in the documentation.
# The default value is: NO.

EXTRACT_PRIVATE        = NO

# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal
# scope will be included in the documentation.
# The default value is: NO.

EXTRACT_PACKAGE        = NO

# If the EXTRACT_STATIC tag is set to YES all static members of a file will be
# included in the documentation.
# The default value is: NO.

EXTRACT_STATIC         = NO

# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined
# locally in source files will be included in the documentation. If set to NO
# only classes defined in header files are included. Does not have any effect
# for Java sources.
# The default value is: YES.

EXTRACT_LOCAL_CLASSES  = YES

# This flag is only useful for Objective-C code. When set to YES local methods,
# which are defined in the implementation section but not in the interface are
# included in the documentation. If set to NO only methods in the interface are
# included.
# The default value is: NO.

EXTRACT_LOCAL_METHODS  = NO

# If this flag is set to YES, the members of anonymous namespaces will be
# extracted and appear in the documentation as a namespace called
# 'anonymous_namespace{file}', where file will be replaced with the base name of
# the file that contains the anonymous namespace. By default anonymous namespace
# are hidden.
# The default value is: NO.

EXTRACT_ANON_NSPACES   = NO

# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
# undocumented members inside documented classes or files. If set to NO these
# members will be included in the various overviews, but no documentation
# section is generated. This option has no effect if EXTRACT_ALL is enabled.
# The default value is: NO.

HIDE_UNDOC_MEMBERS     = NO

# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
# undocumented classes that are normally visible in the class hierarchy. If set
# to NO these classes will be included in the various overviews. This option has
# no effect if EXTRACT_ALL is enabled.
# The default value is: NO.

HIDE_UNDOC_CLASSES     = NO

# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
# (class|struct|union) declarations. If set to NO these declarations will be
# included in the documentation.
# The default value is: NO.

HIDE_FRIEND_COMPOUNDS  = NO

# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
# documentation blocks found inside the body of a function. If set to NO these
# blocks will be appended to the function's detailed documentation block.
# The default value is: NO.

HIDE_IN_BODY_DOCS      = NO

# The INTERNAL_DOCS tag determines if documentation that is typed after a
# \internal command is included. If the tag is set to NO then the documentation
# will be excluded. Set it to YES to include the internal documentation.
# The default value is: NO.

INTERNAL_DOCS          = NO

# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
# names in lower-case letters. If set to YES upper-case letters are also
# allowed. This is useful if you have classes or files whose names only differ
# in case and if your file system supports case sensitive file names. Windows
# and Mac users are advised to set this option to NO.
# The default value is: system dependent.

CASE_SENSE_NAMES       = YES

# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
# their full class and namespace scopes in the documentation. If set to YES the
# scope will be hidden.
# The default value is: NO.

HIDE_SCOPE_NAMES       = NO

# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
# the files that are included by a file in the documentation of that file.
# The default value is: YES.

SHOW_INCLUDE_FILES     = YES

# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
# grouped member an include statement to the documentation, telling the reader
# which file to include in order to use the member.
# The default value is: NO.

SHOW_GROUPED_MEMB_INC  = NO

# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
# files with double quotes in the documentation rather than with sharp brackets.
# The default value is: NO.

FORCE_LOCAL_INCLUDES   = NO

# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
# documentation for inline members.
# The default value is: YES.

INLINE_INFO            = YES

# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
# (detailed) documentation of file and class members alphabetically by member
# name. If set to NO the members will appear in declaration order.
# The default value is: YES.

SORT_MEMBER_DOCS       = YES

# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
# descriptions of file, namespace and class members alphabetically by member
# name. If set to NO the members will appear in declaration order. Note that
# this will also influence the order of the classes in the class list.
# The default value is: NO.

SORT_BRIEF_DOCS        = YES

# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
# (brief and detailed) documentation of class members so that constructors and
# destructors are listed first. If set to NO the constructors will appear in the
# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
# member documentation.
# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
# detailed member documentation.
# The default value is: NO.

SORT_MEMBERS_CTORS_1ST = NO

# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
# of group names into alphabetical order. If set to NO the group names will
# appear in their defined order.
# The default value is: NO.

SORT_GROUP_NAMES       = NO

# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
# fully-qualified names, including namespaces. If set to NO, the class list will
# be sorted only by class name, not including the namespace part.
# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
# Note: This option applies only to the class list, not to the alphabetical
# list.
# The default value is: NO.

SORT_BY_SCOPE_NAME     = NO

# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
# type resolution of all parameters of a function it will reject a match between
# the prototype and the implementation of a member function even if there is
# only one candidate or it is obvious which candidate to choose by doing a
# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
# accept a match between prototype and implementation in such cases.
# The default value is: NO.

STRICT_PROTO_MATCHING  = NO

# The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the
# todo list. This list is created by putting \todo commands in the
# documentation.
# The default value is: YES.

GENERATE_TODOLIST      = YES

# The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the
# test list. This list is created by putting \test commands in the
# documentation.
# The default value is: YES.

GENERATE_TESTLIST      = YES

# The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug
# list. This list is created by putting \bug commands in the documentation.
# The default value is: YES.

GENERATE_BUGLIST       = YES

# The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO)
# the deprecated list. This list is created by putting \deprecated commands in
# the documentation.
# The default value is: YES.

GENERATE_DEPRECATEDLIST= YES

# The ENABLED_SECTIONS tag can be used to enable conditional documentation
# sections, marked by \if <section_label> ... \endif and \cond <section_label>
# ... \endcond blocks.

ENABLED_SECTIONS       =

# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
# initial value of a variable or macro / define can have for it to appear in the
# documentation. If the initializer consists of more lines than specified here
# it will be hidden. Use a value of 0 to hide initializers completely. The
# appearance of the value of individual variables and macros / defines can be
# controlled using \showinitializer or \hideinitializer command in the
# documentation regardless of this setting.
# Minimum value: 0, maximum value: 10000, default value: 30.

MAX_INITIALIZER_LINES  = 30

# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
# the bottom of the documentation of classes and structs. If set to YES the list
# will mention the files that were used to generate the documentation.
# The default value is: YES.

SHOW_USED_FILES        = YES

# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
# will remove the Files entry from the Quick Index and from the Folder Tree View
# (if specified).
# The default value is: YES.

SHOW_FILES             = YES

# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
# page. This will remove the Namespaces entry from the Quick Index and from the
# Folder Tree View (if specified).
# The default value is: YES.

SHOW_NAMESPACES        = YES

# The FILE_VERSION_FILTER tag can be used to specify a program or script that
# doxygen should invoke to get the current version for each file (typically from
# the version control system). Doxygen will invoke the program by executing (via
# popen()) the command command input-file, where command is the value of the
# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
# by doxygen. Whatever the program writes to standard output is used as the file
# version. For an example see the documentation.

FILE_VERSION_FILTER    =

# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
# by doxygen. The layout file controls the global structure of the generated
# output files in an output format independent way. To create the layout file
# that represents doxygen's defaults, run doxygen with the -l option. You can
# optionally specify a file name after the option, if omitted DoxygenLayout.xml
# will be used as the name of the layout file.
#
# Note that if you run doxygen from a directory containing a file called
# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
# tag is left empty.

LAYOUT_FILE            =

# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
# the reference definitions. This must be a list of .bib files. The .bib
# extension is automatically appended if omitted. This requires the bibtex tool
# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
# For LaTeX the style of the bibliography can be controlled using
# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
# search path. Do not use file names with spaces, bibtex cannot handle them. See
# also \cite for info how to create references.

CITE_BIB_FILES         =

#---------------------------------------------------------------------------
# Configuration options related to warning and progress messages
#---------------------------------------------------------------------------

# The QUIET tag can be used to turn on/off the messages that are generated to
# standard output by doxygen. If QUIET is set to YES this implies that the
# messages are off.
# The default value is: NO.

QUIET                  = YES

# The WARNINGS tag can be used to turn on/off the warning messages that are
# generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES
# this implies that the warnings are on.
#
# Tip: Turn warnings on while writing the documentation.
# The default value is: YES.

WARNINGS               = YES

# If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate
# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
# will automatically be disabled.
# The default value is: YES.

WARN_IF_UNDOCUMENTED   = YES

# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
# potential errors in the documentation, such as not documenting some parameters
# in a documented function, or documenting parameters that don't exist or using
# markup commands wrongly.
# The default value is: YES.

WARN_IF_DOC_ERROR      = YES

# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
# are documented, but have no documentation for their parameters or return
# value. If set to NO doxygen will only warn about wrong or incomplete parameter
# documentation, but not about the absence of documentation.
# The default value is: NO.

WARN_NO_PARAMDOC       = NO

# The WARN_FORMAT tag determines the format of the warning messages that doxygen
# can produce. The string should contain the $file, $line, and $text tags, which
# will be replaced by the file and line number from which the warning originated
# and the warning text. Optionally the format may contain $version, which will
# be replaced by the version of the file (if it could be obtained via
# FILE_VERSION_FILTER)
# The default value is: $file:$line: $text.

WARN_FORMAT            = "$file:$line: $text"

# The WARN_LOGFILE tag can be used to specify a file to which warning and error
# messages should be written. If left blank the output is written to standard
# error (stderr).

WARN_LOGFILE           =

#---------------------------------------------------------------------------
# Configuration options related to the input files
#---------------------------------------------------------------------------

# The INPUT tag is used to specify the files and/or directories that contain
# documented source files. You may enter file names like myfile.cpp or
# directories like /usr/src/myproject. Separate the files or directories with
# spaces.
# Note: If this tag is empty the current directory is searched.

INPUT                  = ../src/protocol ../src/keys ../include/noise ../include/noise/protocol ../include/noise/keys .

# This tag can be used to specify the character encoding of the source files
# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
# documentation (see: http://www.gnu.org/software/libiconv) for the list of
# possible encodings.
# The default value is: UTF-8.

INPUT_ENCODING         = UTF-8

# If the value of the INPUT tag contains directories, you can use the
# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
# *.h) to filter out the source-files in the directories. If left blank the
# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii,
# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp,
# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown,
# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf,
# *.qsf, *.as and *.js.

FILE_PATTERNS          = *.h *.c *.dox

# The RECURSIVE tag can be used to specify whether or not subdirectories should
# be searched for input files as well.
# The default value is: NO.

RECURSIVE              = NO

# The EXCLUDE tag can be used to specify files and/or directories that should be
# excluded from the INPUT source files. This way you can easily exclude a
# subdirectory from a directory tree whose root is specified with the INPUT tag.
#
# Note that relative paths are relative to the directory from which doxygen is
# run.

EXCLUDE                = ../src/crypto

# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
# directories that are symbolic links (a Unix file system feature) are excluded
# from the input.
# The default value is: NO.

EXCLUDE_SYMLINKS       = NO

# If the value of the INPUT tag contains directories, you can use the
# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
# certain files from those directories.
#
# Note that the wildcards are matched against the file with absolute path, so to
# exclude all test directories for example use the pattern */test/*

EXCLUDE_PATTERNS       =

# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
# (namespaces, classes, functions, etc.) that should be excluded from the
# output. The symbol name can be a fully qualified name, a word, or if the
# wildcard * is used, a substring. Examples: ANamespace, AClass,
# AClass::ANamespace, ANamespace::*Test
#
# Note that the wildcards are matched against the file with absolute path, so to
# exclude all test directories use the pattern */test/*

EXCLUDE_SYMBOLS        =

# The EXAMPLE_PATH tag can be used to specify one or more files or directories
# that contain example code fragments that are included (see the \include
# command).

EXAMPLE_PATH           = . ../examples

# If the value of the EXAMPLE_PATH tag contains directories, you can use the
# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
# *.h) to filter out the source-files in the directories. If left blank all
# files are included.

EXAMPLE_PATTERNS       =

# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
# searched for input files to be used with the \include or \dontinclude commands
# irrespective of the value of the RECURSIVE tag.
# The default value is: NO.

EXAMPLE_RECURSIVE      = YES

# The IMAGE_PATH tag can be used to specify one or more files or directories
# that contain images that are to be included in the documentation (see the
# \image command).

IMAGE_PATH             =

# The INPUT_FILTER tag can be used to specify a program that doxygen should
# invoke to filter for each input file. Doxygen will invoke the filter program
# by executing (via popen()) the command:
#
# <filter> <input-file>
#
# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
# name of an input file. Doxygen will then use the output that the filter
# program writes to standard output. If FILTER_PATTERNS is specified, this tag
# will be ignored.
#
# Note that the filter must not add or remove lines; it is applied before the
# code is scanned, but not when the output code is generated. If lines are added
# or removed, the anchors will not be placed correctly.

INPUT_FILTER           =

# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
# basis. Doxygen will compare the file name with each pattern and apply the
# filter if there is a match. The filters are a list of the form: pattern=filter
# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
# patterns match the file name, INPUT_FILTER is applied.

FILTER_PATTERNS        =

# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
# INPUT_FILTER ) will also be used to filter the input files that are used for
# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
# The default value is: NO.

FILTER_SOURCE_FILES    = NO

# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
# it is also possible to disable source filtering for a specific pattern using
# *.ext= (so without naming a filter).
# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.

FILTER_SOURCE_PATTERNS =

# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
# is part of the input, its contents will be placed on the main page
# (index.html). This can be useful if you have a project on for instance GitHub
# and want to reuse the introduction page also for the doxygen output.

USE_MDFILE_AS_MAINPAGE =

#---------------------------------------------------------------------------
# Configuration options related to source browsing
#---------------------------------------------------------------------------

# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
# generated. Documented entities will be cross-referenced with these sources.
#
# Note: To get rid of all source code in the generated output, make sure that
# also VERBATIM_HEADERS is set to NO.
# The default value is: NO.

SOURCE_BROWSER         = YES

# Setting the INLINE_SOURCES tag to YES will include the body of functions,
# classes and enums directly into the documentation.
# The default value is: NO.

INLINE_SOURCES         = NO

# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
# special comment blocks from generated source code fragments. Normal C, C++ and
# Fortran comments will always remain visible.
# The default value is: YES.

STRIP_CODE_COMMENTS    = YES

# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
# function all documented functions referencing it will be listed.
# The default value is: NO.

REFERENCED_BY_RELATION = NO

# If the REFERENCES_RELATION tag is set to YES then for each documented function
# all documented entities called/used by that function will be listed.
# The default value is: NO.

REFERENCES_RELATION    = NO

# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
# to YES, then the hyperlinks from functions in REFERENCES_RELATION and
# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
# link to the documentation.
# The default value is: YES.

REFERENCES_LINK_SOURCE = YES

# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
# source code will show a tooltip with additional information such as prototype,
# brief description and links to the definition and documentation. Since this
# will make the HTML file larger and loading of large files a bit slower, you
# can opt to disable this feature.
# The default value is: YES.
# This tag requires that the tag SOURCE_BROWSER is set to YES.

SOURCE_TOOLTIPS        = YES

# If the USE_HTAGS tag is set to YES then the references to source code will
# point to the HTML generated by the htags(1) tool instead of doxygen built-in
# source browser. The htags tool is part of GNU's global source tagging system
# (see http://www.gnu.org/software/global/global.html). You will need version
# 4.8.6 or higher.
#
# To use it do the following:
# - Install the latest version of global
# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
# - Make sure the INPUT points to the root of the source tree
# - Run doxygen as normal
#
# Doxygen will invoke htags (and that will in turn invoke gtags), so these
# tools must be available from the command line (i.e. in the search path).
#
# The result: instead of the source browser generated by doxygen, the links to
# source code will now point to the output of htags.
# The default value is: NO.
# This tag requires that the tag SOURCE_BROWSER is set to YES.

USE_HTAGS              = NO

# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
# verbatim copy of the header file for each class for which an include is
# specified. Set to NO to disable this.
# See also: Section \class.
# The default value is: YES.

VERBATIM_HEADERS       = YES

#---------------------------------------------------------------------------
# Configuration options related to the alphabetical class index
#---------------------------------------------------------------------------

# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
# compounds will be generated. Enable this if the project contains a lot of
# classes, structs, unions or interfaces.
# The default value is: YES.

ALPHABETICAL_INDEX     = YES

# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
# which the alphabetical index list will be split.
# Minimum value: 1, maximum value: 20, default value: 5.
# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.

COLS_IN_ALPHA_INDEX    = 5

# In case all classes in a project start with a common prefix, all classes will
# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
# can be used to specify a prefix (or a list of prefixes) that should be ignored
# while generating the index headers.
# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.

IGNORE_PREFIX          =

#---------------------------------------------------------------------------
# Configuration options related to the HTML output
#---------------------------------------------------------------------------

# If the GENERATE_HTML tag is set to YES doxygen will generate HTML output
# The default value is: YES.

GENERATE_HTML          = YES

# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
# it.
# The default directory is: html.
# This tag requires that the tag GENERATE_HTML is set to YES.

HTML_OUTPUT            = html

# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
# generated HTML page (for example: .htm, .php, .asp).
# The default value is: .html.
# This tag requires that the tag GENERATE_HTML is set to YES.

HTML_FILE_EXTENSION    = .html

# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
# each generated HTML page. If the tag is left blank doxygen will generate a
# standard header.
#
# To get valid HTML the header file that includes any scripts and style sheets
# that doxygen needs, which is dependent on the configuration options used (e.g.
# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
# default header using
# doxygen -w html new_header.html new_footer.html new_stylesheet.css
# YourConfigFile
# and then modify the file new_header.html. See also section "Doxygen usage"
# for information on how to generate the default header that doxygen normally
# uses.
# Note: The header is subject to change so you typically have to regenerate the
# default header when upgrading to a newer version of doxygen. For a description
# of the possible markers and block names see the documentation.
# This tag requires that the tag GENERATE_HTML is set to YES.

HTML_HEADER            =

# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
# generated HTML page. If the tag is left blank doxygen will generate a standard
# footer. See HTML_HEADER for more information on how to generate a default
# footer and what special commands can be used inside the footer. See also
# section "Doxygen usage" for information on how to generate the default footer
# that doxygen normally uses.
# This tag requires that the tag GENERATE_HTML is set to YES.

HTML_FOOTER            =

# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
# sheet that is used by each HTML page. It can be used to fine-tune the look of
# the HTML output. If left blank doxygen will generate a default style sheet.
# See also section "Doxygen usage" for information on how to generate the style
# sheet that doxygen normally uses.
# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
# it is more robust and this tag (HTML_STYLESHEET) will in the future become
# obsolete.
# This tag requires that the tag GENERATE_HTML is set to YES.

HTML_STYLESHEET        =

# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional user-
# defined cascading style sheet that is included after the standard style sheets
# created by doxygen. Using this option one can overrule certain style aspects.
# This is preferred over using HTML_STYLESHEET since it does not replace the
# standard style sheet and is therefor more robust against future updates.
# Doxygen will copy the style sheet file to the output directory. For an example
# see the documentation.
# This tag requires that the tag GENERATE_HTML is set to YES.

HTML_EXTRA_STYLESHEET  =

# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
# other source files which should be copied to the HTML output directory. Note
# that these files will be copied to the base HTML output directory. Use the
# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
# files will be copied as-is; there are no commands or markers available.
# This tag requires that the tag GENERATE_HTML is set to YES.

HTML_EXTRA_FILES       =

# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
# will adjust the colors in the stylesheet and background images according to
# this color. Hue is specified as an angle on a colorwheel, see
# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
# purple, and 360 is red again.
# Minimum value: 0, maximum value: 359, default value: 220.
# This tag requires that the tag GENERATE_HTML is set to YES.

HTML_COLORSTYLE_HUE    = 220

# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
# in the HTML output. For a value of 0 the output will use grayscales only. A
# value of 255 will produce the most vivid colors.
# Minimum value: 0, maximum value: 255, default value: 100.
# This tag requires that the tag GENERATE_HTML is set to YES.

HTML_COLORSTYLE_SAT    = 100

# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
# luminance component of the colors in the HTML output. Values below 100
# gradually make the output lighter, whereas values above 100 make the output
# darker. The value divided by 100 is the actual gamma applied, so 80 represents
# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
# change the gamma.
# Minimum value: 40, maximum value: 240, default value: 80.
# This tag requires that the tag GENERATE_HTML is set to YES.

HTML_COLORSTYLE_GAMMA  = 80

# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
# page will contain the date and time when the page was generated. Setting this
# to NO can help when comparing the output of multiple runs.
# The default value is: YES.
# This tag requires that the tag GENERATE_HTML is set to YES.

HTML_TIMESTAMP         = YES

# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
# documentation will contain sections that can be hidden and shown after the
# page has loaded.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.

HTML_DYNAMIC_SECTIONS  = NO

# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
# shown in the various tree structured indices initially; the user can expand
# and collapse entries dynamically later on. Doxygen will expand the tree to
# such a level that at most the specified number of entries are visible (unless
# a fully collapsed tree already exceeds this amount). So setting the number of
# entries 1 will produce a full collapsed tree by default. 0 is a special value
# representing an infinite number of entries and will result in a full expanded
# tree by default.
# Minimum value: 0, maximum value: 9999, default value: 100.
# This tag requires that the tag GENERATE_HTML is set to YES.

HTML_INDEX_NUM_ENTRIES = 100

# If the GENERATE_DOCSET tag is set to YES, additional index files will be
# generated that can be used as input for Apple's Xcode 3 integrated development
# environment (see: http://developer.apple.com/tools/xcode/), introduced with
# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
# Makefile in the HTML output directory. Running make will produce the docset in
# that directory and running make install will install the docset in
# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
# for more information.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.

GENERATE_DOCSET        = NO

# This tag determines the name of the docset feed. A documentation feed provides
# an umbrella under which multiple documentation sets from a single provider
# (such as a company or product suite) can be grouped.
# The default value is: Doxygen generated docs.
# This tag requires that the tag GENERATE_DOCSET is set to YES.

DOCSET_FEEDNAME        = "Doxygen generated docs"

# This tag specifies a string that should uniquely identify the documentation
# set bundle. This should be a reverse domain-name style string, e.g.
# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
# The default value is: org.doxygen.Project.
# This tag requires that the tag GENERATE_DOCSET is set to YES.

DOCSET_BUNDLE_ID       = org.doxygen.Project

# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
# the documentation publisher. This should be a reverse domain-name style
# string, e.g. com.mycompany.MyDocSet.documentation.
# The default value is: org.doxygen.Publisher.
# This tag requires that the tag GENERATE_DOCSET is set to YES.

DOCSET_PUBLISHER_ID    = org.doxygen.Publisher

# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
# The default value is: Publisher.
# This tag requires that the tag GENERATE_DOCSET is set to YES.

DOCSET_PUBLISHER_NAME  = Publisher

# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
# Windows.
#
# The HTML Help Workshop contains a compiler that can convert all HTML output
# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
# files are now used as the Windows 98 help format, and will replace the old
# Windows help format (.hlp) on all Windows platforms in the future. Compressed
# HTML files also contain an index, a table of contents, and you can search for
# words in the documentation. The HTML workshop also contains a viewer for
# compressed HTML files.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.

GENERATE_HTMLHELP      = NO

# The CHM_FILE tag can be used to specify the file name of the resulting .chm
# file. You can add a path in front of the file if the result should not be
# written to the html output directory.
# This tag requires that the tag GENERATE_HTMLHELP is set to YES.

CHM_FILE               =

# The HHC_LOCATION tag can be used to specify the location (absolute path
# including file name) of the HTML help compiler ( hhc.exe). If non-empty
# doxygen will try to run the HTML help compiler on the generated index.hhp.
# The file has to be specified with full path.
# This tag requires that the tag GENERATE_HTMLHELP is set to YES.

HHC_LOCATION           =

# The GENERATE_CHI flag controls if a separate .chi index file is generated (
# YES) or that it should be included in the master .chm file ( NO).
# The default value is: NO.
# This tag requires that the tag GENERATE_HTMLHELP is set to YES.

GENERATE_CHI           = NO

# The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc)
# and project file content.
# This tag requires that the tag GENERATE_HTMLHELP is set to YES.

CHM_INDEX_ENCODING     =

# The BINARY_TOC flag controls whether a binary table of contents is generated (
# YES) or a normal table of contents ( NO) in the .chm file.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTMLHELP is set to YES.

BINARY_TOC             = NO

# The TOC_EXPAND flag can be set to YES to add extra items for group members to
# the table of contents of the HTML help documentation and to the tree view.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTMLHELP is set to YES.

TOC_EXPAND             = NO

# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
# (.qch) of the generated HTML documentation.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.

GENERATE_QHP           = NO

# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
# the file name of the resulting .qch file. The path specified is relative to
# the HTML output folder.
# This tag requires that the tag GENERATE_QHP is set to YES.

QCH_FILE               =

# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
# Project output. For more information please see Qt Help Project / Namespace
# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
# The default value is: org.doxygen.Project.
# This tag requires that the tag GENERATE_QHP is set to YES.

QHP_NAMESPACE          = org.doxygen.Project

# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
# Help Project output. For more information please see Qt Help Project / Virtual
# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
# folders).
# The default value is: doc.
# This tag requires that the tag GENERATE_QHP is set to YES.

QHP_VIRTUAL_FOLDER     = doc

# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
# filter to add. For more information please see Qt Help Project / Custom
# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
# filters).
# This tag requires that the tag GENERATE_QHP is set to YES.

QHP_CUST_FILTER_NAME   =

# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
# custom filter to add. For more information please see Qt Help Project / Custom
# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
# filters).
# This tag requires that the tag GENERATE_QHP is set to YES.

QHP_CUST_FILTER_ATTRS  =

# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
# project's filter section matches. Qt Help Project / Filter Attributes (see:
# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
# This tag requires that the tag GENERATE_QHP is set to YES.

QHP_SECT_FILTER_ATTRS  =

# The QHG_LOCATION tag can be used to specify the location of Qt's
# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
# generated .qhp file.
# This tag requires that the tag GENERATE_QHP is set to YES.

QHG_LOCATION           =

# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
# generated, together with the HTML files, they form an Eclipse help plugin. To
# install this plugin and make it available under the help contents menu in
# Eclipse, the contents of the directory containing the HTML and XML files needs
# to be copied into the plugins directory of eclipse. The name of the directory
# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
# After copying Eclipse needs to be restarted before the help appears.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.

GENERATE_ECLIPSEHELP   = NO

# A unique identifier for the Eclipse help plugin. When installing the plugin
# the directory name containing the HTML and XML files should also have this
# name. Each documentation set should have its own identifier.
# The default value is: org.doxygen.Project.
# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.

ECLIPSE_DOC_ID         = org.doxygen.Project

# If you want full control over the layout of the generated HTML pages it might
# be necessary to disable the index and replace it with your own. The
# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
# of each HTML page. A value of NO enables the index and the value YES disables
# it. Since the tabs in the index contain the same information as the navigation
# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.

DISABLE_INDEX          = NO

# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
# structure should be generated to display hierarchical information. If the tag
# value is set to YES, a side panel will be generated containing a tree-like
# index structure (just like the one that is generated for HTML Help). For this
# to work a browser that supports JavaScript, DHTML, CSS and frames is required
# (i.e. any modern browser). Windows users are probably better off using the
# HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can
# further fine-tune the look of the index. As an example, the default style
# sheet generated by doxygen has an example that shows how to put an image at
# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
# the same information as the tab index, you could consider setting
# DISABLE_INDEX to YES when enabling this option.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.

GENERATE_TREEVIEW      = NO

# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
# doxygen will group on one line in the generated HTML documentation.
#
# Note that a value of 0 will completely suppress the enum values from appearing
# in the overview section.
# Minimum value: 0, maximum value: 20, default value: 4.
# This tag requires that the tag GENERATE_HTML is set to YES.

ENUM_VALUES_PER_LINE   = 4

# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
# to set the initial width (in pixels) of the frame in which the tree is shown.
# Minimum value: 0, maximum value: 1500, default value: 250.
# This tag requires that the tag GENERATE_HTML is set to YES.

TREEVIEW_WIDTH         = 250

# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to
# external symbols imported via tag files in a separate window.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.

EXT_LINKS_IN_WINDOW    = NO

# Use this tag to change the font size of LaTeX formulas included as images in
# the HTML documentation. When you change the font size after a successful
# doxygen run you need to manually remove any form_*.png images from the HTML
# output directory to force them to be regenerated.
# Minimum value: 8, maximum value: 50, default value: 10.
# This tag requires that the tag GENERATE_HTML is set to YES.

FORMULA_FONTSIZE       = 10

# Use the FORMULA_TRANPARENT tag to determine whether or not the images
# generated for formulas are transparent PNGs. Transparent PNGs are not
# supported properly for IE 6.0, but are supported on all modern browsers.
#
# Note that when changing this option you need to delete any form_*.png files in
# the HTML output directory before the changes have effect.
# The default value is: YES.
# This tag requires that the tag GENERATE_HTML is set to YES.

FORMULA_TRANSPARENT    = YES

# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
# http://www.mathjax.org) which uses client side Javascript for the rendering
# instead of using prerendered bitmaps. Use this if you do not have LaTeX
# installed or if you want to formulas look prettier in the HTML output. When
# enabled you may also need to install MathJax separately and configure the path
# to it using the MATHJAX_RELPATH option.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.

USE_MATHJAX            = NO

# When MathJax is enabled you can set the default output format to be used for
# the MathJax output. See the MathJax site (see:
# http://docs.mathjax.org/en/latest/output.html) for more details.
# Possible values are: HTML-CSS (which is slower, but has the best
# compatibility), NativeMML (i.e. MathML) and SVG.
# The default value is: HTML-CSS.
# This tag requires that the tag USE_MATHJAX is set to YES.

MATHJAX_FORMAT         = HTML-CSS

# When MathJax is enabled you need to specify the location relative to the HTML
# output directory using the MATHJAX_RELPATH option. The destination directory
# should contain the MathJax.js script. For instance, if the mathjax directory
# is located at the same level as the HTML output directory, then
# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
# Content Delivery Network so you can quickly see the result without installing
# MathJax. However, it is strongly recommended to install a local copy of
# MathJax from http://www.mathjax.org before deployment.
# The default value is: http://cdn.mathjax.org/mathjax/latest.
# This tag requires that the tag USE_MATHJAX is set to YES.

MATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest

# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
# extension names that should be enabled during MathJax rendering. For example
# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
# This tag requires that the tag USE_MATHJAX is set to YES.

MATHJAX_EXTENSIONS     =

# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
# of code that will be used on startup of the MathJax code. See the MathJax site
# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
# example see the documentation.
# This tag requires that the tag USE_MATHJAX is set to YES.

MATHJAX_CODEFILE       =

# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
# the HTML output. The underlying search engine uses javascript and DHTML and
# should work on any modern browser. Note that when using HTML help
# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
# there is already a search function so this one should typically be disabled.
# For large projects the javascript based search engine can be slow, then
# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
# search using the keyboard; to jump to the search box use <access key> + S
# (what the <access key> is depends on the OS and browser, but it is typically
# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
# key> to jump into the search results window, the results can be navigated
# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
# the search. The filter options can be selected when the cursor is inside the
# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
# to select a filter and <Enter> or <escape> to activate or cancel the filter
# option.
# The default value is: YES.
# This tag requires that the tag GENERATE_HTML is set to YES.

SEARCHENGINE           = YES

# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
# implemented using a web server instead of a web client using Javascript. There
# are two flavours of web server based searching depending on the
# EXTERNAL_SEARCH setting. When disabled, doxygen will generate a PHP script for
# searching and an index file used by the script. When EXTERNAL_SEARCH is
# enabled the indexing and searching needs to be provided by external tools. See
# the section "External Indexing and Searching" for details.
# The default value is: NO.
# This tag requires that the tag SEARCHENGINE is set to YES.

SERVER_BASED_SEARCH    = NO

# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
# script for searching. Instead the search results are written to an XML file
# which needs to be processed by an external indexer. Doxygen will invoke an
# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
# search results.
#
# Doxygen ships with an example indexer ( doxyindexer) and search engine
# (doxysearch.cgi) which are based on the open source search engine library
# Xapian (see: http://xapian.org/).
#
# See the section "External Indexing and Searching" for details.
# The default value is: NO.
# This tag requires that the tag SEARCHENGINE is set to YES.

EXTERNAL_SEARCH        = NO

# The SEARCHENGINE_URL should point to a search engine hosted by a web server
# which will return the search results when EXTERNAL_SEARCH is enabled.
#
# Doxygen ships with an example indexer ( doxyindexer) and search engine
# (doxysearch.cgi) which are based on the open source search engine library
# Xapian (see: http://xapian.org/). See the section "External Indexing and
# Searching" for details.
# This tag requires that the tag SEARCHENGINE is set to YES.

SEARCHENGINE_URL       =

# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
# search data is written to a file for indexing by an external tool. With the
# SEARCHDATA_FILE tag the name of this file can be specified.
# The default file is: searchdata.xml.
# This tag requires that the tag SEARCHENGINE is set to YES.

SEARCHDATA_FILE        = searchdata.xml

# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
# projects and redirect the results back to the right project.
# This tag requires that the tag SEARCHENGINE is set to YES.

EXTERNAL_SEARCH_ID     =

# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
# projects other than the one defined by this configuration file, but that are
# all added to the same external search index. Each project needs to have a
# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
# to a relative location where the documentation can be found. The format is:
# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
# This tag requires that the tag SEARCHENGINE is set to YES.

EXTRA_SEARCH_MAPPINGS  =

#---------------------------------------------------------------------------
# Configuration options related to the LaTeX output
#---------------------------------------------------------------------------

# If the GENERATE_LATEX tag is set to YES doxygen will generate LaTeX output.
# The default value is: YES.

GENERATE_LATEX         = NO

# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
# it.
# The default directory is: latex.
# This tag requires that the tag GENERATE_LATEX is set to YES.

LATEX_OUTPUT           = latex

# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
# invoked.
#
# Note that when enabling USE_PDFLATEX this option is only used for generating
# bitmaps for formulas in the HTML output, but not in the Makefile that is
# written to the output directory.
# The default file is: latex.
# This tag requires that the tag GENERATE_LATEX is set to YES.

LATEX_CMD_NAME         = latex

# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
# index for LaTeX.
# The default file is: makeindex.
# This tag requires that the tag GENERATE_LATEX is set to YES.

MAKEINDEX_CMD_NAME     = makeindex

# If the COMPACT_LATEX tag is set to YES doxygen generates more compact LaTeX
# documents. This may be useful for small projects and may help to save some
# trees in general.
# The default value is: NO.
# This tag requires that the tag GENERATE_LATEX is set to YES.

COMPACT_LATEX          = NO

# The PAPER_TYPE tag can be used to set the paper type that is used by the
# printer.
# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
# 14 inches) and executive (7.25 x 10.5 inches).
# The default value is: a4.
# This tag requires that the tag GENERATE_LATEX is set to YES.

PAPER_TYPE             = a4

# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
# that should be included in the LaTeX output. To get the times font for
# instance you can specify
# EXTRA_PACKAGES=times
# If left blank no extra packages will be included.
# This tag requires that the tag GENERATE_LATEX is set to YES.

EXTRA_PACKAGES         =

# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
# generated LaTeX document. The header should contain everything until the first
# chapter. If it is left blank doxygen will generate a standard header. See
# section "Doxygen usage" for information on how to let doxygen write the
# default header to a separate file.
#
# Note: Only use a user-defined header if you know what you are doing! The
# following commands have a special meaning inside the header: $title,
# $datetime, $date, $doxygenversion, $projectname, $projectnumber. Doxygen will
# replace them by respectively the title of the page, the current date and time,
# only the current date, the version number of doxygen, the project name (see
# PROJECT_NAME), or the project number (see PROJECT_NUMBER).
# This tag requires that the tag GENERATE_LATEX is set to YES.

LATEX_HEADER           =

# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
# generated LaTeX document. The footer should contain everything after the last
# chapter. If it is left blank doxygen will generate a standard footer.
#
# Note: Only use a user-defined footer if you know what you are doing!
# This tag requires that the tag GENERATE_LATEX is set to YES.

LATEX_FOOTER           =

# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
# other source files which should be copied to the LATEX_OUTPUT output
# directory. Note that the files will be copied as-is; there are no commands or
# markers available.
# This tag requires that the tag GENERATE_LATEX is set to YES.

LATEX_EXTRA_FILES      =

# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
# contain links (just like the HTML output) instead of page references. This
# makes the output suitable for online browsing using a PDF viewer.
# The default value is: YES.
# This tag requires that the tag GENERATE_LATEX is set to YES.

PDF_HYPERLINKS         = YES

# If the LATEX_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
# the PDF file directly from the LaTeX files. Set this option to YES to get a
# higher quality PDF documentation.
# The default value is: YES.
# This tag requires that the tag GENERATE_LATEX is set to YES.

USE_PDFLATEX           = YES

# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
# command to the generated LaTeX files. This will instruct LaTeX to keep running
# if errors occur, instead of asking the user for help. This option is also used
# when generating formulas in HTML.
# The default value is: NO.
# This tag requires that the tag GENERATE_LATEX is set to YES.

LATEX_BATCHMODE        = NO

# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
# index chapters (such as File Index, Compound Index, etc.) in the output.
# The default value is: NO.
# This tag requires that the tag GENERATE_LATEX is set to YES.

LATEX_HIDE_INDICES     = NO

# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
# code with syntax highlighting in the LaTeX output.
#
# Note that which sources are shown also depends on other settings such as
# SOURCE_BROWSER.
# The default value is: NO.
# This tag requires that the tag GENERATE_LATEX is set to YES.

LATEX_SOURCE_CODE      = NO

# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
# bibliography, e.g. plainnat, or ieeetr. See
# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
# The default value is: plain.
# This tag requires that the tag GENERATE_LATEX is set to YES.

LATEX_BIB_STYLE        = plain

#---------------------------------------------------------------------------
# Configuration options related to the RTF output
#---------------------------------------------------------------------------

# If the GENERATE_RTF tag is set to YES doxygen will generate RTF output. The
# RTF output is optimized for Word 97 and may not look too pretty with other RTF
# readers/editors.
# The default value is: NO.

GENERATE_RTF           = NO

# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
# it.
# The default directory is: rtf.
# This tag requires that the tag GENERATE_RTF is set to YES.

RTF_OUTPUT             = rtf

# If the COMPACT_RTF tag is set to YES doxygen generates more compact RTF
# documents. This may be useful for small projects and may help to save some
# trees in general.
# The default value is: NO.
# This tag requires that the tag GENERATE_RTF is set to YES.

COMPACT_RTF            = NO

# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
# contain hyperlink fields. The RTF file will contain links (just like the HTML
# output) instead of page references. This makes the output suitable for online
# browsing using Word or some other Word compatible readers that support those
# fields.
#
# Note: WordPad (write) and others do not support links.
# The default value is: NO.
# This tag requires that the tag GENERATE_RTF is set to YES.

RTF_HYPERLINKS         = NO

# Load stylesheet definitions from file. Syntax is similar to doxygen's config
# file, i.e. a series of assignments. You only have to provide replacements,
# missing definitions are set to their default value.
#
# See also section "Doxygen usage" for information on how to generate the
# default style sheet that doxygen normally uses.
# This tag requires that the tag GENERATE_RTF is set to YES.

RTF_STYLESHEET_FILE    =

# Set optional variables used in the generation of an RTF document. Syntax is
# similar to doxygen's config file. A template extensions file can be generated
# using doxygen -e rtf extensionFile.
# This tag requires that the tag GENERATE_RTF is set to YES.

RTF_EXTENSIONS_FILE    =

#---------------------------------------------------------------------------
# Configuration options related to the man page output
#---------------------------------------------------------------------------

# If the GENERATE_MAN tag is set to YES doxygen will generate man pages for
# classes and files.
# The default value is: NO.

GENERATE_MAN           = NO

# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
# it. A directory man3 will be created inside the directory specified by
# MAN_OUTPUT.
# The default directory is: man.
# This tag requires that the tag GENERATE_MAN is set to YES.

MAN_OUTPUT             = man

# The MAN_EXTENSION tag determines the extension that is added to the generated
# man pages. In case the manual section does not start with a number, the number
# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
# optional.
# The default value is: .3.
# This tag requires that the tag GENERATE_MAN is set to YES.

MAN_EXTENSION          = .3

# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
# will generate one additional man file for each entity documented in the real
# man page(s). These additional files only source the real man page, but without
# them the man command would be unable to find the correct page.
# The default value is: NO.
# This tag requires that the tag GENERATE_MAN is set to YES.

MAN_LINKS              = NO

#---------------------------------------------------------------------------
# Configuration options related to the XML output
#---------------------------------------------------------------------------

# If the GENERATE_XML tag is set to YES doxygen will generate an XML file that
# captures the structure of the code including all documentation.
# The default value is: NO.

GENERATE_XML           = NO

# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
# it.
# The default directory is: xml.
# This tag requires that the tag GENERATE_XML is set to YES.

XML_OUTPUT             = xml

# The XML_SCHEMA tag can be used to specify a XML schema, which can be used by a
# validating XML parser to check the syntax of the XML files.
# This tag requires that the tag GENERATE_XML is set to YES.

XML_SCHEMA             =

# The XML_DTD tag can be used to specify a XML DTD, which can be used by a
# validating XML parser to check the syntax of the XML files.
# This tag requires that the tag GENERATE_XML is set to YES.

XML_DTD                =

# If the XML_PROGRAMLISTING tag is set to YES doxygen will dump the program
# listings (including syntax highlighting and cross-referencing information) to
# the XML output. Note that enabling this will significantly increase the size
# of the XML output.
# The default value is: YES.
# This tag requires that the tag GENERATE_XML is set to YES.

XML_PROGRAMLISTING     = YES

#---------------------------------------------------------------------------
# Configuration options related to the DOCBOOK output
#---------------------------------------------------------------------------

# If the GENERATE_DOCBOOK tag is set to YES doxygen will generate Docbook files
# that can be used to generate PDF.
# The default value is: NO.

GENERATE_DOCBOOK       = NO

# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
# front of it.
# The default directory is: docbook.
# This tag requires that the tag GENERATE_DOCBOOK is set to YES.

DOCBOOK_OUTPUT         = docbook

#---------------------------------------------------------------------------
# Configuration options for the AutoGen Definitions output
#---------------------------------------------------------------------------

# If the GENERATE_AUTOGEN_DEF tag is set to YES doxygen will generate an AutoGen
# Definitions (see http://autogen.sf.net) file that captures the structure of
# the code including all documentation. Note that this feature is still
# experimental and incomplete at the moment.
# The default value is: NO.

GENERATE_AUTOGEN_DEF   = NO

#---------------------------------------------------------------------------
# Configuration options related to the Perl module output
#---------------------------------------------------------------------------

# If the GENERATE_PERLMOD tag is set to YES doxygen will generate a Perl module
# file that captures the structure of the code including all documentation.
#
# Note that this feature is still experimental and incomplete at the moment.
# The default value is: NO.

GENERATE_PERLMOD       = NO

# If the PERLMOD_LATEX tag is set to YES doxygen will generate the necessary
# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
# output from the Perl module output.
# The default value is: NO.
# This tag requires that the tag GENERATE_PERLMOD is set to YES.

PERLMOD_LATEX          = NO

# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be nicely
# formatted so it can be parsed by a human reader. This is useful if you want to
# understand what is going on. On the other hand, if this tag is set to NO the
# size of the Perl module output will be much smaller and Perl will parse it
# just the same.
# The default value is: YES.
# This tag requires that the tag GENERATE_PERLMOD is set to YES.

PERLMOD_PRETTY         = YES

# The names of the make variables in the generated doxyrules.make file are
# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
# so different doxyrules.make files included by the same Makefile don't
# overwrite each other's variables.
# This tag requires that the tag GENERATE_PERLMOD is set to YES.

PERLMOD_MAKEVAR_PREFIX =

#---------------------------------------------------------------------------
# Configuration options related to the preprocessor
#---------------------------------------------------------------------------

# If the ENABLE_PREPROCESSING tag is set to YES doxygen will evaluate all
# C-preprocessor directives found in the sources and include files.
# The default value is: YES.

ENABLE_PREPROCESSING   = YES

# If the MACRO_EXPANSION tag is set to YES doxygen will expand all macro names
# in the source code. If set to NO only conditional compilation will be
# performed. Macro expansion can be done in a controlled way by setting
# EXPAND_ONLY_PREDEF to YES.
# The default value is: NO.
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.

MACRO_EXPANSION        = NO

# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
# the macro expansion is limited to the macros specified with the PREDEFINED and
# EXPAND_AS_DEFINED tags.
# The default value is: NO.
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.

EXPAND_ONLY_PREDEF     = NO

# If the SEARCH_INCLUDES tag is set to YES the includes files in the
# INCLUDE_PATH will be searched if a #include is found.
# The default value is: YES.
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.

SEARCH_INCLUDES        = YES

# The INCLUDE_PATH tag can be used to specify one or more directories that
# contain include files that are not input files but should be processed by the
# preprocessor.
# This tag requires that the tag SEARCH_INCLUDES is set to YES.

INCLUDE_PATH           =

# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
# patterns (like *.h and *.hpp) to filter out the header-files in the
# directories. If left blank, the patterns specified with FILE_PATTERNS will be
# used.
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.

INCLUDE_FILE_PATTERNS  =

# The PREDEFINED tag can be used to specify one or more macro names that are
# defined before the preprocessor is started (similar to the -D option of e.g.
# gcc). The argument of the tag is a list of macros of the form: name or
# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
# is assumed. To prevent a macro definition from being undefined via #undef or
# recursively expanded use the := operator instead of the = operator.
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.

PREDEFINED             =

# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
# tag can be used to specify a list of macro names that should be expanded. The
# macro definition that is found in the sources will be used. Use the PREDEFINED
# tag if you want to use a different macro definition that overrules the
# definition found in the source code.
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.

EXPAND_AS_DEFINED      =

# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
# remove all refrences to function-like macros that are alone on a line, have an
# all uppercase name, and do not end with a semicolon. Such function macros are
# typically used for boiler-plate code, and will confuse the parser if not
# removed.
# The default value is: YES.
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.

SKIP_FUNCTION_MACROS   = YES

#---------------------------------------------------------------------------
# Configuration options related to external references
#---------------------------------------------------------------------------

# The TAGFILES tag can be used to specify one or more tag files. For each tag
# file the location of the external documentation should be added. The format of
# a tag file without this location is as follows:
# TAGFILES = file1 file2 ...
# Adding location for the tag files is done as follows:
# TAGFILES = file1=loc1 "file2 = loc2" ...
# where loc1 and loc2 can be relative or absolute paths or URLs. See the
# section "Linking to external documentation" for more information about the use
# of tag files.
# Note: Each tag file must have an unique name (where the name does NOT include
# the path). If a tag file is not located in the directory in which doxygen is
# run, you must also specify the path to the tagfile here.

TAGFILES               =

# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
# tag file that is based on the input files it reads. See section "Linking to
# external documentation" for more information about the usage of tag files.

GENERATE_TAGFILE       =

# If the ALLEXTERNALS tag is set to YES all external class will be listed in the
# class index. If set to NO only the inherited external classes will be listed.
# The default value is: NO.

ALLEXTERNALS           = NO

# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed in
# the modules index. If set to NO, only the current project's groups will be
# listed.
# The default value is: YES.

EXTERNAL_GROUPS        = YES

# If the EXTERNAL_PAGES tag is set to YES all external pages will be listed in
# the related pages index. If set to NO, only the current project's pages will
# be listed.
# The default value is: YES.

EXTERNAL_PAGES         = YES

# The PERL_PATH should be the absolute path and name of the perl script
# interpreter (i.e. the result of 'which perl').
# The default file (with absolute path) is: /usr/bin/perl.

PERL_PATH              = /usr/bin/perl

#---------------------------------------------------------------------------
# Configuration options related to the dot tool
#---------------------------------------------------------------------------

# If the CLASS_DIAGRAMS tag is set to YES doxygen will generate a class diagram
# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
# NO turns the diagrams off. Note that this option also works with HAVE_DOT
# disabled, but it is recommended to install and use dot, since it yields more
# powerful graphs.
# The default value is: YES.

CLASS_DIAGRAMS         = YES

# You can define message sequence charts within doxygen comments using the \msc
# command. Doxygen will then run the mscgen tool (see:
# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
# documentation. The MSCGEN_PATH tag allows you to specify the directory where
# the mscgen tool resides. If left empty the tool is assumed to be found in the
# default search path.

MSCGEN_PATH            =

# You can include diagrams made with dia in doxygen documentation. Doxygen will
# then run dia to produce the diagram and insert it in the documentation. The
# DIA_PATH tag allows you to specify the directory where the dia binary resides.
# If left empty dia is assumed to be found in the default search path.

DIA_PATH               =

# If set to YES, the inheritance and collaboration graphs will hide inheritance
# and usage relations if the target is undocumented or is not a class.
# The default value is: YES.

HIDE_UNDOC_RELATIONS   = YES

# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
# available from the path. This tool is part of Graphviz (see:
# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
# Bell Labs. The other options in this section have no effect if this option is
# set to NO
# The default value is: NO.

HAVE_DOT               = NO

# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
# to run in parallel. When set to 0 doxygen will base this on the number of
# processors available in the system. You can set it explicitly to a value
# larger than 0 to get control over the balance between CPU load and processing
# speed.
# Minimum value: 0, maximum value: 32, default value: 0.
# This tag requires that the tag HAVE_DOT is set to YES.

DOT_NUM_THREADS        = 0

# When you want a differently looking font n the dot files that doxygen
# generates you can specify the font name using DOT_FONTNAME. You need to make
# sure dot is able to find the font, which can be done by putting it in a
# standard location or by setting the DOTFONTPATH environment variable or by
# setting DOT_FONTPATH to the directory containing the font.
# The default value is: Helvetica.
# This tag requires that the tag HAVE_DOT is set to YES.

DOT_FONTNAME           = Helvetica

# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
# dot graphs.
# Minimum value: 4, maximum value: 24, default value: 10.
# This tag requires that the tag HAVE_DOT is set to YES.

DOT_FONTSIZE           = 10

# By default doxygen will tell dot to use the default font as specified with
# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
# the path where dot can find it using this tag.
# This tag requires that the tag HAVE_DOT is set to YES.

DOT_FONTPATH           =

# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
# each documented class showing the direct and indirect inheritance relations.
# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.

CLASS_GRAPH            = YES

# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
# graph for each documented class showing the direct and indirect implementation
# dependencies (inheritance, containment, and class references variables) of the
# class with other documented classes.
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.

COLLABORATION_GRAPH    = YES

# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
# groups, showing the direct groups dependencies.
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.

GROUP_GRAPHS           = YES

# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
# collaboration diagrams in a style similar to the OMG's Unified Modeling
# Language.
# The default value is: NO.
# This tag requires that the tag HAVE_DOT is set to YES.

UML_LOOK               = NO

# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
# class node. If there are many fields or methods and many nodes the graph may
# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
# number of items for each type to make the size more manageable. Set this to 0
# for no limit. Note that the threshold may be exceeded by 50% before the limit
# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
# but if the number exceeds 15, the total amount of fields shown is limited to
# 10.
# Minimum value: 0, maximum value: 100, default value: 10.
# This tag requires that the tag HAVE_DOT is set to YES.

UML_LIMIT_NUM_FIELDS   = 10

# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
# collaboration graphs will show the relations between templates and their
# instances.
# The default value is: NO.
# This tag requires that the tag HAVE_DOT is set to YES.

TEMPLATE_RELATIONS     = NO

# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
# YES then doxygen will generate a graph for each documented file showing the
# direct and indirect include dependencies of the file with other documented
# files.
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.

INCLUDE_GRAPH          = YES

# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
# set to YES then doxygen will generate a graph for each documented file showing
# the direct and indirect include dependencies of the file with other documented
# files.
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.

INCLUDED_BY_GRAPH      = YES

# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
# dependency graph for every global function or class method.
#
# Note that enabling this option will significantly increase the time of a run.
# So in most cases it will be better to enable call graphs for selected
# functions only using the \callgraph command.
# The default value is: NO.
# This tag requires that the tag HAVE_DOT is set to YES.

CALL_GRAPH             = NO

# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
# dependency graph for every global function or class method.
#
# Note that enabling this option will significantly increase the time of a run.
# So in most cases it will be better to enable caller graphs for selected
# functions only using the \callergraph command.
# The default value is: NO.
# This tag requires that the tag HAVE_DOT is set to YES.

CALLER_GRAPH           = NO

# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
# hierarchy of all classes instead of a textual one.
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.

GRAPHICAL_HIERARCHY    = YES

# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
# dependencies a directory has on other directories in a graphical way. The
# dependency relations are determined by the #include relations between the
# files in the directories.
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.

DIRECTORY_GRAPH        = YES

# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
# generated by dot.
# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
# to make the SVG files visible in IE 9+ (other browsers do not have this
# requirement).
# Possible values are: png, jpg, gif and svg.
# The default value is: png.
# This tag requires that the tag HAVE_DOT is set to YES.

DOT_IMAGE_FORMAT       = png

# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
# enable generation of interactive SVG images that allow zooming and panning.
#
# Note that this requires a modern browser other than Internet Explorer. Tested
# and working are Firefox, Chrome, Safari, and Opera.
# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
# the SVG files visible. Older versions of IE do not have SVG support.
# The default value is: NO.
# This tag requires that the tag HAVE_DOT is set to YES.

INTERACTIVE_SVG        = NO

# The DOT_PATH tag can be used to specify the path where the dot tool can be
# found. If left blank, it is assumed the dot tool can be found in the path.
# This tag requires that the tag HAVE_DOT is set to YES.

DOT_PATH               =

# The DOTFILE_DIRS tag can be used to specify one or more directories that
# contain dot files that are included in the documentation (see the \dotfile
# command).
# This tag requires that the tag HAVE_DOT is set to YES.

DOTFILE_DIRS           =

# The MSCFILE_DIRS tag can be used to specify one or more directories that
# contain msc files that are included in the documentation (see the \mscfile
# command).

MSCFILE_DIRS           =

# The DIAFILE_DIRS tag can be used to specify one or more directories that
# contain dia files that are included in the documentation (see the \diafile
# command).

DIAFILE_DIRS           =

# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
# that will be shown in the graph. If the number of nodes in a graph becomes
# larger than this value, doxygen will truncate the graph, which is visualized
# by representing a node as a red box. Note that doxygen if the number of direct
# children of the root node in a graph is already larger than
# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
# Minimum value: 0, maximum value: 10000, default value: 50.
# This tag requires that the tag HAVE_DOT is set to YES.

DOT_GRAPH_MAX_NODES    = 50

# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
# generated by dot. A depth value of 3 means that only nodes reachable from the
# root by following a path via at most 3 edges will be shown. Nodes that lay
# further from the root node will be omitted. Note that setting this option to 1
# or 2 may greatly reduce the computation time needed for large code bases. Also
# note that the size of a graph can be further restricted by
# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
# Minimum value: 0, maximum value: 1000, default value: 0.
# This tag requires that the tag HAVE_DOT is set to YES.

MAX_DOT_GRAPH_DEPTH    = 0

# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
# background. This is disabled by default, because dot on Windows does not seem
# to support this out of the box.
#
# Warning: Depending on the platform used, enabling this option may lead to
# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
# read).
# The default value is: NO.
# This tag requires that the tag HAVE_DOT is set to YES.

DOT_TRANSPARENT        = NO

# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
# files in one run (i.e. multiple -o and -T options on the command line). This
# makes dot run faster, but since only newer versions of dot (>1.8.10) support
# this, this feature is disabled by default.
# The default value is: NO.
# This tag requires that the tag HAVE_DOT is set to YES.

DOT_MULTI_TARGETS      = YES

# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
# explaining the meaning of the various boxes and arrows in the dot generated
# graphs.
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.

GENERATE_LEGEND        = YES

# If the DOT_CLEANUP tag is set to YES doxygen will remove the intermediate dot
# files that are used to generate the various graphs.
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.

DOT_CLEANUP            = YES


================================================
FILE: doc/Makefile.am
================================================

EXTRA_DIST = \
    buffer.dox \
    cert-key-format.dox \
    constants.dox \
    example-echo.dox \
    mainpage.dox \
    noise-certificate.dox \
    noise-certificate.proto \
    Doxyfile


================================================
FILE: doc/buffer.dox
================================================
/*
 * Copyright (C) 2016 Southern Storm Software, Pty Ltd.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included
 * in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 */

/**
\file buffer.h
\brief Buffer management.
*/

/**
 * \defgroup buffer_management Buffer management API
 *
 * This API defines types and macros to help with managing the passing
 * of buffers to the Noise-C library.  NoiseBuffer objects carry their
 * current and maximum sizes around with them wherever they go.  The intention
 * is that applications that use NoiseBuffer are less likely to create a
 * buffer overrun situation because the maximum size is always available
 * for checking and never implicit.
 */
/**@{*/

/**
 * \struct NoiseBuffer
 * \brief Type that defines a region of memory for a data buffer.
 */

/**
 * \def noise_buffer_init(buffer)
 * \brief Initializes all fields of a buffer to zero.
 */

/**
 * \def noise_buffer_set_output(buffer, ptr, len)
 * \brief Sets a NoiseBuffer object to point to an output memory region.
 *
 * \param buffer The NoiseBuffer object to set.
 * \param ptr Pointer to the start of the memory region for the buffer.
 * \param len Length of the memory region in bytes.
 *
 * The buffer's current size is set to zero and its maximum size is
 * set to \a len.
 *
 * This macro is intended for initializing a region of memory to
 * receive data that was output by a Noise-C function.  The maximum
 * size indicates how many bytes can be output into the region
 * before overflow occurs.
 */

/**
 * \def noise_buffer_set_input(buffer, ptr, len)
 * \brief Sets a NoiseBuffer object to point to an input memory region.
 *
 * \param buffer The NoiseBuffer object to set.
 * \param ptr Pointer to the start of the memory region for the buffer.
 * \param len Length of the memory region in bytes.
 *
 * The buffer's current and maximum size are both set to \a len.
 *
 * This macro is intended for passing an existing region of memory to a
 * Noise-C function.  It is typically used for input values.
 */

/**
 * \def noise_buffer_set_inout(buffer, ptr, len, max)
 * \brief Sets a NoiseBuffer object to point to an input-output memory region.
 *
 * \param buffer The NoiseBuffer object to set.
 * \param ptr Pointer to the start of the memory region for the buffer.
 * \param len Length of the memory region in bytes on input.
 * \param max Maximum length of the memory region in bytes.
 *
 * This function is intended for use when transforming a region of memory;
 * for example to encrypt or decrypt it.  The original size is \a len
 * and during transformation the region can grow in size to no more
 * than \a max.
 */

/**@}*/


================================================
FILE: doc/cert-key-format.dox
================================================
/*
 * Copyright (C) 2016 Southern Storm Software, Pty Ltd.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included
 * in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 */

/**
\file cert-key-format.dox
\page cert_key_format Certificate and private key format

\tableofcontents

This document describes certificate and private key formats that
are proposed for use in implementations of Noise.

The certificate format is represented on the wire using
<a href="https://developers.google.com/protocol-buffers/">Protocol Buffers</a>
or "protobufs" for short.  The full protocol description is contained
in the \ref noise_certificate_proto "noise-certificate.proto" file
in the Noise-C distribution.

\section cert_examples Certificate format examples

The following is an example of a certificate for "Jane Smith" that has been
signed by "Trent Peoples".  To make things easier, we will use a simplified
text syntax for describing the contents of a protobuf message.  The data is
actually encoded in binary on the wire using the standard
<a href="https://developers.google.com/protocol-buffers/docs/encoding">Protocol
Buffers Encoding</a>.

\code
Certificate {
    version: 1
    subject: SubjectInfo {
        id: "jane.smith@example.com"
        name: "Jane Smith"
        role: "foo-chat-user"
        keys: [
            PublicKeyInfo {
                algorithm: "25519"
                key: "0xf14a2dedf6e1dd879a3af47900eedf17ae56868a7849a370ca732a571ef19e0f"
            }
            PublicKeyInfo {
                algorithm: "448"
                key: "0xd414a46bed6231540306818bdab08d8b06a28d98d0bfca47bcea1faf1aca78d8aabc7d7c2073779bd84cf0950ae10247975266267eebb1c8"
            }
        ]
    }
    signatures: [
        Signature {
            id: "tpeoples@example.org"
            name: "Trent Peoples"
            signing_key: PublicKeyInfo {
                algorithm: "Ed25519"
                key: "0x0fdde4a7a7cc91ec509a74bd5f2369ac768a14bb6388ceb2e1710a4b85bfe001"
            }
            hash_algorithm: "BLAKE2b"
            extra_signed_info: ExtraSignedInfo {
                nonce: "0xa2bf177b31bd60ee0e8e00097d88e48e"
                valid_from: "2016-03-15T00:00:00Z"
                valid_to: "2026-03-15T23:59:59Z"
            }
            signature: "0x40fa37936793009750ca45e9ef1eb246eaaded93ddd356e7120e0dc171cfa51ff26b7d7a95ba9498d717bff6b9e5d5eeb0a4bbdbf7bcd8c5c4b617da36a68ed9"
        }
    ]
}
\endcode

Here, Jane has declared that her Curve25519 and Curve448 Diffie-Hellman keys
will be used in the "foo-chat-user" role.  Trent then accepted that role,
hashed the certificate data with "BLAKE2b", and added his signature using the
"Ed25519" algorithm.

The signature covers the contents of the "subject" and "extra_signed_info"
fields, represented in the standard
<a href="https://developers.google.com/protocol-buffers/docs/encoding">Protocol
Buffers Encoding</a>.  The encoding MUST be "canonical" in that all integer
values, field tag numbers, and field lengths are represented using the
minimum number of bytes for the value, and the fields are listed strictly
in order of field tag number.

Multiple signature blocks can be included from multiple signers:

\code
signatures: [
    Signature {
        id: "tpeoples@example.org"
        name: "Trent Peoples"
        signing_key: PublicKeyInfo {
            algorithm: "Ed25519"
            key: "0x0fdde4a7a7cc91ec509a74bd5f2369ac768a14bb6388ceb2e1710a4b85bfe001"
        }
        hash_algorithm: "BLAKE2b"
        extra_signed_info: ExtraSignedInfo {
            nonce: "0xa2bf177b31bd60ee0e8e00097d88e48e"
            valid_from: "2016-03-15T00:00:00Z"
            valid_to: "2026-03-15T23:59:59Z"
        }
        signature: "0x40fa37936793009750ca45e9ef1eb246eaaded93ddd356e7120e0dc171cfa51ff26b7d7a95ba9498d717bff6b9e5d5eeb0a4bbdbf7bcd8c5c4b617da36a68ed9"
    }
    Signature {
        id: "mary.sue@example.com"
        name: "Mary Sue"
        signing_key: PublicKeyInfo {
            algorithm: "Ed25519"
            key: "0x8e15998d97f9b43150f05d1b895f5272a2ff1453dbf40ee4ea90df81147db5c3"
        }
        hash_algorithm: "SHA512"
        extra_signed_info: ExtraSignedInfo {
            nonce: "0x024e95d2a060df2be5e1fbdfe8e31c58"
            valid_from: "2015-05-17T00:00:00Z"
            valid_to: "2025-05-17T23:59:59Z"
        }
        signature: "0x833243ed18ac609880446c1ea147f6322db98ef9d2eaba30ece46bf7cabe50cd822fbe369f4c9c6bd8a5a5f400fff732f1a29c4113e12cb23138733ca880126d"
    }
]
\endcode

Each signature is independent, covering the "subject" information and
continuing with the "extra_signed_info" details for the specific signer.
In the above example, Mary's signature does not include the details
from Trent.  The certificate would be equally valid with Mary's signature
listed first.

Because the signatures are independent, new signatures can be added to
the end of the certificate at any time.  Or old signatures can be removed
from the certificate at any time.  Any remaining signatures will remain
valid as they only vouch for Jane's identity, not the identity of
the other signers.

This approach also allows certificates to be trimmed when they are sent
in Noise packets.  If the client is communicating with a server that
trusts Trent as a certificate authority, then there is no need to send
the signature block for Mary.  Certificates may also be trimmed to
hide the identity of additional signers from remote parties that do not
need to know about those signers.

\note Signatures provide additional information that may help bind a key
to an identity for specific use cases, but signatures are not necessary
for secure communication to occur.  Protocols should keep this in mind
when using Noise certificates.  The lack of a signature does not imply
that the user is untrustworthy.  It only implies that the user has not
found anyone yet who they trust to sign their certificate.  Other
strategies such as "Trust On First Use" can be used to manage certificates
that lack signatures.

\section cert_format Certificate format details

The format details below are specified in the
<a href="https://developers.google.com/protocol-buffers/docs/proto3">proto3</a>
language.

\subsection cert_overall_format Top level of certificates and certificate chains

The top level of a certificate contains a version number, information about
the subject, and any optional signatures:

\dontinclude noise-certificate.proto
\skip message Certificate
\until }

The version number MUST be 1 for this version of the format.

In all of the definitions here, field tags 1 to 15 are intended for use
by this format description (or future versions of it).  Field tags 16
and higher are available for private use extensions, although this shouldn't
be necessary because the "meta" field described later provides a standard
way to add extensions.

Certificate chains are a list of one or more certificates:

\dontinclude noise-certificate.proto
\skip message CertificateChain
\until }

The field tag number on the certificates in a chain is deliberately set to 8,
which is different than any of the field tags in "Certificate".  This allows
applications to quickly determine if the supplied data is a single certificate
or a certificate chain.

When a chain of certificates is given, the first is assumed to be the subject
with the remainder of the certificates intended to provide additional
information to verify the subject.

\subsection cert_subject Subject information

\dontinclude noise-certificate.proto
\skip message SubjectInfo
\until }

<tt>id</tt> - The identity of the subject, formatted as "foo@domain"
and encoded in UTF-8.  The <tt>Id</tt> may look like an e-mail address
but it doesn't have to be.  It only needs to be unique in the context
of the larger Noise protocol.

<tt>name</tt> - The name of the subject for the certificate.  This string
is intended to be human-readable and MUST be encoded in UTF-8.  If the
<tt>name</tt> is not present, <tt>id</tt> can be displayed to the human user
instead.

Both <tt>id</tt> and <tt>name</tt> are OPTIONAL.  If neither are present,
then the subject is identified by their public key fingerprint.  This option
is provided to protect the identity of anonymous users.  A pseudonym could
be used instead, but pseudonym use is not required.

<tt>role</tt> - The role that the subject's keys are intended to be used for.
There are no predefined roles yet and the field can be omitted.  The role
may be an application name; e.g. "foo-chat", or a sub-role within an
application; e.g. "foo-chat-user" and "foo-chat-server".

<tt>keys</tt> - List of public keys for the subject.

\dontinclude noise-certificate.proto
\skip message PublicKeyInfo
\until }

<tt>meta</tt> - Extra meta information about the subject as a list of
freeform name/value pairs:

\dontinclude noise-certificate.proto
\skip message MetaInfo
\until }

MetaInfo blocks may be used to add extra information that is of interest
to an application.  For example, "Foo-Nickname" may convey the nickname
of a user for the "foo-chat" application.  For privacy reasons, any meta
information that may identify the user MUST be OPTIONAL.  Applications
SHOULD use meta names that are obviously unique to that application to
avoid conflict with other applications.

\subsection cert_signature Signature blocks

\dontinclude noise-certificate.proto
\skip message Signature
\until }

The <tt>id</tt> and <tt>name</tt> fields have the same format and meaning
as for subject information blocks.  In this case they identify the signer.
Both fields can be omitted to hide the identity of the signer.

The <tt>signing_key</tt> field specifies the algorithm name and public key
that was used to sign the certificate.

The <tt>hash_algorithm</tt> indicates the algorithm that was used to
hash the subject information and <tt>extra_signed_info</tt>.  It should be
one of <tt>BLAKE2s</tt>, <tt>BLAKE2b</tt>, <tt>SHA256</tt>, or
<tt>SHA512</tt>.  <tt>BLAKE2b</tt> or <tt>SHA512</tt> is recommended
to ensure signature longevity.

The <tt>extra_signed_info</tt> field contains information that is signed
along with the subject information:

\dontinclude noise-certificate.proto
\skip message ExtraSignedInfo
\until }

The <tt>nonce</tt> is an extra pseudorandom value added by the signer,
which ensures that multiple signatures for the same subject from
the same signer will be different.  The value should be considered
opaque.  It is recommended that it consist of at least 128 bits
of pseudorandom data.  This field SHOULD be included.  It MAY be omitted
for anonymous users to avoid the watermarking problems described under
\ref cert_other "Other issues" below.  The <tt>valid_from</tt> field SHOULD
be included in this case to provide a fallback nonce that is different
between signatures.

The <tt>valid_from</tt> and <tt>valid_to</tt> OPTIONAL fields indicate
the starting and ending times for the validity of the signature.
Note: This is the validity of the signature, not of the certificate.
The signer is not saying "this key is valid for this period" but
rather "I do not vouch for this certificate outside this time period".
The subject information may remain valid for much longer.  The format MUST
comply with <a href="https://en.wikipedia.org/wiki/ISO_8601">ISO 8601</a>
as profiled in <a href="https://tools.ietf.org/html/rfc3339">RFC 3339</a>.

The <tt>signature</tt> field MUST be the last line in the <tt>Signature</tt>
block, and contains the actual signature produced with the <tt>signing_key</tt>
and <tt>hash_algorithm</tt>.

If there were any existing <tt>Signature</tt> blocks in the
certificate to be signed, they are ignored when calculating the hash.
The new signature block is inserted at the end of the certificate.

\subsection cert_other Other issues

Any strings that are read from a certificate and presented to a human
user should be preprocessed to remove or transform control characters or
other data that may be problematic for the output device.  The security
considerations from <a href="https://tools.ietf.org/html/rfc3629">RFC 3629</a>
should be kept in mind to ensure that all strings are strict UTF-8.

The <tt>nonce</tt> value and implementation-specific meta fields could be
used to watermark users who otherwise wish to remain anonymous.  Once a
certificate is signed, the subject will need to import the signature into
their key ring.  At this point the subject can see if any extra fields
were inserted that concern them and reject the signature.

The <tt>nonce</tt> field is opaque and non-obvious but highly recommended
to deal with duplicate signatures for the same subject key.  The <tt>nonce</tt>
field MAY be omitted by a signer from certificates if they wish to provide
some assurance to anonymous users that they have not watermarked the
signature.  The <tt>valid_from</tt> field is used as a fallback nonce
for this case.

Anonymous users can choose to reject signatures that include a
<tt>nonce</tt>.  They should also carefully inspect the <tt>valid_from</tt>
and <tt>valid_to</tt> timestamps.  Odd date or time values might provide
another opportunity to include watermarking bits.

The main protection against this is disclosure.  If it was discovered
that well-known signing authorities were watermarking certificates,
affected users can remove the offending signatures and seek new signers.

Signers may require some kind of proof that the subject is in possession
of the relevant key before adding a signature.  For Diffie-Hellman keys,
the Noise protocol itself provides handshake patterns that can prove key
possession.

A hypothetical certificate issuing protocol should check that the static
public key for the session matches that in the supplied certificate.
This does become more complex if the subject has multiple encryption keys
or signing keys.  Multiple requests may be necessary to prove ownership
of the additional keys.

\section key_format Encrypted private key format

The private key information is similar to the subject information from the
certificate format:

\dontinclude noise-certificate.proto
\skip message PrivateKey
\until }
\skip message PrivateKeyInfo
\until }

The format of "PrivateKey" and "PrivateKeyInfo" are identical to
"SubjectInfo" and "PublicKeyInfo", which may allow applications to
share the format handling code between the two use cases if they so wish.

The private key information is encrypted to protect it inside an
"EncryptedPrivateKey" wrapper:

\dontinclude noise-certificate.proto
\skip message EncryptedPrivateKey
\until }

For example:

\code
EncryptedPrivateKey {
    version: 1
    algorithm: "ChaChaPoly_BLAKE2b_PBKDF2"
    salt: "0x1621bb322ca96658eb6172d01031845f"
    iterations: 50000
    encrypted_data: "0x..."
}
\endcode

The <tt>version</tt> must be 1 for this version of the encrypted
private key format.

The <tt>algorithm</tt> indicates the cipher, hash, and KDF schemes that
are used to protect the private key.  Any Noise cipher or hash algorithm
supported by the application can be used, although "ChaChaPoly_BLAKE2b_PBKDF2"
is recommended for minimum interoperability.

The only KDF algorithm that is defined at present is PBKDF2 from
<a href="https://www.ietf.org/rfc/rfc2898.txt">RFC 2898</a>.  The
<tt>salt</tt> and <tt>iterations</tt> fields are two of the parameters
to PBKDF2 (the other being the passphrase).

Other KDF algorithms may be defined in the future.  The <tt>salt</tt>
and <tt>iterations</tt> fields can be repurposed to contain whatever
parameters those KDF algorithms require.

As an example, the algorithm identifier "ChaChaPoly_BLAKE2b_PBKDF2" is
implemented as follows.  PBKDF2 is used with BLAKE2b to generate an
encryption key and nonce for ChaChaPoly.  The first 32 bytes of the PBKDF2
output are used as the encryption key.  The next 8 bytes of the PBKDF2 output
are interpreted as a big-endian 64-bit value and used as the nonce.
The entirety of the private key details are encrypted in a single request,
which limits the size to 65535 bytes including the MAC.

\note The nonce value 2^64 - 1 (0xFFFFFFFFFFFFFFFF) is reserved by
revision 30 of the Noise specification.  If the PBKDF2 hashing process
generates such a nonce, then the implementation should generate a new
salt and hash the passphrase again.  This situation is highly unlikely.

The <tt>salt</tt> SHOULD be at least 16 bytes in length, and MAY be longer
at the implementation's discretion.  The unsigned 32-bit <tt>iteration</tt>
count should be large enough to make dictionary attacks on the private key
file time-consuming on current hardware.

Encrypted private keys can be a hassle for servers and other systems
that run unattended.  Such systems may need to use a static passphrase,
even if only the empty passphrase.

The field tag numbers on "EncryptedPrivateKey" are deliberately different
than those for "Certificate" and "CertificateChain" so that an application
can easily determine what type of data it is processing.  Applications may
use this to cross-check that a private key is not accidentally sent
over the wire as a certificate.

\section fingerprints Public key fingerprints

When displaying a public key to a human user, the public key SHOULD
be hashed with SHA256 with the first 16 bytes of the value formatted
in hexadecimal, separated by colons.  For example:

\code
34:da:01:7b:07:e1:a0:0d:64:14:be:e9:af:cf:db:7b
\endcode

Fingerprints MAY be calculated with other hash algorithms or MAY
include more than 16 bytes.  However, SHA256 with truncation is
RECOMMENDED to improve interoperability of fingerprints between
implementations.

*/


================================================
FILE: doc/constants.dox
================================================
/*
 * Copyright (C) 2016 Southern Storm Software, Pty Ltd.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included
 * in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 */

/**
\file constants.h
\brief Constants for algorithm identifiers, limit values, etc
*/

/**
 * \def NOISE_ID(ch, num)
 * \brief Builds an algorithm identifier for the library.
 *
 * \param ch ASCII character that names the algorithm category;
 * e.g. 'C' for ciphers, 'P' for handshake patterns, 'E' for errors, etc.
 * \param num Code for the specific identifier, 0 to 255.  The value 0 is
 * reserved for category values.
 *
 * \return 16-bit integer value for the algorithm identifier.
 *
 * This macro was deliberately designed to output a 16-bit identifier
 * so that identifiers would fit in an "int" on 8-bit and 16-bit
 * embedded systems.
 */

/**
 * \defgroup cipher_id Cipher algorithm identifiers
 */
/**@{*/

/**
 * \def NOISE_CIPHER_NONE
 * \brief Cipher identifier that indicates "no cipher".
 */

/**
 * \def NOISE_CIPHER_CATEGORY
 * \brief Category for cipher algorithms.
 *
 * Intended for use with noise_name_to_id() and noise_id_to_name().
 */

/**
 * \def NOISE_CIPHER_CHACHAPOLY
 * \brief Cipher identifier for "ChaChaPoly".
 */

/**
 * \def NOISE_CIPHER_AESGCM
 * \brief Cipher identifier for "AESGCM".
 */

/**@}*/

/**
 * \defgroup hash_id Hash algorithm identifiers
 */
/**@{*/

/**
 * \def NOISE_HASH_NONE
 * \brief Hash identifier that indicates "no hash".
 */

/**
 * \def NOISE_HASH_CATEGORY
 * \brief Category for hash algorithms.
 *
 * Intended for use with noise_name_to_id() and noise_id_to_name().
 */

/**
 * \def NOISE_HASH_BLAKE2s
 * \brief Hash identifier for "BLAKE2s".
 */

/**
 * \def NOISE_HASH_BLAKE2b
 * \brief Hash identifier for "BLAKE2b".
 */

/**
 * \def NOISE_HASH_SHA256
 * \brief Hash identifier for "SHA256".
 */

/**
 * \def NOISE_HASH_SHA512
 * \brief Hash identifier for "SHA512".
 */

/**@}*/

/**
 * \defgroup dh_id Diffie-Hellman algorithm identifiers
 */
/**@{*/

/**
 * \def NOISE_DH_NONE
 * \brief Diffie-Hellman identifier that indicates "no DH".
 */

/**
 * \def NOISE_DH_CATEGORY
 * \brief Category for Diffie-Hellman algorithms.
 *
 * Intended for use with noise_name_to_id() and noise_id_to_name().
 */

/**
 * \def NOISE_DH_CURVE25519
 * \brief Diffie-Hellman identifier for "25519".
 */

/**
 * \def NOISE_DH_CURVE448
 * \brief Diffie-Hellman identifier for "448".
 */

/**
 * \def NOISE_DH_NEWHOPE
 * \brief Diffie-Hellman identifier for "NewHope" (post-quantum,
 * ephemeral key exchanges only).
 */

/**@}*/

/**
 * \defgroup pattern_id Handshake pattern identifiers
 */
/**@{*/

/**
 * \def NOISE_PATTERN_NONE
 * \brief Handshake pattern identifier that indicates "no pattern".
 */

/**
 * \def NOISE_PATTERN_CATEGORY
 * \brief Category for handshake patterns.
 *
 * Intended for use with noise_name_to_id() and noise_id_to_name().
 */

/**
 * \def NOISE_PATTERN_N
 * \brief Handshake pattern identifier for "N".
 */

/**
 * \def NOISE_PATTERN_X
 * \brief Handshake pattern identifier for "X".
 */

/**
 * \def NOISE_PATTERN_K
 * \brief Handshake pattern identifier for "K".
 */

/**
 * \def NOISE_PATTERN_NN
 * \brief Handshake pattern identifier for "NN".
 */

/**
 * \def NOISE_PATTERN_NK
 * \brief Handshake pattern identifier for "NK".
 */

/**
 * \def NOISE_PATTERN_NX
 * \brief Handshake pattern identifier for "NX".
 */

/**
 * \def NOISE_PATTERN_XN
 * \brief Handshake pattern identifier for "XN".
 */

/**
 * \def NOISE_PATTERN_XK
 * \brief Handshake pattern identifier for "XK".
 */

/**
 * \def NOISE_PATTERN_XX
 * \brief Handshake pattern identifier for "XX".
 */

/**
 * \def NOISE_PATTERN_KN
 * \brief Handshake pattern identifier for "KN".
 */

/**
 * \def NOISE_PATTERN_KK
 * \brief Handshake pattern identifier for "KK".
 */

/**
 * \def NOISE_PATTERN_KX
 * \brief Handshake pattern identifier for "KX".
 */

/**
 * \def NOISE_PATTERN_IN
 * \brief Handshake pattern identifier for "IN".
 */

/**
 * \def NOISE_PATTERN_IK
 * \brief Handshake pattern identifier for "IK".
 */

/**
 * \def NOISE_PATTERN_IX
 * \brief Handshake pattern identifier for "IX".
 */

/**
 * \def NOISE_PATTERN_XX_FALLBACK
 * \brief Handshake pattern identifier for "XXfallback".
 */

/**
 * \def NOISE_PATTERN_X_NOIDH
 * \brief Handshake pattern identifier for "Xnoidh".
 */

/**
 * \def NOISE_PATTERN_NX_NOIDH
 * \brief Handshake pattern identifier for "NXnoidh".
 */

/**
 * \def NOISE_PATTERN_XX_NOIDH
 * \brief Handshake pattern identifier for "XXnoidh".
 */

/**
 * \def NOISE_PATTERN_KX_NOIDH
 * \brief Handshake pattern identifier for "KXnoidh".
 */

/**
 * \def NOISE_PATTERN_IK_NOIDH
 * \brief Handshake pattern identifier for "IKnoidh".
 */

/**
 * \def NOISE_PATTERN_IX_NOIDH
 * \brief Handshake pattern identifier for "IXnoidh".
 */

/**@}*/

/**
 * \defgroup prefix_id Protocol prefix identifiers
 */
/**@{*/

/**
 * \def NOISE_PREFIX_NONE
 * \brief Protocol prefix identifier that indicates "no prefix".
 */

/**
 * \def NOISE_PREFIX_CATEGORY
 * \brief Category for protocol prefixes.
 *
 * Intended for use with noise_name_to_id() and noise_id_to_name().
 */

/**
 * \def NOISE_PREFIX_STANDARD
 * \brief Protocol prefix identifier for "Noise".
 */

/**
 * \def NOISE_PREFIX_PSK
 * \brief Protocol prefix identifier for "NoisePSK".
 */

/**@}*/

/**
 * \defgroup signature_id Signature algorithm identifiers
 */
/**@{*/

/**
 * \def NOISE_SIGN_NONE
 * \brief Signature algorithm identifier that indicates "no algorithm".
 */

/**
 * \def NOISE_SIGN_CATEGORY
 * \brief Category for signature algorithms.
 *
 * Intended for use with noise_name_to_id() and noise_id_to_name().
 */

/**
 * \def NOISE_SIGN_ED25519
 * \brief Signature algorithm identifier for "Ed25519".
 */

/**@}*/

/**
 * \defgroup roles Initiator/responder role codes
 */
/**@{*/

/**
 * \def NOISE_ROLE_INITIATOR
 * \brief This end of the communications is the initiator.
 */

/**
 * \def NOISE_ROLE_RESPONDER
 * \brief This end of the communications is the responder.
 */

/**@}*/

/**
 * \defgroup actions HandshakeState action codes
 */
/**@{*/

/**
 * \def NOISE_ACTION_NONE
 * \brief No action is required of the application yet because the
 * handshake has not started.
 */

/**
 * \def NOISE_ACTION_WRITE_MESSAGE
 * \brief The HandshakeState expects the application to write the
 * next message payload for the handshake.
 */

/**
 * \def NOISE_ACTION_READ_MESSAGE
 * \brief The HandshakeState expects the application to read the
 * next message payload from the handshake.
 */

/**
 * \def NOISE_ACTION_FAILED
 * \brief The HandshakeState has flagged that the handshake has failed
 * due to some kind of error.
 */

/**
 * \def NOISE_ACTION_SPLIT
 * \brief The HandshakeState has flagged that the handshake is over and
 * that the application is expected to call noise_handshake_split() and
 * begin data session communications.
 */

/**
 * \def NOISE_ACTION_COMPLETE
 * \brief The HandshakeState has flagged that the handshake is over and
 * and that noise_handshake_split() has been called to begin data session
 * communications.
 */

/**@}*/

/**
 * \defgroup padding_modes Padding modes
 */
/**@{*/

/**
 * \def NOISE_PADDING_ZERO
 * \brief Pads messages with zero bytes.
 */

/**
 * \def NOISE_PADDING_RANDOM
 * \brief Pads messages with random bytes.
 */

/**@}*/

/**
 * \defgroup fingerprint_types Fingerprint types
 */
/**@{*/

/**
 * \def NOISE_FINGERPRINT_BASIC
 * \brief Fingerprint format is the hexadecimal encoding of the first
 * 16 bytes of the SHA256 hash of the public key.
 */

/**
 * \def NOISE_FINGERPRINT_FULL
 * \brief Fingerprint format is the hexadecimal encoding of the entire
 * 32 bytes of the SHA256 hash of the public key.
 */

/**
 * \def NOISE_MAX_FINGERPRINT_LEN
 * \brief Recommended maximum size for buffers to be passed to
 * noise_format_fingerprint(), noise_dhstate_format_fingerprint(), etc.
 */

/**@}*/

/**
 * \defgroup errors Error codes
 */
/**@{*/

/**
 * \def NOISE_ERROR_NONE
 * \brief Success, no error.
 */

/**
 * \def NOISE_ERROR_NO_MEMORY
 * \brief Insufficient memory to complete the operation.
 */

/**
 * \def NOISE_ERROR_UNKNOWN_ID
 * \brief Algorithm identifier is unknown.
 */

/**
 * \def NOISE_ERROR_UNKNOWN_NAME
 * \brief Algorithm name is unknown.
 */

/**
 * \def NOISE_ERROR_MAC_FAILURE
 * \brief MAC check failed on an incoming packet.
 */

/**
 * \def NOISE_ERROR_INVALID_LENGTH
 * \brief Invalid length specified for a key, packet, etc.
 */

/**
 * \def NOISE_ERROR_INVALID_PARAM
 * \brief Invalid parameter to function; e.g. a NULL value.
 */

/**
 * \def NOISE_ERROR_INVALID_STATE
 * \brief Operation cannot be performed in the current state.
 *
 * For example, attempting to encrypt or decrypt with a CipherState
 * before setting the key.
 */

/**
 * \def NOISE_ERROR_INVALID_NONCE
 * \brief Invalid nonce value.
 *
 * Typically this is reported when the 64-bit nonce value wraps around.
 */

/**
 * \def NOISE_ERROR_INVALID_PRIVATE_KEY
 * \brief Invalid private key value.
 */

/**
 * \def NOISE_ERROR_INVALID_PUBLIC_KEY
 * \brief Invalid public key value.
 */

/**
 * \def NOISE_ERROR_INVALID_FORMAT
 * \brief Invalid format for packet or key file.
 */

/**
 * \def NOISE_ERROR_INVALID_SIGNATURE
 * \brief Invalid digital signature; does not verify.
 */

/**
 * \def NOISE_ERROR_REMOTE_KEY_REQUIRED
 * \brief A remote static public key is required for the selected protocol,
 * but one was not supplied.
 */

/**
 * \def NOISE_ERROR_LOCAL_KEY_REQUIRED
 * \brief A local keypair is required for the selected protocol, but one
 * was not supplied.
 */

/**
 * \def NOISE_ERROR_PSK_REQUIRED
 * \brief A pre shared key is required for the selected protocol, but one
 * was not supplied.
 */

/**
 * \def NOISE_ERROR_NOT_APPLICABLE
 * \brief An option was supplied that was not applicable to the
 * selected protocol.
 *
 * For example, a pre shared key was supplied to a protocol that does not
 * use pre shared keys.
 */

/**
 * \def NOISE_ERROR_SYSTEM
 * \brief System error, with more information in errno.
 *
 * This code is intended for reporting errors from the underlying
 * operating system, with more information about the specific error
 * in the standard errno variable.
 */

/**@}*/

/**
 * \def NOISE_MAX_PAYLOAD_LEN
 * \brief Maximum payload length for Noise packets.
 *
 * \note Specific protocol instantiations may enforce a smaller limit.
 */

/**
 * \def NOISE_MAX_PROTOCOL_NAME
 * \brief Maximum length of a protocol name string.
 */


================================================
FILE: doc/example-echo.dox
================================================
/*
 * Copyright (C) 2016 Southern Storm Software, Pty Ltd.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included
 * in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 */

/**
\file example-echo.dox
\page example_echo Using Noise-C: Client/Server Echo Example

\tableofcontents

This page describes how to use Noise-C to create a simple client/server
echo system.  This example uses the same wire protocol as the echo example from
<a href="https://github.com/centromere/cacophony#example-code">cacophony</a>,
for testing interoperability between Noise implementations.

The source code for the example is under the <tt>examples/echo</tt>
directory in the Noise-C repository.  There are three programs that
make up the example: <tt>echo-client</tt>, <tt>echo-server</tt>,
and <tt>echo-keygen</tt>.  Here we describe the main points of the
client code to demonstrate how to use Noise-C.  The server side is similar.

\section example_echo_client Creating a Noise-C client application

\subsection example_echo_create_handshake Creating the HandshakeState

The first step in using a HandshakeState is to create it with either the
noise_handshakestate_new_by_name() or noise_handshakestate_new_by_id()
function:

\dontinclude echo-client.c
\skip NoiseHandshakeState *handshake;
\until NoiseHandshakeState
\skip noise_handshakestate_new_by_name
\until }

Here the "protocol" variable is the name of the Noise protocol,
such as "Noise_XX_25519_ChaChaPoly_BLAKE2s".  Because we are writing a
client, the role is \ref NOISE_ROLE_INITIATOR.  The server side uses
\ref NOISE_ROLE_RESPONDER instead.

If an error occurs, the noise_perror() function can be used to print a
simple message to the standard error output in the same way as the
perror() function in C.  If you want to report errors through some
means other than the standard error output, you can use noise_strerror()
to obtain the error string directly.

For the rest of this page we will elide the calls to noise_perror() to
make it easier to understand the code snippets.  Error handling is very
important.  Noise sessions can fail for any number of reasons and
forgetting to check an error return could lead the application to
continue operating when it should stop.

When you no longer need the HandshakeState, the memory should be returned
to the system with noise_handshakestate_free():

\dontinclude echo-client.c
\skip no longer need
\skip noise_handshakestate_free
\until noise_handshakestate_free

\subsection example_echo_setting_keys Setting keys

After the HandshakeState object has been created, the next step is to
specify the prologue, pre shared key, and any public or private keys
that are needed for the handshake.  We start with the prologue:

\code
err = noise_handshakestate_set_prologue(handshake, prologue, prologue_len);
\endcode

We can also set the pre shared key (PSK) value:

\code
err = noise_handshakestate_set_pre_shared_key(handshake, psk, sizeof(psk));
\endcode

Next is the local client private key.  The function
noise_handshakestate_needs_local_keypair() tells us if the handshake
requires a local keypair.

Once we know if we need a keypair, we obtain the local Diffie-Hellman
key object using noise_handshakestate_get_local_keypair_dh() and set
the key with noise_dhstate_set_keypair_private():

\code
if (noise_handshakestate_needs_local_keypair(handshake)) {
    dh = noise_handshakestate_get_local_keypair_dh(handshake);
    key_len = noise_dhstate_get_private_key_length(dh);
    if (!echo_load_private_key(client_private_key, key, key_len))
        return 0;
    err = noise_dhstate_set_keypair_private(dh, key, key_len);
    ...
}
\endcode

In this case we are using a private key only.  Noise-C internally
derives the public key from the private key.  If we had both keys,
then noise_dhstate_set_keypair() can be used to set both.

The public key for the remote server is set in a similar fashion:

\code
if (noise_handshakestate_needs_remote_public_key(handshake)) {
    dh = noise_handshakestate_get_remote_public_key_dh(handshake);
    key_len = noise_dhstate_get_public_key_length(dh);
    if (!echo_load_public_key(server_public_key, key, key_len))
        return 0;
    err = noise_dhstate_set_public_key(dh, key, key_len);
    ...
}
\endcode

\subsection example_echo_run_handshake Running the handshake phase

At this point we have a fully configured HandshakeState object.
The next step is to start the handshake:

\code
err = noise_handshakestate_start(handshake);
\endcode

If there are any missing keys, then this function will fail with an error.

The handshake runs until there are no more packets to be processed.
Each step of the way, the noise_handshakestate_get_action() function
tells the application what needs to be done next.  The two most
important actions are \ref NOISE_ACTION_WRITE_MESSAGE and
\ref NOISE_ACTION_READ_MESSAGE, which indicates whether the application
should write or read the next handshake message.  A typical handshake
processing loop looks like this:

\code
for (;;) {
    int action = noise_handshakestate_get_action(handshake);
    if (action == NOISE_ACTION_WRITE_MESSAGE) {
        ...
    } else if (action == NOISE_ACTION_READ_MESSAGE) {
        ...
    } else {
        break;
    }
}
\endcode

When the application receives \ref NOISE_ACTION_WRITE_MESSAGE,
it should format the next handshake payload and call
noise_handshakestate_write_message() to prepare it for transmission.
The application then transmits what it was given over the transport.

When the application receives \ref NOISE_ACTION_READ_MESSAGE,
it should wait for an incoming message from the transport and pass
it to noise_handshakestate_read_message() to process it and recover
the payload.

This process continues until the action is either \ref NOISE_ACTION_FAILED
or \ref NOISE_ACTION_SPLIT.  An action of \ref NOISE_ACTION_SPLIT
indicates that the handshake has completed successfully and the
application should move onto the data transport phase.

\subsection example_echo_run_transport Running the data transport phase

Once the handshake completes successfully, we can "split" the HandshakeState
into two CipherState objects, one for sending and the other for receiving:

\code
err = noise_handshakestate_split(handshake, &send_cipher, &recv_cipher);
\endcode

If the remote side provided its public key during the handshake,
then noise_handshakestate_get_remote_public_key_dh() and
noise_dhstate_get_public_key() can be used to retrieve it at this point.

The HandshakeState is now no longer required and we can discard it:

\code
noise_handshakestate_free(handshake);
\endcode

From now on, whenever the application has data to send, it calls
noise_cipherstate_encrypt() or noise_cipherstate_encrypt_with_ad()
on the sending CipherState, and then writes the resulting packet to
the transport.

Whenever the application receives an incoming packet, it calls
noise_cipherstate_decrypt() or noise_cipherstate_decrypt_with_ad()
on the receiving CipherState to decrypt it, and then processes the
contents if the decryption succeeded.

This process continues until the connection is terminated or an
error occurs.  The final step is to clean up the two CipherState objects:

\code
noise_cipherstate_free(send_cipher);
noise_cipherstate_free(recv_cipher);
\endcode

\section example_echo_using Using the echo example

This section describes how to use the echo example: how to generate keys,
how to start an echo server running, and how to connect to it using an
echo client.

\subsection example_echo_keygen Generating keys

The echo example uses a very simple key format.  Private key files are
binary data containing the 32 or 56 bytes of the private key, for Curve25519
and Curve448 respectively.  Public key files contain the base64 encoding of
the 32 or 56 byte public key values.

The <tt>echo-keygen</tt> example can be used to generate new keys or you can
use the keys from cacophony.  To generate a new key for Curve25519, you would
invoke the key generator as follows:

\code
echo-keygen 25519 client_key_25519 client_key_25519.pub
\endcode

The arguments are the curve type ("25519" or "448"), the name of the private
key file, and the name of the public key file.

The server needs a full set of keys, so here's how to generate them all:

\code
echo-keygen 25519 client_key_25519 client_key_25519.pub
echo-keygen 25519 server_key_25519 server_key_25519.pub
echo-keygen 448 client_key_448 client_key_448.pub
echo-keygen 448 server_key_448 server_key_448.pub
\endcode

\subsection example_echo_start_server Starting an echo server

A new echo server can be started with the following command:

\code
echo-server --key-dir=../keys 7000
\endcode

The server will look in <tt>key-dir</tt> for the keys that were generated
earlier.  If <tt>--key-dir</tt> is omitted, it defaults to the current
directory.

The pre-shared key value is loaded from the "psk" file in the key
directory.  It is assumed to be a 32 byte value encoded in base64.
Pre-shared keys are only used if the client selects them.

The final argument is the port number for the server to bind to.

\subsection example_echo_start_client Running the echo client

To use the client, specify the Noise protocol name, server hostname,
and server port number on the command-line:

\code
echo-client Noise_NN_25519_AESGCM_SHA256 hostname 7000
\endcode

In this case we are using the "NN" pattern which does not require any
additional local or remote static keys.  If keys are required, they can
be provided via options:

\code
echo-client --client-private-key=client_key_448 \
            --server-public-key=server_key_448.pub \
            Noise_KK_448_ChaChaPoly_BLAKE2b hostname 7000

echo-client --client-private-key=client_key_448 \
            --server-public-key=server_key_448.pub \
            --psk=pskfile \
            NoisePSK_KK_448_ChaChaPoly_BLAKE2b hostname 7000
\endcode

After performing the handshake, the client reads lines of text from its
standard input and sends them to the server.  After each line, the client
will wait for a packet from the server and then will write its contents to
standard output prefixed by `Received`:

\code
Hello!
Received: Hello!
What day is it?
Received: What day is it?
\endcode

If the keys supplied to the client do not match those used by the server,
the connection will abort with a "MAC failure".

The <tt>--padding</tt> option can be supplied to cause the client to pad
all outgoing messages to a uniform size with random data.  The padding will
be stripped when the echo returns from the server.

The <tt>--verbose</tt> or <tt>-v</tt> option can be supplied to dump the
verbose packet contents that are transmitted or received.
The <tt>--fixed-ephemeral</tt> or <tt>-f</tt> option will force the client
or the server to use a fixed ephemeral key instead of the usual random
ephemeral key.  These options can help diagnose interoperability issues
between different implementations of the echo protocol.

*/


================================================
FILE: doc/mainpage.dox
================================================
/*
 * Copyright (C) 2016 Southern Storm Software, Pty Ltd.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included
 * in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 */

/**
\file mainpage.dox
\mainpage
\tableofcontents

Noise-C is a plain C implementation of the
<a href="http://noiseprotocol.org/">Noise Protocol</a>, intended as a
reference implementation.  It can also be referred to as "Noisy",
which is what you get when you say "Noise-C" too fast.  The code is
distributed under the terms of the MIT license, with the code available from
<a href="https://github.com/rweather/noise-c">github</a>.

\note This project is still a work in progress.  There is still a lot of
cleaning up and example writing to do.

The initial target is GNU/Linux systems, because that's what I have,
but contributions are definitely welcome to make the code work
on other platforms.  Desktop systems will be targeted first and
then embedded systems.  "Make It Work And Then Make It Work Better"
is my motto.

\section algorithms Supported Patterns and Algorithms

\li Specification Level: Revision 30
\li Prefixes: Noise and NoisePSK
\li Patterns: N, X, K, NN, NK, NX, XN, XK, XX, KN, KK, KX, IN, IK, IX,
XXfallback, Xnoidh, NXnoidh, XXnoidh, KXnoidh, IKnoidh, IXnoidh,
NNhfs, NKhfs, NXhfs, XNhfs, XKhfs, XXhfs, KNhfs, KKhfs, KXhfs, INhfs, IKhfs,
IXhfs, XXfallback+hfs, NXnoidh+hfs, XXnoidh+hfs, KXnoidh+hfs, IKnoidh+hfs,
IXnoidh+hfs
\li Diffie-Hellman: 25519, 448
\li Post-Quantum: NewHope
\li Cipher: ChaChaPoly, AESGCM
\li Hash: BLAKE2s, BLAKE2b, SHA256, SHA512
\li Other: Support for Hybrid Forward Secrecy

Note that the post-quantum "NewHope" algorithm only works with the "NN"
handshake pattern because it does not support long-term static keys.
For more information, see the <a href="https://github.com/noiseprotocol/noise_wiki/wiki/Post-Quantum-Noise-with-New-Hope">Post-Quantum Noise with New Hope</a>
page on the Noise wiki.

\section major_apis Major API's

\li \ref handshakestate "HandshakeState"
\li \ref cipherstate "CipherState"

\section supporting_apis Supporting API's

\li \ref symmetricstate "SymmetricState"
\li \ref hashstate "HashState"
\li \ref dhstate "DHState"
\li \ref signstate "SignState"
\li \ref randstate "RandState"
\li \ref keyloader "Key/certificate loading and saving"
\li \ref utils "Utilities"

\section other_info Other information

\li \ref example_echo "Using Noise-C: Client/Server Echo Example"
\li \ref cert_key_format "Certificate and private key file format"

\section dir_structure Directory structure

\li <tt>include/noise/</tt> - Public API definitions for inclusion
    into applications.
\li <tt>src/protocol/</tt> - Source code for the core Noise-C protocol library.
\li <tt>src/protobufs/</tt> - Source code for the Noise-C protobufs library.
\li <tt>src/keys/</tt> - Source code for the key and certificate management
    library.
\li <tt>src/crypto/</tt> - Public domain and open source reference
    implementations of the cryptographic primitives.
\li <tt>src/backend/ref/</tt> - Backends for
    \ref cipherstate "CipherState", \ref hashstate "HashState",
    \ref dhstate "DHState", and \ref signstate "SignState" that use the
    reference cryptographic primitives.
\li <tt>src/backend/openssl/</tt> - OpenSSL crypto backend
\li <tt>src/backend/sodium/</tt> - libsodium crypto backend
\li <tt>tools/protoc/</tt> - Source code for the Noise-C protobufs compiler.
\li <tt>tools/keytool/</tt> - Command-line key and certificate management tool.
\li <tt>tests/unit/</tt> - Unit tests to exercise the library's functionality.
\li <tt>tests/vector/</tt> - Public JSON test vectors and test harness for
    the Noise protocol.
\li <tt>tests/vector-gen/</tt> - Generates test vectors in JSON format.
\li <tt>tests/performance/</tt> - Performance tests for the cryptographic
    primitives.
\li <tt>examples/</tt> - Source code for examples.
\li <tt>doc/</tt> - Overview and example documentation.

\section building Building

The library uses autoconf and automake for the Makefile structure.
You will need to have these installed to build from the sources in the
git repository.  Bison and Flex are also requred to build the
<tt>noise-protoc</tt> protobuf compiler.

To build the library under GNU/Linux and run the tests, type the following:

\code
$ autoreconf -i
$ ./configure
$ make
$ make check
\endcode

The following parameters can be supplied to <tt>configure</tt> to select
other crypto back ends:

\li <tt>--with-libsodium</tt> - Use libsodium to provide crypto primitives,
falling back to the reference back end where libsodium does not have an
implementation.
\li <tt>--with-openssl</tt> - Use the AESGCM implementation from OpenSSL.

Both options can be combined to get the best of both worlds.

\section todo TODO

In no particular order:

\li Examples and overview documentation.
\li Mechanism to encrypt static keypairs with a passphrase.
\li Complete the standalone key generation utility for static keypairs.
\li Compile-time subsetting of the library for applications that only
    need a subset of the algorithms, and for platforms with limited memory.

Contributions are welcome to help implement any of these.

\section contact Contact

For more information on this library, to report bugs, to contribute,
or to suggest improvements, please contact the author Rhys Weatherley via
<a href="mailto:rhys.weatherley@gmail.com">e-mail</a>.
*/

/**
\file protocol.h
\brief Main header file to include the Noise protocol library definitions
*/


================================================
FILE: doc/noise-certificate.dox
================================================
/*
 * Copyright (C) 2016 Southern Storm Software, Pty Ltd.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included
 * in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 */

/**
\file noise-certificate.dox
\page noise_certificate_proto noise-certificate.proto

\include noise-certificate.proto

*/


================================================
FILE: doc/noise-certificate.proto
================================================
// This protobuf definition is placed into the public domain.
//
// Author: Rhys Weatherley <rhys.weatherley@gmail.com>

syntax = "proto3";

package Noise;

// The top-level definitions are "Certificate", "CertificateChain",
// and "EncryptedPrivateKey".  The other definitions support these three.

// Fields with tag numbers 1 to 15 are reserved for use in this format
// and future versions of this format.  Fields with tag numbers 16 and
// higher are available for private use extensions, although a "meta"
// block is probably a better approach for extensions.

// A certificate contains a version, information about the subject,
// and zero of more signatures over the subject information.
// The version must be 1 for this version of the format.
message Certificate {
    reserved 4 to 15;
    uint32 version = 1;
    SubjectInfo subject = 2;
    repeated Signature signatures = 3;
}

// A certificate chain consists of one or more certificates appended
// one after the other.  The field tag is set to 8 to distinguish it
// from the fields in Certificate, which allows applications to detect
// if they are parsing a single certificate or a certificate chain.
// The first certificate is assumed to be the subject, with the remaining
// certificates providing additional information for subject verification.
message CertificateChain {
    reserved 1 to 7, 9 to 15;
    repeated Certificate certs = 8;
}

// Information about the subject/owner in a certificate and their public keys.
message SubjectInfo {
    reserved 6 to 15;
    string id = 1;
    string name = 2;
    string role = 3;
    repeated PublicKeyInfo keys = 4;
    repeated MetaInfo meta = 5;
}

// Information about a single public key.
message PublicKeyInfo {
    reserved 3 to 15;
    string algorithm = 1;       // "25519", "448", "Ed25519", etc.
    bytes key = 2;              // Format depends upon the algorithm.
}

// Extra meta information in a certificate, for future extensions.
message MetaInfo {
    reserved 3 to 15;
    string name = 1;
    string value = 2;
}

// Information about a signature on a certificate.
message Signature {
    reserved 6 to 14;
    string id = 1;
    string name = 2;
    PublicKeyInfo signing_key = 3;
    string hash_algorithm = 4;
    ExtraSignedInfo extra_signed_info = 5;
    bytes signature = 15;
}

// Extra information that is included by a signer to be signed
// along with the subject information for the certificate.
message ExtraSignedInfo {
    reserved 5 to 15;
    bytes nonce = 1;
    string valid_from = 2;      // ISO 8601 format timestamp.
    string valid_to = 3;        // ISO 8601 format timestamp.
    repeated MetaInfo meta = 4;
}

// Contents of an encrypted private key file.  The field tag numbers are
// deliberately different from "Certificate" and "CertificateChain" to
// allow the application to detect what type of data it is processing.
message EncryptedPrivateKey {
    reserved 1 to 9, 14;
    uint32 version = 10;        // 1 for this version of the format.
    string algorithm = 11;      // e.g. "ChaChaPoly_BLAKE2b_PBKDF2".
    bytes salt = 12;            // Salt value for input to the KDF.
    uint32 iterations = 13;     // Iteration count for the KDF.
    bytes encrypted_data = 15;  // Encrypted version of PrivateKey.
}

// Information about a subject's private keys.  Note that this is
// identical in format to "SubjectInfo" except that the key values
// are private keys rather than public keys.
message PrivateKey {
    reserved 6 to 15;
    string id = 1;
    string name = 2;
    string role = 3;
    repeated PrivateKeyInfo keys = 4;
    repeated MetaInfo meta = 5;
}

// Information about a single private key.
message PrivateKeyInfo {
    reserved 3 to 15;
    string algorithm = 1;       // "25519", "448", "Ed25519", etc.
    bytes key = 2;              // Format depends upon the algorithm.
}


================================================
FILE: examples/Makefile.am
================================================

SUBDIRS = echo


================================================
FILE: examples/echo/Makefile.am
================================================

SUBDIRS = echo-client echo-keygen echo-server


================================================
FILE: include/Makefile.am
================================================

SUBDIRS = noise


================================================
FILE: include/noise/Makefile.am
================================================

noiseincludedir = $(includedir)/noise
noiseinclude_HEADERS = \
    keys.h \
    protocol.h \
    protobufs.h

SUBDIRS = . protocol keys


================================================
FILE: include/noise/keys/Makefile.am
================================================

keysincludedir = $(includedir)/noise/keys
keysinclude_HEADERS = \
    certificate.h \
    loader.h


================================================
FILE: include/noise/keys/certificate.h
================================================
/*
 * Copyright (C) 2016 Southern Storm Software, Pty Ltd.
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included
 * in all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 */

#ifndef __NOISE_CERTIFICATE_H__
#define __NOISE_CERTIFICATE_H__

#include <noise/protobufs.h>

#ifdef __cplusplus
extern "C" {
#endif

typedef struct _Noise_Certificate Noise_Certificate;
typedef struct _Noise_CertificateChain Noise_CertificateChain;
typedef struct _Noise_SubjectInfo Noise_SubjectInfo;
typedef struct _Noise_PublicKeyInfo Noise_PublicKeyInfo;
typedef struct _Noise_MetaInfo Noise_MetaInfo;
typedef struct _Noise_Signature Noise_Signature;
typedef struct _Noise_ExtraSignedInfo Noise_ExtraSignedInfo;
typedef struct _Noise_EncryptedPrivateKey Noise_EncryptedPrivateKey;
typedef struct _Noise_PrivateKey Noise_PrivateKey;
typedef struct _Noise_PrivateKeyInfo Noise_PrivateKeyInfo;

int Noise_Certificate_new(Noise_Certificate **obj);
int Noise_Certificate_free(Noise_Certificate *obj);
int Noise_Certificate_write(NoiseProtobuf *pbuf, int tag, const Noise_Certificate *obj);
int Noise_Certificate_read(NoiseProtobuf *pbuf, int tag, Noise_Certificate **obj);
int Noise_Certificate_clear_version(Noise_Certificate *obj);
int Noise_Certificate_has_version(const Noise_Certificate *obj);
uint32_t Noise_Certificate_get_version(const Noise_Certificate *obj);
int Noise_Certificate_set_version(Noise_Certificate *obj, uint32_t value);
int Noise_Certificate_clear_subject(Noise_Certificate *obj);
int Noise_Certificate_has_subject(const Noise_Certificate *obj);
Noise_SubjectInfo *Noise_Certificate_get_subject(const Noise_Certificate *obj);
int Noise_Certificate_get_new_subject(Noise_Certificate *obj, Noise_SubjectInfo **value);
int Noise_Certificate_clear_signatures(Noise_Certificate *obj);
int Noise_Certificate_has_signatures(const Noise_Certificate *obj);
size_t Noise_Certificate_count_signatures(const Noise_Certificate *obj);
Noise_Signature *Noise_Certificate_get_at_signatures(const Noise_Certificate *obj, size_t index);
int Noise_Certificate_add_signatures(Noise_Certificate *obj, Noise_Signature **value);
int Noise_Certificate_insert_signatures(Noise_Certificate *obj, size_t index, Noise_Signature *value);

int Noise_CertificateChain_new(Noise_CertificateChain **obj);
int Noise_CertificateChain_free(Noise_CertificateChain *obj);
int Noise_CertificateChain_write(NoiseProtobuf *pbuf, int tag, const Noise_CertificateChain *obj);
int Noise_CertificateChain_read(NoiseProtobuf *pbuf, int tag, Noise_CertificateChain **obj);
int Noise_CertificateChain_clear_certs(Noise_CertificateChain *obj);
int Noise_CertificateChain_has_certs(const Noise_CertificateChain *obj);
size_t Noise_CertificateChain_count_certs(const Noise_CertificateChain *obj);
Noise_Certificate *Noise_CertificateChain_get_at_certs(const Noise_CertificateChain *obj, size_t index);
int Noise_CertificateChain_add_certs(Noise_CertificateChain *obj, Noise_Certificate **value);
int Noise_CertificateChain_insert_certs(Noise_CertificateChain *obj, size_t index, Noise_Certificate *value);

int Noise_SubjectInfo_new(Noise_SubjectInfo **obj);
int Noise_SubjectInfo_free(Noise_SubjectInfo *obj);
int Noise_SubjectInfo_write(NoiseProtobuf *pbuf, int tag, const Noise_SubjectInfo *obj);
int Noise_SubjectInfo_read(NoiseProtobuf *pbuf, int tag, Noise_SubjectInfo **obj);
int Noise_SubjectInfo_clear_id(Noise_SubjectInfo *obj);
int Noise_SubjectInfo_has_id(const Noise_SubjectInfo *obj);
const char *Noise_SubjectInfo_get_id(const Noise_SubjectInfo *obj);
size_t Noise_SubjectInfo_get_size_id(const Noise_SubjectInfo *obj);
int Noise_SubjectInfo_set_id(Noise_SubjectInfo *obj, const char *value, size_t size);
int Noise_SubjectInfo_clear_name(Noise_SubjectInfo *obj);
int Noise_SubjectInfo_has_name(const Noise_SubjectInfo *obj);
const char *Noise_SubjectInfo_get_name(const Noise_SubjectInfo *obj);
size_t Noise_SubjectInfo_get_size_name(const Noise_SubjectInfo *obj);
int Noise_SubjectInfo_set_name(Noise_SubjectInfo *obj, const char *value, size_t size);
int Noise_SubjectInfo_clear_role(Noise_SubjectInfo *obj);
int Noise_SubjectInfo_has_role(const Noise_SubjectInfo *obj);
const char *Noise_SubjectInfo_get_role(const Noise_SubjectInfo *obj);
size_t Noise_SubjectInfo_get_size_role(const Noise_SubjectInfo *obj);
int Noise_SubjectInfo_set_role(Noise_SubjectInfo *obj, const char *value, size_t size);
int Noise_SubjectInfo_clear_keys(Noise_SubjectInfo *obj);
int Noise_SubjectInfo_has_keys(const Noise_SubjectInfo *obj);
size_t Noise_SubjectInfo_count_keys(const Noise_SubjectInfo *obj);
Noise_PublicKeyInfo *Noise_SubjectInfo_get_at_keys(const Noise_SubjectInfo *obj, size_t index);
int Noise_SubjectInfo_add_keys(Noise_SubjectInfo *obj, Noise_PublicKeyInfo **value);
int Noise_SubjectInfo_insert_keys(Noise_SubjectInfo *obj, size_t index, Noise_PublicKeyInfo *value);
int Noise_SubjectInfo_clear_meta(Noise_SubjectInfo *obj);
int Noise_SubjectInfo_has_meta(const Noise_SubjectInfo *obj);
size_t Noise_SubjectInfo_count_meta(const Noise_SubjectInfo *obj);
Noise_MetaInfo *Noise_SubjectInfo_get_at_meta(const Noise_SubjectInfo *obj, size_t index);
int Noise_SubjectInfo_add_meta(Noise_SubjectInfo *obj, Noise_MetaInfo **value);
int Noise_SubjectInfo_insert_meta(Noise_SubjectInfo *obj, size_t index, Noise_MetaInfo *value);

int Noise_PublicKeyInfo_new(Noise_PublicKeyInfo **obj);
int Noise_PublicKeyInfo_free(Noise_PublicKeyInfo *obj);
int Noise_PublicKeyInfo_write(NoiseProtobuf *pbuf, int tag, const Noise_PublicKeyInfo *obj);
int Noise_PublicKeyInfo_read(NoiseProtobuf *pbuf, int tag, Noise_PublicKeyInfo **obj);
int Noise_PublicKeyInfo_clear_algorithm(Noise_PublicKeyInfo *obj);
int Noise_PublicKeyInfo_has_algorithm(const Noise_PublicKeyInfo *obj);
const char *Noise_PublicKeyInfo_get_algorithm(const Noise_PublicKeyInfo *obj);
size_t Noise_PublicKeyInfo_get_size_algorithm(const Noise_PublicKeyInfo *obj);
int Noise_PublicKeyInfo_set_algorithm(Noise_PublicKeyInfo *obj, const char *value, size_t size);
int Noise_PublicKeyInfo_clear_key(Noise_PublicKeyInfo *obj);
int Noise_PublicKeyInfo_has_key(const Noise_PublicKeyInfo *obj);
const void *Noise_PublicKeyInfo_get_key(const Noise_PublicKeyInfo *obj);
size_t Noise_PublicKeyInfo_get_size_key(const Noise_PublicKeyInfo *obj);
int Noise_PublicKeyInfo_set_key(Noise_PublicKeyInfo *obj, const void *value, size_t size);

int Noise_MetaInfo_new(Noise_MetaInfo **obj);
int Noise_MetaInfo_free(Noise_MetaInfo *obj);
int Noise_MetaInfo_write(NoiseProtobuf *pbuf, int tag, const Noise_MetaInfo *obj);
int Noise_MetaInfo_read(NoiseProtobuf *pbuf, int tag, Noise_MetaInfo **obj);
int Noise_MetaInfo_clear_name(Noise_MetaInfo *obj);
int Noise_MetaInfo_has_name(const Noise_MetaInfo *obj);
const char *Noise_MetaInfo_get_name(const Noise_MetaInfo *obj);
size_t Noise_MetaInfo_get_size_name(const Noise_MetaInfo *obj);
int Noise_MetaInfo_set_name(Noise_MetaInfo *obj, const char *value, size_t size);
int Noise_MetaInfo_clear_value(Noise_MetaInfo *obj);
int Noise_MetaInfo_has_value(const Noise_MetaInfo *obj);
const char *Noise_MetaInfo_get_value(const Noise_MetaInfo *obj);
size_t Noise_MetaInfo_get_size_value(const Noise_MetaInfo *obj);
int Noise_MetaInfo_set_value(Noise_MetaInfo *obj, const char *value, size_t size);

int Noise_Signature_new(Noise_Signature **obj);
int Noise_Signature_free(Noise_Signature *obj);
int Noise_Signature_write(NoiseProtobuf *pbuf, int tag, const Noise_Signature *obj);
int Noise_Signature_read(NoiseProtobuf *pbuf, int tag, Noise_Signature **obj);
int Noise_Signature_clear_id(Noise_Signature *obj);
int Noise_Signature_has_id(const Noise_Signature *obj);
const char *Noise_Signature_get_id(const Noise_Signature *obj);
size_t Noise_Signature_get_size_id(const Noise_Signature *obj);
int Noise_Signature_set_id(Noise_Signature *obj, const char *value, size_t size);
int Noise_Signature_clear_name(Noise_Signature *obj);
int Noise_Signature_has_name(const Noise_Signature *obj);
const char *Noise_Signature_get_name(const Noise_Signature *obj);
size_t Noise_Signature_get_size_name(const Noise_Signature *obj);
int Noise_Signature_set_name(Noise_Signature *obj, const char *value, size_t size);
int Noise_Signature_clear_signing_key(Noise_Signature *obj);
int Noise_Signature_has_signing_key(const Noise_Signature *obj);
Noise_PublicKeyInfo *Noise_Signature_get_signing_key(const Noise_Signature *obj);
int Noise_Signature_get_new_signing_key(Noise_Signature *obj, Noise_PublicKeyInfo **value);
int Noise_Signature_clear_hash_algorithm(Noise_Signature *obj);
int Noise_Signature_has_hash_algorithm(const Noise_Signature *obj);
const char *Noise_Signature_get_hash_algorithm(const Noise_Signature *obj);
size_t Noise_Signature_get_size_hash_algorithm(const Noise_Signature *obj);
int Noise_Signature_set_hash_algorithm(Noise_Signature *obj, const char *value, size_t size);
int Noise_Signature_clear_extra_signed_info(Noise_Signature *obj);
int Noise_Signature_has_extra_signed_info(const Noise_Signature *obj);
Noise_ExtraSignedInfo *Noise_Signature_get_extra_signed_info(const Noise_Signature *obj);
int Noise_Signature_get_new_extra_signed_info(Noise_Signature *obj, Noise_ExtraSignedInfo **value);
int Noise_Signature_clear_signature(Noise_Signature *obj);
int Noise_Signature_has_signature(const Noise_Signature *obj);
const void *Noise_Signature_get_signature(const Noise_Signature *obj);
size_t Noise_Signature_get_size_signature(const Noise_Signature *obj);
int Noise_Signature_set_signature(Noise_Signature *obj, const void *value, size_t size);

int Noise_ExtraSignedInfo_new(Noise_ExtraSignedInfo **obj);
int Noise_ExtraSignedInfo_free(Noise_ExtraSignedInfo *obj);
int Noise_ExtraSignedInfo_write(NoiseProtobuf *pbuf, int tag, const Noise_ExtraSignedInfo *obj);
int Noise_ExtraSignedInfo_read(NoiseProtobuf *pbuf, int tag, Noise_ExtraSignedInfo **obj);
int Noise_ExtraSignedInfo_clear_nonce(Noise_ExtraSignedInfo *obj);
int Noise_ExtraSignedInfo_has_nonce(const Noise_ExtraSignedInfo *obj);
const void *Noise_ExtraSignedInfo_get_nonce(const Noise_ExtraSignedInfo *obj);
size_t Noise_ExtraSignedInfo_get_size_nonce(const Noise_ExtraSignedInfo *obj);
int Noise_ExtraSignedInfo_set_nonce(Noise_ExtraSignedInfo *obj, const void *value, size_t size);
int Noise_ExtraSignedInfo_clear_valid_from(Noise_ExtraSignedInfo *obj);
int Noise_ExtraSignedInfo_has_valid_from(const Noise_ExtraSignedInfo *obj);
const char *Noise_ExtraSignedInfo_get_valid_from(const Noise_ExtraSignedInfo *obj);
size_t Noise_ExtraSignedInfo_get_size_valid_from(const Noise_ExtraSignedInfo *obj);
int Noise_ExtraSignedInfo_set_valid_from(Noise_ExtraSignedInfo *obj, const char *value, size_t size);
int Noise_ExtraSignedInfo_clear_valid_to(Noise_ExtraSignedInfo *obj);
int Noise_ExtraSignedInfo_has_valid_to(const Noise_ExtraSignedInfo *obj);
const char *Noise_ExtraSignedInfo_get_valid_to(const Noise_ExtraSignedInfo *obj);
size_t Noise_ExtraSignedInfo_get_size_valid_to(const Noise_ExtraSignedInfo *obj);
int Noise_ExtraSignedInfo_set_valid_to(Noise_ExtraSignedInfo *obj, const char *value, size_t size);
int Noise_ExtraSignedInfo_clear_meta(Noise_ExtraSignedInfo *obj);
int Noise_ExtraSignedInfo_has_meta(const Noise_ExtraSignedInfo *obj);
size_t Noise_ExtraSignedInfo_count_meta(const Noise_ExtraSignedInfo *obj);
Noise_MetaInfo *Noise_ExtraSignedInfo_get_at_meta(const Noise_ExtraSignedInfo *obj, size_t index);
int Noise_ExtraSignedInfo_add_meta(Noise_ExtraSignedInfo *obj, Noise_MetaInfo **value);
int Noise_ExtraSignedInfo_insert_meta(Noise_ExtraSignedInfo *obj, size_t index, Noise_MetaInfo *value);

int Noise_EncryptedPrivateKey_new(Noise_EncryptedPrivateKey **obj);
int Noise_EncryptedPrivateKey_free(Noise_EncryptedPrivateKey *obj);
int Noise_EncryptedPrivateKey_write(NoiseProtobuf *pbuf, int tag, const Noise_EncryptedPrivateKey *obj);
int Noise_EncryptedPrivateKey_read(NoiseProtobuf *pbuf, int tag, Noise_EncryptedPrivateKey **obj);
int Noise_EncryptedPrivateKey_clear_version(Noise_EncryptedPrivateKey *obj);
int Noise_EncryptedPrivateKey_has_version(const Noise_EncryptedPrivateKey *obj);
uint32_t Noise_EncryptedPrivateKey_get_version(const Noise_EncryptedPrivateKey *obj);
int Noise_EncryptedPrivateKey_set_version(Noise_EncryptedPrivateKey *obj, uint32_t value);
int Noise_EncryptedPrivateKey_clear_algorithm(Noise_EncryptedPrivateKey *obj);
int Noise_EncryptedPrivateKey_has_algorithm(const Noise_EncryptedPrivateKey *obj);
const char *Noise_EncryptedPrivateKey_get_algorithm(const Noise_EncryptedPrivateKey *obj);
size_t Noise_EncryptedPrivateKey_get_size_algorithm(const Noise_EncryptedPrivateKey *obj);
int Noise_EncryptedPrivateKey_set_algorithm(Noise_EncryptedPrivateKey *obj, const char *value, size_t size);
int Noise_EncryptedPrivateKey_clear_salt(Noise_EncryptedPrivateKey *obj);
int Noise_EncryptedPrivateKey_has_salt(const Noise_EncryptedPrivateKey *obj);
const void *Noise_EncryptedPrivateKey_get_salt(const Noise_EncryptedPrivateKey *obj);
size_t Noise_EncryptedPrivateKey_get_size_salt(const Noise_EncryptedPrivateKey *obj);
int Noise_EncryptedPrivateKey_set_salt(Noise_EncryptedPrivateKey *obj, const void *value, size_t size);
int Noise_EncryptedPrivateKey_clear_iterations(Noise_EncryptedPrivateKey *obj);
int Noise_EncryptedPrivateKey_has_iterations(const Noise_EncryptedPrivateKey *obj);
uint32_t Noise_EncryptedPrivateKey_get_iterations(const Noise_EncryptedPrivateKey *obj);
int Noise_EncryptedPrivateKey_set_iterations(Noise_EncryptedPrivateKey *obj, uint32_t value);
int Noise_EncryptedPrivateKey_clear_encrypted_data(Noise_EncryptedPrivateKey *obj);
int Noise_EncryptedPrivateKey_has_encrypted_data(const Noise_EncryptedPrivateKey *obj);
const void *Noise_EncryptedPrivateKey_get_encrypted_data(const Noise_EncryptedPrivateKey *obj);
size_t Noise_EncryptedPrivateKey_get_size_encrypted_data(const Noise_EncryptedPrivateKey *obj);
int Noise_EncryptedPrivateKey_set_encrypted_data(Noise_EncryptedPrivateKey *obj, const void *value, size_t size);

int Noise_PrivateKey_new(Noise_PrivateKey **obj);
int Noise_PrivateKey_free(Noise_PrivateKey *obj);
int Noise_PrivateKey_write(NoiseProtobuf *pbuf, int tag, const Noise_PrivateKey *obj);
int Noise_PrivateKey_read(NoiseProtobuf *pbuf, int tag, Noise_PrivateKey **obj);
int Noise_PrivateKey_clear_id(Noise_PrivateKey *obj);
int Noise_PrivateKey_has_id(const Noise_PrivateKey *obj);
const char *Noise_PrivateKey_get_id(const Noise_PrivateKey *obj);
size_t Noise_PrivateKey_get_size_id(const Noise_PrivateKey *obj);
int Noise_PrivateKey_set_id(Noise_PrivateKey *obj, const char *value, size_t size);
int Noise_PrivateKey_clear_name(Noise_PrivateKey *obj);
int Noise_PrivateKey_has_name(const Noise_PrivateKey *obj);
const char *Noise_PrivateKey_get_name(const Noise_PrivateKey *obj);
size_t Noise_PrivateKey_get_size_name(const Noise_PrivateKey *obj);
int Noise_PrivateKey_set_name(Noise_PrivateKey *obj, const char *value, size_t size);
int Noise_PrivateKey_clear_role(Noise_PrivateKey *obj);
int Noise_PrivateKey_has_role(const Noise_PrivateKey *obj);
const char *Noise_PrivateKey_get_role(const Noise_PrivateKey *obj);
size_t Noise_PrivateKey_get_size_role(const Noise_PrivateKey *obj);
int Noise_PrivateKey_set_role(Noise_PrivateKey *obj, const char *value, size_t size);
int Noise_PrivateKey_clear_keys(Noise_PrivateKey *obj);
int Noise_PrivateKey_has_keys(const Noise_PrivateKey *obj);
size_t Noise_PrivateKey_count_keys(const Noise_PrivateKey *obj);
Noise_PrivateKeyInfo *Noise_PrivateKey_get_at_keys(const Noise_PrivateKey *obj, size_t index);
int Noise_PrivateKey_add_keys(Noise_PrivateKey *obj, Noise_PrivateKeyInfo **value);
int Noise_PrivateKey_insert_keys(Noise_PrivateKey *obj, size_t index, Noise_PrivateKeyInfo *value);
int Noise_PrivateKey_clear_meta(Noise_PrivateKey *obj);
int Noise_PrivateKey_has_meta(const Noise_PrivateKey *obj);
size_t Noise_PrivateKey_count_meta(const Noise_PrivateKey *obj);
Noise_MetaInfo *Noise_PrivateKey_get_at_meta(const Noise_PrivateKey *obj, size_t index);
int Noise_PrivateKey_add_meta(Noise_PrivateKey *obj, Noise_MetaInfo **value);
int Noise_PrivateKey_insert_meta(Noise_PrivateKey *obj, size_t index, Noise_MetaInfo *value);

int Noise_PrivateKeyInfo_new(Noise_PrivateKeyInfo **obj);
int Noise_PrivateKeyInfo_free(Noise_PrivateKeyInfo *obj);
int Noise_PrivateKeyInfo_write(NoiseProtobuf *pbuf, int tag, const Noise_PrivateKeyInfo *obj);
int Noise_PrivateKeyInfo_read(NoiseProtobuf *pbuf, int tag, Noise_PrivateKeyInfo **obj);
int Noise_PrivateKeyInfo_clear_algorithm(Noise_PrivateKeyInfo *obj);
int Noise_PrivateKeyInfo_has_algorithm(const Noise_PrivateKeyInfo *obj);
const char *Noise_PrivateKeyInfo_get_algorithm(const Noise_PrivateKeyInfo *obj);
size_t Noise_PrivateKeyInfo_get_size_algorithm(const Noise_PrivateKeyInfo *obj);
int Noise_PrivateKeyInfo_set_algorithm(Noise_PrivateKeyInfo *obj, const char *value, size_t size);
int Noise_PrivateKeyInfo_clear_key(Noise_PrivateKeyInfo *obj);
int Noise_PrivateKeyInfo_has_key(const Noise_PrivateKeyInfo *obj);
const void *Noise_PrivateKeyInfo_get_key(const Noise_PrivateKeyInfo *obj);
size_t Noise_PrivateKeyInfo_get_size_key(const Noise_PrivateKeyInfo *obj);
int Noise_PrivateKeyInfo_set_key(Noise_PrivateKeyInfo *obj, const void *value, size_t size);

#ifdef __cplusplus
};
#endif

#endif


================================================
FILE: include/noise/keys/loader.h
================================================
/*
 * Copyright (C) 2016 Southern Storm Software, Pty Ltd.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included
 * in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 */

#ifndef NOISE_KEYS_LOADER_H
#define NOISE_KEYS_LOADER_H

#include <noise/keys/certificate.h>

#ifdef __cplusplus
extern "C" {
#endif

int noise_load_certificate_from_file
    (Noise_Certificate **cert, const char *filename);
int noise_load_certificate_from_buffer
    (Noise_Certificate **cert, NoiseProtobuf *pbuf);

int noise_load_certificate_chain_from_file
    (Noise_CertificateChain **chain, const char *filename);
int noise_load_certificate_chain_from_buffer
    (Noise_CertificateChain **chain, NoiseProtobuf *pbuf);

int noise_load_private_key_from_file
    (Noise_PrivateKey **key, const char *filename,
     const void *passphrase, size_t passphrase_len);
int noise_load_private_key_from_buffer
    (Noise_PrivateKey **key, NoiseProtobuf *pbuf,
     const void *passphrase, size_t passphrase_len);

int noise_save_certificate_to_file
    (const Noise_Certificate *cert, const char *filename);
int noise_save_certificate_to_buffer
    (const Noise_Certificate *cert, NoiseProtobuf *pbuf);

int noise_save_certificate_chain_to_file
    (const Noise_CertificateChain *chain, const char *filename);
int noise_save_certificate_chain_to_buffer
    (const Noise_CertificateChain *chain, NoiseProtobuf *pbuf);

int noise_save_private_key_to_file
    (const Noise_PrivateKey *key, const char *filename,
     const void *passphrase, size_t passphrase_len,
     const char *protect_name);
int noise_save_private_key_to_buffer
    (const Noise_PrivateKey *key, NoiseProtobuf *pbuf,
     const void *passphrase, size_t passphrase_len,
     const char *protect_name);

#ifdef __cplusplus
};
#endif

#endif


================================================
FILE: include/noise/keys.h
================================================
/*
 * Copyright (C) 2016 Southern Storm Software, Pty Ltd.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included
 * in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 */

#ifndef NOISE_KEYS_H
#define NOISE_KEYS_H

#include <noise/keys/certificate.h>
#include <noise/keys/loader.h>

#endif


================================================
FILE: include/noise/protobufs.h
================================================
/*
 * Copyright (C) 2016 Southern Storm Software, Pty Ltd.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included
 * in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 */

#ifndef NOISE_PROTOBUFS_H
#define NOISE_PROTOBUFS_H

#include <noise/protocol/constants.h>
#include <stddef.h>
#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#endif

typedef struct
{
    uint8_t *data;
    size_t size;
    size_t posn;
    int error;

} NoiseProtobuf;

int noise_protobuf_prepare_input
    (NoiseProtobuf *pbuf, const uint8_t *data, size_t size);
int noise_protobuf_prepare_output
    (NoiseProtobuf *pbuf, uint8_t *data, size_t size);
int noise_protobuf_prepare_measure(NoiseProtobuf *pbuf, size_t max_size);

int noise_protobuf_finish_input(NoiseProtobuf *pbuf);
int noise_protobuf_finish_output
    (NoiseProtobuf *pbuf, uint8_t **data, size_t *size);
int noise_protobuf_finish_output_shift
    (NoiseProtobuf *pbuf, uint8_t **data, size_t *size);
int noise_protobuf_finish_measure(NoiseProtobuf *pbuf, size_t *size);

int noise_protobuf_write_int32(NoiseProtobuf *pbuf, int tag, int32_t value);
int noise_protobuf_write_uint32(NoiseProtobuf *pbuf, int tag, uint32_t value);
int noise_protobuf_write_int64(NoiseProtobuf *pbuf, int tag, int64_t value);
int noise_protobuf_write_uint64(NoiseProtobuf *pbuf, int tag, uint64_t value);
int noise_protobuf_write_sint32(NoiseProtobuf *pbuf, int tag, int32_t value);
int noise_protobuf_write_sint64(NoiseProtobuf *pbuf, int tag, int64_t value);
int noise_protobuf_write_sfixed32(NoiseProtobuf *pbuf, int tag, int32_t value);
int noise_protobuf_write_fixed32(NoiseProtobuf *pbuf, int tag, uint32_t value);
int noise_protobuf_write_sfixed64(NoiseProtobuf *pbuf, int tag, int64_t value);
int noise_protobuf_write_fixed64(NoiseProtobuf *pbuf, int tag, uint64_t value);
int noise_protobuf_write_float(NoiseProtobuf *pbuf, int tag, float value);
int noise_protobuf_write_double(NoiseProtobuf *pbuf, int tag, double value);
int noise_protobuf_write_bool(NoiseProtobuf *pbuf, int tag, int value);
int noise_protobuf_write_string
    (NoiseProtobuf *pbuf, int tag, const char *str, size_t size);
int noise_protobuf_write_bytes
    (NoiseProtobuf *pbuf, int tag, const void *data, size_t size);
int noise_protobuf_write_end_element(NoiseProtobuf *pbuf, size_t *end_posn);
int noise_protobuf_write_start_element
    (NoiseProtobuf *pbuf, int tag, size_t end_posn);

int noise_protobuf_peek_tag(const NoiseProtobuf *pbuf);
size_t noise_protobuf_peek_size(const NoiseProtobuf *pbuf);
int noise_protobuf_read_int32(NoiseProtobuf *pbuf, int tag, int32_t *value);
int noise_protobuf_read_uint32(NoiseProtobuf *pbuf, int tag, uint32_t *value);
int noise_protobuf_read_int64(NoiseProtobuf *pbuf, int tag, int64_t *value);
int noise_protobuf_read_uint64(NoiseProtobuf *pbuf, int tag, uint64_t *value);
int noise_protobuf_read_sint32(NoiseProtobuf *pbuf, int tag, int32_t *value);
int noise_protobuf_read_sint64(NoiseProtobuf *pbuf, int tag, int64_t *value);
int noise_protobuf_read_sfixed32(NoiseProtobuf *pbuf, int tag, int32_t *value);
int noise_protobuf_read_fixed32(NoiseProtobuf *pbuf, int tag, uint32_t *value);
int noise_protobuf_read_sfixed64(NoiseProtobuf *pbuf, int tag, int64_t *value);
int noise_protobuf_read_fixed64(NoiseProtobuf *pbuf, int tag, uint64_t *value);
int noise_protobuf_read_float(NoiseProtobuf *pbuf, int tag, float *value);
int noise_protobuf_read_double(NoiseProtobuf *pbuf, int tag, double *value);
int noise_protobuf_read_bool(NoiseProtobuf *pbuf, int tag, int *value);
int noise_protobuf_read_string
    (NoiseProtobuf *pbuf, int tag, char *str, size_t max_size, size_t *size);
int noise_protobuf_read_alloc_string
    (NoiseProtobuf *pbuf, int tag, char **str, size_t max_size, size_t *size);
int noise_protobuf_read_bytes
    (NoiseProtobuf *pbuf, int tag, void *data, size_t max_size, size_t *size);
int noise_protobuf_read_alloc_bytes
    (NoiseProtobuf *pbuf, int tag, void **data, size_t max_size, size_t *size);
int noise_protobuf_read_start_element
    (NoiseProtobuf *pbuf, int tag, size_t *end_posn);
int noise_protobuf_read_end_element(NoiseProtobuf *pbuf, size_t end_posn);
int noise_protobuf_read_at_end_element
    (const NoiseProtobuf *pbuf, size_t end_posn);
int noise_protobuf_read_stop(NoiseProtobuf *pbuf);
int noise_protobuf_read_skip(NoiseProtobuf *pbuf);

int noise_protobuf_add_to_array
    (void **array, size_t *count, size_t *max, const void *value, size_t size);
int noise_protobuf_add_to_string_array
    (char ***array, size_t **len_array, size_t *count, size_t *max,
     const char *value, size_t size);
int noise_protobuf_add_to_bytes_array
    (void ***array, size_t **len_array, size_t *count, size_t *max,
     const void *value, size_t size);

int noise_protobuf_insert_into_array
    (void **array, size_t *count, size_t *max, size_t index,
     const void *value, size_t size);

void noise_protobuf_free_memory(void *ptr, size_t size);

#ifdef __cplusplus
};
#endif

#endif


================================================
FILE: include/noise/protocol/Makefile.am
================================================

protocolincludedir = $(includedir)/noise/protocol
protocolinclude_HEADERS = \
    buffer.h \
    cipherstate.h \
    constants.h \
    dhstate.h \
    errors.h \
    handshakestate.h \
    hashstate.h \
    names.h \
    randstate.h \
    signstate.h \
    symmetricstate.h \
    util.h


================================================
FILE: include/noise/protocol/buffer.h
================================================
/*
 * Copyright (C) 2016 Southern Storm Software, Pty Ltd.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included
 * in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 */

#ifndef NOISE_BUFFER_H
#define NOISE_BUFFER_H

#include <stddef.h>
#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#endif

typedef struct
{
    uint8_t *data;      /**< Points to the data in the buffer */
    size_t size;        /**< Current size of the data in the buffer */
    size_t max_size;    /**< Maximum size of the data in the buffer */

} NoiseBuffer;

#define noise_buffer_init(buffer)   \
    ((buffer).data = 0, (buffer).size = 0, (buffer).max_size = 0)
#define noise_buffer_set_output(buffer, ptr, len) \
    ((buffer).data = (ptr), (buffer).size = 0, (buffer).max_size = (len))
#define noise_buffer_set_input(buffer, ptr, len) \
    ((buffer).data = (ptr), (buffer).size = (buffer).max_size = (len))
#define noise_buffer_set_inout(buffer, ptr, len, max) \
    ((buffer).data = (ptr), (buffer).size = (len), (buffer).max_size = (max))

#ifdef __cplusplus
};
#endif

#endif


================================================
FILE: include/noise/protocol/cipherstate.h
================================================
/*
 * Copyright (C) 2016 Southern Storm Software, Pty Ltd.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included
 * in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 */

#ifndef NOISE_CIPHERSTATE_H
#define NOISE_CIPHERSTATE_H

#include <noise/protocol/buffer.h>

#ifdef __cplusplus
extern "C" {
#endif

typedef struct NoiseCipherState_s NoiseCipherState;

int noise_cipherstate_new_by_id(NoiseCipherState **state, int id);
int noise_cipherstate_new_by_name(NoiseCipherState **state, const char *name);
int noise_cipherstate_free(NoiseCipherState *state);
int noise_cipherstate_get_cipher_id(const NoiseCipherState *state);
size_t noise_cipherstate_get_key_length(const NoiseCipherState *state);
size_t noise_cipherstate_get_mac_length(const NoiseCipherState *state);
int noise_cipherstate_init_key
    (NoiseCipherState *state, const uint8_t *key, size_t key_len);
int noise_ciphersta
Download .txt
gitextract_kqrwds77/

├── .gitignore
├── AUTHORS
├── COPYING
├── ChangeLog
├── Makefile.am
├── NEWS
├── README
├── README.md
├── autogen.sh
├── configure.ac
├── doc/
│   ├── .gitignore
│   ├── Doxyfile
│   ├── Makefile.am
│   ├── buffer.dox
│   ├── cert-key-format.dox
│   ├── constants.dox
│   ├── example-echo.dox
│   ├── mainpage.dox
│   ├── noise-certificate.dox
│   └── noise-certificate.proto
├── examples/
│   ├── Makefile.am
│   └── echo/
│       └── Makefile.am
├── include/
│   ├── Makefile.am
│   └── noise/
│       ├── Makefile.am
│       ├── keys/
│       │   ├── Makefile.am
│       │   ├── certificate.h
│       │   └── loader.h
│       ├── keys.h
│       ├── protobufs.h
│       ├── protocol/
│       │   ├── Makefile.am
│       │   ├── buffer.h
│       │   ├── cipherstate.h
│       │   ├── constants.h
│       │   ├── dhstate.h
│       │   ├── errors.h
│       │   ├── handshakestate.h
│       │   ├── hashstate.h
│       │   ├── names.h
│       │   ├── randstate.h
│       │   ├── signstate.h
│       │   ├── symmetricstate.h
│       │   └── util.h
│       └── protocol.h
├── m4/
│   ├── ax_pthread.m4
│   └── pkg.m4
├── src/
│   ├── Makefile.am
│   ├── backend/
│   │   ├── openssl/
│   │   │   └── cipher-aesgcm.c
│   │   ├── ref/
│   │   │   ├── cipher-aesgcm.c
│   │   │   ├── cipher-chachapoly.c
│   │   │   ├── dh-curve25519.c
│   │   │   ├── dh-curve448.c
│   │   │   ├── dh-newhope.c
│   │   │   ├── hash-blake2b.c
│   │   │   ├── hash-blake2s.c
│   │   │   ├── hash-sha256.c
│   │   │   ├── hash-sha512.c
│   │   │   └── sign-ed25519.c
│   │   └── sodium/
│   │       ├── cipher-aesgcm.c
│   │       ├── cipher-chachapoly.c
│   │       ├── dh-curve25519.c
│   │       ├── hash-blake2b.c
│   │       ├── hash-sha256.c
│   │       ├── hash-sha512.c
│   │       └── sign-ed25519.c
│   ├── crypto/
│   │   ├── README
│   │   ├── aes/
│   │   │   ├── rijndael-alg-fst.c
│   │   │   └── rijndael-alg-fst.h
│   │   ├── blake2/
│   │   │   ├── blake2-endian.h
│   │   │   ├── blake2b.c
│   │   │   ├── blake2b.h
│   │   │   ├── blake2s.c
│   │   │   └── blake2s.h
│   │   ├── chacha/
│   │   │   ├── chacha.c
│   │   │   └── chacha.h
│   │   ├── curve448/
│   │   │   ├── curve448.c
│   │   │   └── curve448.h
│   │   ├── donna/
│   │   │   ├── curve25519-donna-c64.c
│   │   │   ├── curve25519-donna.c
│   │   │   ├── poly1305-donna-16.h
│   │   │   ├── poly1305-donna-32.h
│   │   │   ├── poly1305-donna-64.h
│   │   │   ├── poly1305-donna-8.h
│   │   │   ├── poly1305-donna.c
│   │   │   └── poly1305-donna.h
│   │   ├── ed25519/
│   │   │   ├── README.md
│   │   │   ├── curve25519-donna-32bit.h
│   │   │   ├── curve25519-donna-64bit.h
│   │   │   ├── curve25519-donna-helpers.h
│   │   │   ├── curve25519-donna-sse2.h
│   │   │   ├── ed25519-donna-32bit-sse2.h
│   │   │   ├── ed25519-donna-32bit-tables.h
│   │   │   ├── ed25519-donna-64bit-sse2.h
│   │   │   ├── ed25519-donna-64bit-tables.h
│   │   │   ├── ed25519-donna-64bit-x86-32bit.h
│   │   │   ├── ed25519-donna-64bit-x86.h
│   │   │   ├── ed25519-donna-basepoint-table.h
│   │   │   ├── ed25519-donna-batchverify.h
│   │   │   ├── ed25519-donna-impl-base.h
│   │   │   ├── ed25519-donna-impl-sse2.h
│   │   │   ├── ed25519-donna-portable-identify.h
│   │   │   ├── ed25519-donna-portable.h
│   │   │   ├── ed25519-donna.h
│   │   │   ├── ed25519-hash-custom.h
│   │   │   ├── ed25519-hash.h
│   │   │   ├── ed25519-randombytes-custom.h
│   │   │   ├── ed25519-randombytes.h
│   │   │   ├── ed25519.c
│   │   │   ├── ed25519.h
│   │   │   ├── fuzz/
│   │   │   │   ├── README.md
│   │   │   │   ├── build-nix.php
│   │   │   │   ├── curve25519-ref10.c
│   │   │   │   ├── curve25519-ref10.h
│   │   │   │   ├── ed25519-donna-sse2.c
│   │   │   │   ├── ed25519-donna.c
│   │   │   │   ├── ed25519-donna.h
│   │   │   │   ├── ed25519-ref10.c
│   │   │   │   ├── ed25519-ref10.h
│   │   │   │   ├── fuzz-curve25519.c
│   │   │   │   └── fuzz-ed25519.c
│   │   │   ├── modm-donna-32bit.h
│   │   │   ├── modm-donna-64bit.h
│   │   │   ├── regression.h
│   │   │   ├── test-internals.c
│   │   │   ├── test-ticks.h
│   │   │   └── test.c
│   │   ├── ghash/
│   │   │   ├── ghash.c
│   │   │   └── ghash.h
│   │   ├── goldilocks/
│   │   │   ├── Doxyfile
│   │   │   ├── HISTORY.txt
│   │   │   ├── LICENSE.txt
│   │   │   ├── README.txt
│   │   │   ├── TODO.txt
│   │   │   ├── include/
│   │   │   │   ├── goldilocks.h
│   │   │   │   └── ridinghood.h
│   │   │   ├── src/
│   │   │   │   ├── arithmetic.c
│   │   │   │   ├── barrett_field.c
│   │   │   │   ├── bat/
│   │   │   │   │   ├── api_dh.h
│   │   │   │   │   ├── api_sign.h
│   │   │   │   │   ├── dh.c
│   │   │   │   │   └── sign.c
│   │   │   │   ├── crandom.c
│   │   │   │   ├── ec_point.c
│   │   │   │   ├── goldilocks.c
│   │   │   │   ├── include/
│   │   │   │   │   ├── barrett_field.h
│   │   │   │   │   ├── constant_time.h
│   │   │   │   │   ├── crandom.h
│   │   │   │   │   ├── ec_point.h
│   │   │   │   │   ├── field.h
│   │   │   │   │   ├── intrinsics.h
│   │   │   │   │   ├── magic.h
│   │   │   │   │   ├── scalarmul.h
│   │   │   │   │   ├── sha512.h
│   │   │   │   │   └── word.h
│   │   │   │   ├── p448/
│   │   │   │   │   ├── arch_32/
│   │   │   │   │   │   ├── arch_config.h
│   │   │   │   │   │   ├── p448.c
│   │   │   │   │   │   └── p448.h
│   │   │   │   │   ├── arch_arm_32/
│   │   │   │   │   │   ├── arch_config.h
│   │   │   │   │   │   ├── p448.c
│   │   │   │   │   │   └── p448.h
│   │   │   │   │   ├── arch_neon_experimental/
│   │   │   │   │   │   ├── arch_config.h
│   │   │   │   │   │   ├── p448.c
│   │   │   │   │   │   └── p448.h
│   │   │   │   │   ├── arch_ref64/
│   │   │   │   │   │   ├── arch_config.h
│   │   │   │   │   │   ├── p448.c
│   │   │   │   │   │   └── p448.h
│   │   │   │   │   ├── arch_x86_64/
│   │   │   │   │   │   ├── arch_config.h
│   │   │   │   │   │   ├── p448.c
│   │   │   │   │   │   ├── p448.h
│   │   │   │   │   │   └── x86-64-arith.h
│   │   │   │   │   ├── f_arithmetic.c
│   │   │   │   │   ├── f_field.h
│   │   │   │   │   ├── f_magic.h
│   │   │   │   │   └── magic.c
│   │   │   │   ├── p480/
│   │   │   │   │   ├── arch_x86_64/
│   │   │   │   │   │   ├── arch_config.h
│   │   │   │   │   │   ├── p480.c
│   │   │   │   │   │   ├── p480.h
│   │   │   │   │   │   └── x86-64-arith.h
│   │   │   │   │   ├── f_arithmetic.c
│   │   │   │   │   ├── f_field.h
│   │   │   │   │   ├── f_magic.h
│   │   │   │   │   └── magic.c
│   │   │   │   ├── p521/
│   │   │   │   │   ├── arch_ref64/
│   │   │   │   │   │   ├── arch_config.h
│   │   │   │   │   │   ├── p521.c
│   │   │   │   │   │   └── p521.h
│   │   │   │   │   ├── arch_x86_64_r12/
│   │   │   │   │   │   ├── arch_config.h
│   │   │   │   │   │   ├── p521.c
│   │   │   │   │   │   └── p521.h
│   │   │   │   │   ├── f_arithmetic.c
│   │   │   │   │   ├── f_field.h
│   │   │   │   │   ├── f_magic.h
│   │   │   │   │   └── magic.c
│   │   │   │   ├── scalarmul.c
│   │   │   │   └── sha512.c
│   │   │   └── test/
│   │   │       ├── bench.c
│   │   │       ├── test.c
│   │   │       ├── test.h
│   │   │       ├── test_arithmetic.c
│   │   │       ├── test_goldilocks.c
│   │   │       ├── test_pointops.c
│   │   │       ├── test_scalarmul.c
│   │   │       └── test_sha512.c
│   │   ├── newhope/
│   │   │   ├── LICENSE
│   │   │   ├── batcher.c
│   │   │   ├── batcher.h
│   │   │   ├── cpucycles.c
│   │   │   ├── cpucycles.h
│   │   │   ├── crypto_stream_chacha20.c
│   │   │   ├── crypto_stream_chacha20.h
│   │   │   ├── error_correction.c
│   │   │   ├── error_correction.h
│   │   │   ├── fips202.c
│   │   │   ├── fips202.h
│   │   │   ├── newhope.c
│   │   │   ├── newhope.h
│   │   │   ├── ntt.c
│   │   │   ├── ntt.h
│   │   │   ├── params.h
│   │   │   ├── poly.c
│   │   │   ├── poly.h
│   │   │   ├── precomp.c
│   │   │   ├── randombytes.c
│   │   │   ├── randombytes.h
│   │   │   ├── reduce.c
│   │   │   └── reduce.h
│   │   └── sha2/
│   │       ├── sha256.c
│   │       ├── sha256.h
│   │       ├── sha512.c
│   │       └── sha512.h
│   ├── keys/
│   │   ├── Makefile.am
│   │   ├── certificate.c
│   │   └── loader.c
│   ├── protobufs/
│   │   ├── Makefile.am
│   │   └── protobufs.c
│   └── protocol/
│       ├── Makefile.am
│       ├── cipherstate.c
│       ├── dhstate.c
│       ├── errors.c
│       ├── handshakestate.c
│       ├── hashstate.c
│       ├── internal.c
│       ├── internal.h
│       ├── names.c
│       ├── patterns.c
│       ├── rand_os.c
│       ├── rand_sodium.c
│       ├── randstate.c
│       ├── signstate.c
│       ├── symmetricstate.c
│       └── util.c
├── tests/
│   ├── Makefile.am
│   ├── performance/
│   │   ├── .gitignore
│   │   ├── Makefile.am
│   │   ├── md5.c
│   │   ├── md5.h
│   │   └── test-performance.c
│   ├── unit/
│   │   ├── .gitignore
│   │   ├── Makefile.am
│   │   ├── test-cipherstate.c
│   │   ├── test-dhstate.c
│   │   ├── test-errors.c
│   │   ├── test-handshakestate.c
│   │   ├── test-hashstate.c
│   │   ├── test-helpers.h
│   │   ├── test-main.c
│   │   ├── test-names.c
│   │   ├── test-patterns.c
│   │   ├── test-protobufs.c
│   │   ├── test-randstate.c
│   │   ├── test-signstate.c
│   │   └── test-symmetricstate.c
│   └── vector/
│       ├── .gitignore
│       ├── Makefile.am
│       ├── cacophony.txt
│       ├── json-reader.c
│       ├── json-reader.h
│       ├── noise-c-basic.txt
│       ├── noise-c-fallback.txt
│       ├── noise-c-hybrid.txt
│       └── test-vector.c
└── tools/
    ├── Makefile.am
    ├── keytool/
    │   ├── .gitignore
    │   ├── Makefile.am
    │   ├── generate.c
    │   ├── keytool.c
    │   ├── keytool.h
    │   ├── show.c
    │   └── sign.c
    └── protoc/
        ├── .gitignore
        ├── Makefile.am
        ├── main.c
        ├── proto3-ast.c
        ├── proto3-ast.h
        ├── proto3-generate-c.c
        ├── proto3-grammar.y
        ├── proto3-lexer.l
        └── test.proto
Download .txt
SYMBOL INDEX (1815 symbols across 184 files)

FILE: include/noise/keys/certificate.h
  type Noise_Certificate (line 32) | typedef struct _Noise_Certificate Noise_Certificate;
  type Noise_CertificateChain (line 33) | typedef struct _Noise_CertificateChain Noise_CertificateChain;
  type Noise_SubjectInfo (line 34) | typedef struct _Noise_SubjectInfo Noise_SubjectInfo;
  type Noise_PublicKeyInfo (line 35) | typedef struct _Noise_PublicKeyInfo Noise_PublicKeyInfo;
  type Noise_MetaInfo (line 36) | typedef struct _Noise_MetaInfo Noise_MetaInfo;
  type Noise_Signature (line 37) | typedef struct _Noise_Signature Noise_Signature;
  type Noise_ExtraSignedInfo (line 38) | typedef struct _Noise_ExtraSignedInfo Noise_ExtraSignedInfo;
  type Noise_EncryptedPrivateKey (line 39) | typedef struct _Noise_EncryptedPrivateKey Noise_EncryptedPrivateKey;
  type Noise_PrivateKey (line 40) | typedef struct _Noise_PrivateKey Noise_PrivateKey;
  type Noise_PrivateKeyInfo (line 41) | typedef struct _Noise_PrivateKeyInfo Noise_PrivateKeyInfo;

FILE: include/noise/protobufs.h
  type NoiseProtobuf (line 34) | typedef struct

FILE: include/noise/protocol/buffer.h
  type NoiseBuffer (line 33) | typedef struct

FILE: include/noise/protocol/cipherstate.h
  type NoiseCipherState (line 32) | typedef struct NoiseCipherState_s NoiseCipherState;

FILE: include/noise/protocol/dhstate.h
  type NoiseDHState (line 33) | typedef struct NoiseDHState_s NoiseDHState;

FILE: include/noise/protocol/handshakestate.h
  type NoiseHandshakeState (line 33) | typedef struct NoiseHandshakeState_s NoiseHandshakeState;

FILE: include/noise/protocol/hashstate.h
  type NoiseHashState (line 33) | typedef struct NoiseHashState_s NoiseHashState;

FILE: include/noise/protocol/names.h
  type NoiseProtocolId (line 33) | typedef struct

FILE: include/noise/protocol/randstate.h
  type NoiseRandState (line 33) | typedef struct NoiseRandState_s NoiseRandState;

FILE: include/noise/protocol/signstate.h
  type NoiseSignState (line 33) | typedef struct NoiseSignState_s NoiseSignState;

FILE: include/noise/protocol/symmetricstate.h
  type NoiseSymmetricState (line 33) | typedef struct NoiseSymmetricState_s NoiseSymmetricState;

FILE: src/backend/openssl/cipher-aesgcm.c
  type NoiseAESGCMState (line 30) | typedef struct
  function noise_aesgcm_init_key (line 39) | static void noise_aesgcm_init_key
  function noise_aesgcm_setup_iv (line 65) | static void noise_aesgcm_setup_iv(NoiseAESGCMState *st)
  function noise_aesgcm_encrypt (line 72) | static int noise_aesgcm_encrypt(NoiseCipherState *state, const uint8_t *...
  function noise_aesgcm_decrypt (line 129) | static int noise_aesgcm_decrypt(NoiseCipherState *state, const uint8_t *...
  function noise_aesgcm_free (line 181) | void noise_aesgcm_free(NoiseCipherState *state)
  function NoiseCipherState (line 188) | NoiseCipherState *noise_aesgcm_new_openssl(void)

FILE: src/backend/ref/cipher-aesgcm.c
  type NoiseAESGCMState (line 28) | typedef struct
  function noise_aesgcm_init_key (line 38) | static void noise_aesgcm_init_key
  function noise_aesgcm_setup_iv (line 70) | static void noise_aesgcm_setup_iv(NoiseAESGCMState *st)
  function noise_aesgcm_encrypt_or_decrypt (line 99) | static void noise_aesgcm_encrypt_or_decrypt
  function noise_aesgcm_finalize_hash (line 135) | static void noise_aesgcm_finalize_hash
  function noise_aesgcm_encrypt (line 156) | static int noise_aesgcm_encrypt
  function noise_aesgcm_decrypt (line 172) | static int noise_aesgcm_decrypt
  function NoiseCipherState (line 190) | NoiseCipherState *noise_aesgcm_new_ref(void)

FILE: src/backend/ref/cipher-chachapoly.c
  type NoiseChaChaPolyState (line 28) | typedef struct
  function noise_chachapoly_init_key (line 37) | static void noise_chachapoly_init_key
  function noise_chachapoly_setup (line 62) | static void noise_chachapoly_setup(NoiseChaChaPolyState *st, uint64_t n)
  function noise_chachapoly_pad_auth (line 81) | static void noise_chachapoly_pad_auth(NoiseChaChaPolyState *st, size_t len)
  function noise_chachapoly_auth_lengths (line 99) | static void noise_chachapoly_auth_lengths
  function noise_chachapoly_encrypt (line 107) | static int noise_chachapoly_encrypt
  function noise_chachapoly_decrypt (line 125) | static int noise_chachapoly_decrypt
  function NoiseCipherState (line 145) | NoiseCipherState *noise_chachapoly_new(void)

FILE: src/backend/ref/dh-curve25519.c
  type NoiseCurve25519State (line 34) | typedef struct
  function noise_curve25519_generate_keypair (line 42) | static int noise_curve25519_generate_keypair
  function noise_curve25519_set_keypair (line 53) | static int noise_curve25519_set_keypair
  function noise_curve25519_set_keypair_private (line 68) | static int noise_curve25519_set_keypair_private
  function noise_curve25519_validate_public_key (line 77) | static int noise_curve25519_validate_public_key
  function noise_curve25519_copy (line 84) | static int noise_curve25519_copy
  function noise_curve25519_calculate (line 94) | static int noise_curve25519_calculate
  function NoiseDHState (line 105) | NoiseDHState *noise_curve25519_new(void)

FILE: src/backend/ref/dh-curve448.c
  type NoiseCurve448State (line 27) | typedef struct
  function noise_curve448_generate_keypair (line 38) | static int noise_curve448_generate_keypair
  function noise_curve448_set_keypair (line 55) | static int noise_curve448_set_keypair
  function noise_curve448_set_keypair_private (line 70) | static int noise_curve448_set_keypair_private
  function noise_curve448_validate_public_key (line 79) | static int noise_curve448_validate_public_key
  function noise_curve448_copy (line 86) | static int noise_curve448_copy
  function noise_curve448_calculate (line 96) | static int noise_curve448_calculate
  function NoiseDHState (line 107) | NoiseDHState *noise_curve448_new(void)

FILE: src/backend/ref/dh-newhope.c
  type NoiseNewHopeState (line 29) | typedef struct NoiseNewHopeState_s
  function noise_newhope_generate_keypair (line 39) | static int noise_newhope_generate_keypair
  function noise_newhope_set_keypair_private (line 60) | static int noise_newhope_set_keypair_private
  function noise_newhope_set_keypair (line 80) | static int noise_newhope_set_keypair
  function noise_newhope_validate_public_key (line 88) | static int noise_newhope_validate_public_key
  function noise_newhope_copy (line 95) | static int noise_newhope_copy
  function noise_newhope_calculate (line 118) | static int noise_newhope_calculate
  function noise_newhope_change_role (line 144) | static void noise_newhope_change_role(NoiseDHState *state)
  function NoiseDHState (line 156) | NoiseDHState *noise_newhope_new(void)

FILE: src/backend/ref/hash-blake2b.c
  type NoiseBLAKE2bState (line 26) | typedef struct
  function noise_blake2b_reset (line 33) | static void noise_blake2b_reset(NoiseHashState *state)
  function noise_blake2b_update (line 39) | static void noise_blake2b_update(NoiseHashState *state, const uint8_t *d...
  function noise_blake2b_finalize (line 45) | static void noise_blake2b_finalize(NoiseHashState *state, uint8_t *hash)
  function NoiseHashState (line 51) | NoiseHashState *noise_blake2b_new(void)

FILE: src/backend/ref/hash-blake2s.c
  type NoiseBLAKE2sState (line 26) | typedef struct
  function noise_blake2s_reset (line 33) | static void noise_blake2s_reset(NoiseHashState *state)
  function noise_blake2s_update (line 39) | static void noise_blake2s_update(NoiseHashState *state, const uint8_t *d...
  function noise_blake2s_finalize (line 45) | static void noise_blake2s_finalize(NoiseHashState *state, uint8_t *hash)
  function NoiseHashState (line 51) | NoiseHashState *noise_blake2s_new(void)

FILE: src/backend/ref/hash-sha256.c
  type NoiseSHA256State (line 26) | typedef struct
  function noise_sha256_reset (line 33) | static void noise_sha256_reset(NoiseHashState *state)
  function noise_sha256_update (line 39) | static void noise_sha256_update(NoiseHashState *state, const uint8_t *da...
  function noise_sha256_finalize (line 45) | static void noise_sha256_finalize(NoiseHashState *state, uint8_t *hash)
  function NoiseHashState (line 51) | NoiseHashState *noise_sha256_new(void)

FILE: src/backend/ref/hash-sha512.c
  type NoiseSHA512State (line 26) | typedef struct
  function noise_sha512_reset (line 33) | static void noise_sha512_reset(NoiseHashState *state)
  function noise_sha512_update (line 39) | static void noise_sha512_update(NoiseHashState *state, const uint8_t *da...
  function noise_sha512_finalize (line 45) | static void noise_sha512_finalize(NoiseHashState *state, uint8_t *hash)
  function NoiseHashState (line 51) | NoiseHashState *noise_sha512_new(void)

FILE: src/backend/ref/sign-ed25519.c
  type NoiseEd25519State (line 26) | typedef struct
  function noise_ed25519_generate_keypair (line 34) | static void noise_ed25519_generate_keypair(NoiseSignState *state)
  function noise_ed25519_validate_keypair (line 43) | static int noise_ed25519_validate_keypair
  function noise_ed25519_validate_public_key (line 55) | static int noise_ed25519_validate_public_key
  function noise_ed25519_derive_public_key (line 62) | static int noise_ed25519_derive_public_key
  function noise_ed25519_sign (line 70) | static int noise_ed25519_sign
  function noise_ed25519_verify (line 80) | static int noise_ed25519_verify
  function NoiseSignState (line 90) | NoiseSignState *noise_ed25519_new(void)

FILE: src/backend/sodium/cipher-aesgcm.c
  type NoiseAESGCMState (line 28) | typedef struct
  function noise_aesgcm_init_key (line 36) | static void noise_aesgcm_init_key
  function noise_aesgcm_setup_iv (line 63) | static void noise_aesgcm_setup_iv(NoiseAESGCMState *st)
  function noise_aesgcm_encrypt (line 70) | static int noise_aesgcm_encrypt
  function noise_aesgcm_decrypt (line 80) | static int noise_aesgcm_decrypt
  function NoiseCipherState (line 91) | NoiseCipherState *noise_aesgcm_new_sodium(void)

FILE: src/backend/sodium/cipher-chachapoly.c
  type NoiseChaChaPolyState (line 28) | typedef struct
  function noise_chachapoly_init_key (line 38) | static void noise_chachapoly_init_key
  function noise_chachapoly_setup (line 63) | static void noise_chachapoly_setup(NoiseChaChaPolyState *st, uint64_t n)
  function noise_chachapoly_pad_auth (line 82) | static void noise_chachapoly_pad_auth(NoiseChaChaPolyState *st, size_t len)
  function noise_chachapoly_auth_lengths (line 100) | static void noise_chachapoly_auth_lengths
  function noise_chachapoly_encrypt (line 108) | static int noise_chachapoly_encrypt
  function noise_chachapoly_decrypt (line 126) | static int noise_chachapoly_decrypt
  function NoiseCipherState (line 146) | NoiseCipherState *noise_chachapoly_new(void)

FILE: src/backend/sodium/dh-curve25519.c
  type NoiseCurve25519State (line 35) | typedef struct
  function noise_curve25519_generate_keypair (line 43) | static int noise_curve25519_generate_keypair
  function noise_curve25519_set_keypair (line 54) | static int noise_curve25519_set_keypair
  function noise_curve25519_set_keypair_private (line 69) | static int noise_curve25519_set_keypair_private
  function noise_curve25519_validate_public_key (line 78) | static int noise_curve25519_validate_public_key
  function noise_curve25519_copy (line 85) | static int noise_curve25519_copy
  function noise_curve25519_calculate (line 95) | static int noise_curve25519_calculate
  function NoiseDHState (line 106) | NoiseDHState *noise_curve25519_new(void)

FILE: src/backend/sodium/hash-blake2b.c
  type NoiseBLAKE2bState (line 27) | typedef struct
  function noise_blake2b_reset (line 34) | static void noise_blake2b_reset(NoiseHashState *state)
  function noise_blake2b_update (line 40) | static void noise_blake2b_update(NoiseHashState *state, const uint8_t *d...
  function noise_blake2b_finalize (line 46) | static void noise_blake2b_finalize(NoiseHashState *state, uint8_t *hash)
  function NoiseHashState (line 52) | NoiseHashState *noise_blake2b_new(void)

FILE: src/backend/sodium/hash-sha256.c
  type NoiseSHA256State (line 27) | typedef struct
  function noise_sha256_reset (line 34) | static void noise_sha256_reset(NoiseHashState *state)
  function noise_sha256_update (line 40) | static void noise_sha256_update(NoiseHashState *state, const uint8_t *da...
  function noise_sha256_finalize (line 46) | static void noise_sha256_finalize(NoiseHashState *state, uint8_t *hash)
  function NoiseHashState (line 52) | NoiseHashState *noise_sha256_new(void)

FILE: src/backend/sodium/hash-sha512.c
  type NoiseSHA512State (line 27) | typedef struct
  function noise_sha512_reset (line 34) | static void noise_sha512_reset(NoiseHashState *state)
  function noise_sha512_update (line 40) | static void noise_sha512_update(NoiseHashState *state, const uint8_t *da...
  function noise_sha512_finalize (line 46) | static void noise_sha512_finalize(NoiseHashState *state, uint8_t *hash)
  function NoiseHashState (line 52) | NoiseHashState *noise_sha512_new(void)

FILE: src/backend/sodium/sign-ed25519.c
  type NoiseEd25519State (line 27) | typedef struct
  function noise_ed25519_generate_keypair (line 40) | static void noise_ed25519_generate_keypair(NoiseSignState *state)
  function noise_ed25519_validate_keypair (line 47) | static int noise_ed25519_validate_keypair
  function noise_ed25519_validate_public_key (line 60) | static int noise_ed25519_validate_public_key
  function noise_ed25519_derive_public_key (line 67) | static int noise_ed25519_derive_public_key
  function noise_ed25519_sign (line 76) | static int noise_ed25519_sign
  function noise_ed25519_verify (line 85) | static int noise_ed25519_verify
  function NoiseSignState (line 95) | NoiseSignState *noise_ed25519_new(void)

FILE: src/crypto/aes/rijndael-alg-fst.c
  function rijndaelKeySetupEnc (line 728) | int rijndaelKeySetupEnc(u32 rk[/*4*(Nr + 1)*/], const u8 cipherKey[], in...
  function rijndaelKeySetupDec (line 814) | int rijndaelKeySetupDec(u32 rk[/*4*(Nr + 1)*/], const u8 cipherKey[], in...
  function rijndaelEncrypt (line 854) | void rijndaelEncrypt(const u32 rk[/*4*(Nr + 1)*/], int Nr, const u8 pt[1...
  function rijndaelDecrypt (line 1035) | void rijndaelDecrypt(const u32 rk[/*4*(Nr + 1)*/], int Nr, const u8 ct[1...
  function rijndaelEncryptRound (line 1218) | void rijndaelEncryptRound(const u32 rk[/*4*(Nr + 1)*/], int Nr, u8 block...
  function rijndaelDecryptRound (line 1311) | void rijndaelDecryptRound(const u32 rk[/*4*(Nr + 1)*/], int Nr, u8 block...

FILE: src/crypto/aes/rijndael-alg-fst.h
  type u8 (line 35) | typedef uint8_t      	u8;
  type u16 (line 36) | typedef uint16_t      	u16;
  type u32 (line 37) | typedef uint32_t  	u32;

FILE: src/crypto/blake2/blake2b.c
  function BLAKE2b_reset (line 43) | void BLAKE2b_reset(BLAKE2b_context_t *context)
  function blake2b_transform (line 89) | static void blake2b_transform
  function BLAKE2b_update (line 145) | void BLAKE2b_update(BLAKE2b_context_t *context, const void *data, size_t...
  function BLAKE2b_finish (line 177) | void BLAKE2b_finish(BLAKE2b_context_t *context, uint8_t *hash)

FILE: src/crypto/blake2/blake2b.h
  type BLAKE2b_context_t (line 33) | typedef struct

FILE: src/crypto/blake2/blake2s.c
  function BLAKE2s_reset (line 44) | void BLAKE2s_reset(BLAKE2s_context_t *context)
  function blake2s_transform (line 116) | static void blake2s_transform
  function BLAKE2s_update (line 213) | void BLAKE2s_update(BLAKE2s_context_t *context, const void *data, size_t...
  function BLAKE2s_finish (line 245) | void BLAKE2s_finish(BLAKE2s_context_t *context, uint8_t *hash)

FILE: src/crypto/blake2/blake2s.h
  type BlakeVectorUInt32 (line 36) | typedef uint32_t BlakeVectorUInt32 __attribute__((ext_vector_type(4)));
  type BlakeVectorUInt32 (line 38) | typedef uint32_t BlakeVectorUInt32 __attribute__((__vector_size__(16)));
  type BLAKE2s_context_t (line 44) | typedef struct

FILE: src/crypto/chacha/chacha.c
  function chacha_keysetup (line 74) | void chacha_keysetup(chacha_ctx *x, const uint8_t *k, uint32_t kbits)
  function chacha_ivsetup (line 111) | void chacha_ivsetup(chacha_ctx *x, const uint8_t *iv, const uint8_t *cou...
  function chacha_encrypt_bytes (line 141) | void chacha_encrypt_bytes(chacha_ctx *x, const uint8_t *m, uint8_t *c, u...
  function chacha_encrypt_bytes (line 209) | void chacha_encrypt_bytes(chacha_ctx *x, const uint8_t *m, uint8_t *c, u...

FILE: src/crypto/chacha/chacha.h
  type VectorUInt32 (line 11) | typedef uint32_t VectorUInt32 __attribute__((ext_vector_type(4)));
  type VectorUInt32 (line 13) | typedef uint32_t VectorUInt32 __attribute__((__vector_size__(16)));
  type chacha_ctx (line 19) | typedef struct

FILE: src/crypto/curve448/curve448.c
  function cswap (line 45) | static void cswap(unsigned char swap, field_t *x, field_t *y)
  function curve448_eval (line 73) | int curve448_eval(unsigned char mypublic[56], const unsigned char secret...

FILE: src/crypto/donna/curve25519-donna-c64.c
  type u8 (line 28) | typedef uint8_t u8;
  type limb (line 29) | typedef uint64_t limb;
  type limb (line 30) | typedef limb felem[5];
  type uint128_t (line 33) | typedef unsigned uint128_t __attribute__((mode(TI)));
  function fsum (line 39) | static inline void force_inline
  function fdifference_backwards (line 54) | static inline void force_inline
  function fscalar_product (line 68) | static inline void force_inline
  function fmul (line 98) | static inline void force_inline
  function fsquare_times (line 147) | static inline void force_inline
  function limb (line 190) | static limb
  function store_limb (line 203) | static void
  function fexpand (line 216) | static void
  function fcontract (line 228) | static void
  function fmonty (line 292) | static void
  function swap_conditional (line 333) | static void
  function cmult (line 351) | static void
  function crecip (line 402) | static void
  function curve25519_donna (line 432) | int

FILE: src/crypto/donna/curve25519-donna.c
  type u8 (line 55) | typedef uint8_t u8;
  type s32 (line 56) | typedef int32_t s32;
  type limb (line 57) | typedef int64_t limb;
  function fsum (line 68) | static void fsum(limb *output, const limb *in) {
  function fdifference (line 78) | static void fdifference(limb *output, const limb *in) {
  function fscalar_product (line 86) | static void fscalar_product(limb *output, const limb *in, const limb sca...
  function fproduct (line 99) | static void fproduct(limb *output, const limb *in2, const limb *in) {
  function freduce_degree (line 206) | static void freduce_degree(limb *output) {
  function limb (line 247) | static inline limb
  function limb (line 263) | static inline limb
  function freduce_coefficients (line 279) | static void freduce_coefficients(limb *output) {
  function fmul (line 328) | static void
  function fsquare_inner (line 345) | static void fsquare_inner(limb *output, const limb *in) {
  function fsquare (line 410) | static void
  function fexpand (line 424) | static void
  function s32 (line 449) | static s32 s32_eq(s32 a, s32 b) {
  function s32 (line 461) | static s32 s32_gte(s32 a, s32 b) {
  function fcontract (line 471) | static void
  function fmonty (line 625) | static void fmonty(limb *x2, limb *z2,  /* output 2Q */
  function swap_conditional (line 709) | static void
  function cmult (line 726) | static void
  function crecip (line 776) | static void
  function curve25519_donna (line 843) | int

FILE: src/crypto/donna/poly1305-donna-16.h
  type poly1305_state_internal_t (line 16) | typedef struct poly1305_state_internal_t {
  function U8TO16 (line 26) | static unsigned short
  function U16TO8 (line 34) | static void
  function poly1305_init (line 40) | void
  function poly1305_blocks (line 70) | static void
  function POLY1305_NOINLINE (line 120) | POLY1305_NOINLINE void

FILE: src/crypto/donna/poly1305-donna-32.h
  type poly1305_state_internal_t (line 16) | typedef struct poly1305_state_internal_t {
  function U8TO32 (line 26) | static unsigned long
  function U32TO8 (line 36) | static void
  function poly1305_init (line 44) | void
  function poly1305_blocks (line 72) | static void
  function POLY1305_NOINLINE (line 133) | POLY1305_NOINLINE void

FILE: src/crypto/donna/poly1305-donna-64.h
  type uint128_t (line 8) | typedef struct uint128_t {
  type uint128_t (line 22) | typedef unsigned __int128 uint128_t;
  type uint128_t (line 24) | typedef unsigned uint128_t __attribute__((mode(TI)));
  type poly1305_state_internal_t (line 39) | typedef struct poly1305_state_internal_t {
  function U8TO64 (line 49) | static unsigned long long
  function U64TO8 (line 63) | static void
  function poly1305_init (line 75) | void
  function poly1305_blocks (line 101) | static void
  function POLY1305_NOINLINE (line 154) | POLY1305_NOINLINE void

FILE: src/crypto/donna/poly1305-donna-8.h
  type poly1305_state_internal_t (line 18) | typedef struct poly1305_state_internal_t {
  function poly1305_init (line 27) | void
  function poly1305_add (line 65) | static void
  function poly1305_squeeze (line 76) | static void
  function poly1305_freeze (line 98) | static void
  function poly1305_blocks (line 119) | static void
  function POLY1305_NOINLINE (line 156) | POLY1305_NOINLINE void

FILE: src/crypto/donna/poly1305-donna.c
  function poly1305_update (line 26) | void
  function poly1305_auth (line 63) | void
  function poly1305_verify (line 71) | int
  function poly1305_power_on_self_test (line 83) | int

FILE: src/crypto/donna/poly1305-donna.h
  type poly1305_context (line 6) | typedef struct poly1305_context {

FILE: src/crypto/ed25519/curve25519-donna-32bit.h
  function DONNA_INLINE (line 16) | DONNA_INLINE static void
  function DONNA_INLINE (line 31) | DONNA_INLINE static void
  function DONNA_INLINE (line 45) | DONNA_INLINE static void
  function DONNA_INLINE (line 61) | DONNA_INLINE static void
  function DONNA_INLINE (line 86) | DONNA_INLINE static void
  function DONNA_INLINE (line 102) | DONNA_INLINE static void
  function DONNA_INLINE (line 118) | DONNA_INLINE static void
  function DONNA_INLINE (line 135) | DONNA_INLINE static void
  function curve25519_mul (line 153) | static void
  function curve25519_square (line 251) | static void
  function curve25519_square_times (line 326) | static void
  function curve25519_expand (line 402) | static void
  function curve25519_contract (line 448) | static void
  function DONNA_INLINE (line 531) | DONNA_INLINE static void
  function DONNA_INLINE (line 564) | DONNA_INLINE static void

FILE: src/crypto/ed25519/curve25519-donna-64bit.h
  function DONNA_INLINE (line 16) | DONNA_INLINE static void
  function DONNA_INLINE (line 26) | DONNA_INLINE static void
  function DONNA_INLINE (line 36) | DONNA_INLINE static void
  function DONNA_INLINE (line 45) | DONNA_INLINE static void
  function DONNA_INLINE (line 63) | DONNA_INLINE static void
  function DONNA_INLINE (line 73) | DONNA_INLINE static void
  function DONNA_INLINE (line 82) | DONNA_INLINE static void
  function DONNA_INLINE (line 94) | DONNA_INLINE static void
  function DONNA_INLINE (line 106) | DONNA_INLINE static void
  function DONNA_NOINLINE (line 173) | DONNA_NOINLINE static void
  function DONNA_NOINLINE (line 179) | DONNA_NOINLINE static void
  function DONNA_INLINE (line 236) | DONNA_INLINE static void
  function DONNA_INLINE (line 287) | DONNA_INLINE static void
  function DONNA_INLINE (line 324) | DONNA_INLINE static void
  function DONNA_INLINE (line 378) | DONNA_INLINE static void
  function DONNA_INLINE (line 398) | DONNA_INLINE static void

FILE: src/crypto/ed25519/curve25519-donna-helpers.h
  function bignum25519 (line 38) | bignum25519 ALIGN(16) a,t0,b;

FILE: src/crypto/ed25519/curve25519-donna-sse2.h
  type __m128i (line 9) | typedef __m128i xmmi;
  type packedelem8 (line 11) | typedef union packedelem8_t {
  type packedelem32 (line 16) | typedef union packedelem32_t {
  type packedelem64 (line 21) | typedef union packedelem64_t {
  type packedelem32 (line 28) | typedef packedelem32 packed32bignum25519[5];
  type packedelem64 (line 29) | typedef packedelem64 packed64bignum25519[10];
  function DONNA_INLINE (line 70) | DONNA_INLINE static void
  function DONNA_INLINE (line 82) | DONNA_INLINE static void
  function DONNA_INLINE (line 100) | DONNA_INLINE static void
  function DONNA_INLINE (line 134) | DONNA_INLINE static void
  function DONNA_INLINE (line 171) | DONNA_INLINE static void
  function DONNA_INLINE (line 208) | DONNA_INLINE static void
  function DONNA_INLINE (line 246) | DONNA_INLINE static void
  function curve25519_mul (line 282) | static void
  function DONNA_NOINLINE (line 426) | DONNA_NOINLINE static void
  function curve25519_square_times (line 432) | static void
  function DONNA_INLINE (line 557) | DONNA_INLINE static void
  function DONNA_INLINE (line 575) | DONNA_INLINE static void
  function DONNA_INLINE (line 593) | DONNA_INLINE static void
  function DONNA_INLINE (line 625) | DONNA_INLINE static void
  function DONNA_INLINE (line 634) | DONNA_INLINE static void
  function DONNA_INLINE (line 666) | DONNA_INLINE static void
  function DONNA_INLINE (line 703) | DONNA_INLINE static void
  function DONNA_INLINE (line 746) | DONNA_INLINE static void
  function DONNA_INLINE (line 764) | DONNA_INLINE static void
  function DONNA_INLINE (line 784) | DONNA_INLINE static void
  function DONNA_INLINE (line 798) | DONNA_INLINE static void
  function DONNA_INLINE (line 808) | DONNA_INLINE static void
  function DONNA_INLINE (line 863) | DONNA_INLINE static void
  function curve25519_expand (line 923) | static void
  function curve25519_contract (line 953) | static void
  function DONNA_INLINE (line 1035) | DONNA_INLINE static void
  function DONNA_INLINE (line 1069) | DONNA_INLINE static void

FILE: src/crypto/ed25519/ed25519-donna-32bit-sse2.h
  function DONNA_NOINLINE (line 5) | DONNA_NOINLINE static void

FILE: src/crypto/ed25519/ed25519-donna-64bit-sse2.h
  function DONNA_NOINLINE (line 5) | DONNA_NOINLINE static void

FILE: src/crypto/ed25519/ed25519-donna-64bit-x86-32bit.h
  function DONNA_NOINLINE (line 5) | DONNA_NOINLINE static void

FILE: src/crypto/ed25519/ed25519-donna-64bit-x86.h
  function DONNA_NOINLINE (line 10) | DONNA_NOINLINE static void

FILE: src/crypto/ed25519/ed25519-donna-batchverify.h
  type heap_index_t (line 11) | typedef size_t heap_index_t;
  type batch_heap (line 13) | typedef struct batch_heap_t {
  function heap_swap (line 22) | static void
  function heap_insert_next (line 31) | static void
  function heap_updated_root (line 51) | static void
  function heap_build (line 80) | static void
  function heap_extend (line 89) | static void
  function heap_get_top2 (line 96) | static void
  function ge25519_multi_scalarmult_vartime_final (line 106) | static void
  function ge25519_multi_scalarmult_vartime (line 151) | static void
  function ge25519_is_neutral_vartime (line 193) | static int

FILE: src/crypto/ed25519/ed25519-donna-impl-base.h
  function DONNA_INLINE (line 5) | DONNA_INLINE static void
  function DONNA_INLINE (line 12) | DONNA_INLINE static void
  function ge25519_full_to_pniels (line 20) | static void
  function ge25519_add_p1p1 (line 32) | static void
  function ge25519_double_p1p1 (line 53) | static void
  function ge25519_nielsadd2_p1p1 (line 69) | static void
  function ge25519_pnielsadd_p1p1 (line 88) | static void
  function ge25519_double_partial (line 108) | static void
  function ge25519_double (line 115) | static void
  function ge25519_add (line 122) | static void
  function ge25519_nielsadd2 (line 129) | static void
  function ge25519_pnielsadd (line 149) | static void
  function ge25519_pack (line 179) | static void
  function ge25519_unpack_negative_vartime (line 191) | static int
  function ge25519_double_scalarmult_vartime (line 252) | static void
  function ge25519_windowb_equal (line 298) | static uint32_t
  function ge25519_scalarmult_base_choose_niels (line 303) | static void
  function ge25519_scalarmult_base_niels (line 334) | static void

FILE: src/crypto/ed25519/ed25519-donna-impl-sse2.h
  function packed64bignum25519 (line 17) | packed64bignum25519 ALIGN(16) zy, xt, xx, zz, ty;
  function bignum25519 (line 121) | bignum25519 ALIGN(16) a,b,c;
  function ge25519_add (line 152) | static void
  function ge25519_double_partial (line 159) | static void
  function bignum25519 (line 210) | bignum25519 ALIGN(16) tx, ty, zi;
  function ge25519_double_scalarmult_vartime (line 283) | static void
  function ge25519_windowb_equal (line 327) | static uint32_t
  function bignum25519 (line 334) | bignum25519 ALIGN(16) neg;

FILE: src/crypto/ed25519/ed25519-donna-portable.h
  type uint128_t (line 34) | typedef unsigned __int128 uint128_t;
  type uint128_t (line 37) | typedef struct uint128_t {
  type uint128_t (line 52) | typedef unsigned __int128 uint128_t;
  type uint128_t (line 55) | typedef unsigned uint128_t __attribute__((mode(TI)));
  type uint128_t (line 58) | typedef struct uint128_t {
  function U32TO8_LE (line 93) | static inline void U32TO8_LE(unsigned char *p, const uint32_t v) {
  function U8TO32_LE (line 102) | static inline uint32_t U8TO32_LE(const unsigned char *p) {
  function U8TO64_LE (line 110) | static inline uint64_t U8TO64_LE(const unsigned char *p) {
  function U64TO8_LE (line 122) | static inline void U64TO8_LE(unsigned char *p, const uint64_t v) {

FILE: src/crypto/ed25519/ed25519-donna.h
  function ed25519_verify (line 66) | static int
  type ge25519 (line 81) | typedef struct ge25519_t {
  type ge25519_p1p1 (line 85) | typedef struct ge25519_p1p1_t {
  type ge25519_niels (line 89) | typedef struct ge25519_niels_t {
  type ge25519_pniels (line 93) | typedef struct ge25519_pniels_t {

FILE: src/crypto/ed25519/ed25519-hash.h
  type sha512_state (line 8) | typedef struct sha512_state_t {
  type sha512_state (line 15) | typedef sha512_state ed25519_hash_context;
  function sha512_ROTR64 (line 40) | static uint64_t
  function sha512_LOAD64_BE (line 45) | static uint64_t
  function sha512_STORE64_BE (line 58) | static void
  function sha512_blocks (line 90) | static void
  function ed25519_hash_init (line 108) | static void
  function ed25519_hash_update (line 123) | static void
  function ed25519_hash_final (line 153) | static void
  function ed25519_hash (line 180) | static void
  type SHA512_CTX (line 196) | typedef SHA512_CTX ed25519_hash_context;
  function ed25519_hash_init (line 198) | static void
  function ed25519_hash_update (line 203) | static void
  function ed25519_hash_final (line 208) | static void
  function ed25519_hash (line 213) | static void

FILE: src/crypto/ed25519/ed25519-randombytes.h
  type isaacp_state (line 8) | typedef struct isaacp_state_t {
  function isaacp_mix (line 23) | static void
  function isaacp_random (line 46) | static void

FILE: src/crypto/ed25519/ed25519.c
  function DONNA_INLINE (line 26) | DONNA_INLINE static void
  function ed25519_hram (line 34) | static void
  function ge25519 (line 62) | ge25519 ALIGN(16) R;

FILE: src/crypto/ed25519/fuzz/build-nix.php
  function echoln (line 2) | function echoln($str) {
  function usage (line 7) | function usage($reason) {
  function cleanup (line 22) | function cleanup() {
  function runcmd (line 26) | function runcmd($desc, $cmd) {
  class argument (line 37) | class argument {
  class multiargument (line 41) | class multiargument extends argument {
    method multiargument (line 42) | function multiargument($flag, $legal_values) {
  class flag (line 66) | class flag extends argument {
    method flag (line 67) | function flag($flag) {

FILE: src/crypto/ed25519/fuzz/curve25519-ref10.c
  type crypto_int32 (line 3) | typedef int32_t crypto_int32;
  type crypto_int64 (line 4) | typedef int64_t crypto_int64;
  type crypto_uint64 (line 5) | typedef uint64_t crypto_uint64;
  type crypto_int32 (line 7) | typedef crypto_int32 fe[10];
  function fe_0 (line 13) | void fe_0(fe h)
  function fe_1 (line 31) | void fe_1(fe h)
  function fe_add (line 57) | void fe_add(fe h,fe f,fe g)
  function fe_copy (line 105) | void fe_copy(fe h,fe f)
  function fe_cswap (line 137) | void fe_cswap(fe f,fe g,unsigned int b)
  function crypto_uint64 (line 202) | static crypto_uint64 load_3(const unsigned char *in)
  function crypto_uint64 (line 211) | static crypto_uint64 load_4(const unsigned char *in)
  function fe_frombytes (line 221) | void fe_frombytes(fe h,const unsigned char *s)
  function fe_mul (line 301) | void fe_mul(fe h,fe f,fe g)
  function fe_mul121666 (line 531) | void fe_mul121666(fe h,fe f)
  function fe_sq (line 603) | void fe_sq(fe h,fe f)
  function fe_sub (line 747) | void fe_sub(fe h,fe f,fe g)
  function fe_tobytes (line 816) | void fe_tobytes(unsigned char *s,fe h)
  function fe_invert (line 909) | void fe_invert(fe out,fe z)
  function crypto_scalarmult_ref10 (line 1082) | int crypto_scalarmult_ref10(unsigned char *q,
  function crypto_scalarmult_base_ref10 (line 1268) | int crypto_scalarmult_base_ref10(unsigned char *q,const unsigned char *n)

FILE: src/crypto/ed25519/fuzz/ed25519-ref10.c
  function crypto_verify_32 (line 5) | static int crypto_verify_32(const unsigned char *x,const unsigned char *y)
  type sha512_state (line 51) | typedef struct sha512_state_t {
  type sha512_state (line 58) | typedef sha512_state ed25519_hash_context;
  function sha512_ROTR64 (line 83) | static uint64_t
  function sha512_LOAD64_BE (line 88) | static uint64_t
  function sha512_STORE64_BE (line 101) | static void
  function sha512_blocks (line 133) | static void
  function ed25519_hash_init (line 151) | static void
  function ed25519_hash_update (line 166) | static void
  function ed25519_hash_final (line 196) | static void
  function crypto_hash_sha512 (line 223) | static void
  function crypto_hash_sha512 (line 235) | static void
  type crypto_int32 (line 245) | typedef int32_t crypto_int32;
  type crypto_uint32 (line 246) | typedef uint32_t crypto_uint32;
  type crypto_int64 (line 247) | typedef int64_t crypto_int64;
  type crypto_uint64 (line 248) | typedef uint64_t crypto_uint64;
  type crypto_int32 (line 250) | typedef crypto_int32 fe[10];
  function fe_0 (line 256) | static void fe_0(fe h)
  function fe_1 (line 274) | static void fe_1(fe h)
  function fe_add (line 300) | static void fe_add(fe h,const fe f,const fe g)
  function fe_cmov (line 352) | static void fe_cmov(fe f,const fe g,unsigned int b)
  function fe_copy (line 412) | static void fe_copy(fe h,const fe f)
  function crypto_uint64 (line 437) | static crypto_uint64 load_3(const unsigned char *in)
  function crypto_uint64 (line 446) | static crypto_uint64 load_4(const unsigned char *in)
  function fe_frombytes (line 460) | static void fe_frombytes(fe h,const unsigned char *s)
  function fe_tobytes (line 532) | static void fe_tobytes(unsigned char *s,const fe h)
  function fe_sub (line 638) | static void fe_sub(fe h,const fe f,const fe g)
  function fe_sq (line 698) | static void fe_sq(fe h,const fe f)
  function fe_sq2 (line 845) | static void fe_sq2(fe h,const fe f)
  function fe_mul (line 1020) | static void fe_mul(fe h,const fe f,const fe g)
  function fe_isnegative (line 1248) | static int fe_isnegative(const fe f)
  function fe_isnonzero (line 1266) | static int fe_isnonzero(const fe f)
  function fe_neg (line 1283) | static void fe_neg(fe h,const fe f)
  function fe_invert (line 1317) | static void fe_invert(fe out,const fe z)
  function fe_pow22523 (line 1490) | static void fe_pow22523(fe out,const fe z)
  type ge_p2 (line 1677) | typedef struct {
  type ge_p3 (line 1683) | typedef struct {
  type ge_p1p1 (line 1690) | typedef struct {
  type ge_precomp (line 1697) | typedef struct {
  type ge_cached (line 1703) | typedef struct {
  function ge_p2_0 (line 3114) | static void ge_p2_0(ge_p2 *h)
  function ge_p3_0 (line 3121) | static void ge_p3_0(ge_p3 *h)
  function ge_precomp_0 (line 3129) | static void ge_precomp_0(ge_precomp *h)
  function ge_p1p1_to_p2 (line 3140) | static void ge_p1p1_to_p2(ge_p2 *r,const ge_p1p1 *p)
  function ge_p1p1_to_p3 (line 3151) | static void ge_p1p1_to_p3(ge_p3 *r,const ge_p1p1 *p)
  function ge_p3_to_p2 (line 3163) | static void ge_p3_to_p2(ge_p2 *r,const ge_p3 *p)
  function ge_p2_dbl (line 3175) | static void ge_p2_dbl(ge_p1p1 *r,const ge_p2 *p)
  function ge_p3_dbl (line 3257) | static void ge_p3_dbl(ge_p1p1 *r,const ge_p3 *p)
  function ge_p3_to_cached (line 3269) | static void ge_p3_to_cached(ge_cached *r,const ge_p3 *p)
  function ge_add (line 3281) | static void ge_add(ge_p1p1 *r,const ge_p3 *p,const ge_cached *q)
  function ge_sub (line 3387) | static void ge_sub(ge_p1p1 *r,const ge_p3 *p,const ge_cached *q)
  function ge_madd (line 3493) | static void ge_madd(ge_p1p1 *r,const ge_p3 *p,const ge_precomp *q)
  function ge_msub (line 3590) | static void ge_msub(ge_p1p1 *r,const ge_p3 *p,const ge_precomp *q)
  function ge_p3_tobytes (line 3683) | static void ge_p3_tobytes(unsigned char *s,const ge_p3 *h)
  function ge_tobytes (line 3696) | static void ge_tobytes(unsigned char *s,const ge_p2 *h)
  function ge_frombytes_negate_vartime (line 3709) | static int ge_frombytes_negate_vartime(ge_p3 *h,const unsigned char *s)
  function slide (line 3751) | static void slide(signed char *r,const unsigned char *a)
  function ge_double_scalarmult_vartime (line 3791) | static void ge_double_scalarmult_vartime(ge_p2 *r,const unsigned char *a...
  function equal (line 3843) | static unsigned char equal(signed char b,signed char c)
  function negative (line 3854) | static unsigned char negative(signed char b)
  function cmov (line 3861) | static void cmov(ge_precomp *t,ge_precomp *u,unsigned char b)
  function select (line 3870) | static void select(ge_precomp *t,int pos,signed char b)
  function ge_scalarmult_base (line 3900) | static void ge_scalarmult_base(ge_p3 *h,const unsigned char *a)
  function sc_reduce (line 3953) | static void sc_reduce(unsigned char *s)
  function sc_muladd (line 4206) | static void sc_muladd(unsigned char *s,const unsigned char *a,const unsi...
  function crypto_sign_pk_ref10 (line 4561) | int crypto_sign_pk_ref10(unsigned char *pk,unsigned char *sk)
  function crypto_sign_ref10 (line 4579) | int crypto_sign_ref10(
  function crypto_sign_open_ref10 (line 4613) | int crypto_sign_open_ref10(

FILE: src/crypto/ed25519/fuzz/fuzz-curve25519.c
  function print_diff (line 16) | static void
  function print_bytes (line 33) | static void
  function prng (line 47) | void

FILE: src/crypto/ed25519/fuzz/fuzz-ed25519.c
  function print_diff (line 15) | static void
  function print_bytes (line 32) | static void
  function prng (line 46) | void

FILE: src/crypto/ed25519/modm-donna-32bit.h
  type bignum256modm_element_t (line 18) | typedef uint32_t bignum256modm_element_t;
  type bignum256modm_element_t (line 19) | typedef bignum256modm_element_t bignum256modm[9];
  function bignum256modm_element_t (line 33) | static bignum256modm_element_t
  function reduce256_modm (line 39) | static void
  function barrett_reduce256_modm (line 74) | static void
  function add256_modm (line 143) | static void
  function mul256_modm (line 161) | static void
  function expand256_modm (line 207) | static void
  function expand_raw256_modm (line 260) | static void
  function contract256_modm (line 284) | static void
  function contract256_window4_modm (line 298) | static void
  function contract256_slidingwindow_modm (line 334) | static void
  function sub256_modm_batch (line 382) | static void
  function lt256_modm_batch (line 402) | static int
  function lte256_modm_batch (line 419) | static int
  function iszero256_modm_batch (line 437) | static int
  function isone256_modm_batch (line 447) | static int
  function isatmost128bits256_modm_batch (line 459) | static int

FILE: src/crypto/ed25519/modm-donna-64bit.h
  type bignum256modm_element_t (line 18) | typedef uint64_t bignum256modm_element_t;
  type bignum256modm_element_t (line 19) | typedef bignum256modm_element_t bignum256modm[5];
  function bignum256modm_element_t (line 37) | static bignum256modm_element_t
  function reduce256_modm (line 42) | static void
  function barrett_reduce256_modm (line 65) | static void
  function add256_modm (line 110) | static void
  function mul256_modm (line 123) | static void
  function expand256_modm (line 152) | static void
  function expand_raw256_modm (line 189) | static void
  function contract256_modm (line 205) | static void
  function contract256_window4_modm (line 213) | static void
  function contract256_slidingwindow_modm (line 240) | static void
  function sub256_modm_batch (line 287) | static void
  function lt256_modm_batch (line 303) | static int
  function lte256_modm_batch (line 318) | static int
  function iszero256_modm_batch (line 333) | static int
  function isone256_modm_batch (line 343) | static int
  function isatmost128bits256_modm_batch (line 353) | static int

FILE: src/crypto/ed25519/test-internals.c
  function bignum25519 (line 122) | bignum25519 ALIGN(16) a, b, c;

FILE: src/crypto/ed25519/test-ticks.h
  function get_ticks (line 4) | static uint64_t

FILE: src/crypto/ed25519/test.c
  function edassert (line 12) | static void
  function edassert_die (line 20) | static void
  function edassert_equal (line 33) | static void
  function edassert_equal_round (line 40) | static void
  type test_data (line 49) | typedef struct test_data_t {
  type batch_test (line 113) | typedef enum batch_test_t {
  function test_batch_instance (line 120) | static int
  function test_batch (line 178) | static void
  function test_main (line 211) | static void
  function main (line 254) | int

FILE: src/crypto/ghash/ghash.c
  function swapEndian (line 54) | static uint64_t swapEndian(uint64_t x)
  function GF128_mulInit (line 70) | static void GF128_mulInit(uint64_t H[2], const void *key)
  function GF128_mul (line 78) | static void GF128_mul(uint64_t Y[2], const uint64_t H[2])
  function swapEndian (line 114) | static uint32_t swapEndian(uint32_t x)
  function GF128_mulInit (line 126) | static void GF128_mulInit(uint32_t H[4], const void *key)
  function GF128_mul (line 136) | static void GF128_mul(uint32_t Y[4], const uint32_t H[4])
  function ghash_reset (line 180) | void ghash_reset(ghash_state *state, const void *key)
  function ghash_update (line 188) | void ghash_update(ghash_state *state, const void *data, size_t len)
  function ghash_finalize (line 208) | void ghash_finalize(ghash_state *state, void *token, size_t len)
  function ghash_pad (line 216) | void ghash_pad(ghash_state *state)

FILE: src/crypto/ghash/ghash.h
  type ghash_state (line 35) | typedef struct {
  type ghash_state (line 43) | typedef struct {

FILE: src/crypto/goldilocks/include/goldilocks.h
  type goldilocks_public_key_t (line 58) | struct goldilocks_public_key_t {
  type goldilocks_private_key_t (line 70) | struct goldilocks_private_key_t {
  type goldilocks_private_key_t (line 129) | struct goldilocks_private_key_t
  type goldilocks_public_key_t (line 130) | struct goldilocks_public_key_t
  type goldilocks_private_key_t (line 145) | struct goldilocks_private_key_t
  type goldilocks_private_key_t (line 163) | struct goldilocks_private_key_t
  type goldilocks_public_key_t (line 179) | struct goldilocks_public_key_t
  type goldilocks_private_key_t (line 180) | struct goldilocks_private_key_t
  type goldilocks_private_key_t (line 215) | struct goldilocks_private_key_t
  type goldilocks_public_key_t (line 216) | struct goldilocks_public_key_t
  type goldilocks_private_key_t (line 244) | struct goldilocks_private_key_t
  type goldilocks_public_key_t (line 275) | struct goldilocks_public_key_t
  type goldilocks_precomputed_public_key_t (line 282) | struct goldilocks_precomputed_public_key_t
  type goldilocks_precomputed_public_key_t (line 294) | struct goldilocks_precomputed_public_key_t
  type goldilocks_public_key_t (line 296) | struct goldilocks_public_key_t
  type goldilocks_precomputed_public_key_t (line 308) | struct goldilocks_precomputed_public_key_t
  type goldilocks_precomputed_public_key_t (line 334) | struct goldilocks_precomputed_public_key_t
  type goldilocks_private_key_t (line 370) | struct goldilocks_private_key_t
  type goldilocks_precomputed_public_key_t (line 371) | struct goldilocks_precomputed_public_key_t

FILE: src/crypto/goldilocks/include/ridinghood.h
  type goldilocks_public_key_t (line 54) | struct goldilocks_public_key_t {
  type goldilocks_private_key_t (line 66) | struct goldilocks_private_key_t {
  type goldilocks_private_key_t (line 125) | struct goldilocks_private_key_t
  type goldilocks_public_key_t (line 126) | struct goldilocks_public_key_t
  type goldilocks_private_key_t (line 141) | struct goldilocks_private_key_t
  type goldilocks_private_key_t (line 159) | struct goldilocks_private_key_t
  type goldilocks_public_key_t (line 175) | struct goldilocks_public_key_t
  type goldilocks_private_key_t (line 176) | struct goldilocks_private_key_t
  type goldilocks_private_key_t (line 211) | struct goldilocks_private_key_t
  type goldilocks_public_key_t (line 212) | struct goldilocks_public_key_t
  type goldilocks_private_key_t (line 240) | struct goldilocks_private_key_t
  type goldilocks_public_key_t (line 271) | struct goldilocks_public_key_t
  type goldilocks_precomputed_public_key_t (line 278) | struct goldilocks_precomputed_public_key_t
  type goldilocks_precomputed_public_key_t (line 290) | struct goldilocks_precomputed_public_key_t
  type goldilocks_public_key_t (line 292) | struct goldilocks_public_key_t
  type goldilocks_precomputed_public_key_t (line 304) | struct goldilocks_precomputed_public_key_t
  type goldilocks_precomputed_public_key_t (line 330) | struct goldilocks_precomputed_public_key_t
  type goldilocks_private_key_t (line 366) | struct goldilocks_private_key_t
  type goldilocks_precomputed_public_key_t (line 367) | struct goldilocks_precomputed_public_key_t

FILE: src/crypto/goldilocks/src/arithmetic.c
  function mask_t (line 14) | mask_t
  function field_inverse (line 29) | void
  function mask_t (line 41) | mask_t
  function field_simultaneous_invert (line 53) | void

FILE: src/crypto/goldilocks/src/barrett_field.c
  function word_t (line 9) | word_t
  function word_t (line 31) | static __inline__ word_t
  function word_t (line 46) | word_t
  function word_t (line 68) | static word_t
  function barrett_negate (line 102) | void
  function barrett_reduce (line 135) | void
  function barrett_mul_or_mac (line 193) | void
  function mask_t (line 261) | mask_t
  function barrett_deserialize_and_reduce (line 305) | void
  function barrett_serialize (line 337) | void

FILE: src/crypto/goldilocks/src/bat/dh.c
  function crypto_dh_keypair (line 15) | int crypto_dh_keypair (
  function crypto_dh (line 30) | int crypto_dh (

FILE: src/crypto/goldilocks/src/bat/sign.c
  function crypto_sign_keypair (line 15) | int crypto_sign_keypair (
  function crypto_sign (line 30) | int crypto_sign (
  function crypto_sign_open (line 50) | int crypto_sign_open (

FILE: src/crypto/goldilocks/src/crandom.c
  function crandom_detect_features (line 17) | unsigned int crandom_detect_features(void) {
  function INTRINSIC (line 41) | INTRINSIC u_int64_t rdrand(int abort_on_fail) {
  function quarter_round_xop (line 100) | static __inline__ void
  function INTRINSIC (line 118) | INTRINSIC ssereg ssse3_rotate_8(ssereg a) {
  function INTRINSIC (line 122) | INTRINSIC ssereg ssse3_rotate_16(ssereg a) {
  function quarter_round_ssse3 (line 126) | static __inline__ void
  function quarter_round_sse2 (line 141) | static __inline__ void
  function INTRINSIC (line 195) | INTRINSIC u_int32_t rotate(int r, u_int32_t a) {
  function quarter_round (line 199) | static __inline__ __attribute__((unused)) void
  function crandom_chacha_expand (line 207) | static void
  function crandom_init_from_file (line 302) | int
  function crandom_init_from_buffer (line 339) | void
  function crandom_generate (line 351) | int
  function crandom_destroy (line 476) | void

FILE: src/crypto/goldilocks/src/ec_point.c
  function add_tw_niels_to_tw_extensible (line 15) | void
  function sub_tw_niels_from_tw_extensible (line 37) | void
  function add_tw_pniels_to_tw_extensible (line 59) | void
  function sub_tw_pniels_from_tw_extensible (line 70) | void
  function double_tw_extensible (line 81) | void
  function double_extensible (line 106) | void
  function twist_and_double (line 131) | void
  function untwist_and_double (line 152) | void
  function convert_tw_affine_to_tw_pniels (line 173) | void
  function convert_tw_affine_to_tw_extensible (line 185) | void
  function convert_affine_to_extensible (line 197) | void
  function convert_tw_extensible_to_tw_pniels (line 209) | void
  function convert_tw_pniels_to_tw_extensible (line 221) | void
  function convert_tw_niels_to_tw_extensible (line 233) | void
  function montgomery_step (line 245) | void
  function deserialize_montgomery (line 273) | void
  function mask_t (line 285) | mask_t
  function serialize_extensible (line 332) | void
  function untwist_and_double_and_serialize (line 351) | void
  function twist_even (line 376) | void
  function test_only_twist (line 402) | void
  function mask_t (line 437) | mask_t
  function mask_t (line 448) | mask_t
  function mask_t (line 459) | mask_t
  function mask_t (line 493) | mask_t
  function set_identity_extensible (line 538) | void
  function set_identity_tw_extensible (line 549) | void
  function set_identity_affine (line 560) | void
  function mask_t (line 568) | mask_t
  function mask_t (line 582) | mask_t
  function mask_t (line 600) | mask_t
  function elligator_2s_inject (line 618) | void
  function mask_t (line 677) | mask_t
  function mask_t (line 692) | mask_t
  function mask_t (line 729) | mask_t

FILE: src/crypto/goldilocks/src/goldilocks.c
  function field_hash_final (line 43) | static inline void field_hash_final (
  type goldilocks_precomputed_public_key_t (line 63) | struct goldilocks_precomputed_public_key_t {
  type fixed_base_table_t (line 75) | struct fixed_base_table_t
  function mask_t (line 80) | static inline mask_t
  function goldilocks_init (line 89) | int
  function goldilocks_derive_private_key (line 148) | int
  function goldilocks_underive_private_key (line 183) | void
  function goldilocks_keygen (line 191) | int
  function goldilocks_private_to_public (line 223) | int
  function goldilocks_shared_secret_core (line 239) | static int
  function goldilocks_shared_secret (line 318) | int
  function goldilocks_derive_challenge (line 333) | static void
  function goldilocks_sign (line 352) | int
  function goldilocks_verify (line 429) | int
  type goldilocks_precomputed_public_key_t (line 476) | struct goldilocks_precomputed_public_key_t
  type goldilocks_public_key_t (line 478) | struct goldilocks_public_key_t
  type goldilocks_precomputed_public_key_t (line 480) | struct goldilocks_precomputed_public_key_t
  type goldilocks_precomputed_public_key_t (line 481) | struct goldilocks_precomputed_public_key_t
  function goldilocks_destroy_precomputed_public_key (line 513) | void
  function goldilocks_verify_precomputed (line 523) | int
  function goldilocks_shared_secret_precomputed (line 561) | int

FILE: src/crypto/goldilocks/src/include/barrett_field.h
  type barrett_prime_t (line 25) | struct barrett_prime_t {
  type barrett_prime_t (line 35) | struct barrett_prime_t
  type barrett_prime_t (line 50) | struct barrett_prime_t
  type barrett_prime_t (line 106) | struct barrett_prime_t
  type barrett_prime_t (line 127) | struct barrett_prime_t
  function barrett_mul (line 132) | static inline void
  function barrett_mac (line 148) | static inline void
  type barrett_prime_t (line 168) | struct barrett_prime_t
  type barrett_prime_t (line 183) | struct barrett_prime_t

FILE: src/crypto/goldilocks/src/include/constant_time.h
  type unaligned_br_t (line 44) | typedef struct {
  type unaligned_word_t (line 51) | typedef struct {
  function constant_time_cond_swap (line 63) | static __inline__ void
  function constant_time_lookup (line 136) | static __inline__ void
  function constant_time_mask (line 192) | static __inline__ void
  function constant_time_select (line 242) | static __inline__ void

FILE: src/crypto/goldilocks/src/include/crandom.h
  type crandom_state_t (line 30) | struct crandom_state_t {
  type crandom_state_t (line 43) | struct crandom_state_t

FILE: src/crypto/goldilocks/src/include/ec_point.h
  type affine_t (line 23) | struct affine_t {
  type tw_affine_t (line 30) | struct tw_affine_t {
  type montgomery_t (line 37) | struct montgomery_t {
  type extensible_t (line 59) | struct extensible_t {
  type tw_extensible_t (line 67) | struct tw_extensible_t {
  type tw_niels_t (line 76) | struct tw_niels_t {
  type tw_pniels_t (line 85) | struct tw_pniels_t {
  function cond_negate_tw_niels (line 450) | static __inline__ void
  function cond_negate_tw_pniels (line 463) | static __inline__ void
  function copy_affine (line 472) | void
  function copy_tw_affine (line 481) | void
  function copy_montgomery (line 490) | void
  function copy_extensible (line 502) | void
  function copy_tw_extensible (line 514) | void
  function copy_tw_niels (line 526) | void
  function copy_tw_pniels (line 536) | void

FILE: src/crypto/goldilocks/src/include/field.h
  type field_t (line 17) | struct field_t
  function field_copy (line 57) | static inline void
  function field_sqrn (line 115) | static __inline__ void
  function field_mulw_scc (line 139) | static __inline__ void
  function field_mulw_scc_wr (line 155) | static __inline__ void
  function field_subx_RAW (line 166) | static __inline__ void
  function field_sub (line 177) | static __inline__ void
  function field_add (line 188) | static __inline__ void
  function field_subw (line 198) | static __inline__ void
  function field_neg (line 208) | static __inline__ void
  function field_cond_neg (line 221) | static inline void

FILE: src/crypto/goldilocks/src/include/intrinsics.h
  function INTRINSIC (line 42) | INTRINSIC u_int64_t rdtsc(void) {
  function INTRINSIC (line 60) | INTRINSIC u_int64_t opacify(u_int64_t x) {
  type __m128i (line 102) | typedef __m128i ssereg;
  function INTRINSIC (line 167) | INTRINSIC ssereg sse2_rotate(int r, ssereg a) {
  function INTRINSIC (line 174) | INTRINSIC ssereg xop_rotate(int amount, ssereg x) {
  function INTRINSIC (line 226) | INTRINSIC const char *
  function INTRINSIC (line 245) | INTRINSIC int
  function HAVE (line 266) | int HAVE(unsigned int feature) {

FILE: src/crypto/goldilocks/src/include/magic.h
  type barrett_prime_t (line 58) | struct barrett_prime_t

FILE: src/crypto/goldilocks/src/include/scalarmul.h
  type word_t (line 24) | typedef word_t scalar_t[SCALAR_WORDS];
  type fixed_base_table_t (line 31) | struct fixed_base_table_t {
  type fixed_base_table_t (line 163) | struct fixed_base_table_t
  type fixed_base_table_t (line 179) | struct fixed_base_table_t
  type fixed_base_table_t (line 203) | struct fixed_base_table_t
  type fixed_base_table_t (line 315) | struct fixed_base_table_t
  type fixed_base_table_t (line 318) | struct fixed_base_table_t

FILE: src/crypto/goldilocks/src/include/word.h
  type hword_t (line 45) | typedef uint32_t hword_t;
  type word_t (line 46) | typedef uint64_t word_t;
  type __uint128_t (line 47) | typedef __uint128_t dword_t;
  type hsword_t (line 48) | typedef int32_t hsword_t;
  type sword_t (line 49) | typedef int64_t sword_t;
  type __int128_t (line 50) | typedef __int128_t dsword_t;
  type hword_t (line 62) | typedef uint16_t hword_t;
  type word_t (line 63) | typedef uint32_t word_t;
  type dword_t (line 64) | typedef uint64_t dword_t;
  type hsword_t (line 65) | typedef int16_t hsword_t;
  type sword_t (line 66) | typedef int32_t sword_t;
  type dsword_t (line 67) | typedef int64_t dsword_t;
  type word_t (line 83) | typedef word_t mask_t;
  type uint32x4_t (line 89) | typedef uint32x4_t vecmask_t;
  type uint64x2_t (line 91) | typedef uint64_t uint64x2_t __attribute__((ext_vector_type(2)));
  type int64x2_t (line 92) | typedef int64_t  int64x2_t __attribute__((ext_vector_type(2)));
  type uint64x4_t (line 93) | typedef uint64_t uint64x4_t __attribute__((ext_vector_type(4)));
  type int64x4_t (line 94) | typedef int64_t  int64x4_t __attribute__((ext_vector_type(4)));
  type uint32x4_t (line 95) | typedef uint32_t uint32x4_t __attribute__((ext_vector_type(4)));
  type int32x4_t (line 96) | typedef int32_t  int32x4_t __attribute__((ext_vector_type(4)));
  type uint32x2_t (line 97) | typedef uint32_t uint32x2_t __attribute__((ext_vector_type(2)));
  type int32x2_t (line 98) | typedef int32_t  int32x2_t __attribute__((ext_vector_type(2)));
  type uint32x8_t (line 99) | typedef uint32_t uint32x8_t __attribute__((ext_vector_type(8)));
  type int32x8_t (line 100) | typedef int32_t  int32x8_t __attribute__((ext_vector_type(8)));
  type word_t (line 101) | typedef word_t vecmask_t __attribute__((ext_vector_type(4)));
  type uint64x2_t (line 103) | typedef uint64_t uint64x2_t __attribute__((vector_size(16)));
  type int64x2_t (line 104) | typedef int64_t  int64x2_t __attribute__((vector_size(16)));
  type uint64x4_t (line 105) | typedef uint64_t uint64x4_t __attribute__((vector_size(32)));
  type int64x4_t (line 106) | typedef int64_t  int64x4_t __attribute__((vector_size(32)));
  type uint32x4_t (line 107) | typedef uint32_t uint32x4_t __attribute__((vector_size(16)));
  type int32x4_t (line 108) | typedef int32_t  int32x4_t __attribute__((vector_size(16)));
  type uint32x2_t (line 109) | typedef uint32_t uint32x2_t __attribute__((vector_size(8)));
  type int32x2_t (line 110) | typedef int32_t  int32x2_t __attribute__((vector_size(8)));
  type uint32x8_t (line 111) | typedef uint32_t uint32x8_t __attribute__((vector_size(32)));
  type int32x8_t (line 112) | typedef int32_t  int32x8_t __attribute__((vector_size(32)));
  type word_t (line 113) | typedef word_t vecmask_t __attribute__((vector_size(32)));
  type uint32x8_t (line 118) | typedef uint32x8_t big_register_t;
  type uint64x4_t (line 119) | typedef uint64x4_t uint64xn_t;
  type uint32x8_t (line 120) | typedef uint32x8_t uint32xn_t;
  function big_register_t (line 122) | static __inline__ big_register_t
  type uint32x4_t (line 130) | typedef uint32x4_t big_register_t;
  type uint64x2_t (line 131) | typedef uint64x2_t uint64xn_t;
  type uint32x4_t (line 132) | typedef uint32x4_t uint32xn_t;
  function big_register_t (line 134) | static __inline__ big_register_t
  type uint32x4_t (line 142) | typedef uint32x4_t big_register_t;
  type uint64x2_t (line 143) | typedef uint64x2_t uint64xn_t;
  type uint32x4_t (line 144) | typedef uint32x4_t uint32xn_t;
  function big_register_t (line 145) | static __inline__ big_register_t
  type big_register_t (line 151) | typedef uint64_t big_register_t, uint64xn_t;
  type uint32xn_t (line 153) | typedef uint32_t uint32xn_t;
  function big_register_t (line 154) | static __inline__ big_register_t
  type uint64xn_t (line 160) | typedef uint64_t uint64xn_t;
  type uint32xn_t (line 161) | typedef uint32_t uint32xn_t;
  type big_register_t (line 162) | typedef uint32_t big_register_t;
  function big_register_t (line 164) | static __inline__ big_register_t
  type unaligned_uint64xn_t (line 170) | typedef struct {
  type unaligned_uint32xn_t (line 174) | typedef struct {
  function mask_t (line 181) | static __inline__ mask_t
  function big_register_t (line 188) | static __inline__ big_register_t
  function big_register_t (line 193) | static __inline__ big_register_t
  function big_register_t (line 199) | static __inline__ big_register_t
  function mask_t (line 204) | static __inline__ mask_t
  function htobe64 (line 214) | static inline uint64_t
  function htole64 (line 219) | static inline uint64_t
  function letoh64 (line 222) | static inline uint64_t
  function really_memset (line 247) | static __inline__ void
  function really_memset (line 252) | static __inline__ void __attribute__((always_inline,unused))

FILE: src/crypto/goldilocks/src/p448/arch_32/p448.c
  function mask_t (line 8) | static inline mask_t __attribute__((always_inline))
  function widemul_32 (line 17) | static uint64_t widemul_32 (
  function p448_mul (line 24) | void
  function p448_mulw (line 85) | void
  function p448_sqr (line 129) | void
  function p448_strong_reduce (line 137) | void
  function mask_t (line 180) | mask_t
  function p448_serialize (line 196) | void
  function mask_t (line 215) | mask_t

FILE: src/crypto/goldilocks/src/p448/arch_32/p448.h
  type p448_t (line 12) | typedef struct p448_t {
  type p448_t (line 108) | struct p448_t
  function p448_set_ui (line 119) | void
  function p448_add_RAW (line 132) | void
  function p448_sub_RAW (line 143) | void
  function p448_neg_RAW (line 154) | void
  function p448_addw (line 164) | void
  function p448_subw (line 172) | void
  function p448_copy (line 180) | void
  function p448_bias (line 188) | void
  function p448_weak_reduce (line 199) | void

FILE: src/crypto/goldilocks/src/p448/arch_arm_32/p448.c
  function mask_t (line 8) | static inline mask_t __attribute__((always_inline))
  function widemul_32 (line 17) | static uint64_t widemul_32 (
  function smlal (line 24) | static inline void __attribute__((gnu_inline,always_inline))
  function smlal2 (line 44) | static inline void __attribute__((gnu_inline,always_inline))
  function smull (line 63) | static inline void __attribute__((gnu_inline,always_inline))
  function smull2 (line 82) | static inline void __attribute__((gnu_inline,always_inline))
  function p448_mul (line 101) | void
  function p448_sqr (line 452) | void
  function p448_mulw (line 750) | void
  function p448_strong_reduce (line 864) | void
  function mask_t (line 907) | mask_t
  function p448_serialize (line 923) | void
  function mask_t (line 942) | mask_t

FILE: src/crypto/goldilocks/src/p448/arch_arm_32/p448.h
  type p448_t (line 12) | typedef struct p448_t {
  type p448_t (line 108) | struct p448_t
  function p448_set_ui (line 119) | void
  function p448_add_RAW (line 132) | void
  function p448_sub_RAW (line 150) | void
  function p448_neg_RAW (line 168) | void
  function p448_addw (line 185) | void
  function p448_subw (line 193) | void
  function p448_copy (line 201) | void
  function p448_bias (line 209) | void
  function p448_weak_reduce (line 223) | void

FILE: src/crypto/goldilocks/src/p448/arch_neon_experimental/p448.c
  function mask_t (line 8) | static inline mask_t __attribute__((always_inline))
  function uint64x2_t (line 17) | static __inline__ uint64x2_t __attribute__((gnu_inline,always_inline,unu...
  function int64x2_t (line 23) | static __inline__ int64x2_t __attribute__((gnu_inline,always_inline,unus...
  function uint64x2_t (line 29) | static __inline__ uint64x2_t __attribute__((gnu_inline,always_inline))
  function smlal (line 35) | static inline void __attribute__((gnu_inline,always_inline,unused))
  function smlal2 (line 44) | static inline void __attribute__((gnu_inline,always_inline,unused))
  function smull (line 53) | static inline void __attribute__((gnu_inline,always_inline,unused))
  function smull2 (line 62) | static inline void __attribute__((gnu_inline,always_inline,unused))
  function p448_mul (line 71) | void
  function p448_sqr (line 370) | void
  function p448_mulw (line 571) | void
  function p448_strong_reduce (line 622) | void
  function mask_t (line 665) | mask_t
  function p448_serialize (line 681) | void
  function mask_t (line 701) | mask_t

FILE: src/crypto/goldilocks/src/p448/arch_neon_experimental/p448.h
  type p448_t (line 12) | typedef struct p448_t {
  type p448_t (line 111) | struct p448_t
  function p448_set_ui (line 122) | void
  function p448_add_RAW (line 135) | void
  function p448_sub_RAW (line 147) | void
  function p448_neg_RAW (line 165) | void
  function p448_addw (line 182) | void
  function p448_subw (line 190) | void
  function p448_copy (line 198) | void
  function p448_bias (line 206) | void
  function p448_weak_reduce (line 220) | void

FILE: src/crypto/goldilocks/src/p448/arch_ref64/p448.c
  function __uint128_t (line 7) | static __inline__ __uint128_t widemul(
  function is_zero (line 14) | static __inline__ uint64_t is_zero(uint64_t a) {
  function p448_mul (line 19) | void
  function p448_mulw (line 185) | void
  function p448_sqr (line 214) | void
  function p448_strong_reduce (line 329) | void
  function mask_t (line 372) | mask_t
  function p448_serialize (line 388) | void
  function mask_t (line 406) | mask_t

FILE: src/crypto/goldilocks/src/p448/arch_ref64/p448.h
  type p448_t (line 13) | typedef struct p448_t {
  type p448_t (line 115) | struct p448_t
  function p448_set_ui (line 126) | void
  function p448_add_RAW (line 138) | void
  function p448_sub_RAW (line 151) | void
  function p448_neg_RAW (line 165) | void
  function p448_addw (line 178) | void
  function p448_subw (line 188) | void
  function p448_copy (line 198) | void
  function p448_really_bias (line 206) | void
  function p448_bias (line 218) | void
  function p448_weak_reduce (line 227) | void

FILE: src/crypto/goldilocks/src/p448/arch_x86_64/p448.c
  function p448_mul (line 8) | void
  function p448_mulw (line 148) | void
  function p448_sqr (line 193) | void
  function p448_strong_reduce (line 308) | void
  function mask_t (line 351) | mask_t
  function p448_serialize (line 367) | void
  function mask_t (line 385) | mask_t

FILE: src/crypto/goldilocks/src/p448/arch_x86_64/p448.h
  type p448_t (line 12) | typedef struct p448_t {
  type p448_t (line 108) | struct p448_t
  function p448_set_ui (line 119) | void
  function p448_add_RAW (line 131) | void
  function p448_sub_RAW (line 149) | void
  function p448_neg_RAW (line 167) | void
  function p448_addw (line 184) | void
  function p448_subw (line 192) | void
  function p448_copy (line 200) | void
  function p448_bias (line 211) | void
  function p448_weak_reduce (line 238) | void

FILE: src/crypto/goldilocks/src/p448/arch_x86_64/x86-64-arith.h
  function __uint128_t (line 14) | static __inline__ __uint128_t widemul(const uint64_t *a, const uint64_t ...
  function __uint128_t (line 36) | static __inline__ __uint128_t widemul_rm(uint64_t a, const uint64_t *b) {
  function __uint128_t (line 56) | static __inline__ __uint128_t widemul2(const uint64_t *a, const uint64_t...
  function mac (line 80) | static __inline__ void mac(__uint128_t *acc, const uint64_t *a, const ui...
  function macac (line 107) | static __inline__ void macac(__uint128_t *acc, __uint128_t *acc2, const ...
  function mac_rm (line 140) | static __inline__ void mac_rm(__uint128_t *acc, uint64_t a, const uint64...
  function mac2 (line 166) | static __inline__ void mac2(__uint128_t *acc, const uint64_t *a, const u...
  function msb (line 195) | static __inline__ void msb(__uint128_t *acc, const uint64_t *a, const ui...
  function msb2 (line 220) | static __inline__ void msb2(__uint128_t *acc, const uint64_t *a, const u...
  function mrs (line 248) | static __inline__ void mrs(__uint128_t *acc, const uint64_t *a, const ui...
  function __uint128_t (line 261) | static __inline__ __uint128_t widemulu(uint64_t a, uint64_t b) {
  function __int128_t (line 265) | static __inline__ __int128_t widemuls(int64_t a, int64_t b) {
  function opacify (line 269) | static __inline__ uint64_t opacify(uint64_t x) {
  function mask_t (line 274) | static __inline__ mask_t is_zero(uint64_t x) {

FILE: src/crypto/goldilocks/src/p448/f_arithmetic.c
  function field_isr (line 13) | void

FILE: src/crypto/goldilocks/src/p448/magic.c
  type barrett_prime_t (line 57) | struct barrett_prime_t

FILE: src/crypto/goldilocks/src/p480/arch_x86_64/p480.c
  function p480_mul (line 8) | void
  function p480_mulw (line 148) | void
  function p480_sqr (line 193) | void
  function p480_strong_reduce (line 308) | void
  function mask_t (line 351) | mask_t
  function p480_serialize (line 367) | void
  function mask_t (line 393) | mask_t

FILE: src/crypto/goldilocks/src/p480/arch_x86_64/p480.h
  type p480_t (line 12) | typedef struct p480_t {
  type p480_t (line 108) | struct p480_t
  function p480_set_ui (line 119) | void
  function p480_add_RAW (line 131) | void
  function p480_sub_RAW (line 149) | void
  function p480_neg_RAW (line 167) | void
  function p480_addw (line 184) | void
  function p480_subw (line 192) | void
  function p480_copy (line 200) | void
  function p480_bias (line 211) | void
  function p480_weak_reduce (line 238) | void

FILE: src/crypto/goldilocks/src/p480/arch_x86_64/x86-64-arith.h
  function __uint128_t (line 14) | static __inline__ __uint128_t widemul(const uint64_t *a, const uint64_t ...
  function __uint128_t (line 36) | static __inline__ __uint128_t widemul_rm(uint64_t a, const uint64_t *b) {
  function __uint128_t (line 56) | static __inline__ __uint128_t widemul2(const uint64_t *a, const uint64_t...
  function mac (line 80) | static __inline__ void mac(__uint128_t *acc, const uint64_t *a, const ui...
  function macac (line 107) | static __inline__ void macac(__uint128_t *acc, __uint128_t *acc2, const ...
  function mac_rm (line 140) | static __inline__ void mac_rm(__uint128_t *acc, uint64_t a, const uint64...
  function mac2 (line 166) | static __inline__ void mac2(__uint128_t *acc, const uint64_t *a, const u...
  function msb (line 195) | static __inline__ void msb(__uint128_t *acc, const uint64_t *a, const ui...
  function msb2 (line 220) | static __inline__ void msb2(__uint128_t *acc, const uint64_t *a, const u...
  function mrs (line 248) | static __inline__ void mrs(__uint128_t *acc, const uint64_t *a, const ui...
  function __uint128_t (line 261) | static __inline__ __uint128_t widemulu(uint64_t a, uint64_t b) {
  function __int128_t (line 265) | static __inline__ __int128_t widemuls(int64_t a, int64_t b) {
  function opacify (line 269) | static __inline__ uint64_t opacify(uint64_t x) {
  function mask_t (line 274) | static __inline__ mask_t is_zero(uint64_t x) {

FILE: src/crypto/goldilocks/src/p480/f_arithmetic.c
  function field_isr (line 13) | void

FILE: src/crypto/goldilocks/src/p480/magic.c
  type barrett_prime_t (line 58) | struct barrett_prime_t

FILE: src/crypto/goldilocks/src/p521/arch_ref64/p521.c
  function __uint128_t (line 7) | static __inline__ __uint128_t widemul(
  function is_zero (line 14) | static __inline__ uint64_t is_zero(uint64_t a) {
  function p521_mul (line 19) | void
  function p521_mulw (line 160) | void
  function p521_sqr (line 199) | void
  function p521_strong_reduce (line 308) | void
  function mask_t (line 349) | mask_t
  function p521_serialize (line 365) | void
  function mask_t (line 389) | mask_t

FILE: src/crypto/goldilocks/src/p521/arch_ref64/p521.h
  type p521_t (line 13) | typedef struct p521_t {
  type p521_t (line 115) | struct p521_t
  function p521_set_ui (line 126) | void
  function p521_add_RAW (line 138) | void
  function p521_sub_RAW (line 151) | void
  function p521_neg_RAW (line 165) | void
  function p521_addw (line 178) | void
  function p521_subw (line 188) | void
  function p521_copy (line 198) | void
  function p521_really_bias (line 206) | void
  function p521_bias (line 218) | void
  function p521_weak_reduce (line 227) | void

FILE: src/crypto/goldilocks/src/p521/arch_x86_64_r12/p521.c
  type nonad_t (line 7) | typedef struct {
  function is_zero (line 11) | static __inline__ uint64_t is_zero(uint64_t a) {
  function __uint128_t (line 16) | static inline __uint128_t widemulu(uint64_t a, uint64_t b) {
  function __int128_t (line 20) | static inline __int128_t widemuls(int64_t a, int64_t b) {
  function opacify (line 25) | static inline uint64_t opacify(uint64_t x) {
  function nonad_mul (line 31) | static inline void nonad_mul (
  function hexad_mul_signed (line 64) | static inline void hexad_mul_signed (
  function nonad_sqr (line 102) | static inline void nonad_sqr (
  function hexad_sqr_signed (line 132) | static inline void hexad_sqr_signed (
  function p521_mul (line 170) | void
  function p521_sqr (line 256) | void
  function p521_mulw (line 315) | void
  function p521_strong_reduce (line 377) | void
  function mask_t (line 420) | mask_t
  function p521_serialize (line 436) | void
  function mask_t (line 460) | mask_t

FILE: src/crypto/goldilocks/src/p521/arch_x86_64_r12/p521.h
  type p521_t (line 17) | typedef struct p521_t {
  type p521_t (line 113) | struct p521_t
  type uint64x4_t (line 124) | typedef uint64x4_t uint64x3_t;
  function uint64x3_t (line 129) | static inline uint64x3_t
  function p521_set_ui (line 137) | void
  function p521_add_RAW (line 149) | void
  function p521_sub_RAW (line 161) | void
  function p521_neg_RAW (line 173) | void
  function p521_addw (line 184) | void
  function p521_subw (line 192) | void
  function p521_copy (line 200) | void
  function p521_bias (line 208) | void
  function p521_weak_reduce (line 220) | void

FILE: src/crypto/goldilocks/src/p521/f_arithmetic.c
  function field_isr (line 13) | void

FILE: src/crypto/goldilocks/src/p521/magic.c
  type barrett_prime_t (line 78) | struct barrett_prime_t

FILE: src/crypto/goldilocks/src/scalarmul.c
  function mask_t (line 16) | mask_t
  function constant_time_lookup_tw_pniels (line 51) | static __inline__ void
  function constant_time_lookup_tw_niels (line 62) | static __inline__ void
  function convert_to_signed_window_form (line 73) | static void
  function scalarmul (line 100) | void
  function scalarmul_vlook (line 163) | void
  function mask_t (line 227) | static mask_t
  function mask_t (line 267) | mask_t
  function mask_t (line 325) | mask_t
  function mask_t (line 403) | mask_t
  function destroy_fixed_base (line 566) | void
  function mask_t (line 579) | mask_t
  type smvt_control (line 648) | struct smvt_control {
  function recode_wnaf (line 652) | static int
  function prepare_wnaf_table (line 709) | static void
  function scalarmul_vt (line 733) | void
  function scalarmul_fixed_base_wnaf_vt (line 774) | void
  function linear_combo_var_fixed_vt (line 815) | void

FILE: src/crypto/goldilocks/src/sha512.c
  function rotate_r (line 11) | static inline uint64_t
  function S0 (line 49) | static inline uint64_t S0 (uint64_t h1) {
  function S1 (line 53) | static inline uint64_t S1 (uint64_t h4) {
  function s0 (line 57) | static inline uint64_t s0 (uint64_t a) {
  function s1 (line 61) | static inline uint64_t s1 (uint64_t b) {
  function ch (line 65) | static inline uint64_t ch (uint64_t h4, uint64_t h5, uint64_t h6) {
  function maj (line 69) | static inline uint64_t maj(uint64_t h1, uint64_t h2, uint64_t h3) {
  function sha512_process_block (line 73) | static void
  function sha512_init (line 120) | void
  function sha512_update (line 129) | void
  function sha512_final (line 154) | void

FILE: src/crypto/goldilocks/test/bench.c
  function ignore_result (line 20) | static __inline__ void
  function now (line 25) | static double now(void) {
  function field_randomize (line 32) | static void field_randomize( struct crandom_state_t *crand, field_a_t a ) {
  function q448_randomize (line 37) | static void q448_randomize( struct crandom_state_t *crand, word_t sk[SCA...
  function field_print (line 41) | static void field_print( const char *descr, const field_a_t a ) {
  function field_print_full (line 52) | static void __attribute__((unused))
  function q448_print (line 66) | static void q448_print( const char *descr, const word_t secret[SCALAR_WO...
  function main (line 79) | int main(int argc, char **argv) {

FILE: src/crypto/goldilocks/test/test.c
  function end_test (line 12) | static void end_test(void) {
  function begin_test (line 20) | static void begin_test(const char *name) {
  function youfail (line 28) | void youfail(void) {
  function hexchar (line 35) | static int
  function hexdecode (line 48) | int
  function hexprint (line 69) | void
  function field_print (line 83) | void field_print (
  function scalar_print (line 97) | void scalar_print (
  function main (line 110) | int main(int argc, char **argv) {

FILE: src/crypto/goldilocks/test/test_arithmetic.c
  function mask_t (line 9) | static mask_t mpz_to_field (
  function BRANCH_ON_CONSTANT (line 23) | static inline int BRANCH_ON_CONSTANT(int x) {
  function mask_t (line 28) | static mask_t field_assert_eq_gmp(
  function mask_t (line 86) | static mask_t test_add_sub_RAW (
  function mask_t (line 130) | static mask_t test_mul_sqr (
  function mask_t (line 179) | static mask_t test_isr (
  function dbg_gmp_printf (line 210) | void dbg_gmp_printf(const mpz_t x) {
  function test_arithmetic (line 214) | int test_arithmetic (void) {

FILE: src/crypto/goldilocks/test/test_goldilocks.c
  function test_goldilocks (line 7) | int test_goldilocks (void) {

FILE: src/crypto/goldilocks/test/test_pointops.c
  function failprint_ext (line 11) | static void
  function failprint_tw_ext (line 27) | static void
  function mask_t (line 34) | static mask_t
  function mask_t (line 58) | static mask_t
  function mask_t (line 86) | static mask_t
  function mask_t (line 114) | static mask_t
  function add_double_test (line 128) | static int
  function single_twisting_test (line 177) | static int
  function test_pointops (line 253) | int test_pointops (void) {

FILE: src/crypto/goldilocks/test/test_scalarmul.c
  function single_scalarmul_compatibility_test (line 13) | static int
  function single_linear_combo_test (line 161) | static int
  function single_scalarmul_commutativity_test (line 235) | static int
  function crandom_generate_f (line 288) | static void crandom_generate_f(struct crandom_state_t *crand, uint8_t *s...
  function test_scalarmul_commutativity (line 301) | int test_scalarmul_commutativity (void) {
  function test_linear_combo (line 339) | int test_linear_combo (void) {
  function test_scalarmul_compatibility (line 382) | int test_scalarmul_compatibility (void) {

FILE: src/crypto/goldilocks/test/test_sha512.c
  function sha512_monte_carlo_core (line 10) | static int sha512_monte_carlo_core (
  function test_sha512_monte_carlo (line 62) | int test_sha512_monte_carlo(void) {

FILE: src/crypto/newhope/batcher.c
  function batcher84 (line 14) | void batcher84(uint16_t *x)

FILE: src/crypto/newhope/cpucycles.c
  function cpucycles (line 3) | long long cpucycles(void)

FILE: src/crypto/newhope/crypto_stream_chacha20.c
  type uint32 (line 9) | typedef uint32_t uint32;
  function uint32 (line 11) | static uint32 load_littleendian(const unsigned char *x)
  function store_littleendian (line 20) | static void store_littleendian(unsigned char *x,uint32 u)
  function crypto_core_chacha20 (line 40) | static int crypto_core_chacha20(
  function crypto_stream_chacha20 (line 118) | int crypto_stream_chacha20(unsigned char *c,unsigned long long clen, con...

FILE: src/crypto/newhope/error_correction.c
  function abs (line 5) | static int32_t abs(int32_t v)
  function f (line 12) | static int32_t f(int32_t *v0, int32_t *v1, uint32_t x)
  function g (line 35) | static int32_t g(int32_t x)
  function LDDecode (line 56) | static int16_t LDDecode(int32_t xi0, int32_t xi1, int32_t xi2, int32_t xi3)
  function helprec (line 71) | void helprec(poly *c, const poly *v, const unsigned char *seed, unsigned...
  function rec (line 109) | void rec(unsigned char *key, const poly *v, const poly *c)

FILE: src/crypto/newhope/fips202.c
  function load64 (line 15) | static uint64_t load64(const unsigned char *x)
  function store64 (line 25) | static void store64(uint8_t *x, uint64_t u)
  function KeccakF1600_StatePermute (line 63) | void KeccakF1600_StatePermute(uint64_t * state)
  function keccak_absorb (line 334) | static void keccak_absorb(uint64_t *s,
  function keccak_squeezeblocks (line 366) | static void keccak_squeezeblocks(unsigned char *h, unsigned long long in...
  function shake128_absorb (line 384) | void shake128_absorb(uint64_t *s, const unsigned char *input, unsigned i...
  function shake128_squeezeblocks (line 390) | void shake128_squeezeblocks(unsigned char *output, unsigned long long nb...
  function sha3256 (line 407) | void sha3256(unsigned char *output, const unsigned char *input, unsigned...

FILE: src/crypto/newhope/newhope.c
  function encode_a (line 7) | static void encode_a(unsigned char *r, const poly *pk, const unsigned ch...
  function decode_a (line 15) | static void decode_a(poly *pk, unsigned char *seed, const unsigned char *r)
  function encode_b (line 23) | static void encode_b(unsigned char *r, const poly *b, const poly *c)
  function decode_b (line 31) | static void decode_b(poly *b, poly *c, const unsigned char *r)
  function gen_a (line 44) | static void gen_a(poly *a, const unsigned char *seed)
  function newhope_keygen (line 52) | void newhope_keygen(unsigned char *send, poly *sk, const unsigned char *...
  function newhope_sharedb (line 76) | void newhope_sharedb(unsigned char *sharedkey, unsigned char *send, cons...
  function newhope_shareda (line 113) | void newhope_shareda(unsigned char *sharedkey, const poly *sk, const uns...

FILE: src/crypto/newhope/ntt.c
  function bitrev_vector (line 41) | void bitrev_vector(uint16_t* poly)
  function mul_coefficients (line 58) | void mul_coefficients(uint16_t* poly, const uint16_t* factors)
  function ntt (line 69) | void ntt(uint16_t * a, const uint16_t* omega)

FILE: src/crypto/newhope/poly.c
  function poly_frombytes (line 9) | void poly_frombytes(poly *r, const unsigned char *a)
  function poly_tobytes (line 21) | void poly_tobytes(unsigned char *r, const poly *p)
  function discardtopoly (line 63) | static int discardtopoly(poly* a, unsigned char *buf, unsigned int nblocks)
  function poly_uniform (line 87) | void poly_uniform(poly *a, const unsigned char *seed)
  function poly_getnoise (line 102) | void poly_getnoise(poly *r, unsigned char *seed, unsigned char nonce)
  function poly_pointwise (line 131) | void poly_pointwise(poly *r, const poly *a, const poly *b)
  function poly_add (line 142) | void poly_add(poly *r, const poly *a, const poly *b)
  function poly_ntt (line 149) | void poly_ntt(poly *r)
  function poly_invntt (line 155) | void poly_invntt(poly *r)

FILE: src/crypto/newhope/poly.h
  type poly (line 7) | typedef struct {

FILE: src/crypto/newhope/randombytes.c
  function randombytes (line 9) | void randombytes(unsigned char *x,unsigned long long xlen)

FILE: src/crypto/newhope/reduce.c
  function montgomery_reduce (line 12) | uint16_t montgomery_reduce(uint32_t a)
  function barrett_reduce (line 24) | uint16_t barrett_reduce(uint16_t a)

FILE: src/crypto/sha2/sha256.c
  function sha256_reset (line 26) | void sha256_reset(sha256_context_t *context)
  function sha256_transform (line 42) | static void sha256_transform(sha256_context_t *context, const uint8_t *m)
  function sha256_update (line 129) | void sha256_update(sha256_context_t *context, const void *data, size_t s...
  function write_be32 (line 155) | static void write_be32(uint8_t *out, uint32_t value)
  function sha256_finish (line 163) | void sha256_finish(sha256_context_t *context, uint8_t *hash)

FILE: src/crypto/sha2/sha256.h
  type sha256_context_t (line 33) | typedef struct

FILE: src/crypto/sha2/sha512.c
  function sha512_reset (line 26) | void sha512_reset(sha512_context_t *context)
  function sha512_transform (line 40) | static void sha512_transform(sha512_context_t *context, const uint8_t *m)
  function sha512_update (line 142) | void sha512_update(sha512_context_t *context, const void *data, size_t s...
  function write_be64 (line 168) | static void write_be64(uint8_t *out, uint64_t value)
  function sha512_finish (line 180) | void sha512_finish(sha512_context_t *context, uint8_t *hash)
  function sha512_hash (line 200) | void sha512_hash(uint8_t *hash, const void *data, size_t size)

FILE: src/crypto/sha2/sha512.h
  type sha512_context_t (line 33) | typedef struct

FILE: src/keys/certificate.c
  type _Noise_Certificate (line 27) | struct _Noise_Certificate {
  type _Noise_CertificateChain (line 35) | struct _Noise_CertificateChain {
  type _Noise_SubjectInfo (line 41) | struct _Noise_SubjectInfo {
  type _Noise_PublicKeyInfo (line 56) | struct _Noise_PublicKeyInfo {
  type _Noise_MetaInfo (line 63) | struct _Noise_MetaInfo {
  type _Noise_Signature (line 70) | struct _Noise_Signature {
  type _Noise_ExtraSignedInfo (line 83) | struct _Noise_ExtraSignedInfo {
  type _Noise_EncryptedPrivateKey (line 95) | struct _Noise_EncryptedPrivateKey {
  type _Noise_PrivateKey (line 106) | struct _Noise_PrivateKey {
  type _Noise_PrivateKeyInfo (line 121) | struct _Noise_PrivateKeyInfo {
  function Noise_Certificate_new (line 128) | int Noise_Certificate_new(Noise_Certificate **obj)
  function Noise_Certificate_free (line 138) | int Noise_Certificate_free(Noise_Certificate *obj)
  function Noise_Certificate_write (line 151) | int Noise_Certificate_write(NoiseProtobuf *pbuf, int tag, const Noise_Ce...
  function Noise_Certificate_read (line 167) | int Noise_Certificate_read(NoiseProtobuf *pbuf, int tag, Noise_Certifica...
  function Noise_Certificate_clear_version (line 211) | int Noise_Certificate_clear_version(Noise_Certificate *obj)
  function Noise_Certificate_has_version (line 220) | int Noise_Certificate_has_version(const Noise_Certificate *obj)
  function Noise_Certificate_get_version (line 225) | uint32_t Noise_Certificate_get_version(const Noise_Certificate *obj)
  function Noise_Certificate_set_version (line 230) | int Noise_Certificate_set_version(Noise_Certificate *obj, uint32_t value)
  function Noise_Certificate_clear_subject (line 239) | int Noise_Certificate_clear_subject(Noise_Certificate *obj)
  function Noise_Certificate_has_subject (line 249) | int Noise_Certificate_has_subject(const Noise_Certificate *obj)
  function Noise_SubjectInfo (line 254) | Noise_SubjectInfo *Noise_Certificate_get_subject(const Noise_Certificate...
  function Noise_Certificate_get_new_subject (line 259) | int Noise_Certificate_get_new_subject(Noise_Certificate *obj, Noise_Subj...
  function Noise_Certificate_clear_signatures (line 275) | int Noise_Certificate_clear_signatures(Noise_Certificate *obj)
  function Noise_Certificate_has_signatures (line 290) | int Noise_Certificate_has_signatures(const Noise_Certificate *obj)
  function Noise_Certificate_count_signatures (line 295) | size_t Noise_Certificate_count_signatures(const Noise_Certificate *obj)
  function Noise_Signature (line 300) | Noise_Signature *Noise_Certificate_get_at_signatures(const Noise_Certifi...
  function Noise_Certificate_add_signatures (line 308) | int Noise_Certificate_add_signatures(Noise_Certificate *obj, Noise_Signa...
  function Noise_Certificate_insert_signatures (line 328) | int Noise_Certificate_insert_signatures(Noise_Certificate *obj, size_t i...
  function Noise_CertificateChain_new (line 335) | int Noise_CertificateChain_new(Noise_CertificateChain **obj)
  function Noise_CertificateChain_free (line 345) | int Noise_CertificateChain_free(Noise_CertificateChain *obj)
  function Noise_CertificateChain_write (line 357) | int Noise_CertificateChain_write(NoiseProtobuf *pbuf, int tag, const Noi...
  function Noise_CertificateChain_read (line 369) | int Noise_CertificateChain_read(NoiseProtobuf *pbuf, int tag, Noise_Cert...
  function Noise_CertificateChain_clear_certs (line 405) | int Noise_CertificateChain_clear_certs(Noise_CertificateChain *obj)
  function Noise_CertificateChain_has_certs (line 420) | int Noise_CertificateChain_has_certs(const Noise_CertificateChain *obj)
  function Noise_CertificateChain_count_certs (line 425) | size_t Noise_CertificateChain_count_certs(const Noise_CertificateChain *...
  function Noise_Certificate (line 430) | Noise_Certificate *Noise_CertificateChain_get_at_certs(const Noise_Certi...
  function Noise_CertificateChain_add_certs (line 438) | int Noise_CertificateChain_add_certs(Noise_CertificateChain *obj, Noise_...
  function Noise_CertificateChain_insert_certs (line 458) | int Noise_CertificateChain_insert_certs(Noise_CertificateChain *obj, siz...
  function Noise_SubjectInfo_new (line 465) | int Noise_SubjectInfo_new(Noise_SubjectInfo **obj)
  function Noise_SubjectInfo_free (line 475) | int Noise_SubjectInfo_free(Noise_SubjectInfo *obj)
  function Noise_SubjectInfo_write (line 493) | int Noise_SubjectInfo_write(NoiseProtobuf *pbuf, int tag, const Noise_Su...
  function Noise_SubjectInfo_read (line 513) | int Noise_SubjectInfo_read(NoiseProtobuf *pbuf, int tag, Noise_SubjectIn...
  function Noise_SubjectInfo_clear_id (line 575) | int Noise_SubjectInfo_clear_id(Noise_SubjectInfo *obj)
  function Noise_SubjectInfo_has_id (line 586) | int Noise_SubjectInfo_has_id(const Noise_SubjectInfo *obj)
  function Noise_SubjectInfo_get_size_id (line 596) | size_t Noise_SubjectInfo_get_size_id(const Noise_SubjectInfo *obj)
  function Noise_SubjectInfo_set_id (line 601) | int Noise_SubjectInfo_set_id(Noise_SubjectInfo *obj, const char *value, ...
  function Noise_SubjectInfo_clear_name (line 619) | int Noise_SubjectInfo_clear_name(Noise_SubjectInfo *obj)
  function Noise_SubjectInfo_has_name (line 630) | int Noise_SubjectInfo_has_name(const Noise_SubjectInfo *obj)
  function Noise_SubjectInfo_get_size_name (line 640) | size_t Noise_SubjectInfo_get_size_name(const Noise_SubjectInfo *obj)
  function Noise_SubjectInfo_set_name (line 645) | int Noise_SubjectInfo_set_name(Noise_SubjectInfo *obj, const char *value...
  function Noise_SubjectInfo_clear_role (line 663) | int Noise_SubjectInfo_clear_role(Noise_SubjectInfo *obj)
  function Noise_SubjectInfo_has_role (line 674) | int Noise_SubjectInfo_has_role(const Noise_SubjectInfo *obj)
  function Noise_SubjectInfo_get_size_role (line 684) | size_t Noise_SubjectInfo_get_size_role(const Noise_SubjectInfo *obj)
  function Noise_SubjectInfo_set_role (line 689) | int Noise_SubjectInfo_set_role(Noise_SubjectInfo *obj, const char *value...
  function Noise_SubjectInfo_clear_keys (line 707) | int Noise_SubjectInfo_clear_keys(Noise_SubjectInfo *obj)
  function Noise_SubjectInfo_has_keys (line 722) | int Noise_SubjectInfo_has_keys(const Noise_SubjectInfo *obj)
  function Noise_SubjectInfo_count_keys (line 727) | size_t Noise_SubjectInfo_count_keys(const Noise_SubjectInfo *obj)
  function Noise_PublicKeyInfo (line 732) | Noise_PublicKeyInfo *Noise_SubjectInfo_get_at_keys(const Noise_SubjectIn...
  function Noise_SubjectInfo_add_keys (line 740) | int Noise_SubjectInfo_add_keys(Noise_SubjectInfo *obj, Noise_PublicKeyIn...
  function Noise_SubjectInfo_insert_keys (line 760) | int Noise_SubjectInfo_insert_keys(Noise_SubjectInfo *obj, size_t index, ...
  function Noise_SubjectInfo_clear_meta (line 767) | int Noise_SubjectInfo_clear_meta(Noise_SubjectInfo *obj)
  function Noise_SubjectInfo_has_meta (line 782) | int Noise_SubjectInfo_has_meta(const Noise_SubjectInfo *obj)
  function Noise_SubjectInfo_count_meta (line 787) | size_t Noise_SubjectInfo_count_meta(const Noise_SubjectInfo *obj)
  function Noise_MetaInfo (line 792) | Noise_MetaInfo *Noise_SubjectInfo_get_at_meta(const Noise_SubjectInfo *o...
  function Noise_SubjectInfo_add_meta (line 800) | int Noise_SubjectInfo_add_meta(Noise_SubjectInfo *obj, Noise_MetaInfo **...
  function Noise_SubjectInfo_insert_meta (line 820) | int Noise_SubjectInfo_insert_meta(Noise_SubjectInfo *obj, size_t index, ...
  function Noise_PublicKeyInfo_new (line 827) | int Noise_PublicKeyInfo_new(Noise_PublicKeyInfo **obj)
  function Noise_PublicKeyInfo_free (line 837) | int Noise_PublicKeyInfo_free(Noise_PublicKeyInfo *obj)
  function Noise_PublicKeyInfo_write (line 847) | int Noise_PublicKeyInfo_write(NoiseProtobuf *pbuf, int tag, const Noise_...
  function Noise_PublicKeyInfo_read (line 860) | int Noise_PublicKeyInfo_read(NoiseProtobuf *pbuf, int tag, Noise_PublicK...
  function Noise_PublicKeyInfo_clear_algorithm (line 900) | int Noise_PublicKeyInfo_clear_algorithm(Noise_PublicKeyInfo *obj)
  function Noise_PublicKeyInfo_has_algorithm (line 911) | int Noise_PublicKeyInfo_has_algorithm(const Noise_PublicKeyInfo *obj)
  function Noise_PublicKeyInfo_get_size_algorithm (line 921) | size_t Noise_PublicKeyInfo_get_size_algorithm(const Noise_PublicKeyInfo ...
  function Noise_PublicKeyInfo_set_algorithm (line 926) | int Noise_PublicKeyInfo_set_algorithm(Noise_PublicKeyInfo *obj, const ch...
  function Noise_PublicKeyInfo_clear_key (line 944) | int Noise_PublicKeyInfo_clear_key(Noise_PublicKeyInfo *obj)
  function Noise_PublicKeyInfo_has_key (line 955) | int Noise_PublicKeyInfo_has_key(const Noise_PublicKeyInfo *obj)
  function Noise_PublicKeyInfo_get_size_key (line 965) | size_t Noise_PublicKeyInfo_get_size_key(const Noise_PublicKeyInfo *obj)
  function Noise_PublicKeyInfo_set_key (line 970) | int Noise_PublicKeyInfo_set_key(Noise_PublicKeyInfo *obj, const void *va...
  function Noise_MetaInfo_new (line 987) | int Noise_MetaInfo_new(Noise_MetaInfo **obj)
  function Noise_MetaInfo_free (line 997) | int Noise_MetaInfo_free(Noise_MetaInfo *obj)
  function Noise_MetaInfo_write (line 1007) | int Noise_MetaInfo_write(NoiseProtobuf *pbuf, int tag, const Noise_MetaI...
  function Noise_MetaInfo_read (line 1020) | int Noise_MetaInfo_read(NoiseProtobuf *pbuf, int tag, Noise_MetaInfo **obj)
  function Noise_MetaInfo_clear_name (line 1060) | int Noise_MetaInfo_clear_name(Noise_MetaInfo *obj)
  function Noise_MetaInfo_has_name (line 1071) | int Noise_MetaInfo_has_name(const Noise_MetaInfo *obj)
  function Noise_MetaInfo_get_size_name (line 1081) | size_t Noise_MetaInfo_get_size_name(const Noise_MetaInfo *obj)
  function Noise_MetaInfo_set_name (line 1086) | int Noise_MetaInfo_set_name(Noise_MetaInfo *obj, const char *value, size...
  function Noise_MetaInfo_clear_value (line 1104) | int Noise_MetaInfo_clear_value(Noise_MetaInfo *obj)
  function Noise_MetaInfo_has_value (line 1115) | int Noise_MetaInfo_has_value(const Noise_MetaInfo *obj)
  function Noise_MetaInfo_get_size_value (line 1125) | size_t Noise_MetaInfo_get_size_value(const Noise_MetaInfo *obj)
  function Noise_MetaInfo_set_value (line 1130) | int Noise_MetaInfo_set_value(Noise_MetaInfo *obj, const char *value, siz...
  function Noise_Signature_new (line 1148) | int Noise_Signature_new(Noise_Signature **obj)
  function Noise_Signature_free (line 1158) | int Noise_Signature_free(Noise_Signature *obj)
  function Noise_Signature_write (line 1172) | int Noise_Signature_write(NoiseProtobuf *pbuf, int tag, const Noise_Sign...
  function Noise_Signature_read (line 1193) | int Noise_Signature_read(NoiseProtobuf *pbuf, int tag, Noise_Signature *...
  function Noise_Signature_clear_id (line 1255) | int Noise_Signature_clear_id(Noise_Signature *obj)
  function Noise_Signature_has_id (line 1266) | int Noise_Signature_has_id(const Noise_Signature *obj)
  function Noise_Signature_get_size_id (line 1276) | size_t Noise_Signature_get_size_id(const Noise_Signature *obj)
  function Noise_Signature_set_id (line 1281) | int Noise_Signature_set_id(Noise_Signature *obj, const char *value, size...
  function Noise_Signature_clear_name (line 1299) | int Noise_Signature_clear_name(Noise_Signature *obj)
  function Noise_Signature_has_name (line 1310) | int Noise_Signature_has_name(const Noise_Signature *obj)
  function Noise_Signature_get_size_name (line 1320) | size_t Noise_Signature_get_size_name(const Noise_Signature *obj)
  function Noise_Signature_set_name (line 1325) | int Noise_Signature_set_name(Noise_Signature *obj, const char *value, si...
  function Noise_Signature_clear_signing_key (line 1343) | int Noise_Signature_clear_signing_key(Noise_Signature *obj)
  function Noise_Signature_has_signing_key (line 1353) | int Noise_Signature_has_signing_key(const Noise_Signature *obj)
  function Noise_PublicKeyInfo (line 1358) | Noise_PublicKeyInfo *Noise_Signature_get_signing_key(const Noise_Signatu...
  function Noise_Signature_get_new_signing_key (line 1363) | int Noise_Signature_get_new_signing_key(Noise_Signature *obj, Noise_Publ...
  function Noise_Signature_clear_hash_algorithm (line 1379) | int Noise_Signature_clear_hash_algorithm(Noise_Signature *obj)
  function Noise_Signature_has_hash_algorithm (line 1390) | int Noise_Signature_has_hash_algorithm(const Noise_Signature *obj)
  function Noise_Signature_get_size_hash_algorithm (line 1400) | size_t Noise_Signature_get_size_hash_algorithm(const Noise_Signature *obj)
  function Noise_Signature_set_hash_algorithm (line 1405) | int Noise_Signature_set_hash_algorithm(Noise_Signature *obj, const char ...
  function Noise_Signature_clear_extra_signed_info (line 1423) | int Noise_Signature_clear_extra_signed_info(Noise_Signature *obj)
  function Noise_Signature_has_extra_signed_info (line 1433) | int Noise_Signature_has_extra_signed_info(const Noise_Signature *obj)
  function Noise_ExtraSignedInfo (line 1438) | Noise_ExtraSignedInfo *Noise_Signature_get_extra_signed_info(const Noise...
  function Noise_Signature_get_new_extra_signed_info (line 1443) | int Noise_Signature_get_new_extra_signed_info(Noise_Signature *obj, Nois...
  function Noise_Signature_clear_signature (line 1459) | int Noise_Signature_clear_signature(Noise_Signature *obj)
  function Noise_Signature_has_signature (line 1470) | int Noise_Signature_has_signature(const Noise_Signature *obj)
  function Noise_Signature_get_size_signature (line 1480) | size_t Noise_Signature_get_size_signature(const Noise_Signature *obj)
  function Noise_Signature_set_signature (line 1485) | int Noise_Signature_set_signature(Noise_Signature *obj, const void *valu...
  function Noise_ExtraSignedInfo_new (line 1502) | int Noise_ExtraSignedInfo_new(Noise_ExtraSignedInfo **obj)
  function Noise_ExtraSignedInfo_free (line 1512) | int Noise_ExtraSignedInfo_free(Noise_ExtraSignedInfo *obj)
  function Noise_ExtraSignedInfo_write (line 1527) | int Noise_ExtraSignedInfo_write(NoiseProtobuf *pbuf, int tag, const Nois...
  function Noise_ExtraSignedInfo_read (line 1545) | int Noise_ExtraSignedInfo_read(NoiseProtobuf *pbuf, int tag, Noise_Extra...
  function Noise_ExtraSignedInfo_clear_nonce (line 1599) | int Noise_ExtraSignedInfo_clear_nonce(Noise_ExtraSignedInfo *obj)
  function Noise_ExtraSignedInfo_has_nonce (line 1610) | int Noise_ExtraSignedInfo_has_nonce(const Noise_ExtraSignedInfo *obj)
  function Noise_ExtraSignedInfo_get_size_nonce (line 1620) | size_t Noise_ExtraSignedInfo_get_size_nonce(const Noise_ExtraSignedInfo ...
  function Noise_ExtraSignedInfo_set_nonce (line 1625) | int Noise_ExtraSignedInfo_set_nonce(Noise_ExtraSignedInfo *obj, const vo...
  function Noise_ExtraSignedInfo_clear_valid_from (line 1642) | int Noise_ExtraSignedInfo_clear_valid_from(Noise_ExtraSignedInfo *obj)
  function Noise_ExtraSignedInfo_has_valid_from (line 1653) | int Noise_ExtraSignedInfo_has_valid_from(const Noise_ExtraSignedInfo *obj)
  function Noise_ExtraSignedInfo_get_size_valid_from (line 1663) | size_t Noise_ExtraSignedInfo_get_size_valid_from(const Noise_ExtraSigned...
  function Noise_ExtraSignedInfo_set_valid_from (line 1668) | int Noise_ExtraSignedInfo_set_valid_from(Noise_ExtraSignedInfo *obj, con...
  function Noise_ExtraSignedInfo_clear_valid_to (line 1686) | int Noise_ExtraSignedInfo_clear_valid_to(Noise_ExtraSignedInfo *obj)
  function Noise_ExtraSignedInfo_has_valid_to (line 1697) | int Noise_ExtraSignedInfo_has_valid_to(const Noise_ExtraSignedInfo *obj)
  function Noise_ExtraSignedInfo_get_size_valid_to (line 1707) | size_t Noise_ExtraSignedInfo_get_size_valid_to(const Noise_ExtraSignedIn...
  function Noise_ExtraSignedInfo_set_valid_to (line 1712) | int Noise_ExtraSignedInfo_set_valid_to(Noise_ExtraSignedInfo *obj, const...
  function Noise_ExtraSignedInfo_clear_meta (line 1730) | int Noise_ExtraSignedInfo_clear_meta(Noise_ExtraSignedInfo *obj)
  function Noise_ExtraSignedInfo_has_meta (line 1745) | int Noise_ExtraSignedInfo_has_meta(const Noise_ExtraSignedInfo *obj)
  function Noise_ExtraSignedInfo_count_meta (line 1750) | size_t Noise_ExtraSignedInfo_count_meta(const Noise_ExtraSignedInfo *obj)
  function Noise_MetaInfo (line 1755) | Noise_MetaInfo *Noise_ExtraSignedInfo_get_at_meta(const Noise_ExtraSigne...
  function Noise_ExtraSignedInfo_add_meta (line 1763) | int Noise_ExtraSignedInfo_add_meta(Noise_ExtraSignedInfo *obj, Noise_Met...
  function Noise_ExtraSignedInfo_insert_meta (line 1783) | int Noise_ExtraSignedInfo_insert_meta(Noise_ExtraSignedInfo *obj, size_t...
  function Noise_EncryptedPrivateKey_new (line 1790) | int Noise_EncryptedPrivateKey_new(Noise_EncryptedPrivateKey **obj)
  function Noise_EncryptedPrivateKey_free (line 1800) | int Noise_EncryptedPrivateKey_free(Noise_EncryptedPrivateKey *obj)
  function Noise_EncryptedPrivateKey_write (line 1811) | int Noise_EncryptedPrivateKey_write(NoiseProtobuf *pbuf, int tag, const ...
  function Noise_EncryptedPrivateKey_read (line 1830) | int Noise_EncryptedPrivateKey_read(NoiseProtobuf *pbuf, int tag, Noise_E...
  function Noise_EncryptedPrivateKey_clear_version (line 1882) | int Noise_EncryptedPrivateKey_clear_version(Noise_EncryptedPrivateKey *obj)
  function Noise_EncryptedPrivateKey_has_version (line 1891) | int Noise_EncryptedPrivateKey_has_version(const Noise_EncryptedPrivateKe...
  function Noise_EncryptedPrivateKey_get_version (line 1896) | uint32_t Noise_EncryptedPrivateKey_get_version(const Noise_EncryptedPriv...
  function Noise_EncryptedPrivateKey_set_version (line 1901) | int Noise_EncryptedPrivateKey_set_version(Noise_EncryptedPrivateKey *obj...
  function Noise_EncryptedPrivateKey_clear_algorithm (line 1910) | int Noise_EncryptedPrivateKey_clear_algorithm(Noise_EncryptedPrivateKey ...
  function Noise_EncryptedPrivateKey_has_algorithm (line 1921) | int Noise_EncryptedPrivateKey_has_algorithm(const Noise_EncryptedPrivate...
  function Noise_EncryptedPrivateKey_get_size_algorithm (line 1931) | size_t Noise_EncryptedPrivateKey_get_size_algorithm(const Noise_Encrypte...
  function Noise_EncryptedPrivateKey_set_algorithm (line 1936) | int Noise_EncryptedPrivateKey_set_algorithm(Noise_EncryptedPrivateKey *o...
  function Noise_EncryptedPrivateKey_clear_salt (line 1954) | int Noise_EncryptedPrivateKey_clear_salt(Noise_EncryptedPrivateKey *obj)
  function Noise_EncryptedPrivateKey_has_salt (line 1965) | int Noise_EncryptedPrivateKey_has_salt(const Noise_EncryptedPrivateKey *...
  function Noise_EncryptedPrivateKey_get_size_salt (line 1975) | size_t Noise_EncryptedPrivateKey_get_size_salt(const Noise_EncryptedPriv...
  function Noise_EncryptedPrivateKey_set_salt (line 1980) | int Noise_EncryptedPrivateKey_set_salt(Noise_EncryptedPrivateKey *obj, c...
  function Noise_EncryptedPrivateKey_clear_iterations (line 1997) | int Noise_EncryptedPrivateKey_clear_iterations(Noise_EncryptedPrivateKey...
  function Noise_EncryptedPrivateKey_has_iterations (line 2006) | int Noise_EncryptedPrivateKey_has_iterations(const Noise_EncryptedPrivat...
  function Noise_EncryptedPrivateKey_get_iterations (line 2011) | uint32_t Noise_EncryptedPrivateKey_get_iterations(const Noise_EncryptedP...
  function Noise_EncryptedPrivateKey_set_iterations (line 2016) | int Noise_EncryptedPrivateKey_set_iterations(Noise_EncryptedPrivateKey *...
  function Noise_EncryptedPrivateKey_clear_encrypted_data (line 2025) | int Noise_EncryptedPrivateKey_clear_encrypted_data(Noise_EncryptedPrivat...
  function Noise_EncryptedPrivateKey_has_encrypted_data (line 2036) | int Noise_EncryptedPrivateKey_has_encrypted_data(const Noise_EncryptedPr...
  function Noise_EncryptedPrivateKey_get_size_encrypted_data (line 2046) | size_t Noise_EncryptedPrivateKey_get_size_encrypted_data(const Noise_Enc...
  function Noise_EncryptedPrivateKey_set_encrypted_data (line 2051) | int Noise_EncryptedPrivateKey_set_encrypted_data(Noise_EncryptedPrivateK...
  function Noise_PrivateKey_new (line 2068) | int Noise_PrivateKey_new(Noise_PrivateKey **obj)
  function Noise_PrivateKey_free (line 2078) | int Noise_PrivateKey_free(Noise_PrivateKey *obj)
  function Noise_PrivateKey_write (line 2096) | int Noise_PrivateKey_write(NoiseProtobuf *pbuf, int tag, const Noise_Pri...
  function Noise_PrivateKey_read (line 2116) | int Noise_PrivateKey_read(NoiseProtobuf *pbuf, int tag, Noise_PrivateKey...
  function Noise_PrivateKey_clear_id (line 2178) | int Noise_PrivateKey_clear_id(Noise_PrivateKey *obj)
  function Noise_PrivateKey_has_id (line 2189) | int Noise_PrivateKey_has_id(const Noise_PrivateKey *obj)
  function Noise_PrivateKey_get_size_id (line 2199) | size_t Noise_PrivateKey_get_size_id(const Noise_PrivateKey *obj)
  function Noise_PrivateKey_set_id (line 2204) | int Noise_PrivateKey_set_id(Noise_PrivateKey *obj, const char *value, si...
  function Noise_PrivateKey_clear_name (line 2222) | int Noise_PrivateKey_clear_name(Noise_PrivateKey *obj)
  function Noise_PrivateKey_has_name (line 2233) | int Noise_PrivateKey_has_name(const Noise_PrivateKey *obj)
  function Noise_PrivateKey_get_size_name (line 2243) | size_t Noise_PrivateKey_get_size_name(const Noise_PrivateKey *obj)
  function Noise_PrivateKey_set_name (line 2248) | int Noise_PrivateKey_set_name(Noise_PrivateKey *obj, const char *value, ...
  function Noise_PrivateKey_clear_role (line 2266) | int Noise_PrivateKey_clear_role(Noise_PrivateKey *obj)
  function Noise_PrivateKey_has_role (line 2277) | int Noise_PrivateKey_has_role(const Noise_PrivateKey *obj)
  function Noise_PrivateKey_get_size_role (line 2287) | size_t Noise_PrivateKey_get_size_role(const Noise_PrivateKey *obj)
  function Noise_PrivateKey_set_role (line 2292) | int Noise_PrivateKey_set_role(Noise_PrivateKey *obj, const char *value, ...
  function Noise_PrivateKey_clear_keys (line 2310) | int Noise_PrivateKey_clear_keys(Noise_PrivateKey *obj)
  function Noise_PrivateKey_has_keys (line 2325) | int Noise_PrivateKey_has_keys(const Noise_PrivateKey *obj)
  function Noise_PrivateKey_count_keys (line 2330) | size_t Noise_PrivateKey_count_keys(const Noise_PrivateKey *obj)
  function Noise_PrivateKeyInfo (line 2335) | Noise_PrivateKeyInfo *Noise_PrivateKey_get_at_keys(const Noise_PrivateKe...
  function Noise_PrivateKey_add_keys (line 2343) | int Noise_PrivateKey_add_keys(Noise_PrivateKey *obj, Noise_PrivateKeyInf...
  function Noise_PrivateKey_insert_keys (line 2363) | int Noise_PrivateKey_insert_keys(Noise_PrivateKey *obj, size_t index, No...
  function Noise_PrivateKey_clear_meta (line 2370) | int Noise_PrivateKey_clear_meta(Noise_PrivateKey *obj)
  function Noise_PrivateKey_has_meta (line 2385) | int Noise_PrivateKey_has_meta(const Noise_PrivateKey *obj)
  function Noise_PrivateKey_count_meta (line 2390) | size_t Noise_PrivateKey_count_meta(const Noise_PrivateKey *obj)
  function Noise_MetaInfo (line 2395) | Noise_MetaInfo *Noise_PrivateKey_get_at_meta(const Noise_PrivateKey *obj...
  function Noise_PrivateKey_add_meta (line 2403) | int Noise_PrivateKey_add_meta(Noise_PrivateKey *obj, Noise_MetaInfo **va...
  function Noise_PrivateKey_insert_meta (line 2423) | int Noise_PrivateKey_insert_meta(Noise_PrivateKey *obj, size_t index, No...
  function Noise_PrivateKeyInfo_new (line 2430) | int Noise_PrivateKeyInfo_new(Noise_PrivateKeyInfo **obj)
  function Noise_PrivateKeyInfo_free (line 2440) | int Noise_PrivateKeyInfo_free(Noise_PrivateKeyInfo *obj)
  function Noise_PrivateKeyInfo_write (line 2450) | int Noise_PrivateKeyInfo_write(NoiseProtobuf *pbuf, int tag, const Noise...
  function Noise_PrivateKeyInfo_read (line 2463) | int Noise_PrivateKeyInfo_read(NoiseProtobuf *pbuf, int tag, Noise_Privat...
  function Noise_PrivateKeyInfo_clear_algorithm (line 2503) | int Noise_PrivateKeyInfo_clear_algorithm(Noise_PrivateKeyInfo *obj)
  function Noise_PrivateKeyInfo_has_algorithm (line 2514) | int Noise_PrivateKeyInfo_has_algorithm(const Noise_PrivateKeyInfo *obj)
  function Noise_PrivateKeyInfo_get_size_algorithm (line 2524) | size_t Noise_PrivateKeyInfo_get_size_algorithm(const Noise_PrivateKeyInf...
  function Noise_PrivateKeyInfo_set_algorithm (line 2529) | int Noise_PrivateKeyInfo_set_algorithm(Noise_PrivateKeyInfo *obj, const ...
  function Noise_PrivateKeyInfo_clear_key (line 2547) | int Noise_PrivateKeyInfo_clear_key(Noise_PrivateKeyInfo *obj)
  function Noise_PrivateKeyInfo_has_key (line 2558) | int Noise_PrivateKeyInfo_has_key(const Noise_PrivateKeyInfo *obj)
  function Noise_PrivateKeyInfo_get_size_key (line 2568) | size_t Noise_PrivateKeyInfo_get_size_key(const Noise_PrivateKeyInfo *obj)
  function Noise_PrivateKeyInfo_set_key (line 2573) | int Noise_PrivateKeyInfo_set_key(Noise_PrivateKeyInfo *obj, const void *...

FILE: src/keys/loader.c
  function noise_load_file (line 87) | static int noise_load_file
  function noise_load_free (line 148) | static void noise_load_free(NoiseProtobuf *pbuf)
  function noise_load_certificate_from_file (line 178) | int noise_load_certificate_from_file
  function noise_load_certificate_from_buffer (line 213) | int noise_load_certificate_from_buffer
  function noise_load_certificate_chain_from_file (line 279) | int noise_load_certificate_chain_from_file
  function noise_load_certificate_chain_from_buffer (line 314) | int noise_load_certificate_chain_from_buffer
  function noise_load_private_key_from_file (line 375) | int noise_load_private_key_from_file
  function noise_parse_protect_name (line 401) | static int noise_parse_protect_name
  function noise_load_private_key_from_buffer (line 450) | int noise_load_private_key_from_buffer
  function noise_save_to_file (line 568) | static int noise_save_to_file
  function noise_save_certificate_to_file (line 636) | int noise_save_certificate_to_file
  function noise_save_certificate_to_buffer (line 654) | int noise_save_certificate_to_buffer
  function noise_save_certificate_chain_to_file (line 677) | int noise_save_certificate_chain_to_file
  function noise_save_certificate_chain_to_buffer (line 696) | int noise_save_certificate_chain_to_buffer
  function noise_save_private_key_to_file (line 726) | int noise_save_private_key_to_file
  function noise_save_private_key_to_buffer (line 807) | int noise_save_private_key_to_buffer

FILE: src/protobufs/protobufs.c
  function noise_protobuf_prepare_input (line 243) | int noise_protobuf_prepare_input
  function noise_protobuf_prepare_output (line 267) | int noise_protobuf_prepare_output
  function noise_protobuf_prepare_measure (line 292) | int noise_protobuf_prepare_measure(NoiseProtobuf *pbuf, size_t max_size)
  function noise_protobuf_finish_input (line 322) | int noise_protobuf_finish_input(NoiseProtobuf *pbuf)
  function noise_protobuf_finish_output (line 361) | int noise_protobuf_finish_output
  function noise_protobuf_finish_output_shift (line 404) | int noise_protobuf_finish_output_shift
  function noise_protobuf_finish_measure (line 444) | int noise_protobuf_finish_measure(NoiseProtobuf *pbuf, size_t *size)
  function noise_protobuf_reserve_space (line 470) | static int noise_protobuf_reserve_space
  function noise_protobuf_write_varint (line 505) | static int noise_protobuf_write_varint(NoiseProtobuf *pbuf, uint64_t value)
  function noise_protobuf_write_tag (line 555) | static int noise_protobuf_write_tag(NoiseProtobuf *pbuf, int tag, int type)
  function noise_protobuf_write_integer (line 579) | static int noise_protobuf_write_integer
  function noise_protobuf_write_int32 (line 599) | int noise_protobuf_write_int32(NoiseProtobuf *pbuf, int tag, int32_t value)
  function noise_protobuf_write_uint32 (line 615) | int noise_protobuf_write_uint32(NoiseProtobuf *pbuf, int tag, uint32_t v...
  function noise_protobuf_write_int64 (line 631) | int noise_protobuf_write_int64(NoiseProtobuf *pbuf, int tag, int64_t value)
  function noise_protobuf_write_uint64 (line 647) | int noise_protobuf_write_uint64(NoiseProtobuf *pbuf, int tag, uint64_t v...
  function noise_protobuf_write_sint32 (line 663) | int noise_protobuf_write_sint32(NoiseProtobuf *pbuf, int tag, int32_t va...
  function noise_protobuf_write_sint64 (line 680) | int noise_protobuf_write_sint64(NoiseProtobuf *pbuf, int tag, int64_t va...
  function noise_protobuf_write_sfixed32 (line 697) | int noise_protobuf_write_sfixed32(NoiseProtobuf *pbuf, int tag, int32_t ...
  function noise_protobuf_write_fixed32 (line 713) | int noise_protobuf_write_fixed32(NoiseProtobuf *pbuf, int tag, uint32_t ...
  function noise_protobuf_write_sfixed64 (line 739) | int noise_protobuf_write_sfixed64(NoiseProtobuf *pbuf, int tag, int64_t ...
  function noise_protobuf_write_fixed64 (line 755) | int noise_protobuf_write_fixed64(NoiseProtobuf *pbuf, int tag, uint64_t ...
  function noise_protobuf_write_float (line 785) | int noise_protobuf_write_float(NoiseProtobuf *pbuf, int tag, float value)
  function noise_protobuf_write_double (line 806) | int noise_protobuf_write_double(NoiseProtobuf *pbuf, int tag, double value)
  function noise_protobuf_write_bool (line 827) | int noise_protobuf_write_bool(NoiseProtobuf *pbuf, int tag, int value)
  function noise_protobuf_is_utf8 (line 843) | static int noise_protobuf_is_utf8(const char *str, size_t size)
  function noise_protobuf_write_string (line 934) | int noise_protobuf_write_string
  function noise_protobuf_write_bytes (line 962) | int noise_protobuf_write_bytes
  function noise_protobuf_write_end_element (line 999) | int noise_protobuf_write_end_element(NoiseProtobuf *pbuf, size_t *end_posn)
  function noise_protobuf_write_start_element (line 1026) | int noise_protobuf_write_start_element
  function noise_protobuf_peek_varint (line 1050) | static int noise_protobuf_peek_varint
  function noise_protobuf_peek_tag (line 1095) | int noise_protobuf_peek_tag(const NoiseProtobuf *pbuf)
  function noise_protobuf_peek_size (line 1128) | size_t noise_protobuf_peek_size(const NoiseProtobuf *pbuf)
  function noise_protobuf_read_varint (line 1156) | static int noise_protobuf_read_varint(NoiseProtobuf *pbuf, uint64_t *value)
  function noise_protobuf_read_tag (line 1200) | static int noise_protobuf_read_tag(NoiseProtobuf *pbuf, int tag, int type)
  function noise_protobuf_read_space (line 1235) | static int noise_protobuf_read_space
  function noise_protobuf_read_integer (line 1262) | static int noise_protobuf_read_integer
  function noise_protobuf_read_int32 (line 1286) | int noise_protobuf_read_int32(NoiseProtobuf *pbuf, int tag, int32_t *value)
  function noise_protobuf_read_uint32 (line 1311) | int noise_protobuf_read_uint32(NoiseProtobuf *pbuf, int tag, uint32_t *v...
  function noise_protobuf_read_int64 (line 1336) | int noise_protobuf_read_int64(NoiseProtobuf *pbuf, int tag, int64_t *value)
  function noise_protobuf_read_uint64 (line 1361) | int noise_protobuf_read_uint64(NoiseProtobuf *pbuf, int tag, uint64_t *v...
  function noise_protobuf_read_sint32 (line 1386) | int noise_protobuf_read_sint32(NoiseProtobuf *pbuf, int tag, int32_t *va...
  function noise_protobuf_read_sint64 (line 1411) | int noise_protobuf_read_sint64(NoiseProtobuf *pbuf, int tag, int64_t *va...
  function noise_protobuf_read_sfixed32 (line 1436) | int noise_protobuf_read_sfixed32(NoiseProtobuf *pbuf, int tag, int32_t *...
  function noise_protobuf_read_fixed32 (line 1453) | int noise_protobuf_read_fixed32(NoiseProtobuf *pbuf, int tag, uint32_t *...
  function noise_protobuf_read_sfixed64 (line 1487) | int noise_protobuf_read_sfixed64(NoiseProtobuf *pbuf, int tag, int64_t *...
  function noise_protobuf_read_fixed64 (line 1504) | int noise_protobuf_read_fixed64(NoiseProtobuf *pbuf, int tag, uint64_t *...
  function noise_protobuf_read_float (line 1542) | int noise_protobuf_read_float(NoiseProtobuf *pbuf, int tag, float *value)
  function noise_protobuf_read_double (line 1572) | int noise_protobuf_read_double(NoiseProtobuf *pbuf, int tag, double *value)
  function noise_protobuf_read_bool (line 1602) | int noise_protobuf_read_bool(NoiseProtobuf *pbuf, int tag, int *value)
  function noise_protobuf_read_string (line 1640) | int noise_protobuf_read_string
  function noise_protobuf_read_alloc_string (line 1707) | int noise_protobuf_read_alloc_string
  function noise_protobuf_read_bytes (line 1767) | int noise_protobuf_read_bytes
  function noise_protobuf_read_alloc_bytes (line 1821) | int noise_protobuf_read_alloc_bytes
  function noise_protobuf_read_start_element (line 1885) | int noise_protobuf_read_start_element
  function noise_protobuf_read_end_element (line 1926) | int noise_protobuf_read_end_element(NoiseProtobuf *pbuf, size_t end_posn)
  function noise_protobuf_read_at_end_element (line 1952) | int noise_protobuf_read_at_end_element
  function noise_protobuf_read_stop (line 1976) | int noise_protobuf_read_stop(NoiseProtobuf *pbuf)
  function noise_protobuf_read_skip (line 2001) | int noise_protobuf_read_skip(NoiseProtobuf *pbuf)
  function noise_protobuf_grow_array (line 2047) | static size_t noise_protobuf_grow_array(size_t max)
  function noise_protobuf_add_to_array (line 2074) | int noise_protobuf_add_to_array
  function noise_protobuf_add_to_block_array (line 2097) | static int noise_protobuf_add_to_block_array
  function noise_protobuf_add_to_string_array (line 2164) | int noise_protobuf_add_to_string_array
  function noise_protobuf_add_to_bytes_array (line 2189) | int noise_protobuf_add_to_bytes_array
  function noise_protobuf_insert_into_array (line 2214) | int noise_protobuf_insert_into_array
  function noise_protobuf_free_memory (line 2256) | void noise_protobuf_free_memory(void *ptr, size_t size)

FILE: src/protocol/cipherstate.c
  function noise_cipherstate_new_by_id (line 77) | int noise_cipherstate_new_by_id(NoiseCipherState **state, int id)
  function noise_cipherstate_new_by_name (line 122) | int noise_cipherstate_new_by_name(NoiseCipherState **state, const char *...
  function noise_cipherstate_free (line 152) | int noise_cipherstate_free(NoiseCipherState *state)
  function noise_cipherstate_get_cipher_id (line 174) | int noise_cipherstate_get_cipher_id(const NoiseCipherState *state)
  function noise_cipherstate_get_key_length (line 188) | size_t noise_cipherstate_get_key_length(const NoiseCipherState *state)
  function noise_cipherstate_get_mac_length (line 202) | size_t noise_cipherstate_get_mac_length(const NoiseCipherState *state)
  function noise_cipherstate_init_key (line 221) | int noise_cipherstate_init_key
  function noise_cipherstate_has_key (line 247) | int noise_cipherstate_has_key(const NoiseCipherState *state)
  function noise_cipherstate_encrypt_with_ad (line 293) | int noise_cipherstate_encrypt_with_ad
  function noise_cipherstate_decrypt_with_ad (line 373) | int noise_cipherstate_decrypt_with_ad
  function noise_cipherstate_encrypt (line 452) | int noise_cipherstate_encrypt(NoiseCipherState *state, NoiseBuffer *buffer)
  function noise_cipherstate_decrypt (line 494) | int noise_cipherstate_decrypt(NoiseCipherState *state, NoiseBuffer *buffer)
  function noise_cipherstate_set_nonce (line 518) | int noise_cipherstate_set_nonce(NoiseCipherState *state, uint64_t nonce)
  function noise_cipherstate_get_max_key_length (line 542) | int noise_cipherstate_get_max_key_length(void)
  function noise_cipherstate_get_max_mac_length (line 552) | int noise_cipherstate_get_max_mac_length(void)

FILE: src/protocol/dhstate.c
  function noise_dhstate_new_by_id (line 67) | int noise_dhstate_new_by_id(NoiseDHState **state, int id)
  function noise_dhstate_new_by_name (line 116) | int noise_dhstate_new_by_name(NoiseDHState **state, const char *name)
  function noise_dhstate_free (line 146) | int noise_dhstate_free(NoiseDHState *state)
  function noise_dhstate_get_dh_id (line 168) | int noise_dhstate_get_dh_id(const NoiseDHState *state)
  function noise_dhstate_get_public_key_length (line 183) | size_t noise_dhstate_get_public_key_length(const NoiseDHState *state)
  function noise_dhstate_get_private_key_length (line 198) | size_t noise_dhstate_get_private_key_length(const NoiseDHState *state)
  function noise_dhstate_get_shared_key_length (line 213) | size_t noise_dhstate_get_shared_key_length(const NoiseDHState *state)
  function noise_dhstate_is_ephemeral_only (line 230) | int noise_dhstate_is_ephemeral_only(const NoiseDHState *state)
  function noise_dhstate_has_keypair (line 247) | int noise_dhstate_has_keypair(const NoiseDHState *state)
  function noise_dhstate_has_public_key (line 267) | int noise_dhstate_has_public_key(const NoiseDHState *state)
  function noise_dhstate_generate_keypair (line 289) | int noise_dhstate_generate_keypair(NoiseDHState *state)
  function noise_dhstate_generate_dependent_keypair (line 331) | int noise_dhstate_generate_dependent_keypair
  function noise_dhstate_set_keypair (line 373) | int noise_dhstate_set_keypair
  function noise_dhstate_set_keypair_private (line 422) | int noise_dhstate_set_keypair_private
  function noise_dhstate_get_keypair (line 461) | int noise_dhstate_get_keypair
  function noise_dhstate_set_public_key (line 510) | int noise_dhstate_set_public_key
  function noise_dhstate_get_public_key (line 550) | int noise_dhstate_get_public_key
  function noise_dhstate_set_null_public_key (line 576) | int noise_dhstate_set_null_public_key(NoiseDHState *state)
  function noise_dhstate_is_null_public_key (line 602) | int noise_dhstate_is_null_public_key(const NoiseDHState *state)
  function noise_dhstate_clear_key (line 622) | int noise_dhstate_clear_key(NoiseDHState *state)
  function noise_cmove_zero (line 645) | static void noise_cmove_zero(uint8_t *data, size_t len, int condition)
  function noise_dhstate_calculate (line 685) | int noise_dhstate_calculate
  function noise_dhstate_copy (line 730) | int noise_dhstate_copy(NoiseDHState *state, const NoiseDHState *from)
  function noise_dhstate_format_fingerprint (line 775) | int noise_dhstate_format_fingerprint
  function noise_dhstate_get_role (line 805) | int noise_dhstate_get_role(const NoiseDHState *state)
  function noise_dhstate_set_role (line 835) | int noise_dhstate_set_role(NoiseDHState *state, int role)

FILE: src/protocol/errors.c
  function noise_perror (line 92) | void noise_perror(const char *s, int err)
  function noise_strerror (line 116) | int noise_strerror(int err, char *buf, size_t size)

FILE: src/protocol/handshakestate.c
  function noise_handshakestate_requirements (line 60) | static int noise_handshakestate_requirements
  function noise_handshakestate_new (line 102) | static int noise_handshakestate_new
  function noise_handshakestate_new_by_id (line 256) | int noise_handshakestate_new_by_id
  function noise_handshakestate_new_by_name (line 302) | int noise_handshakestate_new_by_name
  function noise_handshakestate_free (line 336) | int noise_handshakestate_free(NoiseHandshakeState *state)
  function noise_handshakestate_get_role (line 376) | int noise_handshakestate_get_role(const NoiseHandshakeState *state)
  function noise_handshakestate_get_protocol_id (line 392) | int noise_handshakestate_get_protocol_id
  function NoiseDHState (line 417) | NoiseDHState *noise_handshakestate_get_local_keypair_dh
  function NoiseDHState (line 438) | NoiseDHState *noise_handshakestate_get_remote_public_key_dh
  function NoiseDHState (line 458) | NoiseDHState *noise_handshakestate_get_fixed_ephemeral_dh
  function NoiseDHState (line 494) | NoiseDHState *noise_handshakestate_get_fixed_hybrid_dh
  function noise_handshakestate_needs_pre_shared_key (line 531) | int noise_handshakestate_needs_pre_shared_key(const NoiseHandshakeState ...
  function noise_handshakestate_has_pre_shared_key (line 550) | int noise_handshakestate_has_pre_shared_key(const NoiseHandshakeState *s...
  function noise_handshakestate_set_pre_shared_key (line 578) | int noise_handshakestate_set_pre_shared_key
  function noise_handshakestate_set_prologue (line 618) | int noise_handshakestate_set_prologue
  function noise_handshakestate_needs_local_keypair (line 663) | int noise_handshakestate_needs_local_keypair(const NoiseHandshakeState *...
  function noise_handshakestate_has_local_keypair (line 685) | int noise_handshakestate_has_local_keypair(const NoiseHandshakeState *st...
  function noise_handshakestate_needs_remote_public_key (line 711) | int noise_handshakestate_needs_remote_public_key(const NoiseHandshakeSta...
  function noise_handshakestate_has_remote_public_key (line 735) | int noise_handshakestate_has_remote_public_key(const NoiseHandshakeState...
  function noise_handshakestate_mix_public_key (line 748) | static void noise_handshakestate_mix_public_key
  function noise_handshakestate_mix_chaining_key (line 763) | static void noise_handshakestate_mix_chaining_key
  function noise_handshakestate_start (line 800) | int noise_handshakestate_start(NoiseHandshakeState *state)
  function noise_handshakestate_fallback (line 921) | int noise_handshakestate_fallback(NoiseHandshakeState *state)
  function noise_handshakestate_fallback_to (line 973) | int noise_handshakestate_fallback_to(NoiseHandshakeState *state, int pat...
  function noise_handshakestate_get_action (line 1112) | int noise_handshakestate_get_action(const NoiseHandshakeState *state)
  function noise_handshake_mix_dh (line 1128) | static int noise_handshake_mix_dh
  function noise_handshakestate_write (line 1151) | static int noise_handshakestate_write
  function noise_handshakestate_write_message (line 1379) | int noise_handshakestate_write_message
  function noise_handshakestate_read (line 1419) | static int noise_handshakestate_read
  function noise_handshakestate_read_message (line 1639) | int noise_handshakestate_read_message
  function noise_handshakestate_split (line 1701) | int noise_handshakestate_split
  function noise_handshakestate_get_handshake_hash (line 1759) | int noise_handshakestate_get_handshake_hash

FILE: src/protocol/hashstate.c
  function noise_hashstate_new_by_id (line 73) | int noise_hashstate_new_by_id(NoiseHashState **state, int id)
  function noise_hashstate_new_by_name (line 126) | int noise_hashstate_new_by_name(NoiseHashState **state, const char *name)
  function noise_hashstate_free (line 156) | int noise_hashstate_free(NoiseHashState *state)
  function noise_hashstate_get_hash_id (line 178) | int noise_hashstate_get_hash_id(const NoiseHashState *state)
  function noise_hashstate_get_hash_length (line 192) | size_t noise_hashstate_get_hash_length(const NoiseHashState *state)
  function noise_hashstate_get_block_length (line 206) | size_t noise_hashstate_get_block_length(const NoiseHashState *state)
  function noise_hashstate_reset (line 221) | int noise_hashstate_reset(NoiseHashState *state)
  function noise_hashstate_update (line 244) | int noise_hashstate_update
  function noise_hashstate_finalize (line 271) | int noise_hashstate_finalize
  function noise_hashstate_hash_one (line 308) | int noise_hashstate_hash_one
  function noise_hashstate_hash_two (line 351) | int noise_hashstate_hash_two
  function noise_hashstate_xor_key (line 381) | static void noise_hashstate_xor_key(uint8_t *key, size_t key_len, uint8_...
  function noise_hashstate_hmac (line 406) | static void noise_hashstate_hmac
  function noise_hashstate_hkdf (line 476) | int noise_hashstate_hkdf
  function noise_hashstate_pbkdf2 (line 541) | int noise_hashstate_pbkdf2
  function noise_hashstate_get_max_hash_length (line 603) | int noise_hashstate_get_max_hash_length(void)
  function noise_hashstate_get_max_block_length (line 613) | int noise_hashstate_get_max_block_length(void)

FILE: src/protocol/internal.c
  function NoiseCipherState (line 40) | NoiseCipherState *noise_aesgcm_new(void)

FILE: src/protocol/internal.h
  type NoiseCipherState_s (line 58) | struct NoiseCipherState_s
  type NoiseHashState_s (line 151) | struct NoiseHashState_s
  type NoiseDHState_s (line 213) | struct NoiseDHState_s
  type NoiseSignState_s (line 362) | struct NoiseSignState_s
  type NoiseSymmetricState_s (line 500) | struct NoiseSymmetricState_s
  type NoiseHandshakeState_s (line 531) | struct NoiseHandshakeState_s
  type NoisePatternFlags_t (line 669) | typedef uint16_t NoisePatternFlags_t;

FILE: src/protocol/names.c
  type NoiseIdMapping (line 49) | typedef struct
  function noise_name_to_id (line 146) | int noise_name_to_id(int category, const char *name, size_t name_len)
  function noise_protocol_parse_field (line 214) | static int noise_protocol_parse_field
  function noise_protocol_parse_dual_field (line 270) | static int noise_protocol_parse_dual_field
  function noise_protocol_name_to_id (line 331) | int noise_protocol_name_to_id
  function noise_protocol_format_field (line 379) | static void noise_protocol_format_field
  function noise_protocol_id_to_name (line 436) | int noise_protocol_id_to_name

FILE: src/protocol/patterns.c
  function NoisePatternFlags_t (line 1306) | NoisePatternFlags_t noise_pattern_reverse_flags(NoisePatternFlags_t flags)

FILE: src/protocol/rand_os.c
  function noise_rand_bytes (line 68) | void noise_rand_bytes(void *bytes, size_t size)
  function ed25519_randombytes_unsafe (line 111) | void ed25519_randombytes_unsafe(void *p, size_t len)

FILE: src/protocol/rand_sodium.c
  function noise_rand_bytes (line 42) | void noise_rand_bytes(void *bytes, size_t size)

FILE: src/protocol/randstate.c
  type NoiseRandState_s (line 67) | struct NoiseRandState_s
  function noise_randstate_new (line 115) | int noise_randstate_new(NoiseRandState **state)
  function noise_randstate_free (line 147) | int noise_randstate_free(NoiseRandState *state)
  function noise_randstate_reseed (line 177) | int noise_randstate_reseed(NoiseRandState *state)
  function noise_randstate_rekey (line 225) | static void noise_randstate_rekey(NoiseRandState *state)
  function noise_randstate_generate (line 263) | int noise_randstate_generate
  function noise_randstate_pad (line 348) | int noise_randstate_pad
  function noise_randstate_generate_simple (line 391) | int noise_randstate_generate_simple(uint8_t *buffer, size_t len)

FILE: src/protocol/signstate.c
  function noise_signstate_new_by_id (line 67) | int noise_signstate_new_by_id(NoiseSignState **state, int id)
  function noise_signstate_new_by_name (line 108) | int noise_signstate_new_by_name(NoiseSignState **state, const char *name)
  function noise_signstate_free (line 138) | int noise_signstate_free(NoiseSignState *state)
  function noise_signstate_get_sign_id (line 160) | int noise_signstate_get_sign_id(const NoiseSignState *state)
  function noise_signstate_get_public_key_length (line 175) | size_t noise_signstate_get_public_key_length(const NoiseSignState *state)
  function noise_signstate_get_private_key_length (line 190) | size_t noise_signstate_get_private_key_length(const NoiseSignState *state)
  function noise_signstate_get_signature_length (line 205) | size_t noise_signstate_get_signature_length(const NoiseSignState *state)
  function noise_signstate_has_keypair (line 222) | int noise_signstate_has_keypair(const NoiseSignState *state)
  function noise_signstate_has_public_key (line 242) | int noise_signstate_has_public_key(const NoiseSignState *state)
  function noise_signstate_generate_keypair (line 264) | int noise_signstate_generate_keypair(NoiseSignState *state)
  function noise_signstate_set_keypair (line 300) | int noise_signstate_set_keypair
  function noise_signstate_set_keypair_private (line 351) | int noise_signstate_set_keypair_private
  function noise_signstate_get_keypair (line 394) | int noise_signstate_get_keypair
  function noise_signstate_set_public_key (line 442) | int noise_signstate_set_public_key
  function noise_signstate_get_public_key (line 481) | int noise_signstate_get_public_key
  function noise_signstate_clear_key (line 507) | int noise_signstate_clear_key(NoiseSignState *state)
  function noise_signstate_sign (line 544) | int noise_signstate_sign
  function noise_signstate_verify (line 582) | int noise_signstate_verify
  function noise_signstate_copy (line 609) | int noise_signstate_copy(NoiseSignState *state, const NoiseSignState *from)
  function noise_signstate_format_fingerprint (line 651) | int noise_signstate_format_fingerprint
  function noise_signstate_get_max_key_length (line 677) | int noise_signstate_get_max_key_length(void)
  function noise_signstate_get_max_signature_length (line 687) | int noise_signstate_get_max_signature_length(void)

FILE: src/protocol/symmetricstate.c
  function noise_symmetricstate_new (line 58) | static int noise_symmetricstate_new
  function noise_symmetricstate_new_by_id (line 134) | int noise_symmetricstate_new_by_id
  function noise_symmetricstate_new_by_name (line 175) | int noise_symmetricstate_new_by_name
  function noise_symmetricstate_free (line 209) | int noise_symmetricstate_free(NoiseSymmetricState *state)
  function noise_symmetricstate_get_protocol_id (line 237) | int noise_symmetricstate_get_protocol_id
  function noise_symmetricstate_mix_key (line 262) | int noise_symmetricstate_mix_key
  function noise_symmetricstate_mix_hash (line 303) | int noise_symmetricstate_mix_hash
  function noise_symmetricstate_encrypt_and_hash (line 352) | int noise_symmetricstate_encrypt_and_hash
  function noise_symmetricstate_decrypt_and_hash (line 402) | int noise_symmetricstate_decrypt_and_hash
  function noise_symmetricstate_get_mac_length (line 464) | size_t noise_symmetricstate_get_mac_length(const NoiseSymmetricState *st...
  function noise_symmetricstate_split (line 514) | int noise_symmetricstate_split

FILE: src/protocol/util.c
  type crypto_hash_sha256_state (line 27) | typedef crypto_hash_sha256_state sha256_context_t;
  function noise_init_helper (line 54) | void noise_init_helper(void)
  function noise_init (line 87) | int noise_init(void)
  function noise_free (line 152) | void noise_free(void *ptr, size_t size)
  function noise_clean (line 170) | void noise_clean(void *data, size_t size)
  function noise_is_equal (line 188) | int noise_is_equal(const void *s1, const void *s2, size_t size)
  function noise_is_zero (line 211) | int noise_is_zero(const void *data, size_t size)
  function noise_format_fingerprint (line 245) | int noise_format_fingerprint

FILE: tests/performance/md5.c
  function md5_reset (line 26) | void md5_reset(md5_context_t *context)
  function md5_transform (line 104) | static void md5_transform(md5_context_t *context, const uint8_t *m)
  function md5_update (line 214) | void md5_update(md5_context_t *context, const void *data, size_t size)
  function write_le32 (line 240) | static void write_le32(uint8_t *out, uint32_t value)
  function md5_finish (line 248) | void md5_finish(md5_context_t *context, uint8_t *hash)

FILE: tests/performance/md5.h
  type md5_context_t (line 33) | typedef struct

FILE: tests/performance/test-performance.c
  type timestamp_t (line 50) | typedef uint64_t timestamp_t;
  function timestamp_t (line 56) | static timestamp_t current_timestamp(void)
  function elapsed_to_seconds (line 61) | static double elapsed_to_seconds(timestamp_t start, timestamp_t end)
  function timestamp_t (line 68) | static timestamp_t current_timestamp(void)
  function elapsed_to_seconds (line 75) | static double elapsed_to_seconds(timestamp_t start, timestamp_t end)
  function timestamp_t (line 82) | static timestamp_t current_timestamp(void)
  function elapsed_to_seconds (line 89) | static double elapsed_to_seconds(timestamp_t start, timestamp_t end)
  function calibrate_md5 (line 97) | static void calibrate_md5(void)
  function perf_hash (line 113) | static void perf_hash(int id)
  function perf_cipher (line 140) | static void perf_cipher(int id)
  function perf_dh_derive (line 182) | static void perf_dh_derive(int id)
  function perf_dh_calculate (line 211) | static void perf_dh_calculate(int id)
  function perf_dh_ephemeral_only (line 249) | static void perf_dh_ephemeral_only(int id)
  function perf_sign_derive (line 301) | static void perf_sign_derive(int id)
  function perf_sign_sign (line 330) | static void perf_sign_sign(int id)
  function perf_sign_verify (line 365) | static void perf_sign_verify(int id)
  function main (line 400) | int main(int argc, char *argv[])

FILE: tests/unit/test-cipherstate.c
  function check_cipher (line 31) | static void check_cipher(int id, size_t key_len, size_t mac_len,
  function cipherstate_check_test_vectors (line 228) | static void cipherstate_check_test_vectors(void)
  function cipherstate_check_errors (line 284) | static void cipherstate_check_errors(void)
  function test_cipherstate (line 313) | void test_cipherstate(void)

FILE: tests/unit/test-dhstate.c
  function check_dh (line 28) | static void check_dh(int id, size_t private_key_len, size_t public_key_len,
  function dhstate_check_test_vectors (line 297) | static void dhstate_check_test_vectors(void)
  function check_dh_generate (line 644) | static void check_dh_generate(int id)
  function dhstate_check_generate_keypair (line 706) | static void dhstate_check_generate_keypair(void)
  function dhstate_check_errors (line 714) | static void dhstate_check_errors(void)
  function test_dhstate (line 748) | void test_dhstate(void)

FILE: tests/unit/test-errors.c
  function test_errors (line 28) | void test_errors(void)

FILE: tests/unit/test-handshakestate.c
  function handshakestate_derive_keys (line 86) | static void handshakestate_derive_keys(void)
  function check_handshake_protocol (line 141) | static void check_handshake_protocol(const char *name)
  function handshakestate_check_protocols (line 434) | static void handshakestate_check_protocols(void)
  function check_fallback_protocol (line 478) | static void check_fallback_protocol
  function handshakestate_check_fallback (line 663) | static void handshakestate_check_fallback(void)
  function handshakestate_check_errors (line 670) | static void handshakestate_check_errors(void)
  function test_handshakestate (line 717) | void test_handshakestate(void)

FILE: tests/unit/test-hashstate.c
  function check_hash (line 30) | static void check_hash(int id, size_t hash_len, size_t block_len,
  function hashstate_check_test_vectors (line 137) | static void hashstate_check_test_vectors(void)
  function format_hmac_key (line 215) | static void format_hmac_key(NoiseHashState *state, uint8_t *block,
  function hmac (line 234) | static void hmac(NoiseHashState *state, uint8_t *hash,
  function hkdf (line 248) | static void hkdf(NoiseHashState *state, uint8_t *output1, uint8_t *output2,
  function hashstate_check_hkdf_algorithm (line 265) | static void hashstate_check_hkdf_algorithm(int id)
  function hashstate_check_hkdf (line 336) | static void hashstate_check_hkdf(void)
  function check_pbkdf2 (line 345) | static void check_pbkdf2(const char *name, const char *passphrase,
  function hashstate_check_pbkdf2 (line 408) | static void hashstate_check_pbkdf2(void)
  function hashstate_check_errors (line 425) | static void hashstate_check_errors(void)
  function test_hashstate (line 454) | void test_hashstate(void)

FILE: tests/unit/test-main.c
  function main (line 31) | int main(int argc, char *argv[])
  function from_hex (line 64) | static int from_hex(char ch)
  function string_to_data (line 76) | size_t string_to_data(uint8_t *data, size_t max_len, const char *str)
  function print_block (line 104) | void print_block(const char *tag, const uint8_t *data, size_t size)

FILE: tests/unit/test-names.c
  function check_id (line 26) | static void check_id(const char *name, int id)
  function test_id_mappings (line 54) | static void test_id_mappings(void)
  function check_protocol_name (line 123) | static void check_protocol_name
  function test_protocol_names (line 211) | static void test_protocol_names(void)
  function test_names (line 265) | void test_names(void)

FILE: tests/unit/test-patterns.c
  function next_token (line 32) | static uint8_t next_token(const char **pattern)
  function check_for_collapse (line 97) | static void check_for_collapse(int id)
  function check_pattern (line 182) | static void check_pattern(int id, const char *name, const char *required,
  function test_patterns (line 316) | void test_patterns(void)

FILE: tests/unit/test-protobufs.c
  function test_protobufs_prepare (line 27) | static void test_protobufs_prepare(void)
  function check_integer (line 81) | static void check_integer(int64_t value, const char *varint, const char ...
  function test_protobufs_integer (line 726) | static void test_protobufs_integer(void)
  function check_floating_point (line 799) | static void check_floating_point(const char *name, double value)
  function test_protobufs_floating_point (line 904) | static void test_protobufs_floating_point(void)
  function check_tagged_string (line 914) | static void check_tagged_string(const char *str, int is_valid_utf8, int ...
  function check_string (line 1057) | static void check_string(const char *str, int is_valid_utf8)
  function test_protobufs_string (line 1064) | static void test_protobufs_string(void)
  function check_tagged_element (line 1115) | static void check_tagged_element(int tag)
  function test_protobufs_element (line 1196) | static void test_protobufs_element(void)
  function test_protobufs (line 1204) | void test_protobufs(void)

FILE: tests/unit/test-randstate.c
  function is_all (line 28) | static int is_all(const uint8_t *data, size_t size, uint8_t value)
  function test_randstate (line 38) | void test_randstate(void)

FILE: tests/unit/test-signstate.c
  function check_sign (line 30) | static void check_sign(int id, size_t private_key_len, size_t public_key...
  function signstate_check_test_vectors (line 259) | static void signstate_check_test_vectors(void)
  function check_dh_generate (line 333) | static void check_dh_generate(int id)
  function signstate_check_generate_keypair (line 374) | static void signstate_check_generate_keypair(void)
  function signstate_check_errors (line 380) | static void signstate_check_errors(void)
  function test_signstate (line 413) | void test_signstate(void)

FILE: tests/unit/test-symmetricstate.c
  type HashValue (line 29) | typedef struct
  type HKDFValue (line 35) | typedef struct
  function HashValue (line 46) | static HashValue HASH(const void *data, size_t len)
  function HashValue (line 57) | static HashValue HASHTwo(const HashValue h, const void *data, size_t len)
  function HashValue (line 69) | static HashValue PadOrHash(const void *data, size_t len)
  function HKDFValue (line 81) | static HKDFValue HKDF(const HashValue key, const uint8_t *data, size_t d...
  function check_symmetric_object (line 96) | static void check_symmetric_object
  function check_symmetric (line 499) | static void check_symmetric(const char *protocol)
  function symmetricstate_check_protocols (line 538) | static void symmetricstate_check_protocols(void)
  function symmetricstate_check_errors (line 552) | static void symmetricstate_check_errors(void)
  function test_symmetricstate (line 586) | void test_symmetricstate(void)

FILE: tests/vector/json-reader.c
  function json_init (line 37) | void json_init(JSONReader *reader, const char *filename, FILE *stream)
  function json_free (line 53) | void json_free(JSONReader *reader)
  function json_named_token (line 75) | static void json_named_token
  function JSONToken (line 111) | JSONToken json_next_token(JSONReader *reader)
  function json_is_name (line 213) | int json_is_name(JSONReader *reader, const char *name)
  function json_error (line 226) | void json_error(JSONReader *reader, const char *format, ...)
  function json_error_on_line (line 244) | void json_error_on_line(JSONReader *reader, long line, const char *forma...

FILE: tests/vector/json-reader.h
  type JSONToken (line 39) | typedef enum
  type JSONReader (line 60) | typedef struct

FILE: tests/vector/test-vector.c
  type TestVector (line 35) | typedef struct
  function test_vector_free (line 89) | static void test_vector_free(TestVector *vec)
  function dump_block (line 174) | static void dump_block(uint8_t *block, size_t len)
  function check_id (line 207) | static void check_id(int id, int category, const char *name)
  function test_name_parsing (line 222) | static int test_name_parsing(const TestVector *vec)
  function test_connection (line 251) | static void test_connection(const TestVector *vec, int is_one_way)
  function test_vector_run (line 494) | static int test_vector_run(JSONReader *reader, const TestVector *vec)
  function expect_token (line 520) | static void expect_token(JSONReader *reader, JSONToken token, const char...
  function expect_name (line 537) | static void expect_name(JSONReader *reader, const char *name)
  function expect_string_field (line 555) | static void expect_string_field(JSONReader *reader, char **value)
  function from_hex_digit (line 575) | static int from_hex_digit(int ch)
  function expect_binary_field (line 595) | static size_t expect_binary_field(JSONReader *reader, uint8_t **value)
  function expect_boolean_field (line 633) | static int expect_boolean_field(JSONReader *reader)
  function process_test_vector (line 655) | static int process_test_vector(JSONReader *reader)
  function process_test_vectors (line 783) | static void process_test_vectors(JSONReader *reader)
  function process_file (line 810) | static int process_file(const char *filename)
  function main (line 829) | int main(int argc, char *argv[])

FILE: tools/keytool/generate.c
  type option (line 27) | struct option
  function help_generate (line 51) | void help_generate(const char *progname)
  function add_algorithm_id (line 70) | static void add_algorithm_id(int id)
  function parse_algorithms (line 82) | static int parse_algorithms(const char *names)
  function parse_options_generate (line 117) | static int parse_options_generate(const char *progname, int argc, char *...
  function main_generate (line 149) | int main_generate(const char *progname, int argc, char *argv[])

FILE: tools/keytool/keytool.c
  function usage (line 30) | static void usage(const char *progname)
  function cleanup (line 42) | static void cleanup(void)
  function main (line 47) | int main(int argc, char *argv[])
  function report_error (line 91) | void report_error(const char *file, long line, int err)

FILE: tools/keytool/show.c
  type option (line 27) | struct option
  function help_show (line 40) | void help_show(const char *progname)
  function parse_options_show (line 54) | static int parse_options_show(const char *progname, int argc, char *argv[])
  function dump_certificate (line 80) | static void dump_certificate(const Noise_Certificate *cert)
  function show_certificate (line 134) | static int show_certificate(const char *filename, NoiseProtobuf *pbuf)
  function show_certificate_chain (line 159) | static int show_certificate_chain(const char *filename, NoiseProtobuf *p...
  function dump_private_key (line 190) | static void dump_private_key(const Noise_PrivateKey *priv_key)
  function show_private_key (line 257) | static int show_private_key(const char *filename, NoiseProtobuf *pbuf)
  function show_file (line 295) | static int show_file(const char *filename)
  function main_show (line 347) | int main_show(const char *progname, int argc, char *argv[])

FILE: tools/keytool/sign.c
  type option (line 27) | struct option
  function help_sign (line 45) | void help_sign(const char *progname)
  function parse_options_sign (line 65) | static int parse_options_sign(const char *progname, int argc, char *argv[])
  function main_sign (line 105) | int main_sign(const char *progname, int argc, char *argv[])

FILE: tools/protoc/main.c
  type option (line 31) | struct option
  function usage (line 48) | static void usage(const char *progname)
  function parse_options (line 63) | static int parse_options(int argc, char *argv[])
  function main (line 86) | int main(int argc, char *argv[])

FILE: tools/protoc/proto3-ast.c
  type Proto3StringBlock (line 33) | typedef struct _Proto3StringBlock
  type Proto3Scope (line 40) | typedef struct _Proto3Scope
  function Proto3Name (line 64) | Proto3Name proto3_string(const char *str, size_t len)
  function Proto3Name (line 86) | Proto3Name proto3_basic_name(const char *name)
  function Proto3Name (line 99) | Proto3Name proto3_qualified_name(Proto3Name parent, Proto3Name name)
  function Proto3Name (line 128) | Proto3Name proto3_qualified_name_2(Proto3Name parent, size_t parent_len,...
  function Proto3Name (line 154) | Proto3Name proto3_qualify_name(Proto3Name name)
  function proto3_push_scope (line 171) | void proto3_push_scope(Proto3ScopeId id, Proto3Name name, int line)
  function proto3_pop_scope (line 250) | void proto3_pop_scope(void)
  function Proto3Type (line 266) | Proto3Type proto3_basic_type(Proto3TypeId id)
  function Proto3Type (line 282) | Proto3Type proto3_map_type(Proto3Type key_type, Proto3Type value_type)
  function Proto3Type (line 300) | Proto3Type proto3_named_type(Proto3Name name)
  function proto3_can_pack_type (line 316) | int proto3_can_pack_type(Proto3Type type)
  function proto3_add_field (line 348) | void proto3_add_field(Proto3FieldQualifier qualifier, Proto3Type type,
  function proto3_add_enum (line 402) | void proto3_add_enum(Proto3Name name, uint64_t value, int line)
  function proto3_add_scope_option (line 441) | void proto3_add_scope_option(Proto3Option option)
  function proto3_have_scope_fields (line 451) | int proto3_have_scope_fields(void)
  function proto3_have_scope_enums (line 464) | int proto3_have_scope_enums(void)
  function proto3_set_package_name (line 477) | void proto3_set_package_name(Proto3Name name)
  function proto3_resolve_try_name (line 493) | static int proto3_resolve_try_name(Proto3Name name)
  function Proto3Name (line 518) | static Proto3Name proto3_resolve_name(Proto3Name parent, Proto3Name name)
  function Proto3Type (line 553) | static Proto3Type proto3_resolve_type
  function proto3_resolve_types (line 583) | void proto3_resolve_types(void)
  function proto3_cleanup (line 613) | void proto3_cleanup(void)
  function Proto3Message (line 625) | Proto3Message *proto3_first_message(void)
  function Proto3Enum (line 633) | Proto3Enum *proto3_first_enum(void)

FILE: tools/protoc/proto3-ast.h
  type Proto3Name (line 31) | typedef struct {
  type Proto3TypeId (line 35) | typedef enum {
  type Proto3Type (line 57) | typedef struct {
  type Proto3ScopeId (line 64) | typedef enum {
  type Proto3FieldQualifier (line 69) | typedef enum {
  type Proto3ValueTypeId (line 76) | typedef enum {
  type Proto3OptionValue (line 84) | typedef struct {
  type Proto3Option (line 90) | typedef struct {
  type Proto3Field (line 95) | typedef struct _Proto3Field {
  type Proto3Message (line 105) | typedef struct _Proto3Message {
  type Proto3EnumValue (line 112) | typedef struct _Proto3EnumValue {
  type Proto3Enum (line 119) | typedef struct _Proto3Enum {

FILE: tools/protoc/proto3-generate-c.c
  type Proto3TypeOps (line 33) | typedef struct _Proto3TypeOps Proto3TypeOps;
  type _Proto3TypeOps (line 34) | struct _Proto3TypeOps
  function print_indent (line 46) | static void print_indent(void)
  function generate_name (line 58) | static void generate_name(FILE *output, const char *name)
  function type_numeric_declare_field (line 72) | static void type_numeric_declare_field
  function type_numeric_free_field (line 92) | static void type_numeric_free_field
  function type_numeric_clear_field (line 106) | static void type_numeric_clear_field
  function type_numeric_write_field (line 124) | static void type_numeric_write_field
  function type_numeric_read_field (line 167) | static void type_numeric_read_field
  function type_numeric_declare_field_ops (line 210) | static void type_numeric_declare_field_ops
  function type_string_declare_field (line 350) | static void type_string_declare_field
  function type_string_free_field (line 374) | static void type_string_free_field
  function type_string_clear_field (line 403) | static void type_string_clear_field
  function type_string_write_field (line 424) | static void type_string_write_field
  function type_string_read_field (line 454) | static void type_string_read_field
  function type_string_declare_field_ops (line 493) | static void type_string_declare_field_ops
  function type_named_declare_field (line 701) | static void type_named_declare_field
  function type_named_free_field (line 723) | static void type_named_free_field
  function type_named_clear_field (line 751) | static void type_named_clear_field
  function type_named_write_field (line 769) | static void type_named_write_field
  function type_named_read_field (line 820) | static void type_named_read_field
  function type_named_declare_field_ops (line 859) | static void type_named_declare_field_ops
  function Proto3TypeOps (line 1220) | static const Proto3TypeOps *type_ops(Proto3Type type)
  function generate_license (line 1285) | static void generate_license(FILE *output)
  function has_repeated (line 1308) | static int has_repeated(const Proto3Message *message)
  function has_packed (line 1322) | static int has_packed(const Proto3Message *message)
  function generate_declare_ctor (line 1336) | static void generate_declare_ctor
  function generate_declare_dtor (line 1352) | static void generate_declare_dtor
  function generate_declare_write (line 1368) | static void generate_declare_write
  function generate_declare_read (line 1384) | static void generate_declare_read
  function generate_c_header (line 1400) | static void generate_c_header(const char *output_h_name, FILE *output_h)
  function generate_implement_ctor (line 1487) | static void generate_implement_ctor(FILE *output, Proto3Message *message)
  function generate_implement_dtor (line 1507) | static void generate_implement_dtor(FILE *output, Proto3Message *message)
  function generate_implement_field_write (line 1535) | static void generate_implement_field_write
  function generate_implement_write (line 1549) | static void generate_implement_write(Proto3Message *message)
  function generate_implement_read (line 1572) | static void generate_implement_read(FILE *output, Proto3Message *message)
  function generate_c_source (line 1627) | static void generate_c_source(const char *output_c_name,
  function generate_c (line 1682) | void generate_c(const char *output_c_name, FILE *output_c,
Copy disabled (too large) Download .json
Condensed preview — 296 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (10,645K chars).
[
  {
    "path": ".gitignore",
    "chars": 167,
    "preview": "*.o\n*.a\n.depend\n.*.swp\naclocal.m4\nautom4te.cache\nconfigure\nMakefile.in\nMakefile\n.deps\nconfig.*\nINSTALL\ncompile\ndepcomp\ni"
  },
  {
    "path": "AUTHORS",
    "chars": 81,
    "preview": "Rhys Weatherley <rhys.weatherley@gmail.com>\nEli Fidler <efidler@topologyinc.com>\n"
  },
  {
    "path": "COPYING",
    "chars": 1077,
    "preview": "Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n\nPermission is hereby granted, free of charge, to any person obtain"
  },
  {
    "path": "ChangeLog",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "Makefile.am",
    "chars": 111,
    "preview": "\nSUBDIRS = include src tools tests examples doc\n\nEXTRA_DIST = README.md\n\ndocs:\n\t(cd $(srcdir)/doc; $(DOXYGEN))\n"
  },
  {
    "path": "NEWS",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "README",
    "chars": 15,
    "preview": "\nSee README.md\n"
  },
  {
    "path": "README.md",
    "chars": 644,
    "preview": "\nNoise-C Library\n===============\n\nNoise-C is a plain C implementation of the\n[Noise Protocol](http://noiseprotocol.org),"
  },
  {
    "path": "autogen.sh",
    "chars": 297,
    "preview": "#! /bin/sh\n\nif [ -x \"`which autoreconf 2>/dev/null`\" ] ; then\n  exec autoreconf -ivf\nfi\n\nif glibtoolize --version > /dev"
  },
  {
    "path": "configure.ac",
    "chars": 3314,
    "preview": "\nAC_INIT([noise-c], [0.0.1])\nAM_INIT_AUTOMAKE\nAC_CONFIG_MACRO_DIR([m4])\n\nAC_PROG_CC\nAC_PROG_CC_STDC\nAC_PROG_RANLIB\nAC_PR"
  },
  {
    "path": "doc/.gitignore",
    "chars": 5,
    "preview": "html\n"
  },
  {
    "path": "doc/Doxyfile",
    "chars": 100366,
    "preview": "# Doxyfile 1.8.6\n\n# This file describes the settings to be used by the documentation system\n# doxygen (www.doxygen.org) "
  },
  {
    "path": "doc/Makefile.am",
    "chars": 192,
    "preview": "\nEXTRA_DIST = \\\n    buffer.dox \\\n    cert-key-format.dox \\\n    constants.dox \\\n    example-echo.dox \\\n    mainpage.dox \\"
  },
  {
    "path": "doc/buffer.dox",
    "chars": 3616,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n *\n * Permission is hereby granted, free of charge, to any pe"
  },
  {
    "path": "doc/cert-key-format.dox",
    "chars": 18573,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n *\n * Permission is hereby granted, free of charge, to any pe"
  },
  {
    "path": "doc/constants.dox",
    "chars": 11417,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n *\n * Permission is hereby granted, free of charge, to any pe"
  },
  {
    "path": "doc/example-echo.dox",
    "chars": 11920,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n *\n * Permission is hereby granted, free of charge, to any pe"
  },
  {
    "path": "doc/mainpage.dox",
    "chars": 6470,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n *\n * Permission is hereby granted, free of charge, to any pe"
  },
  {
    "path": "doc/noise-certificate.dox",
    "chars": 1263,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n *\n * Permission is hereby granted, free of charge, to any pe"
  },
  {
    "path": "doc/noise-certificate.proto",
    "chars": 3869,
    "preview": "// This protobuf definition is placed into the public domain.\n//\n// Author: Rhys Weatherley <rhys.weatherley@gmail.com>\n"
  },
  {
    "path": "examples/Makefile.am",
    "chars": 16,
    "preview": "\nSUBDIRS = echo\n"
  },
  {
    "path": "examples/echo/Makefile.am",
    "chars": 47,
    "preview": "\nSUBDIRS = echo-client echo-keygen echo-server\n"
  },
  {
    "path": "include/Makefile.am",
    "chars": 17,
    "preview": "\nSUBDIRS = noise\n"
  },
  {
    "path": "include/noise/Makefile.am",
    "chars": 137,
    "preview": "\nnoiseincludedir = $(includedir)/noise\nnoiseinclude_HEADERS = \\\n    keys.h \\\n    protocol.h \\\n    protobufs.h\n\nSUBDIRS ="
  },
  {
    "path": "include/noise/keys/Makefile.am",
    "chars": 100,
    "preview": "\nkeysincludedir = $(includedir)/noise/keys\nkeysinclude_HEADERS = \\\n    certificate.h \\\n    loader.h\n"
  },
  {
    "path": "include/noise/keys/certificate.h",
    "chars": 18167,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n * \n * Permission is hereby granted, free of charge, to any p"
  },
  {
    "path": "include/noise/keys/loader.h",
    "chars": 2742,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n *\n * Permission is hereby granted, free of charge, to any pe"
  },
  {
    "path": "include/noise/keys.h",
    "chars": 1257,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n *\n * Permission is hereby granted, free of charge, to any pe"
  },
  {
    "path": "include/noise/protobufs.h",
    "chars": 5933,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n *\n * Permission is hereby granted, free of charge, to any pe"
  },
  {
    "path": "include/noise/protocol/Makefile.am",
    "chars": 288,
    "preview": "\nprotocolincludedir = $(includedir)/noise/protocol\nprotocolinclude_HEADERS = \\\n    buffer.h \\\n    cipherstate.h \\\n    co"
  },
  {
    "path": "include/noise/protocol/buffer.h",
    "chars": 2032,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n *\n * Permission is hereby granted, free of charge, to any pe"
  },
  {
    "path": "include/noise/protocol/cipherstate.h",
    "chars": 2516,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n *\n * Permission is hereby granted, free of charge, to any pe"
  },
  {
    "path": "include/noise/protocol/constants.h",
    "chars": 7416,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n *\n * Permission is hereby granted, free of charge, to any pe"
  },
  {
    "path": "include/noise/protocol/dhstate.h",
    "chars": 3438,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n *\n * Permission is hereby granted, free of charge, to any pe"
  },
  {
    "path": "include/noise/protocol/errors.h",
    "chars": 1381,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n *\n * Permission is hereby granted, free of charge, to any pe"
  },
  {
    "path": "include/noise/protocol/handshakestate.h",
    "chars": 3712,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n *\n * Permission is hereby granted, free of charge, to any pe"
  },
  {
    "path": "include/noise/protocol/hashstate.h",
    "chars": 2813,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n *\n * Permission is hereby granted, free of charge, to any pe"
  },
  {
    "path": "include/noise/protocol/names.h",
    "chars": 2104,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n *\n * Permission is hereby granted, free of charge, to any pe"
  },
  {
    "path": "include/noise/protocol/randstate.h",
    "chars": 1792,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n *\n * Permission is hereby granted, free of charge, to any pe"
  },
  {
    "path": "include/noise/protocol/signstate.h",
    "chars": 3367,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n *\n * Permission is hereby granted, free of charge, to any pe"
  },
  {
    "path": "include/noise/protocol/symmetricstate.h",
    "chars": 2350,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n *\n * Permission is hereby granted, free of charge, to any pe"
  },
  {
    "path": "include/noise/protocol/util.h",
    "chars": 1766,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n *\n * Permission is hereby granted, free of charge, to any pe"
  },
  {
    "path": "include/noise/protocol.h",
    "chars": 1649,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n *\n * Permission is hereby granted, free of charge, to any pe"
  },
  {
    "path": "m4/ax_pthread.m4",
    "chars": 20816,
    "preview": "# ===========================================================================\n#        http://www.gnu.org/software/autoc"
  },
  {
    "path": "m4/pkg.m4",
    "chars": 10247,
    "preview": "dnl pkg.m4 - Macros to locate and utilise pkg-config.   -*- Autoconf -*-\ndnl serial 11 (pkg-config-0.29.1)\ndnl\ndnl Copyr"
  },
  {
    "path": "src/Makefile.am",
    "chars": 35,
    "preview": "\nSUBDIRS = protocol protobufs keys\n"
  },
  {
    "path": "src/backend/openssl/cipher-aesgcm.c",
    "chars": 6437,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n * Copyright (C) 2016 Topology LP.\n *\n * Permission is hereby"
  },
  {
    "path": "src/backend/ref/cipher-aesgcm.c",
    "chars": 6878,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n *\n * Permission is hereby granted, free of charge, to any pe"
  },
  {
    "path": "src/backend/ref/cipher-chachapoly.c",
    "chars": 5516,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n *\n * Permission is hereby granted, free of charge, to any pe"
  },
  {
    "path": "src/backend/ref/dh-curve25519.c",
    "chars": 5062,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n *\n * Permission is hereby granted, free of charge, to any pe"
  },
  {
    "path": "src/backend/ref/dh-curve448.c",
    "chars": 4695,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n *\n * Permission is hereby granted, free of charge, to any pe"
  },
  {
    "path": "src/backend/ref/dh-newhope.c",
    "chars": 7364,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n *\n * Permission is hereby granted, free of charge, to any pe"
  },
  {
    "path": "src/backend/ref/hash-blake2b.c",
    "chars": 2257,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n *\n * Permission is hereby granted, free of charge, to any pe"
  },
  {
    "path": "src/backend/ref/hash-blake2s.c",
    "chars": 2256,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n *\n * Permission is hereby granted, free of charge, to any pe"
  },
  {
    "path": "src/backend/ref/hash-sha256.c",
    "chars": 2232,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n *\n * Permission is hereby granted, free of charge, to any pe"
  },
  {
    "path": "src/backend/ref/hash-sha512.c",
    "chars": 2233,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n *\n * Permission is hereby granted, free of charge, to any pe"
  },
  {
    "path": "src/backend/ref/sign-ed25519.c",
    "chars": 4004,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n *\n * Permission is hereby granted, free of charge, to any pe"
  },
  {
    "path": "src/backend/sodium/cipher-aesgcm.c",
    "chars": 3872,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n * Copyright (C) 2016 Topology LP.\n *\n * Permission is hereby"
  },
  {
    "path": "src/backend/sodium/cipher-chachapoly.c",
    "chars": 5986,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n * Copyright (C) 2016 Topology LP.\n *\n * Permission is hereby"
  },
  {
    "path": "src/backend/sodium/dh-curve25519.c",
    "chars": 5084,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n * Copyright (C) 2016 Topology LP.\n *\n * Permission is hereby"
  },
  {
    "path": "src/backend/sodium/hash-blake2b.c",
    "chars": 2432,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n * Copyright (C) 2016 Topology LP.\n *\n * Permission is hereby"
  },
  {
    "path": "src/backend/sodium/hash-sha256.c",
    "chars": 2297,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n * Copyright (C) 2016 Topology LP.\n *\n * Permission is hereby"
  },
  {
    "path": "src/backend/sodium/hash-sha512.c",
    "chars": 2298,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n * Copyright (C) 2016 Topology LP.\n *\n * Permission is hereby"
  },
  {
    "path": "src/backend/sodium/sign-ed25519.c",
    "chars": 4293,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n * Copyright (C) 2016 Topology LP.\n *\n * Permission is hereby"
  },
  {
    "path": "src/crypto/README",
    "chars": 1613,
    "preview": "\nThis directory contains reference implementations of various primitives.\n\ncurve25519-donna:\n    https://github.com/agl/"
  },
  {
    "path": "src/crypto/aes/rijndael-alg-fst.c",
    "chars": 63668,
    "preview": "/**\n * rijndael-alg-fst.c\n *\n * @version 3.0 (December 2000)\n *\n * Optimised ANSI C code for the Rijndael cipher (now AE"
  },
  {
    "path": "src/crypto/aes/rijndael-alg-fst.h",
    "chars": 1982,
    "preview": "/**\n * rijndael-alg-fst.h\n *\n * @version 3.0 (December 2000)\n *\n * Optimised ANSI C code for the Rijndael cipher (now AE"
  },
  {
    "path": "src/crypto/blake2/blake2-endian.h",
    "chars": 1921,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n *\n * Permission is hereby granted, free of charge, to any pe"
  },
  {
    "path": "src/crypto/blake2/blake2b.c",
    "chars": 7439,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n *\n * Permission is hereby granted, free of charge, to any pe"
  },
  {
    "path": "src/crypto/blake2/blake2b.h",
    "chars": 1642,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n *\n * Permission is hereby granted, free of charge, to any pe"
  },
  {
    "path": "src/crypto/blake2/blake2s.c",
    "chars": 9835,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n *\n * Permission is hereby granted, free of charge, to any pe"
  },
  {
    "path": "src/crypto/blake2/blake2s.h",
    "chars": 1989,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n *\n * Permission is hereby granted, free of charge, to any pe"
  },
  {
    "path": "src/crypto/chacha/chacha.c",
    "chars": 10439,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n *\n * Permission is hereby granted, free of charge, to any pe"
  },
  {
    "path": "src/crypto/chacha/chacha.h",
    "chars": 745,
    "preview": "\n#ifndef CHACHA_H\n#define CHACHA_H\n\n#include <stddef.h>\n#include <stdint.h>\n\n#if defined(__SSE2__) && defined(__GNUC__) "
  },
  {
    "path": "src/crypto/curve448/curve448.c",
    "chars": 9299,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n *\n * Permission is hereby granted, free of charge, to any pe"
  },
  {
    "path": "src/crypto/curve448/curve448.h",
    "chars": 1378,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n *\n * Permission is hereby granted, free of charge, to any pe"
  },
  {
    "path": "src/crypto/donna/curve25519-donna-c64.c",
    "chars": 13539,
    "preview": "/* Copyright 2008, Google Inc.\n * All rights reserved.\n *\n * Code released into the public domain.\n *\n * curve25519-donn"
  },
  {
    "path": "src/crypto/donna/curve25519-donna.c",
    "chars": 31696,
    "preview": "/* Copyright 2008, Google Inc.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or "
  },
  {
    "path": "src/crypto/donna/poly1305-donna-16.h",
    "chars": 6138,
    "preview": "/*\n\tpoly1305 implementation using 16 bit * 16 bit = 32 bit multiplication and 32 bit addition\n*/\n\n#if defined(_MSC_VER)\n"
  },
  {
    "path": "src/crypto/donna/poly1305-donna-32.h",
    "chars": 6515,
    "preview": "/*\n\tpoly1305 implementation using 32 bit * 32 bit = 64 bit multiplication and 64 bit addition\n*/\n\n#if defined(_MSC_VER)\n"
  },
  {
    "path": "src/crypto/donna/poly1305-donna-64.h",
    "chars": 6225,
    "preview": "/*\n\tpoly1305 implementation using 64 bit * 64 bit = 128 bit multiplication and 128 bit addition\n*/\n\n#if defined(_MSC_VER"
  },
  {
    "path": "src/crypto/donna/poly1305-donna-8.h",
    "chars": 4231,
    "preview": "/*\n\tpoly1305 implementation using 8 bit * 8 bit = 16 bit multiplication and 32 bit addition\n\n\tbased on the public domain"
  },
  {
    "path": "src/crypto/donna/poly1305-donna.c",
    "chars": 5823,
    "preview": "#include \"poly1305-donna.h\"\n\n#if defined(POLY1305_8BIT)\n#include \"poly1305-donna-8.h\"\n#elif defined(POLY1305_16BIT)\n#inc"
  },
  {
    "path": "src/crypto/donna/poly1305-donna.h",
    "chars": 658,
    "preview": "#ifndef POLY1305_DONNA_H\n#define POLY1305_DONNA_H\n\n#include <stddef.h>\n\ntypedef struct poly1305_context {\n\tsize_t aligne"
  },
  {
    "path": "src/crypto/ed25519/README.md",
    "chars": 8155,
    "preview": "[ed25519](http://ed25519.cr.yp.to/) is an \n[Elliptic Curve Digital Signature Algortithm](http://en.wikipedia.org/wiki/El"
  },
  {
    "path": "src/crypto/ed25519/curve25519-donna-32bit.h",
    "chars": 22614,
    "preview": "/*\n\tPublic domain by Andrew M. <liquidsun@gmail.com>\n\tSee: https://github.com/floodyberry/curve25519-donna\n\n\t32 bit inte"
  },
  {
    "path": "src/crypto/ed25519/curve25519-donna-64bit.h",
    "chars": 14869,
    "preview": "/*\n\tPublic domain by Adam Langley <agl@imperialviolet.org> &\n\t                 Andrew M. <liquidsun@gmail.com>\n\tSee: htt"
  },
  {
    "path": "src/crypto/ed25519/curve25519-donna-helpers.h",
    "chars": 2374,
    "preview": "/*\n\tPublic domain by Andrew M. <liquidsun@gmail.com>\n\tSee: https://github.com/floodyberry/curve25519-donna\n\n\tCurve25519 "
  },
  {
    "path": "src/crypto/ed25519/curve25519-donna-sse2.h",
    "chars": 58626,
    "preview": "/*\n\tPublic domain by Andrew M. <liquidsun@gmail.com>\n\tSee: https://github.com/floodyberry/curve25519-donna\n\n\tSSE2 curve2"
  },
  {
    "path": "src/crypto/ed25519/ed25519-donna-32bit-sse2.h",
    "chars": 18640,
    "preview": "#if defined(ED25519_GCC_32BIT_SSE_CHOOSE)\n\n#define HAVE_GE25519_SCALARMULT_BASE_CHOOSE_NIELS\n\nDONNA_NOINLINE static void"
  },
  {
    "path": "src/crypto/ed25519/ed25519-donna-32bit-tables.h",
    "chars": 12002,
    "preview": "static const ge25519 ALIGN(16) ge25519_basepoint = {\n\t{0x0325d51a,0x018b5823,0x00f6592a,0x0104a92d,0x01a4b31d,0x01d6dc5c"
  },
  {
    "path": "src/crypto/ed25519/ed25519-donna-64bit-sse2.h",
    "chars": 16318,
    "preview": "#if defined(ED25519_GCC_64BIT_SSE_CHOOSE)\n\n#define HAVE_GE25519_SCALARMULT_BASE_CHOOSE_NIELS\n\nDONNA_NOINLINE static void"
  },
  {
    "path": "src/crypto/ed25519/ed25519-donna-64bit-tables.h",
    "chars": 10380,
    "preview": "static const ge25519 ge25519_basepoint = {\n\t{0x00062d608f25d51a,0x000412a4b4f6592a,0x00075b7171a4b31d,0x0001ff60527118fe"
  },
  {
    "path": "src/crypto/ed25519/ed25519-donna-64bit-x86-32bit.h",
    "chars": 16281,
    "preview": "#if defined(ED25519_GCC_64BIT_32BIT_CHOOSE)\n\n#define HAVE_GE25519_SCALARMULT_BASE_CHOOSE_NIELS\n\nDONNA_NOINLINE static vo"
  },
  {
    "path": "src/crypto/ed25519/ed25519-donna-64bit-x86.h",
    "chars": 13084,
    "preview": "#if defined(ED25519_GCC_64BIT_X86_CHOOSE)\n\n#define HAVE_GE25519_SCALARMULT_BASE_CHOOSE_NIELS\n\n#if defined(__has_feature)"
  },
  {
    "path": "src/crypto/ed25519/ed25519-donna-basepoint-table.h",
    "chars": 124048,
    "preview": "/* multiples of the base point in packed {ysubx, xaddy, t2d} form */\nstatic const uint8_t ALIGN(16) ge25519_niels_base_m"
  },
  {
    "path": "src/crypto/ed25519/ed25519-donna-batchverify.h",
    "chars": 7644,
    "preview": "/*\n\tEd25519 batch verification\n*/\n\n#define max_batch_size 64\n#define heap_batch_size ((max_batch_size * 2) + 1)\n\n/* whic"
  },
  {
    "path": "src/crypto/ed25519/ed25519-donna-impl-base.h",
    "chars": 10220,
    "preview": "/*\n\tconversions\n*/\n\nDONNA_INLINE static void\nge25519_p1p1_to_partial(ge25519 *r, const ge25519_p1p1 *p) {\n\tcurve25519_mu"
  },
  {
    "path": "src/crypto/ed25519/ed25519-donna-impl-sse2.h",
    "chars": 11815,
    "preview": "/*\n\tconversions\n*/\n\nstatic void\nge25519_p1p1_to_partial(ge25519 *r, const ge25519_p1p1 *p) {\n\tpacked64bignum25519 ALIGN("
  },
  {
    "path": "src/crypto/ed25519/ed25519-donna-portable-identify.h",
    "chars": 2910,
    "preview": "/* os */\n#if defined(_WIN32)\t|| defined(_WIN64) || defined(__TOS_WIN__) || defined(__WINDOWS__)\n\t#define OS_WINDOWS\n#eli"
  },
  {
    "path": "src/crypto/ed25519/ed25519-donna-portable.h",
    "chars": 4842,
    "preview": "#include \"ed25519-donna-portable-identify.h\"\n\n#define mul32x32_64(a,b) (((uint64_t)(a))*(b))\n\n/* platform */\n#if defined"
  },
  {
    "path": "src/crypto/ed25519/ed25519-donna.h",
    "chars": 2762,
    "preview": "/*\n\tPublic domain by Andrew M. <liquidsun@gmail.com>\n\tModified from the amd64-51-30k implementation by\n\t\tDaniel J. Berns"
  },
  {
    "path": "src/crypto/ed25519/ed25519-hash-custom.h",
    "chars": 658,
    "preview": "/*\n\ta custom hash must have a 512bit digest and implement:\n\n\tstruct ed25519_hash_context;\n\n\tvoid ed25519_hash_init(ed255"
  },
  {
    "path": "src/crypto/ed25519/ed25519-hash.h",
    "chars": 6867,
    "preview": "#if defined(ED25519_REFHASH)\n\n/* reference/slow SHA-512. really, do not use this */\n\n#define HASH_BLOCK_SIZE 128\n#define"
  },
  {
    "path": "src/crypto/ed25519/ed25519-randombytes-custom.h",
    "chars": 211,
    "preview": "/*\n\ta custom randombytes must implement:\n\n\tvoid ED25519_FN(ed25519_randombytes_unsafe) (void *p, size_t len);\n\n\ted25519_"
  },
  {
    "path": "src/crypto/ed25519/ed25519-randombytes.h",
    "chars": 1847,
    "preview": "#if defined(ED25519_TEST)\n/*\n\tISAAC+ \"variant\", the paper is not clear on operator precedence and other\n\tthings. This is"
  },
  {
    "path": "src/crypto/ed25519/ed25519.c",
    "chars": 3687,
    "preview": "/*\n\tPublic domain by Andrew M. <liquidsun@gmail.com>\n\n\tEd25519 reference implementation using Ed25519-donna\n*/\n\n\n/* defi"
  },
  {
    "path": "src/crypto/ed25519/ed25519.h",
    "chars": 960,
    "preview": "#ifndef ED25519_H\n#define ED25519_H\n\n#include <stdlib.h>\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif\n\ntypedef unsigned"
  },
  {
    "path": "src/crypto/ed25519/fuzz/README.md",
    "chars": 5761,
    "preview": "This code fuzzes ed25519-donna (and optionally ed25519-donna-sse2) against the ref10 implementations of\n[curve25519](htt"
  },
  {
    "path": "src/crypto/ed25519/fuzz/build-nix.php",
    "chars": 3641,
    "preview": "<?php\n\tfunction echoln($str) {\n\t\techo $str;\n\t\techo \"\\n\";\n\t}\n\n\tfunction usage($reason) {\n\t\techoln(\"Usage: php build-nix.p"
  },
  {
    "path": "src/crypto/ed25519/fuzz/curve25519-ref10.c",
    "chars": 38169,
    "preview": "#include <stdint.h>\n\ntypedef int32_t crypto_int32;\ntypedef int64_t crypto_int64;\ntypedef uint64_t crypto_uint64;\n\ntypede"
  },
  {
    "path": "src/crypto/ed25519/fuzz/curve25519-ref10.h",
    "chars": 259,
    "preview": "#ifndef CURVE25519_REF10_H\n#define CURVE25519_REF10_H\n\nint crypto_scalarmult_base_ref10(unsigned char *q,const unsigned "
  },
  {
    "path": "src/crypto/ed25519/fuzz/ed25519-donna-sse2.c",
    "chars": 74,
    "preview": "#define ED25519_SUFFIX _sse2\n#define ED25519_SSE2\n#include \"../ed25519.c\"\n"
  },
  {
    "path": "src/crypto/ed25519/fuzz/ed25519-donna.c",
    "chars": 24,
    "preview": "#include \"../ed25519.c\"\n"
  },
  {
    "path": "src/crypto/ed25519/fuzz/ed25519-donna.h",
    "chars": 1561,
    "preview": "#ifndef ED25519_H\n#define ED25519_H\n\n#include <stdlib.h>\n\ntypedef unsigned char ed25519_signature[64];\ntypedef unsigned "
  },
  {
    "path": "src/crypto/ed25519/fuzz/ed25519-ref10.c",
    "chars": 171009,
    "preview": "#include <stdint.h>\n#include <stddef.h>\n#include <string.h>\n\nstatic int crypto_verify_32(const unsigned char *x,const un"
  },
  {
    "path": "src/crypto/ed25519/fuzz/ed25519-ref10.h",
    "chars": 426,
    "preview": "#ifndef ED25519_REF10_H\n#define ED25519_REF10_H\n\nint crypto_sign_pk_ref10(unsigned char *pk,unsigned char *sk);\nint cryp"
  },
  {
    "path": "src/crypto/ed25519/fuzz/fuzz-curve25519.c",
    "chars": 3686,
    "preview": "#if defined(_WIN32)\n\t#include <windows.h>\n\t#include <wincrypt.h>\n\ttypedef unsigned int uint32_t;\n\ttypedef unsigned __int"
  },
  {
    "path": "src/crypto/ed25519/fuzz/fuzz-ed25519.c",
    "chars": 5412,
    "preview": "#if defined(_WIN32)\n\t#include <windows.h>\n\t#include <wincrypt.h>\n\ttypedef unsigned int uint32_t;\n#else\n\t#include <stdint"
  },
  {
    "path": "src/crypto/ed25519/modm-donna-32bit.h",
    "chars": 21134,
    "preview": "/*\n\tPublic domain by Andrew M. <liquidsun@gmail.com>\n*/\n\n\n/*\n\tArithmetic modulo the group order n = 2^252 +  27742317777"
  },
  {
    "path": "src/crypto/ed25519/modm-donna-64bit.h",
    "chars": 13354,
    "preview": "/*\n\tPublic domain by Andrew M. <liquidsun@gmail.com>\n*/\n\n\n/*\n\tArithmetic modulo the group order n = 2^252 +  27742317777"
  },
  {
    "path": "src/crypto/ed25519/regression.h",
    "chars": 2765824,
    "preview": "{{0x9d,0x61,0xb1,0x9d,0xef,0xfd,0x5a,0x60,0xba,0x84,0x4a,0xf4,0x92,0xec,0x2c,0xc4,0x44,0x49,0xc5,0x69,0x7b,0x32,0x69,0x1"
  },
  {
    "path": "src/crypto/ed25519/test-internals.c",
    "chars": 6019,
    "preview": "#include <stdio.h>\n#include \"ed25519-donna.h\"\n\nstatic int\ntest_adds() {\n#if defined(HAVE_UINT128) && !defined(ED25519_SS"
  },
  {
    "path": "src/crypto/ed25519/test-ticks.h",
    "chars": 1313,
    "preview": "#include \"ed25519-donna-portable-identify.h\"\n\n/* ticks - not tested on anything other than x86 */\nstatic uint64_t\nget_ti"
  },
  {
    "path": "src/crypto/ed25519/test.c",
    "chars": 8151,
    "preview": "/*\n\tValidate ed25519 implementation against the official test vectors from \n\thttp://ed25519.cr.yp.to/software.html\n*/\n\n#"
  },
  {
    "path": "src/crypto/ghash/ghash.c",
    "chars": 6882,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n *\n * Permission is hereby granted, free of charge, to any pe"
  },
  {
    "path": "src/crypto/ghash/ghash.h",
    "chars": 1759,
    "preview": "/*\n * Copyright (C) 2016 Southern Storm Software, Pty Ltd.\n *\n * Permission is hereby granted, free of charge, to any pe"
  },
  {
    "path": "src/crypto/goldilocks/Doxyfile",
    "chars": 100386,
    "preview": "# Doxyfile 1.8.6\n\n# This file describes the settings to be used by the documentation system\n# doxygen (www.doxygen.org) "
  },
  {
    "path": "src/crypto/goldilocks/HISTORY.txt",
    "chars": 14280,
    "preview": "March 1, 2015:\n    Not much to report.  Most of the fixes since Oct 27 last year have\n    been bug fixes or simplificati"
  },
  {
    "path": "src/crypto/goldilocks/LICENSE.txt",
    "chars": 1134,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2011 Stanford University.\nCopyright (c) 2014 Cryptography Research, Inc.\n\nPermissio"
  },
  {
    "path": "src/crypto/goldilocks/README.txt",
    "chars": 2149,
    "preview": "Ed448-Goldilocks\n\nThis software is an experimental implementation of a new 448-bit elliptic\ncurve called Ed448-Goldilock"
  },
  {
    "path": "src/crypto/goldilocks/TODO.txt",
    "chars": 4514,
    "preview": "Important work items for Ed448-Goldilocks:\n\n* Better architecture detection / factoring of arch-related headers.\n    [PR"
  },
  {
    "path": "src/crypto/goldilocks/include/goldilocks.h",
    "chars": 12429,
    "preview": "/* Copyright (c) 2014-2015 Cryptography Research, Inc.\n * Released under the MIT License.  See LICENSE.txt for license i"
  },
  {
    "path": "src/crypto/goldilocks/include/ridinghood.h",
    "chars": 12285,
    "preview": "/* Copyright (c) 2014 Cryptography Research, Inc.\n * Released under the MIT License.  See LICENSE.txt for license inform"
  },
  {
    "path": "src/crypto/goldilocks/src/arithmetic.c",
    "chars": 1781,
    "preview": "/**\n * @cond internal\n * @file field.c\n * @copyright\n *   Copyright (c) 2014 Cryptography Research, Inc.  \\n\n *   Releas"
  },
  {
    "path": "src/crypto/goldilocks/src/barrett_field.c",
    "chars": 9025,
    "preview": "/* Copyright (c) 2014 Cryptography Research, Inc.\n * Released under the MIT License.  See LICENSE.txt for license inform"
  },
  {
    "path": "src/crypto/goldilocks/src/bat/api_dh.h",
    "chars": 685,
    "preview": "/**\n * @file sizes.h\n * @copyright\n *   Copyright (c) 2014 Cryptography Research, Inc.  \\n\n *   Released under the MIT L"
  },
  {
    "path": "src/crypto/goldilocks/src/bat/api_sign.h",
    "chars": 675,
    "preview": "/**\n * @file sizes.h\n * @copyright\n *   Copyright (c) 2014 Cryptography Research, Inc.  \\n\n *   Released under the MIT L"
  },
  {
    "path": "src/crypto/goldilocks/src/bat/dh.c",
    "chars": 990,
    "preview": "/**\n * @file sizes.h\n * @copyright\n *   Copyright (c) 2014 Cryptography Research, Inc.  \\n\n *   Released under the MIT L"
  },
  {
    "path": "src/crypto/goldilocks/src/bat/sign.c",
    "chars": 1667,
    "preview": "/**\n * @file sizes.h\n * @copyright\n *   Copyright (c) 2014 Cryptography Research, Inc.  \\n\n *   Released under the MIT L"
  },
  {
    "path": "src/crypto/goldilocks/src/crandom.c",
    "chars": 14929,
    "preview": "/* Copyright (c) 2011 Stanford University.\n * Copyright (c) 2014 Cryptography Research, Inc.\n * Released under the MIT L"
  },
  {
    "path": "src/crypto/goldilocks/src/ec_point.c",
    "chars": 20000,
    "preview": "/**\n * @cond internal\n * @file ec_point.c\n * @copyright\n *   Copyright (c) 2014 Cryptography Research, Inc.  \\n\n *   Rel"
  },
  {
    "path": "src/crypto/goldilocks/src/goldilocks.c",
    "chars": 16394,
    "preview": "/* Copyright (c) 2014 Cryptography Research, Inc.\n * Released under the MIT License.  See LICENSE.txt for license inform"
  },
  {
    "path": "src/crypto/goldilocks/src/include/barrett_field.h",
    "chars": 4200,
    "preview": "/* Copyright (c) 2014 Cryptography Research, Inc.\n * Released under the MIT License.  See LICENSE.txt for license inform"
  },
  {
    "path": "src/crypto/goldilocks/src/include/constant_time.h",
    "chars": 9788,
    "preview": "/**\n * @file constant_time.h\n * @copyright\n *   Copyright (c) 2014 Cryptography Research, Inc.  \\n\n *   Released under t"
  },
  {
    "path": "src/crypto/goldilocks/src/include/crandom.h",
    "chars": 4255,
    "preview": "/* Copyright (c) 2011 Stanford University.\n * Copyright (c) 2014-2015 Cryptography Research, Inc.\n * Released under the "
  },
  {
    "path": "src/crypto/goldilocks/src/include/ec_point.h",
    "chars": 10684,
    "preview": "/**\n * @file ec_point.h\n * @copyright\n *   Copyright (c) 2014 Cryptography Research, Inc.  \\n\n *   Released under the MI"
  },
  {
    "path": "src/crypto/goldilocks/src/include/field.h",
    "chars": 4938,
    "preview": "/**\n * @file field.h\n * @brief Generic field header.\n * @copyright\n *   Copyright (c) 2014 Cryptography Research, Inc.  "
  },
  {
    "path": "src/crypto/goldilocks/src/include/intrinsics.h",
    "chars": 7269,
    "preview": "/* Copyright (c) 2011 Stanford University.\n * Copyright (c) 2014 Cryptography Research, Inc.\n * Released under the MIT L"
  },
  {
    "path": "src/crypto/goldilocks/src/include/magic.h",
    "chars": 2343,
    "preview": "/**\n * @file magic.h\n * @copyright\n *   Copyright (c) 2014 Cryptography Research, Inc.  \\n\n *   Released under the MIT L"
  },
  {
    "path": "src/crypto/goldilocks/src/include/scalarmul.h",
    "chars": 9557,
    "preview": "/**\n * @file scalarmul.h\n * @copyright\n *   Copyright (c) 2014 Cryptography Research, Inc.  \\n\n *   Released under the M"
  },
  {
    "path": "src/crypto/goldilocks/src/include/sha512.h",
    "chars": 806,
    "preview": "/* Copyright (c) 2014 Cryptography Research, Inc.\n * Released under the MIT License.  See LICENSE.txt for license inform"
  },
  {
    "path": "src/crypto/goldilocks/src/include/word.h",
    "chars": 7862,
    "preview": "/* Copyright (c) 2014 Cryptography Research, Inc.\n * Released under the MIT License.  See LICENSE.txt for license inform"
  },
  {
    "path": "src/crypto/goldilocks/src/p448/arch_32/arch_config.h",
    "chars": 21,
    "preview": "#define WORD_BITS 32\n"
  },
  {
    "path": "src/crypto/goldilocks/src/p448/arch_32/p448.c",
    "chars": 5627,
    "preview": "/* Copyright (c) 2014 Cryptography Research, Inc.\n * Released under the MIT License.  See LICENSE.txt for license inform"
  },
  {
    "path": "src/crypto/goldilocks/src/p448/arch_32/p448.h",
    "chars": 3575,
    "preview": "/* Copyright (c) 2014 Cryptography Research, Inc.\n * Released under the MIT License.  See LICENSE.txt for license inform"
  },
  {
    "path": "src/crypto/goldilocks/src/p448/arch_arm_32/arch_config.h",
    "chars": 21,
    "preview": "#define WORD_BITS 32\n"
  },
  {
    "path": "src/crypto/goldilocks/src/p448/arch_arm_32/p448.c",
    "chars": 27144,
    "preview": "/* Copyright (c) 2014 Cryptography Research, Inc.\n * Released under the MIT License.  See LICENSE.txt for license inform"
  },
  {
    "path": "src/crypto/goldilocks/src/p448/arch_arm_32/p448.h",
    "chars": 4248,
    "preview": "/* Copyright (c) 2014 Cryptography Research, Inc.\n * Released under the MIT License.  See LICENSE.txt for license inform"
  },
  {
    "path": "src/crypto/goldilocks/src/p448/arch_neon_experimental/arch_config.h",
    "chars": 21,
    "preview": "#define WORD_BITS 32\n"
  },
  {
    "path": "src/crypto/goldilocks/src/p448/arch_neon_experimental/p448.c",
    "chars": 24297,
    "preview": "/* Copyright (c) 2014 Cryptography Research, Inc.\n * Released under the MIT License.  See LICENSE.txt for license inform"
  },
  {
    "path": "src/crypto/goldilocks/src/p448/arch_neon_experimental/p448.h",
    "chars": 4217,
    "preview": "/* Copyright (c) 2014 Cryptography Research, Inc.\n * Released under the MIT License.  See LICENSE.txt for license inform"
  },
  {
    "path": "src/crypto/goldilocks/src/p448/arch_ref64/arch_config.h",
    "chars": 21,
    "preview": "#define WORD_BITS 64\n"
  },
  {
    "path": "src/crypto/goldilocks/src/p448/arch_ref64/p448.c",
    "chars": 10619,
    "preview": "/* Copyright (c) 2014 Cryptography Research, Inc.\n * Released under the MIT License.  See LICENSE.txt for license inform"
  },
  {
    "path": "src/crypto/goldilocks/src/p448/arch_ref64/p448.h",
    "chars": 3945,
    "preview": "/* Copyright (c) 2014 Cryptography Research, Inc.\n * Released under the MIT License.  See LICENSE.txt for license inform"
  },
  {
    "path": "src/crypto/goldilocks/src/p448/arch_x86_64/arch_config.h",
    "chars": 21,
    "preview": "#define WORD_BITS 64\n"
  },
  {
    "path": "src/crypto/goldilocks/src/p448/arch_x86_64/p448.c",
    "chars": 9960,
    "preview": "/* Copyright (c) 2014 Cryptography Research, Inc.\n * Released under the MIT License.  See LICENSE.txt for license inform"
  },
  {
    "path": "src/crypto/goldilocks/src/p448/arch_x86_64/p448.h",
    "chars": 4707,
    "preview": "/* Copyright (c) 2014 Cryptography Research, Inc.\n * Released under the MIT License.  See LICENSE.txt for license inform"
  },
  {
    "path": "src/crypto/goldilocks/src/p448/arch_x86_64/x86-64-arith.h",
    "chars": 7297,
    "preview": "/* Copyright (c) 2014 Cryptography Research, Inc.\n * Released under the MIT License.  See LICENSE.txt for license inform"
  },
  {
    "path": "src/crypto/goldilocks/src/p448/f_arithmetic.c",
    "chars": 1251,
    "preview": "/**\n * @cond internal\n * @file f_arithmetic.c\n * @copyright\n *   Copyright (c) 2014 Cryptography Research, Inc.  \\n\n *  "
  },
  {
    "path": "src/crypto/goldilocks/src/p448/f_field.h",
    "chars": 1242,
    "preview": "/**\n * @file f_field.h\n * @brief Field-specific code.\n * @copyright\n *   Copyright (c) 2014 Cryptography Research, Inc. "
  },
  {
    "path": "src/crypto/goldilocks/src/p448/f_magic.h",
    "chars": 828,
    "preview": "/**\n * @file f_magic.h\n * @copyright\n *   Copyright (c) 2014 Cryptography Research, Inc.  \\n\n *   Released under the MIT"
  },
  {
    "path": "src/crypto/goldilocks/src/p448/magic.c",
    "chars": 2546,
    "preview": "/* Copyright (c) 2014 Cryptography Research, Inc.\n * Released under the MIT License.  See LICENSE.txt for license inform"
  },
  {
    "path": "src/crypto/goldilocks/src/p480/arch_x86_64/arch_config.h",
    "chars": 21,
    "preview": "#define WORD_BITS 64\n"
  },
  {
    "path": "src/crypto/goldilocks/src/p480/arch_x86_64/p480.c",
    "chars": 10265,
    "preview": "/* Copyright (c) 2014 Cryptography Research, Inc.\n * Released under the MIT License.  See LICENSE.txt for license inform"
  },
  {
    "path": "src/crypto/goldilocks/src/p480/arch_x86_64/p480.h",
    "chars": 4707,
    "preview": "/* Copyright (c) 2014 Cryptography Research, Inc.\n * Released under the MIT License.  See LICENSE.txt for license inform"
  },
  {
    "path": "src/crypto/goldilocks/src/p480/arch_x86_64/x86-64-arith.h",
    "chars": 7297,
    "preview": "/* Copyright (c) 2014 Cryptography Research, Inc.\n * Released under the MIT License.  See LICENSE.txt for license inform"
  },
  {
    "path": "src/crypto/goldilocks/src/p480/f_arithmetic.c",
    "chars": 1261,
    "preview": "/**\n * @cond internal\n * @file f_arithmetic.c\n * @copyright\n *   Copyright (c) 2014 Cryptography Research, Inc.  \\n\n *  "
  },
  {
    "path": "src/crypto/goldilocks/src/p480/f_field.h",
    "chars": 1242,
    "preview": "/**\n * @file f_field.h\n * @brief Field-specific code.\n * @copyright\n *   Copyright (c) 2014 Cryptography Research, Inc. "
  },
  {
    "path": "src/crypto/goldilocks/src/p480/f_magic.h",
    "chars": 827,
    "preview": "/**\n * @file f_magic.h\n * @copyright\n *   Copyright (c) 2014 Cryptography Research, Inc.  \\n\n *   Released under the MIT"
  },
  {
    "path": "src/crypto/goldilocks/src/p480/magic.c",
    "chars": 2037,
    "preview": "/* Copyright (c) 2014 Cryptography Research, Inc.\n * Released under the MIT License.  See LICENSE.txt for license inform"
  },
  {
    "path": "src/crypto/goldilocks/src/p521/arch_ref64/arch_config.h",
    "chars": 21,
    "preview": "#define WORD_BITS 64\n"
  },
  {
    "path": "src/crypto/goldilocks/src/p521/arch_ref64/p521.c",
    "chars": 10735,
    "preview": "/* Copyright (c) 2014 Cryptography Research, Inc.\n * Released under the MIT License.  See LICENSE.txt for license inform"
  },
  {
    "path": "src/crypto/goldilocks/src/p521/arch_ref64/p521.h",
    "chars": 3951,
    "preview": "/* Copyright (c) 2014 Cryptography Research, Inc.\n * Released under the MIT License.  See LICENSE.txt for license inform"
  },
  {
    "path": "src/crypto/goldilocks/src/p521/arch_x86_64_r12/arch_config.h",
    "chars": 21,
    "preview": "#define WORD_BITS 64\n"
  },
  {
    "path": "src/crypto/goldilocks/src/p521/arch_x86_64_r12/p521.c",
    "chars": 11949,
    "preview": "/* Copyright (c) 2014 Cryptography Research, Inc.\n * Released under the MIT License.  See LICENSE.txt for license inform"
  },
  {
    "path": "src/crypto/goldilocks/src/p521/arch_x86_64_r12/p521.h",
    "chars": 4408,
    "preview": "/* Copyright (c) 2014 Cryptography Research, Inc.\n * Released under the MIT License.  See LICENSE.txt for license inform"
  },
  {
    "path": "src/crypto/goldilocks/src/p521/f_arithmetic.c",
    "chars": 1251,
    "preview": "/**\n * @cond internal\n * @file f_arithmetic.c\n * @copyright\n *   Copyright (c) 2014 Cryptography Research, Inc.  \\n\n *  "
  },
  {
    "path": "src/crypto/goldilocks/src/p521/f_field.h",
    "chars": 1242,
    "preview": "/**\n * @file f_field.h\n * @brief Field-specific code.\n * @copyright\n *   Copyright (c) 2014 Cryptography Research, Inc. "
  },
  {
    "path": "src/crypto/goldilocks/src/p521/f_magic.h",
    "chars": 829,
    "preview": "/**\n * @file f_magic.h\n * @copyright\n *   Copyright (c) 2014 Cryptography Research, Inc.  \\n\n *   Released under the MIT"
  },
  {
    "path": "src/crypto/goldilocks/src/p521/magic.c",
    "chars": 3099,
    "preview": "/* Copyright (c) 2014 Cryptography Research, Inc.\n * Released under the MIT License.  See LICENSE.txt for license inform"
  },
  {
    "path": "src/crypto/goldilocks/src/scalarmul.c",
    "chars": 25937,
    "preview": "/* Copyright (c) 2014 Cryptography Research, Inc.\n * Released under the MIT License.  See LICENSE.txt for license inform"
  },
  {
    "path": "src/crypto/goldilocks/src/sha512.c",
    "chars": 5623,
    "preview": "/* Copyright (c) 2011 Stanford University.\n * Copyright (c) 2014 Cryptography Research, Inc.\n * Released under the MIT L"
  },
  {
    "path": "src/crypto/goldilocks/test/bench.c",
    "chars": 21397,
    "preview": "/* Copyright (c) 2014 Cryptography Research, Inc.\n * Released under the MIT License.  See LICENSE.txt for license inform"
  },
  {
    "path": "src/crypto/goldilocks/test/test.c",
    "chars": 2918,
    "preview": "#include \"test.h\"\n\n#include <stdio.h>\n#include <string.h>\n\n#ifndef LIMBPERM\n#define LIMBPERM(x) (x)\n#endif\n\nint failed_t"
  },
  {
    "path": "src/crypto/goldilocks/test/test.h",
    "chars": 744,
    "preview": "#ifndef __GOLDILOCKS_TEST_H__\n#define __GOLDILOCKS_TEST_H__ 1\n\n#include \"word.h\"\n#include \"field.h\"\n\nint\nhexdecode (\n   "
  },
  {
    "path": "src/crypto/goldilocks/test/test_arithmetic.c",
    "chars": 6157,
    "preview": "#include \"field.h\"\n#include \"test.h\"\n#include <gmp.h>\n#include <string.h>\n#include <stdio.h>\n\nmpz_t mp_field;\n\nstatic ma"
  },
  {
    "path": "src/crypto/goldilocks/test/test_goldilocks.c",
    "chars": 5469,
    "preview": "#include \"test.h\"\n#include \"goldilocks.h\"\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\nint test_goldilock"
  },
  {
    "path": "src/crypto/goldilocks/test/test_pointops.c",
    "chars": 8042,
    "preview": "#include \"test.h\"\n\n#include <stdio.h>\n\n#include \"ec_point.h\"\n#include \"magic.h\"\n#include \"field.h\"\n#include \"crandom.h\"\n"
  },
  {
    "path": "src/crypto/goldilocks/test/test_scalarmul.c",
    "chars": 13332,
    "preview": "#include \"test.h\"\n\n#include <stdio.h>\n\n#include \"scalarmul.h\"\n#include \"ec_point.h\"\n#include \"field.h\"\n#include \"crandom"
  }
]

// ... and 96 more files (download for full content)

About this extraction

This page contains the full source code of the rweather/noise-c GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 296 files (9.3 MB), approximately 2.5M tokens, and a symbol index with 1815 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!