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