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.messages;
22
23
24 import java.nio.BufferOverflowException;
25 import java.nio.ByteBuffer;
26
27 import org.apache.directory.api.asn1.EncoderException;
28 import org.apache.directory.api.asn1.ber.tlv.BerValue;
29 import org.apache.directory.api.asn1.ber.tlv.TLV;
30 import org.apache.directory.api.asn1.ber.tlv.UniversalTag;
31 import org.apache.directory.api.util.Strings;
32 import org.apache.directory.server.i18n.I18n;
33 import org.apache.directory.shared.kerberos.KerberosConstants;
34 import org.apache.directory.shared.kerberos.KerberosMessageType;
35 import org.apache.directory.shared.kerberos.components.Checksum;
36 import org.apache.directory.shared.kerberos.components.KrbSafeBody;
37 import org.slf4j.Logger;
38 import org.slf4j.LoggerFactory;
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 public class KrbSafe extends KerberosMessage
55 {
56
57 private static final Logger log = LoggerFactory.getLogger( KrbError.class );
58
59
60 private static final boolean IS_DEBUG = log.isDebugEnabled();
61
62
63 private KrbSafeBody krbSafeBody;
64
65
66 private Checksum checksum;
67
68
69 private int pvnoLen;
70 private int msgTypeLength;
71 private int krbSafeBodyLen;
72 private int checksumLen;
73 private int krbSafeSeqLen;
74 private int krbSafeLen;
75
76
77
78
79
80 public KrbSafe()
81 {
82 super( KerberosMessageType.KRB_SAFE );
83 }
84
85
86
87
88
89 public KrbSafeBody getSafeBody()
90 {
91 return krbSafeBody;
92 }
93
94
95
96
97
98 public void setSafeBody( KrbSafeBody safeBody )
99 {
100 this.krbSafeBody = safeBody;
101 }
102
103
104
105
106
107 public Checksum getChecksum()
108 {
109 return checksum;
110 }
111
112
113
114
115
116 public void setChecksum( Checksum checksum )
117 {
118 this.checksum = checksum;
119 }
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148 @Override
149 public int computeLength()
150 {
151 pvnoLen = 1 + 1 + 1;
152 krbSafeSeqLen = 1 + TLV.getNbBytes( pvnoLen ) + pvnoLen;
153
154 msgTypeLength = 1 + 1 + BerValue.getNbBytes( getMessageType().getValue() );
155 krbSafeSeqLen += 1 + TLV.getNbBytes( msgTypeLength ) + msgTypeLength;
156
157 krbSafeBodyLen = krbSafeBody.computeLength();
158 krbSafeSeqLen += 1 + TLV.getNbBytes( krbSafeBodyLen ) + krbSafeBodyLen;
159
160 checksumLen = checksum.computeLength();
161 krbSafeSeqLen += 1 + TLV.getNbBytes( checksumLen ) + checksumLen;
162
163 krbSafeLen = 1 + TLV.getNbBytes( krbSafeSeqLen ) + krbSafeSeqLen;
164
165 return 1 + TLV.getNbBytes( krbSafeLen ) + krbSafeLen;
166 }
167
168
169
170
171
172 @Override
173 public ByteBuffer encode( ByteBuffer buffer ) throws EncoderException
174 {
175 if ( buffer == null )
176 {
177 throw new EncoderException( I18n.err( I18n.ERR_148 ) );
178 }
179
180 try
181 {
182
183 buffer.put( ( byte ) KerberosConstants.KRB_SAFE_TAG );
184 buffer.put( TLV.getBytes( krbSafeLen ) );
185
186
187 buffer.put( UniversalTag.SEQUENCE.getValue() );
188 buffer.put( TLV.getBytes( krbSafeSeqLen ) );
189
190
191 buffer.put( ( byte ) KerberosConstants.KRB_SAFE_PVNO_TAG );
192 buffer.put( TLV.getBytes( pvnoLen ) );
193 BerValue.encode( buffer, getProtocolVersionNumber() );
194
195
196 buffer.put( ( byte ) KerberosConstants.KRB_SAFE_MSGTYPE_TAG );
197 buffer.put( TLV.getBytes( msgTypeLength ) );
198 BerValue.encode( buffer, getMessageType().getValue() );
199
200
201 buffer.put( ( byte ) KerberosConstants.KRB_SAFE_SAFE_BODY_TAG );
202 buffer.put( TLV.getBytes( krbSafeBodyLen ) );
203 krbSafeBody.encode( buffer );
204
205
206 buffer.put( ( byte ) KerberosConstants.KRB_SAFE_CKSUM_TAG );
207 buffer.put( TLV.getBytes( checksumLen ) );
208 checksum.encode( buffer );
209 }
210 catch ( BufferOverflowException boe )
211 {
212 log.error( I18n.err( I18n.ERR_736_CANNOT_ENCODE_KRBSAFE, 1 + TLV.getNbBytes( krbSafeLen )
213 + krbSafeLen, buffer.capacity() ) );
214 throw new EncoderException( I18n.err( I18n.ERR_138 ), boe );
215 }
216
217 if ( IS_DEBUG )
218 {
219 log.debug( "KrbSafe encoding : {}", Strings.dumpBytes( buffer.array() ) );
220 log.debug( "KrbSafe initial value : {}", this );
221 }
222
223 return buffer;
224 }
225
226
227
228
229
230 public String toString()
231 {
232 StringBuilder sb = new StringBuilder();
233
234 sb.append( "KRB-SAFE : {\n" );
235 sb.append( " pvno: " ).append( getProtocolVersionNumber() ).append( '\n' );
236 sb.append( " msgType: " ).append( getMessageType() ).append( '\n' );
237
238 if ( krbSafeBody != null )
239 {
240 sb.append( " safe-body: " ).append( krbSafeBody ).append( '\n' );
241 }
242
243 if ( checksum != null )
244 {
245 sb.append( " cusec: " ).append( checksum ).append( '\n' );
246 }
247
248 sb.append( "}\n" );
249
250 return sb.toString();
251 }
252 }