summaryrefslogtreecommitdiff
path: root/librpc/ndr/ndr_claims.c
blob: 6bafbbe1f856719569efae6f7f698a4e21ab1d00 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include "includes.h"
#include "bin/default/librpc/gen_ndr/ndr_claims.h"
#include "librpc/ndr/ndr_claims.h"

#include "librpc/ndr/ndr_compression.h"
#include "lib/compression/lzxpress_huffman.h"

enum ndr_compression_alg ndr_claims_compression_alg(enum CLAIMS_COMPRESSION_FORMAT wire_alg)
{
	switch (wire_alg) {
	case CLAIMS_COMPRESSION_FORMAT_NONE:
		return NDR_COMPRESSION_NONE;

	case CLAIMS_COMPRESSION_FORMAT_LZNT1:
		return NDR_COMPRESSION_INVALID;

	case CLAIMS_COMPRESSION_FORMAT_XPRESS:
		return NDR_COMPRESSION_INVALID;

	case CLAIMS_COMPRESSION_FORMAT_XPRESS_HUFF:
		return NDR_COMPRESSION_XPRESS_HUFF_RAW;
	}
	return NDR_COMPRESSION_INVALID;
}


enum CLAIMS_COMPRESSION_FORMAT ndr_claims_actual_wire_compression_alg(enum CLAIMS_COMPRESSION_FORMAT specified_compression,
								      size_t uncompressed_claims_size) {
	if (uncompressed_claims_size < CLAIM_MINIMUM_BYTES_TO_COMPRESS) {
		return CLAIMS_COMPRESSION_FORMAT_NONE;
	}

	return specified_compression;
}

size_t ndr_claims_compressed_size(struct CLAIMS_SET_NDR *claims_set,
				  enum CLAIMS_COMPRESSION_FORMAT wire_alg,
				  int flags)
{
	TALLOC_CTX *frame = NULL;
	DATA_BLOB tmp_blob;
	uint8_t * tmp_compressed;
	ssize_t compressed_size;
	enum ndr_err_code ndr_err;
	enum CLAIMS_COMPRESSION_FORMAT actual_wire_alg;

	if (claims_set == NULL) {
		return 0;
	}

	frame = talloc_stackframe();

	ndr_err = ndr_push_struct_blob(&tmp_blob,
				       frame,
				       claims_set,
				       (ndr_push_flags_fn_t)ndr_push_CLAIMS_SET_NDR);
	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
		DBG_ERR("Failed to push claims while determining compressed size");
		TALLOC_FREE(frame);
		return 0;
	}

	actual_wire_alg = ndr_claims_actual_wire_compression_alg(wire_alg,
								 tmp_blob.length);

	switch (actual_wire_alg) {
	case CLAIMS_COMPRESSION_FORMAT_NONE:
		TALLOC_FREE(frame);
		return tmp_blob.length;

	case CLAIMS_COMPRESSION_FORMAT_XPRESS_HUFF:
		compressed_size = lzxpress_huffman_compress_talloc(frame,
								   tmp_blob.data,
								   tmp_blob.length,
								   &tmp_compressed);

		TALLOC_FREE(frame);

		if (compressed_size < 0) {
			DBG_ERR("Failed to compress claims (for determining compressed size)");
			return 0;
		}
		return compressed_size;

	default:
		TALLOC_FREE(frame);
		DBG_ERR("Invalid chosen compression algorithm while determining compressed claim size");
		return 0;
	}
}