2 #include "librpc/gen_ndr/ndr_claims.h"
3 #include "librpc/ndr/ndr_claims.h"
5 #include "librpc/ndr/ndr_compression.h"
6 #include "lib/compression/lzxpress_huffman.h"
8 enum ndr_compression_alg
ndr_claims_compression_alg(enum CLAIMS_COMPRESSION_FORMAT wire_alg
)
11 case CLAIMS_COMPRESSION_FORMAT_NONE
:
12 return NDR_COMPRESSION_NONE
;
14 case CLAIMS_COMPRESSION_FORMAT_LZNT1
:
15 return NDR_COMPRESSION_INVALID
;
17 case CLAIMS_COMPRESSION_FORMAT_XPRESS
:
18 return NDR_COMPRESSION_INVALID
;
20 case CLAIMS_COMPRESSION_FORMAT_XPRESS_HUFF
:
21 return NDR_COMPRESSION_XPRESS_HUFF_RAW
;
23 return NDR_COMPRESSION_INVALID
;
27 enum CLAIMS_COMPRESSION_FORMAT
ndr_claims_actual_wire_compression_alg(enum CLAIMS_COMPRESSION_FORMAT specified_compression
,
28 size_t uncompressed_claims_size
) {
29 if (uncompressed_claims_size
< CLAIM_UPPER_COMPRESSION_THRESHOLD
) {
30 return CLAIMS_COMPRESSION_FORMAT_NONE
;
33 return specified_compression
;
36 size_t ndr_claims_compressed_size(struct CLAIMS_SET_NDR
*claims_set
,
37 enum CLAIMS_COMPRESSION_FORMAT wire_alg
,
40 TALLOC_CTX
*frame
= NULL
;
42 uint8_t * tmp_compressed
;
43 ssize_t compressed_size
;
44 enum ndr_err_code ndr_err
;
45 enum CLAIMS_COMPRESSION_FORMAT actual_wire_alg
;
47 if (claims_set
== NULL
) {
51 frame
= talloc_stackframe();
53 ndr_err
= ndr_push_struct_blob(&tmp_blob
,
56 (ndr_push_flags_fn_t
)ndr_push_CLAIMS_SET_NDR
);
57 if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err
)) {
58 DBG_ERR("Failed to push claims while determining compressed size\n");
63 actual_wire_alg
= ndr_claims_actual_wire_compression_alg(wire_alg
,
66 switch (actual_wire_alg
) {
67 case CLAIMS_COMPRESSION_FORMAT_NONE
:
69 return tmp_blob
.length
;
71 case CLAIMS_COMPRESSION_FORMAT_XPRESS_HUFF
:
72 compressed_size
= lzxpress_huffman_compress_talloc(frame
,
79 if (compressed_size
< 0) {
80 DBG_ERR("Failed to compress claims (for determining compressed size)\n");
83 return compressed_size
;
87 DBG_ERR("Invalid chosen compression algorithm while determining compressed claim size\n");