1 /* 2 +----------------------------------------------------------------------+ 3 | PHP Version 5 | 4 +----------------------------------------------------------------------+ 5 | Copyright (c) 2013-2016 Jakub Zelenka | 6 +----------------------------------------------------------------------+ 7 | This source file is subject to version 3.01 of the PHP license, | 8 | that is bundled with this package in the file LICENSE, and is | 9 | available through the world-wide-web at the following url: | 10 | http://www.php.net/license/3_01.txt | 11 | If you did not receive a copy of the PHP license and are unable to | 12 | obtain it through the world-wide-web, please send a note to | 13 | license@php.net so we can mail you a copy immediately. | 14 +----------------------------------------------------------------------+ 15 | Author: Jakub Zelenka <bukka@php.net> | 16 +----------------------------------------------------------------------+ 17 */ 18 19 #ifndef PHP_CRYPTO_HASH_H 20 #define PHP_CRYPTO_HASH_H 21 22 #include "php.h" 23 #include "php_crypto.h" 24 25 #include <openssl/evp.h> 26 #include <openssl/hmac.h> 27 #ifdef PHP_CRYPTO_HAS_CMAC 28 #include <openssl/cmac.h> 29 #endif 30 31 typedef enum { 32 PHP_CRYPTO_HASH_TYPE_NONE, 33 PHP_CRYPTO_HASH_TYPE_MD, 34 PHP_CRYPTO_HASH_TYPE_HMAC, 35 PHP_CRYPTO_HASH_TYPE_CMAC 36 } php_crypto_hash_type; 37 38 typedef enum { 39 PHP_CRYPTO_HASH_STATUS_CLEAR, 40 PHP_CRYPTO_HASH_STATUS_HASH 41 } php_crypto_hash_status; 42 43 PHPC_OBJ_STRUCT_BEGIN(crypto_hash) 44 php_crypto_hash_type type; 45 php_crypto_hash_status status; 46 union { 47 const EVP_MD *md; 48 #ifdef PHP_CRYPTO_HAS_CMAC 49 const EVP_CIPHER *cipher; 50 #endif 51 } alg; 52 union { 53 EVP_MD_CTX *md; 54 HMAC_CTX *hmac; 55 #ifdef PHP_CRYPTO_HAS_CMAC 56 CMAC_CTX *cmac; 57 #endif 58 } ctx; 59 char *key; 60 int key_len; 61 PHPC_OBJ_STRUCT_END() 62 63 /* Hash or MAC object accessors */ 64 #ifdef PHP_CRYPTO_HAS_CMAC 65 #define PHP_CRYPTO_CMAC_CTX(pobj) (pobj)->ctx.cmac 66 #define PHP_CRYPTO_CMAC_ALG(pobj) (pobj)->alg.cipher 67 #endif 68 #define PHP_CRYPTO_HASH_CTX(pobj) (pobj)->ctx.md 69 #define PHP_CRYPTO_HASH_ALG(pobj) (pobj)->alg.md 70 #define PHP_CRYPTO_HMAC_CTX(pobj) (pobj)->ctx.hmac 71 #define PHP_CRYPTO_HMAC_ALG(pobj) (pobj)->alg.md 72 73 /* Exceptions */ 74 PHP_CRYPTO_EXCEPTION_EXPORT(Hash) 75 PHP_CRYPTO_EXCEPTION_EXPORT(MAC) 76 /* Error infos */ 77 PHP_CRYPTO_ERROR_INFO_EXPORT(MAC) 78 79 80 /* CLASSES */ 81 82 /* Class entries */ 83 extern PHP_CRYPTO_API zend_class_entry *php_crypto_hash_ce; 84 extern PHP_CRYPTO_API zend_class_entry *php_crypto_hmac_ce; 85 #ifdef PHP_CRYPTO_HAS_CMAC 86 extern PHP_CRYPTO_API zend_class_entry *php_crypto_cmac_ce; 87 #endif 88 89 /* USER METHODS */ 90 91 /* Module init for Crypto Hash */ 92 PHP_MINIT_FUNCTION(crypto_hash); 93 94 /* Hash methods */ 95 PHP_CRYPTO_METHOD(Hash, getAlgorithms); 96 PHP_CRYPTO_METHOD(Hash, hasAlgorithm); 97 PHP_CRYPTO_METHOD(Hash, __callStatic); 98 PHP_CRYPTO_METHOD(Hash, __construct); 99 PHP_CRYPTO_METHOD(Hash, getAlgorithmName); 100 PHP_CRYPTO_METHOD(Hash, update); 101 PHP_CRYPTO_METHOD(Hash, digest); 102 PHP_CRYPTO_METHOD(Hash, hexdigest); 103 PHP_CRYPTO_METHOD(Hash, getSize); 104 PHP_CRYPTO_METHOD(Hash, getBlockSize); 105 106 /* MAC methods */ 107 PHP_CRYPTO_METHOD(MAC, __construct); 108 109 110 /* CRYPTO API FUNCTIONS */ 111 /* Hash functions */ 112 PHP_CRYPTO_API void php_crypto_hash_bin2hex(char *out, const unsigned char *in, unsigned in_len); 113 114 115 #endif /* PHP_CRYPTO_EVP_H */ 116 117 /* 118 * Local variables: 119 * tab-width: 4 120 * c-basic-offset: 4 121 * End: 122 * vim600: noet sw=4 ts=4 fdm=marker 123 * vim<600: noet sw=4 ts=4 124 */ 125