1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.apache.directory.shared.kerberos.components;
22
23
24 import java.nio.BufferOverflowException;
25 import java.nio.ByteBuffer;
26
27 import org.apache.directory.api.asn1.Asn1Object;
28 import org.apache.directory.api.asn1.EncoderException;
29 import org.apache.directory.api.asn1.ber.tlv.BerValue;
30 import org.apache.directory.api.asn1.ber.tlv.TLV;
31 import org.apache.directory.api.asn1.ber.tlv.UniversalTag;
32 import org.apache.directory.api.util.Strings;
33 import org.apache.directory.server.i18n.I18n;
34 import org.apache.directory.shared.kerberos.KerberosConstants;
35 import org.apache.directory.shared.kerberos.KerberosTime;
36 import org.slf4j.Logger;
37 import org.slf4j.LoggerFactory;
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57 public class EncKrbPrivPart implements Asn1Object
58 {
59
60 private static final Logger log = LoggerFactory.getLogger( EncKrbPrivPart.class );
61
62
63 private static final boolean IS_DEBUG = log.isDebugEnabled();
64
65
66 private byte[] userData;
67
68
69 private KerberosTime timestamp;
70
71
72 private Integer usec;
73
74
75 private Integer seqNumber;
76
77
78 private HostAddress senderAddress;
79
80
81 private HostAddress recipientAddress;
82
83
84 private int userDataLen;
85 private int timestampLen;
86 private int usecLen;
87 private int seqNumberLen;
88 private int senderAddressLen;
89 private int recipientAddressLen;
90 private int encKrbPrivPartSeqLen;
91 private int encKrbPrivPartLen;
92
93
94
95
96
97 public byte[] getUserData()
98 {
99 return userData;
100 }
101
102
103
104
105
106 public void setUserData( byte[] userData )
107 {
108 this.userData = userData;
109 }
110
111
112
113
114
115 public KerberosTime getTimestamp()
116 {
117 return timestamp;
118 }
119
120
121
122
123
124 public void setTimestamp( KerberosTime timestamp )
125 {
126 this.timestamp = timestamp;
127 }
128
129
130
131
132
133 public int getUsec()
134 {
135 if ( usec == null )
136 {
137 return 0;
138 }
139
140 return usec;
141 }
142
143
144
145
146
147 public void setUsec( int usec )
148 {
149 this.usec = usec;
150 }
151
152
153
154
155
156 public int getSeqNumber()
157 {
158 if ( seqNumber == null )
159 {
160 return 0;
161 }
162
163 return seqNumber;
164 }
165
166
167
168
169
170 public void setSeqNumber( int seqNumber )
171 {
172 this.seqNumber = seqNumber;
173 }
174
175
176
177
178
179 public HostAddress getSenderAddress()
180 {
181 return senderAddress;
182 }
183
184
185
186
187
188 public void setSenderAddress( HostAddress senderAddress )
189 {
190 this.senderAddress = senderAddress;
191 }
192
193
194
195
196
197 public HostAddress getRecipientAddress()
198 {
199 return recipientAddress;
200 }
201
202
203
204
205
206 public void setRecipientAddress( HostAddress recipientAddress )
207 {
208 this.recipientAddress = recipientAddress;
209 }
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246 @Override
247 public int computeLength()
248 {
249 userDataLen = 1 + TLV.getNbBytes( userData.length ) + userData.length;
250 encKrbPrivPartSeqLen = 1 + TLV.getNbBytes( userDataLen ) + userDataLen;
251
252 senderAddressLen = senderAddress.computeLength();
253 encKrbPrivPartSeqLen += 1 + TLV.getNbBytes( senderAddressLen ) + senderAddressLen;
254
255 if ( timestamp != null )
256 {
257 timestampLen = timestamp.getBytes().length;
258 timestampLen = 1 + TLV.getNbBytes( timestampLen ) + timestampLen;
259 encKrbPrivPartSeqLen += 1 + TLV.getNbBytes( timestampLen ) + timestampLen;
260 }
261
262 if ( usec != null )
263 {
264 usecLen = BerValue.getNbBytes( usec );
265 usecLen = 1 + TLV.getNbBytes( usecLen ) + usecLen;
266 encKrbPrivPartSeqLen += 1 + TLV.getNbBytes( usecLen ) + usecLen;
267 }
268
269 if ( seqNumber != null )
270 {
271 seqNumberLen = BerValue.getNbBytes( seqNumber );
272 seqNumberLen = 1 + TLV.getNbBytes( seqNumberLen ) + seqNumberLen;
273 encKrbPrivPartSeqLen += 1 + TLV.getNbBytes( seqNumberLen ) + seqNumberLen;
274 }
275
276 if ( recipientAddress != null )
277 {
278 recipientAddressLen = recipientAddress.computeLength();
279 encKrbPrivPartSeqLen += 1 + TLV.getNbBytes( recipientAddressLen ) + recipientAddressLen;
280 }
281
282 encKrbPrivPartLen = 1 + TLV.getNbBytes( encKrbPrivPartSeqLen ) + encKrbPrivPartSeqLen;
283
284 return 1 + TLV.getNbBytes( encKrbPrivPartLen ) + encKrbPrivPartLen;
285 }
286
287
288
289
290
291 @Override
292 public ByteBuffer encode( ByteBuffer buffer ) throws EncoderException
293 {
294 if ( buffer == null )
295 {
296 throw new EncoderException( I18n.err( I18n.ERR_148 ) );
297 }
298
299 try
300 {
301 buffer.put( ( byte ) KerberosConstants.ENC_KRB_PRIV_PART_TAG );
302 buffer.put( TLV.getBytes( encKrbPrivPartLen ) );
303
304 buffer.put( UniversalTag.SEQUENCE.getValue() );
305 buffer.put( TLV.getBytes( encKrbPrivPartSeqLen ) );
306
307
308 buffer.put( ( byte ) KerberosConstants.KRB_SAFE_BODY_USER_DATA_TAG );
309 buffer.put( TLV.getBytes( userDataLen ) );
310 BerValue.encode( buffer, userData );
311
312 if ( timestamp != null )
313 {
314
315 buffer.put( ( byte ) KerberosConstants.KRB_SAFE_BODY_TIMESTAMP_TAG );
316 buffer.put( TLV.getBytes( timestampLen ) );
317
318
319 buffer.put( UniversalTag.GENERALIZED_TIME.getValue() );
320 buffer.put( ( byte ) 0x0F );
321 buffer.put( timestamp.getBytes() );
322 }
323
324 if ( usec != null )
325 {
326
327 buffer.put( ( byte ) KerberosConstants.KRB_SAFE_BODY_USEC_TAG );
328 buffer.put( TLV.getBytes( usecLen ) );
329 BerValue.encode( buffer, usec );
330 }
331
332 if ( seqNumber != null )
333 {
334
335 buffer.put( ( byte ) KerberosConstants.KRB_SAFE_BODY_SEQ_NUMBER_TAG );
336 buffer.put( TLV.getBytes( seqNumberLen ) );
337 BerValue.encode( buffer, seqNumber );
338 }
339
340
341 buffer.put( ( byte ) KerberosConstants.KRB_SAFE_BODY_SENDER_ADDRESS_TAG );
342 buffer.put( TLV.getBytes( senderAddressLen ) );
343 senderAddress.encode( buffer );
344
345 if ( recipientAddress != null )
346 {
347
348 buffer.put( ( byte ) KerberosConstants.KRB_SAFE_BODY_RECIPIENT_ADDRESS_TAG );
349 buffer.put( TLV.getBytes( recipientAddressLen ) );
350 recipientAddress.encode( buffer );
351 }
352 }
353 catch ( BufferOverflowException boe )
354 {
355 log.error( I18n.err( I18n.ERR_735_CANNOT_ENCODE_KRBSAFEBODY, 1 + TLV.getNbBytes( encKrbPrivPartLen )
356 + encKrbPrivPartLen, buffer.capacity() ) );
357 throw new EncoderException( I18n.err( I18n.ERR_138 ), boe );
358 }
359
360 if ( IS_DEBUG )
361 {
362 log.debug( "EncKrbPrivPart encoding : {}", Strings.dumpBytes( buffer.array() ) );
363 log.debug( "EncKrbPrivPart initial value : {}", this );
364 }
365
366 return buffer;
367 }
368
369
370
371
372
373 public String toString()
374 {
375 StringBuilder sb = new StringBuilder();
376
377 sb.append( "EncKrbPrivPart : {\n" );
378 sb.append( " user-data: " ).append( Strings.dumpBytes( userData ) ).append( '\n' );
379
380 if ( timestamp != null )
381 {
382 sb.append( " timestamp: " ).append( timestamp.getDate() ).append( '\n' );
383 }
384
385 if ( usec != null )
386 {
387 sb.append( " usec: " ).append( usec ).append( '\n' );
388 }
389
390 if ( seqNumber != null )
391 {
392 sb.append( " seq-number: " ).append( seqNumber ).append( '\n' );
393 }
394
395 sb.append( " s-address: " ).append( senderAddress ).append( '\n' );
396
397 if ( recipientAddress != null )
398 {
399 sb.append( " r-address: " ).append( recipientAddress ).append( '\n' );
400 }
401
402 sb.append( "}\n" );
403
404 return sb.toString();
405 }
406 }