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