[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[or-cvs] Add some incremental encryption wrappers to torgzip code
Update of /home/or/cvsroot/tor/src/common
In directory moria:/tmp/cvs-serv22344/src/common
Modified Files:
torgzip.c torgzip.h
Log Message:
Add some incremental encryption wrappers to torgzip code
Index: torgzip.c
===================================================================
RCS file: /home/or/cvsroot/tor/src/common/torgzip.c,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -p -d -r1.33 -r1.34
--- torgzip.c 3 Jun 2006 18:52:31 -0000 1.33
+++ torgzip.c 18 Jun 2006 07:24:29 -0000 1.34
@@ -282,3 +282,95 @@ detect_compression_method(const char *in
}
}
+struct tor_zlib_state_t {
+ struct z_stream_s stream;
+ int compress;
+};
+
+/** DOCDOC */
+tor_zlib_state_t *
+tor_zlib_new(int compress, compress_method_t method)
+{
+ tor_zlib_state_t *out;
+
+ if (method == GZIP_METHOD && !is_gzip_supported()) {
+ /* Old zlib version don't support gzip in inflateInit2 */
+ log_warn(LD_GENERAL, "Gzip not supported with zlib %s", ZLIB_VERSION);
+ return NULL;
+ }
+
+ out = tor_malloc_zero(sizeof(tor_zlib_state_t));
+ out->stream.zalloc = Z_NULL;
+ out->stream.zfree = Z_NULL;
+ out->stream.opaque = NULL;
+ out->compress = compress;
+ if (compress) {
+ if (deflateInit2(&out->stream, Z_BEST_COMPRESSION, Z_DEFLATED,
+ method_bits(method), 8, Z_DEFAULT_STRATEGY) != Z_OK)
+ goto err;
+ } else {
+ if (inflateInit2(&out->stream, method_bits(method)) != Z_OK)
+ goto err;
+ }
+ return out;
+
+ err:
+ tor_free(out);
+ return NULL;
+}
+
+/** DOCDOC */
+tor_zlib_output_t
+tor_zlib_process(tor_zlib_state_t *state,
+ char **out, size_t *out_len,
+ const char **in, size_t *in_len,
+ int finish)
+{
+ int err;
+ state->stream.next_in = (unsigned char*) *in;
+ state->stream.avail_in = *in_len;
+ state->stream.next_out = (unsigned char*) *out;
+ state->stream.avail_out = *out_len;
+
+ if (state->compress) {
+ err = deflate(&state->stream, finish ? Z_FINISH : Z_SYNC_FLUSH);
+ } else {
+ err = inflate(&state->stream, finish ? Z_FINISH : Z_SYNC_FLUSH);
+ }
+
+ *out = (char*) state->stream.next_out;
+ *out_len = state->stream.avail_out;
+ *in = (const char *) state->stream.next_in;
+ *in_len = state->stream.avail_in;
+
+ switch (err)
+ {
+ case Z_STREAM_END:
+ return TOR_ZLIB_DONE;
+ case Z_BUF_ERROR:
+ return TOR_ZLIB_BUF_FULL;
+ case Z_OK:
+ if (state->stream.avail_out == 0)
+ return TOR_ZLIB_BUF_FULL;
+ return TOR_ZLIB_OK;
+ default:
+ log_warn(LD_GENERAL, "Gzip returned an error: %s",
+ state->stream.msg ? state->stream.msg : "<no message>");
+ return TOR_ZLIB_ERR;
+ }
+}
+
+/** DOCDOC */
+void
+tor_zlib_free(tor_zlib_state_t *state)
+{
+ tor_assert(state);
+
+ if (state->compress)
+ deflateEnd(&state->stream);
+ else
+ inflateEnd(&state->stream);
+
+ tor_free(state);
+}
+
Index: torgzip.h
===================================================================
RCS file: /home/or/cvsroot/tor/src/common/torgzip.h,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -p -d -r1.10 -r1.11
--- torgzip.h 12 Feb 2006 23:43:17 -0000 1.10
+++ torgzip.h 18 Jun 2006 07:24:29 -0000 1.11
@@ -31,5 +31,17 @@ int is_gzip_supported(void);
int detect_compression_method(const char *in, size_t in_len);
+typedef enum {
+ TOR_ZLIB_OK, TOR_ZLIB_DONE, TOR_ZLIB_BUF_FULL, TOR_ZLIB_ERR
+} tor_zlib_output_t;
+typedef struct tor_zlib_state_t tor_zlib_state_t;
+tor_zlib_state_t *tor_zlib_new(int compress, compress_method_t method);
+
+tor_zlib_output_t tor_zlib_process(tor_zlib_state_t *state,
+ char **out, size_t *out_len,
+ const char **in, size_t *in_len,
+ int finish);
+void tor_zlib_free(tor_zlib_state_t *state);
+
#endif