/src/samba/librpc/ndr/ndr_claims.c
Line | Count | Source |
1 | | #include "includes.h" |
2 | | #include "librpc/gen_ndr/ndr_claims.h" |
3 | | #include "librpc/ndr/ndr_claims.h" |
4 | | |
5 | | #include "librpc/ndr/ndr_compression.h" |
6 | | #include "lib/compression/lzxpress_huffman.h" |
7 | | |
8 | | enum ndr_compression_alg ndr_claims_compression_alg(enum CLAIMS_COMPRESSION_FORMAT wire_alg) |
9 | 869 | { |
10 | 869 | switch (wire_alg) { |
11 | 175 | case CLAIMS_COMPRESSION_FORMAT_NONE: |
12 | 175 | return NDR_COMPRESSION_NONE; |
13 | | |
14 | 0 | case CLAIMS_COMPRESSION_FORMAT_LZNT1: |
15 | 0 | return NDR_COMPRESSION_INVALID; |
16 | | |
17 | 0 | case CLAIMS_COMPRESSION_FORMAT_XPRESS: |
18 | 0 | return NDR_COMPRESSION_INVALID; |
19 | | |
20 | 666 | case CLAIMS_COMPRESSION_FORMAT_XPRESS_HUFF: |
21 | 666 | return NDR_COMPRESSION_XPRESS_HUFF_RAW; |
22 | 869 | } |
23 | 28 | return NDR_COMPRESSION_INVALID; |
24 | 869 | } |
25 | | |
26 | | static void ndr_claims_compressed_sizes(struct CLAIMS_SET_NDR *claims_set, |
27 | | enum CLAIMS_COMPRESSION_FORMAT wire_alg, |
28 | | int flags, |
29 | | ssize_t *_uncompressed_size, |
30 | | enum CLAIMS_COMPRESSION_FORMAT *_used_alg, |
31 | | ssize_t *_compressed_size) |
32 | 120 | { |
33 | 120 | TALLOC_CTX *frame = NULL; |
34 | 120 | DATA_BLOB tmp_blob; |
35 | 120 | uint8_t * tmp_compressed; |
36 | 120 | ssize_t compressed_size; |
37 | 120 | enum ndr_err_code ndr_err; |
38 | | |
39 | 120 | if (claims_set == NULL) { |
40 | 72 | *_uncompressed_size = 0; |
41 | 72 | *_used_alg = CLAIMS_COMPRESSION_FORMAT_NONE; |
42 | 72 | *_compressed_size = 0; |
43 | 72 | return; |
44 | 72 | } |
45 | | |
46 | 48 | frame = talloc_stackframe(); |
47 | | |
48 | 48 | ndr_err = ndr_push_struct_blob(&tmp_blob, |
49 | 48 | frame, |
50 | 48 | claims_set, |
51 | 48 | (ndr_push_flags_fn_t)ndr_push_CLAIMS_SET_NDR); |
52 | 48 | if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { |
53 | 0 | DBG_ERR("Failed to push claims while determining compressed size\n"); |
54 | 0 | *_uncompressed_size = -1; |
55 | 0 | *_used_alg = CLAIMS_COMPRESSION_FORMAT_NONE; |
56 | 0 | *_compressed_size = -1; |
57 | 0 | TALLOC_FREE(frame); |
58 | 0 | return; |
59 | 0 | } |
60 | | |
61 | 48 | if (tmp_blob.length < CLAIM_UPPER_COMPRESSION_THRESHOLD) { |
62 | 30 | *_uncompressed_size = tmp_blob.length; |
63 | 30 | *_used_alg = CLAIMS_COMPRESSION_FORMAT_NONE; |
64 | 30 | *_compressed_size = tmp_blob.length; |
65 | 30 | TALLOC_FREE(frame); |
66 | 30 | return; |
67 | 30 | } |
68 | | |
69 | 18 | switch (wire_alg) { |
70 | 18 | case CLAIMS_COMPRESSION_FORMAT_NONE: |
71 | 18 | *_uncompressed_size = tmp_blob.length; |
72 | 18 | *_used_alg = CLAIMS_COMPRESSION_FORMAT_NONE; |
73 | 18 | *_compressed_size = tmp_blob.length; |
74 | 18 | TALLOC_FREE(frame); |
75 | 18 | return; |
76 | | |
77 | 0 | case CLAIMS_COMPRESSION_FORMAT_XPRESS_HUFF: |
78 | 0 | compressed_size = lzxpress_huffman_compress_talloc(frame, |
79 | 0 | tmp_blob.data, |
80 | 0 | tmp_blob.length, |
81 | 0 | &tmp_compressed); |
82 | |
|
83 | 0 | if (compressed_size < 0) { |
84 | 0 | DBG_ERR("Failed to compress claims (for determining compressed size)\n"); |
85 | 0 | *_uncompressed_size = -1; |
86 | 0 | *_used_alg = CLAIMS_COMPRESSION_FORMAT_NONE; |
87 | 0 | *_compressed_size = -1; |
88 | 0 | TALLOC_FREE(frame); |
89 | 0 | return; |
90 | 0 | } |
91 | 0 | if (compressed_size >= tmp_blob.length) { |
92 | 0 | *_uncompressed_size = tmp_blob.length; |
93 | 0 | *_used_alg = CLAIMS_COMPRESSION_FORMAT_NONE; |
94 | 0 | *_compressed_size = tmp_blob.length; |
95 | 0 | TALLOC_FREE(frame); |
96 | 0 | return; |
97 | 0 | } |
98 | | |
99 | 0 | *_uncompressed_size = tmp_blob.length; |
100 | 0 | *_used_alg = CLAIMS_COMPRESSION_FORMAT_XPRESS_HUFF; |
101 | 0 | *_compressed_size = compressed_size; |
102 | 0 | TALLOC_FREE(frame); |
103 | 0 | return; |
104 | | |
105 | 0 | default: |
106 | 0 | DBG_ERR("Invalid chosen compression algorithm while determining compressed claim size\n"); |
107 | 0 | *_uncompressed_size = -1; |
108 | 0 | *_used_alg = CLAIMS_COMPRESSION_FORMAT_NONE; |
109 | 0 | *_compressed_size = -1; |
110 | 0 | TALLOC_FREE(frame); |
111 | 0 | return; |
112 | 18 | } |
113 | 18 | } |
114 | | |
115 | | enum CLAIMS_COMPRESSION_FORMAT ndr_claims_actual_wire_compression_alg(enum CLAIMS_COMPRESSION_FORMAT specified_compression, |
116 | | struct CLAIMS_SET_NDR *claims_set, |
117 | | int flags) |
118 | 68 | { |
119 | 68 | ssize_t uncompressed_size = -1; |
120 | 68 | enum CLAIMS_COMPRESSION_FORMAT used_alg = CLAIMS_COMPRESSION_FORMAT_NONE; |
121 | 68 | ssize_t compressed_size = -1; |
122 | | |
123 | 68 | ndr_claims_compressed_sizes(claims_set, |
124 | 68 | specified_compression, |
125 | 68 | flags, |
126 | 68 | &uncompressed_size, |
127 | 68 | &used_alg, |
128 | 68 | &compressed_size); |
129 | | |
130 | 68 | return used_alg; |
131 | 68 | } |
132 | | |
133 | | size_t ndr_claims_compressed_size(struct CLAIMS_SET_NDR *claims_set, |
134 | | enum CLAIMS_COMPRESSION_FORMAT wire_alg, |
135 | | int flags) |
136 | 52 | { |
137 | 52 | ssize_t uncompressed_size = -1; |
138 | 52 | enum CLAIMS_COMPRESSION_FORMAT used_alg = CLAIMS_COMPRESSION_FORMAT_NONE; |
139 | 52 | ssize_t compressed_size = -1; |
140 | | |
141 | 52 | ndr_claims_compressed_sizes(claims_set, |
142 | 52 | wire_alg, |
143 | 52 | flags, |
144 | 52 | &uncompressed_size, |
145 | 52 | &used_alg, |
146 | 52 | &compressed_size); |
147 | 52 | if (uncompressed_size == -1) { |
148 | 0 | DBG_ERR("Failed to push claims while determining compressed size\n"); |
149 | 0 | return 0; |
150 | 0 | } |
151 | | |
152 | 52 | return compressed_size; |
153 | 52 | } |
154 | | |
155 | | _PUBLIC_ enum ndr_err_code ndr_push_claims_tf_rule_set(struct ndr_push *ndr, ndr_flags_type ndr_flags, const struct claims_tf_rule_set *r) |
156 | 0 | { |
157 | 0 | return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, |
158 | 0 | "ndr_push_claims_tf_rule_set() not implemented"); |
159 | 0 | } |
160 | | |
161 | | _PUBLIC_ enum ndr_err_code ndr_pull_claims_tf_rule_set(struct ndr_pull *ndr, ndr_flags_type ndr_flags, struct claims_tf_rule_set *r) |
162 | 1 | { |
163 | | return ndr_pull_error(ndr, NDR_ERR_INVALID_POINTER, |
164 | 1 | "ndr_pull_claims_tf_rule_set() not implemented"); |
165 | 1 | } |