2 +--------------------------------------------------------------------+
4 +--------------------------------------------------------------------+
5 | Redistribution and use in source and binary forms, with or without |
6 | modification, are permitted provided that the conditions mentioned |
7 | in the accompanying LICENSE file are met. |
8 +--------------------------------------------------------------------+
9 | Copyright (c) 2004-2014, Michael Wallner <mike@php.net> |
10 +--------------------------------------------------------------------+
13 #include "php_http_api.h"
15 #if PHP_HTTP_HAVE_HASH
16 # include "ext/hash/php_hash.h"
19 #include "ext/standard/crc32.h"
20 #include "ext/standard/sha1.h"
21 #include "ext/standard/md5.h"
23 php_http_etag_t
*php_http_etag_init(const char *mode
)
28 if (mode
&& (!strcasecmp(mode
, "crc32b"))) {
29 ctx
= emalloc(sizeof(uint
));
31 } else if (mode
&& !strcasecmp(mode
, "sha1")) {
32 PHP_SHA1Init(ctx
= emalloc(sizeof(PHP_SHA1_CTX
)));
33 } else if (mode
&& !strcasecmp(mode
, "md5")) {
34 PHP_MD5Init(ctx
= emalloc(sizeof(PHP_MD5_CTX
)));
36 #if PHP_HTTP_HAVE_HASH
37 const php_hash_ops
*eho
= NULL
;
39 if (mode
&& (eho
= php_hash_fetch_ops(mode
, strlen(mode
)))) {
40 ctx
= emalloc(eho
->context_size
);
47 e
= emalloc(sizeof(*e
));
49 e
->mode
= estrdup(mode
);
54 char *php_http_etag_finish(php_http_etag_t
*e
)
56 unsigned char digest
[128] = {0};
59 if (!strcasecmp(e
->mode
, "crc32b")) {
61 memcpy(&e_ctx
, e
->ctx
, 4);
62 e_ctx
= ntohl(~e_ctx
);
63 etag
= php_http_etag_digest((unsigned char *) &e_ctx
, 4);
64 } else if ((!strcasecmp(e
->mode
, "sha1"))) {
65 PHP_SHA1Final(digest
, e
->ctx
);
66 etag
= php_http_etag_digest(digest
, 20);
67 } else if ((!strcasecmp(e
->mode
, "md5"))) {
68 PHP_MD5Final(digest
, e
->ctx
);
69 etag
= php_http_etag_digest(digest
, 16);
71 #if PHP_HTTP_HAVE_HASH
72 const php_hash_ops
*eho
= NULL
;
74 if ((eho
= php_hash_fetch_ops(e
->mode
, strlen(e
->mode
)))) {
75 eho
->hash_final(digest
, e
->ctx
);
76 etag
= php_http_etag_digest(digest
, eho
->digest_size
);
88 size_t php_http_etag_update(php_http_etag_t
*e
, const char *data_ptr
, size_t data_len
)
90 if (!strcasecmp(e
->mode
, "crc32b")) {
91 uint i
, c
= *((uint
*) e
->ctx
);
92 for (i
= 0; i
< data_len
; ++i
) {
93 CRC32(c
, data_ptr
[i
]);
95 *((uint
*) e
->ctx
) = c
;
96 } else if ((!strcasecmp(e
->mode
, "sha1"))) {
97 PHP_SHA1Update(e
->ctx
, (const unsigned char *) data_ptr
, data_len
);
98 } else if ((!strcasecmp(e
->mode
, "md5"))) {
99 PHP_MD5Update(e
->ctx
, (const unsigned char *) data_ptr
, data_len
);
101 #if PHP_HTTP_HAVE_HASH
102 const php_hash_ops
*eho
= NULL
;
104 if ((eho
= php_hash_fetch_ops(e
->mode
, strlen(e
->mode
)))) {
105 eho
->hash_update(e
->ctx
, (const unsigned char *) data_ptr
, data_len
);
119 * vim600: noet sw=4 ts=4 fdm=marker
120 * vim<600: noet sw=4 ts=4