# ===========================================================================
#      https://www.gnu.org/software/autoconf-archive/ax_lib_gcrypt.html
# ===========================================================================
#
# SYNOPSIS
#
#   AX_LIB_GCRYPT([yes|no|auto])
#
# DESCRIPTION
#
#   Searches for the 'gcrypt' library with the --with... option.
#
#   If found, define HAVE_GCRYPT and macro GCRYPT_LIBS and GCRYPT_CFLAGS.
#   Also defines GCRYPT_WITH_<algo> for the algorithms found available.
#   Possible algorithms are: AES ARCFOUR BLOWFISH CAST5 DES IDEA RFC2268
#   SERPENT TWOFISH CRC HAVAL MD2 MD4 MD5 RMD160 SHA0 SHA1 SHA224 SHA256
#   SHA384 SHA512 TIGER WHIRLPOOL DSA ELGAMAL RSA
#
#   The argument is used if no --with...-gcrypt option is set. Value "yes"
#   requires the configuration by default. Value "no" does not require it by
#   default. Value "auto" configures the library only if available.
#
#   See also AX_LIB_BEECRYPT and AX_LIB_CRYPTO.
#
# LICENSE
#
#   Copyright (c) 2009 Fabien Coelho <autoconf.archive@coelho.net>
#
#   Copying and distribution of this file, with or without modification, are
#   permitted in any medium without royalty provided the copyright notice
#   and this notice are preserved. This file is offered as-is, without any
#   warranty.

#serial 12

# AX_CHECK_GCRYPT_ALGO([algo])
# generate convenient defines for each algorithm
AC_DEFUN([AX_CHECK_GCRYPT_ALGO],[
  AC_REQUIRE([AC_PROG_EGREP])
  AC_MSG_CHECKING([for $1 in gcrypt])
  if echo $gcrypt_algos | $EGREP -i ":.*( $1 | $1$)" > /dev/null ; then
    AC_DEFINE([GCRYPT_WITH_$1],[1],[Algorithm $1 in gcrypt library])
    AC_MSG_RESULT([yes])
  else
    AC_MSG_RESULT([no])
  fi
])

# AX_LIB_GCRYPT([yes|no|auto])
AC_DEFUN([AX_LIB_GCRYPT],[
  AC_MSG_CHECKING([whether gcrypt is enabled])
  AC_ARG_WITH([gcrypt],[  --with-gcrypt           require gcrypt library
  --without-gcrypt        disable gcrypt library],[
    AC_MSG_RESULT([$withval])
    ac_with_gcrypt=$withval
  ],[
    AC_MSG_RESULT($1)
    ac_with_gcrypt=$1
  ])
  if test "$ac_with_gcrypt" = "yes" -o "$ac_with_gcrypt" = "auto" ; then
    AM_PATH_LIBGCRYPT([1.2.0],[
      AC_DEFINE([HAVE_GCRYPT],[1],[Gcrypt library is available])
      HAVE_GCRYPT=1
      # checking for available algorithms...
      gcrypt_algos=`$LIBGCRYPT_CONFIG --algorithms`
      # ciphers
      # this does not work with a "for" loop: nothing generated in config.h:-(
      AX_CHECK_GCRYPT_ALGO([AES])
      AX_CHECK_GCRYPT_ALGO([ARCFOUR])
      AX_CHECK_GCRYPT_ALGO([BLOWFISH])
      AX_CHECK_GCRYPT_ALGO([CAST5])
      AX_CHECK_GCRYPT_ALGO([DES])
      AX_CHECK_GCRYPT_ALGO([IDEA])
      AX_CHECK_GCRYPT_ALGO([RFC2268])
      AX_CHECK_GCRYPT_ALGO([SERPENT])
      AX_CHECK_GCRYPT_ALGO([TWOFISH])
      # digests
      AX_CHECK_GCRYPT_ALGO([CRC])
      AX_CHECK_GCRYPT_ALGO([HAVAL])
      AX_CHECK_GCRYPT_ALGO([MD2])
      AX_CHECK_GCRYPT_ALGO([MD4])
      AX_CHECK_GCRYPT_ALGO([MD5])
      AX_CHECK_GCRYPT_ALGO([RMD160])
      AX_CHECK_GCRYPT_ALGO([SHA0])
      AX_CHECK_GCRYPT_ALGO([SHA1])
      AX_CHECK_GCRYPT_ALGO([SHA224])
      AX_CHECK_GCRYPT_ALGO([SHA256])
      AX_CHECK_GCRYPT_ALGO([SHA384])
      AX_CHECK_GCRYPT_ALGO([SHA512])
      AX_CHECK_GCRYPT_ALGO([TIGER])
      AX_CHECK_GCRYPT_ALGO([WHIRLPOOL])
      # others
      AX_CHECK_GCRYPT_ALGO([DSA])
      AX_CHECK_GCRYPT_ALGO([ELGAMAL])
      AX_CHECK_GCRYPT_ALGO([RSA])
      # CMAC support
      AC_MSG_CHECKING([for CMAC_AES in gcrypt])
      AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <gcrypt.h>]], [[
int ok = GCRY_MAC_CMAC_AES;
(void)ok;
      ]])],[
        AC_MSG_RESULT([yes])
        AC_DEFINE([GCRYPT_WITH_CMAC_AES],[1],[Algorithm CMAC_AES in gcrypt library])
        HAVE_CMAC=yes
      ], [
        AC_MSG_RESULT([no])
        HAVE_CMAC=no
      ])
      # conclusion
      GCRYPT_CFLAGS=`$LIBGCRYPT_CONFIG --cflags`
      GCRYPT_LIBS=`$LIBGCRYPT_CONFIG --libs`
      AC_SUBST(GCRYPT_CFLAGS)
      AC_SUBST(GCRYPT_LIBS)
    ],[
      # complain only if explicitly required
      if test "$ac_with_gcrypt" = "yes" ; then
	AC_MSG_ERROR([cannot configure required gcrypt library])
      fi
    ])
  fi
])
