summaryrefslogtreecommitdiff
path: root/src/common/compress.c
diff options
context:
space:
mode:
authorAlexander Færøy <ahf@torproject.org>2017-04-18 22:19:29 +0200
committerNick Mathewson <nickm@torproject.org>2017-04-25 08:10:09 -0400
commit380736d045f85299121f044928170cff321ae852 (patch)
tree4b6590a5ee0a5c08e1e128fc8ee9bf0938e75bc8 /src/common/compress.c
parentce1feae9d9a4366e3cd93a68416841d0c6a636c5 (diff)
downloadtor-380736d045f85299121f044928170cff321ae852.tar.gz
tor-380736d045f85299121f044928170cff321ae852.zip
Add Zstandard support.
See: https://bugs.torproject.org/21662
Diffstat (limited to 'src/common/compress.c')
-rw-r--r--src/common/compress.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/common/compress.c b/src/common/compress.c
index 3c7a3c6392..dc86be7750 100644
--- a/src/common/compress.c
+++ b/src/common/compress.c
@@ -25,6 +25,7 @@
#include "compress.h"
#include "compress_lzma.h"
#include "compress_zlib.h"
+#include "compress_zstd.h"
/** @{ */
/* These macros define the maximum allowable compression factor. Anything of
@@ -85,6 +86,9 @@ tor_compress(char **out, size_t *out_len,
if (method == LZMA_METHOD)
return tor_lzma_compress(out, out_len, in, in_len, method);
+ if (method == ZSTD_METHOD)
+ return tor_zstd_compress(out, out_len, in, in_len, method);
+
return -1;
}
@@ -118,6 +122,12 @@ tor_uncompress(char **out, size_t *out_len,
complete_only,
protocol_warn_level);
+ if (method == ZSTD_METHOD)
+ return tor_zstd_uncompress(out, out_len, in, in_len,
+ method,
+ complete_only,
+ protocol_warn_level);
+
return -1;
}
@@ -136,6 +146,9 @@ detect_compression_method(const char *in, size_t in_len)
} else if (in_len > 3 &&
fast_memeq(in, "\x5d\x00\x00\x00", 4)) {
return LZMA_METHOD;
+ } else if (in_len > 3 &&
+ fast_memeq(in, "\x28\xb5\x2f\xfd", 4)) {
+ return ZSTD_METHOD;
} else {
return UNKNOWN_METHOD;
}
@@ -149,6 +162,7 @@ struct tor_compress_state_t {
union {
tor_zlib_compress_state_t *zlib_state;
tor_lzma_compress_state_t *lzma_state;
+ tor_zstd_compress_state_t *zstd_state;
} u; /**< Compression backend state. */
};
@@ -185,6 +199,16 @@ tor_compress_new(int compress, compress_method_t method,
state->u.lzma_state = lzma_state;
break;
}
+ case ZSTD_METHOD: {
+ tor_zstd_compress_state_t *zstd_state =
+ tor_zstd_compress_new(compress, method, compression_level);
+
+ if (zstd_state == NULL)
+ goto err;
+
+ state->u.zstd_state = zstd_state;
+ break;
+ }
case NO_METHOD:
case UNKNOWN_METHOD:
goto err;
@@ -226,6 +250,10 @@ tor_compress_process(tor_compress_state_t *state,
return tor_lzma_compress_process(state->u.lzma_state,
out, out_len, in, in_len,
finish);
+ case ZSTD_METHOD:
+ return tor_zstd_compress_process(state->u.zstd_state,
+ out, out_len, in, in_len,
+ finish);
case NO_METHOD:
case UNKNOWN_METHOD:
goto err;
@@ -250,6 +278,9 @@ tor_compress_free(tor_compress_state_t *state)
case LZMA_METHOD:
tor_lzma_compress_free(state->u.lzma_state);
break;
+ case ZSTD_METHOD:
+ tor_zstd_compress_free(state->u.zstd_state);
+ break;
case NO_METHOD:
case UNKNOWN_METHOD:
break;
@@ -270,6 +301,8 @@ tor_compress_state_size(const tor_compress_state_t *state)
return tor_zlib_compress_state_size(state->u.zlib_state);
case LZMA_METHOD:
return tor_lzma_compress_state_size(state->u.lzma_state);
+ case ZSTD_METHOD:
+ return tor_zstd_compress_state_size(state->u.zstd_state);
case NO_METHOD:
case UNKNOWN_METHOD:
goto err;