125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Hashing function for CUPS.
325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
4bfe95db54f1c346a8a14ce89a2a7825d6c2303bdPhilip P. Moltmann * Copyright 2015-2016 by Apple Inc.
525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * These coded instructions, statements, and computer programs are the
725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * property of Apple Inc. and are protected by Federal copyright
825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * which should have been included with this file.  If this file is
102447373f182dbfeb47fb86c0f5a6ac5773c65ac2Philip P. Moltmann * missing or damaged, see the license at "http://www.cups.org/".
1125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
1225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * This file is subject to the Apple OS-Developed Software exception.
1325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
1425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
1525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
1625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Include necessary headers...
1725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
1825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
1925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#include "cups-private.h"
2025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef __APPLE__
2125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#  include <CommonCrypto/CommonDigest.h>
2225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#elif defined(HAVE_GNUTLS)
2325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#  include <gnutls/crypto.h>
2425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* __APPLE__ */
2525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
2625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
2725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
2825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsHashData()' - Perform a hash function on the given data.
2925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
3025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * The "algorithm" argument can be any of the registered, non-deprecated IPP
3125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * hash algorithms for the "job-password-encryption" attribute, including
3225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * "sha" for SHA-1, "sha-256" for SHA2-256, etc.
3325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
3425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * The "hash" argument points to a buffer of "hashsize" bytes and should be at
3525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * least 64 bytes in length for all of the supported algorithms.
3625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
3725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * The returned hash is binary data.
3825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
3925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 2.2/macOS 10.12@
4025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
4125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
4225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannssize_t					/* O - Size of hash or -1 on error */
4325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsHashData(const char    *algorithm,	/* I - Algorithm name */
4425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann             const void    *data,	/* I - Data to hash */
4525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann             size_t        datalen,	/* I - Length of data to hash */
4625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann             unsigned char *hash,	/* I - Hash buffer */
4725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann             size_t        hashsize)	/* I - Size of hash buffer */
4825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
4925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (!algorithm || !data || datalen == 0 || !hash || hashsize == 0)
5025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
5125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad arguments to function"), 1);
5225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (-1);
5325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
5425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
5525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef __APPLE__
56bfe95db54f1c346a8a14ce89a2a7825d6c2303bdPhilip P. Moltmann  if (!strcmp(algorithm, "sha"))
5725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
5825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann   /*
5925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * SHA-1...
6025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    */
6125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
6225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    CC_SHA1_CTX	ctx;			/* SHA-1 context */
6325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
6425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (hashsize < CC_SHA1_DIGEST_LENGTH)
6525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      goto too_small;
6625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
6725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    CC_SHA1_Init(&ctx);
6825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    CC_SHA1_Update(&ctx, data, (CC_LONG)datalen);
6925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    CC_SHA1_Final(hash, &ctx);
7025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
7125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (CC_SHA1_DIGEST_LENGTH);
7225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
73bfe95db54f1c346a8a14ce89a2a7825d6c2303bdPhilip P. Moltmann  else if (!strcmp(algorithm, "sha2-224"))
7425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
7525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    CC_SHA256_CTX	ctx;		/* SHA-224 context */
7625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
7725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (hashsize < CC_SHA224_DIGEST_LENGTH)
7825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      goto too_small;
7925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
8025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    CC_SHA224_Init(&ctx);
8125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    CC_SHA224_Update(&ctx, data, (CC_LONG)datalen);
8225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    CC_SHA224_Final(hash, &ctx);
8325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
8425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (CC_SHA224_DIGEST_LENGTH);
8525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
86bfe95db54f1c346a8a14ce89a2a7825d6c2303bdPhilip P. Moltmann  else if (!strcmp(algorithm, "sha2-256"))
8725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
8825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    CC_SHA256_CTX	ctx;		/* SHA-256 context */
8925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
9025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (hashsize < CC_SHA256_DIGEST_LENGTH)
9125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      goto too_small;
9225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
9325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    CC_SHA256_Init(&ctx);
9425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    CC_SHA256_Update(&ctx, data, (CC_LONG)datalen);
9525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    CC_SHA256_Final(hash, &ctx);
9625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
9725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (CC_SHA256_DIGEST_LENGTH);
9825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
99bfe95db54f1c346a8a14ce89a2a7825d6c2303bdPhilip P. Moltmann  else if (!strcmp(algorithm, "sha2-384"))
10025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
10125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    CC_SHA512_CTX	ctx;		/* SHA-384 context */
10225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
10325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (hashsize < CC_SHA384_DIGEST_LENGTH)
10425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      goto too_small;
10525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
10625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    CC_SHA384_Init(&ctx);
10725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    CC_SHA384_Update(&ctx, data, (CC_LONG)datalen);
10825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    CC_SHA384_Final(hash, &ctx);
10925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
11025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (CC_SHA384_DIGEST_LENGTH);
11125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
112bfe95db54f1c346a8a14ce89a2a7825d6c2303bdPhilip P. Moltmann  else if (!strcmp(algorithm, "sha2-512"))
11325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
11425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    CC_SHA512_CTX	ctx;		/* SHA-512 context */
11525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
11625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (hashsize < CC_SHA512_DIGEST_LENGTH)
11725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      goto too_small;
11825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
11925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    CC_SHA512_Init(&ctx);
12025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    CC_SHA512_Update(&ctx, data, (CC_LONG)datalen);
12125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    CC_SHA512_Final(hash, &ctx);
12225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
12325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (CC_SHA512_DIGEST_LENGTH);
12425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
125bfe95db54f1c346a8a14ce89a2a7825d6c2303bdPhilip P. Moltmann  else if (!strcmp(algorithm, "sha2-512_224"))
12625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
12725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    CC_SHA512_CTX	ctx;		/* SHA-512 context */
12825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    unsigned char	temp[CC_SHA512_DIGEST_LENGTH];
12925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann                                        /* SHA-512 hash */
13025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
13125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann   /*
13225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * SHA2-512 truncated to 224 bits (28 bytes)...
13325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    */
13425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
13525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (hashsize < CC_SHA224_DIGEST_LENGTH)
13625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      goto too_small;
13725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
13825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    CC_SHA512_Init(&ctx);
13925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    CC_SHA512_Update(&ctx, data, (CC_LONG)datalen);
14025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    CC_SHA512_Final(temp, &ctx);
14125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
14225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    memcpy(hash, temp, CC_SHA224_DIGEST_LENGTH);
14325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
14425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (CC_SHA224_DIGEST_LENGTH);
14525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
146bfe95db54f1c346a8a14ce89a2a7825d6c2303bdPhilip P. Moltmann  else if (!strcmp(algorithm, "sha2-512_256"))
14725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
14825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    CC_SHA512_CTX	ctx;		/* SHA-512 context */
14925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    unsigned char	temp[CC_SHA512_DIGEST_LENGTH];
15025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann                                        /* SHA-512 hash */
15125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
15225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann   /*
15325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * SHA2-512 truncated to 256 bits (32 bytes)...
15425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    */
15525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
15625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (hashsize < CC_SHA256_DIGEST_LENGTH)
15725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      goto too_small;
15825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
15925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    CC_SHA512_Init(&ctx);
16025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    CC_SHA512_Update(&ctx, data, (CC_LONG)datalen);
16125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    CC_SHA512_Final(temp, &ctx);
16225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
16325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    memcpy(hash, temp, CC_SHA256_DIGEST_LENGTH);
16425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
16525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (CC_SHA256_DIGEST_LENGTH);
16625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
16725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
16825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#elif defined(HAVE_GNUTLS)
16925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  gnutls_digest_algorithm_t alg = GNUTLS_DIG_UNKNOWN;
17025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann					/* Algorithm */
17125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  unsigned char	temp[64];		/* Temporary hash buffer */
17225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  size_t	tempsize = 0;		/* Truncate to this size? */
17325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
174bfe95db54f1c346a8a14ce89a2a7825d6c2303bdPhilip P. Moltmann  if (!strcmp(algorithm, "sha"))
17525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    alg = GNUTLS_DIG_SHA1;
176bfe95db54f1c346a8a14ce89a2a7825d6c2303bdPhilip P. Moltmann  else if (!strcmp(algorithm, "sha2-224"))
17725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    alg = GNUTLS_DIG_SHA224;
178bfe95db54f1c346a8a14ce89a2a7825d6c2303bdPhilip P. Moltmann  else if (!strcmp(algorithm, "sha2-256"))
17925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    alg = GNUTLS_DIG_SHA256;
180bfe95db54f1c346a8a14ce89a2a7825d6c2303bdPhilip P. Moltmann  else if (!strcmp(algorithm, "sha2-384"))
18125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    alg = GNUTLS_DIG_SHA384;
182bfe95db54f1c346a8a14ce89a2a7825d6c2303bdPhilip P. Moltmann  else if (!strcmp(algorithm, "sha2-512"))
18325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    alg = GNUTLS_DIG_SHA512;
184bfe95db54f1c346a8a14ce89a2a7825d6c2303bdPhilip P. Moltmann  else if (!strcmp(algorithm, "sha2-512_224"))
18525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
18625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    alg      = GNUTLS_DIG_SHA512;
18725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    tempsize = 28;
18825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
189bfe95db54f1c346a8a14ce89a2a7825d6c2303bdPhilip P. Moltmann  else if (!strcmp(algorithm, "sha2-512_256"))
19025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
19125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    alg      = GNUTLS_DIG_SHA512;
19225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    tempsize = 32;
19325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
19425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
19525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (alg != GNUTLS_DIG_UNKNOWN)
19625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
19725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (tempsize > 0)
19825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
19925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann     /*
20025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * Truncate result to tempsize bytes...
20125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      */
20225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
20325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      if (hashsize < tempsize)
20425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        goto too_small;
20525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
20625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      gnutls_hash_fast(alg, data, datalen, temp);
20725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      memcpy(hash, temp, tempsize);
20825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
20925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      return ((ssize_t)tempsize);
21025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
21125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
21225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (hashsize < gnutls_hash_get_len(alg))
21325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      goto too_small;
21425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
21525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    gnutls_hash_fast(alg, data, datalen, hash);
21625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
21725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (gnutls_hash_get_len(alg));
21825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
21925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
22025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#else
22125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
22225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * No hash support without CommonCrypto or GNU TLS...
22325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
22425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
22525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (hashsize < 64)
22625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    goto too_small;
22725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* __APPLE__ */
22825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
22925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
23025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Unknown hash algorithm...
23125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
23225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
23325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Unknown hash algorithm."), 1);
23425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
23525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  return (-1);
23625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
23725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
23825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * We get here if the buffer is too small.
23925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
24025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
24125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  too_small:
24225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
24325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Hash buffer too small."), 1);
24425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  return (-1);
24525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
246