3 #ifdef PHP_HTTP_HAVE_HASH
7 #include <ext/standard/crc32.h>
8 #include <ext/standard/sha1.h>
9 #include <ext/standard/md5.h>
11 PHP_HTTP_API
void *php_http_etag_init(TSRMLS_D
)
14 char *mode
= PHP_HTTP_G
->env
.etag_mode
;
16 #ifdef PHP_HTTP_HAVE_HASH
17 const php_hash_ops
*eho
= NULL
;
19 if (mode
&& (eho
= php_hash_fetch_ops(mode
, strlen(mode
)))) {
20 ctx
= emalloc(eho
->context_size
);
24 if (mode
&& ((!strcasecmp(mode
, "crc32")) || (!strcasecmp(mode
, "crc32b")))) {
25 ctx
= emalloc(sizeof(uint
));
27 } else if (mode
&& !strcasecmp(mode
, "sha1")) {
28 PHP_SHA1Init(ctx
= emalloc(sizeof(PHP_SHA1_CTX
)));
30 PHP_MD5Init(ctx
= emalloc(sizeof(PHP_MD5_CTX
)));
36 PHP_HTTP_API
char *php_http_etag_finish(void *ctx TSRMLS_DC
)
38 unsigned char digest
[128] = {0};
39 char *etag
= NULL
, *mode
= PHP_HTTP_G
->env
.etag_mode
;
41 #ifdef PHP_HTTP_HAVE_HASH
42 const php_hash_ops
*eho
= NULL
;
44 if (mode
&& (eho
= php_hash_fetch_ops(mode
, strlen(mode
)))) {
45 eho
->hash_final(digest
, ctx
);
46 etag
= php_http_etag_digest(digest
, eho
->digest_size
);
49 if (mode
&& ((!strcasecmp(mode
, "crc32")) || (!strcasecmp(mode
, "crc32b")))) {
50 *((uint
*) ctx
) = ~*((uint
*) ctx
);
51 etag
= php_http_etag_digest((const unsigned char *) ctx
, sizeof(uint
));
52 } else if (mode
&& (!strcasecmp(mode
, "sha1"))) {
53 PHP_SHA1Final(digest
, ctx
);
54 etag
= php_http_etag_digest(digest
, 20);
56 PHP_MD5Final(digest
, ctx
);
57 etag
= php_http_etag_digest(digest
, 16);
64 PHP_HTTP_API
size_t php_http_etag_update(void *ctx
, const char *data_ptr
, size_t data_len TSRMLS_DC
)
66 char *mode
= PHP_HTTP_G
->env
.etag_mode
;
67 #ifdef PHP_HTTP_HAVE_HASH
68 const php_hash_ops
*eho
= NULL
;
70 if (mode
&& (eho
= php_hash_fetch_ops(mode
, strlen(mode
)))) {
71 eho
->hash_update(ctx
, (const unsigned char *) data_ptr
, data_len
);
74 if (mode
&& ((!strcasecmp(mode
, "crc32")) || (!strcasecmp(mode
, "crc32b")))) {
75 uint i
, c
= *((uint
*) ctx
);
76 for (i
= 0; i
< data_len
; ++i
) {
77 CRC32(c
, data_ptr
[i
]);
80 } else if (mode
&& (!strcasecmp(mode
, "sha1"))) {
81 PHP_SHA1Update(ctx
, (const unsigned char *) data_ptr
, data_len
);
83 PHP_MD5Update(ctx
, (const unsigned char *) data_ptr
, data_len
);