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.EncryptedData;
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 public class KrbPriv extends KerberosMessage
54 {
55
56 private static final Logger log = LoggerFactory.getLogger( KrbError.class );
57
58
59 private static final boolean IS_DEBUG = log.isDebugEnabled();
60
61
62 private EncryptedData encPart;
63
64
65 private int pvnoLen;
66 private int msgTypeLength;
67 private int encPartLen;
68 private int krbPrivSeqLen;
69 private int krbPrivLen;
70
71
72
73
74
75 public KrbPriv()
76 {
77 super( 5, KerberosMessageType.KRB_PRIV );
78 }
79
80
81
82
83
84 public EncryptedData getEncPart()
85 {
86 return encPart;
87 }
88
89
90
91
92
93 public void setEncPart( EncryptedData encPart )
94 {
95 this.encPart = encPart;
96 }
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119 @Override
120 public int computeLength()
121 {
122 pvnoLen = 1 + 1 + 1;
123 krbPrivSeqLen = 1 + TLV.getNbBytes( pvnoLen ) + pvnoLen;
124
125 msgTypeLength = 1 + 1 + BerValue.getNbBytes( getMessageType().getValue() );
126 krbPrivSeqLen += 1 + TLV.getNbBytes( msgTypeLength ) + msgTypeLength;
127
128 encPartLen = encPart.computeLength();
129 krbPrivSeqLen += 1 + TLV.getNbBytes( encPartLen ) + encPartLen;
130
131 krbPrivLen += 1 + TLV.getNbBytes( krbPrivSeqLen ) + krbPrivSeqLen;
132
133 return 1 + TLV.getNbBytes( krbPrivLen ) + krbPrivLen;
134 }
135
136
137
138
139
140 @Override
141 public ByteBuffer encode( ByteBuffer buffer ) throws EncoderException
142 {
143 if ( buffer == null )
144 {
145 throw new EncoderException( I18n.err( I18n.ERR_148 ) );
146 }
147
148 try
149 {
150
151 buffer.put( ( byte ) KerberosConstants.KRB_PRIV_TAG );
152 buffer.put( TLV.getBytes( krbPrivLen ) );
153
154
155 buffer.put( UniversalTag.SEQUENCE.getValue() );
156 buffer.put( TLV.getBytes( krbPrivSeqLen ) );
157
158
159 buffer.put( ( byte ) KerberosConstants.KRB_PRIV_PVNO_TAG );
160 buffer.put( TLV.getBytes( pvnoLen ) );
161 BerValue.encode( buffer, getProtocolVersionNumber() );
162
163
164 buffer.put( ( byte ) KerberosConstants.KRB_PRIV_MSGTYPE_TAG );
165 buffer.put( TLV.getBytes( msgTypeLength ) );
166 BerValue.encode( buffer, getMessageType().getValue() );
167
168
169 buffer.put( ( byte ) KerberosConstants.KRB_PRIV_ENC_PART_TAG );
170 buffer.put( TLV.getBytes( encPartLen ) );
171 encPart.encode( buffer );
172 }
173 catch ( BufferOverflowException boe )
174 {
175 log.error( I18n.err( I18n.ERR_738_CANNOT_ENCODE_KRB_PRIV, 1 + TLV.getNbBytes( krbPrivLen )
176 + krbPrivLen, buffer.capacity() ) );
177 throw new EncoderException( I18n.err( I18n.ERR_138 ), boe );
178 }
179
180 if ( IS_DEBUG )
181 {
182 log.debug( "KrbPriv encoding : {}", Strings.dumpBytes( buffer.array() ) );
183 log.debug( "KrbPriv initial value : {}", this );
184 }
185
186 return buffer;
187 }
188
189
190
191
192
193 public String toString()
194 {
195 StringBuilder sb = new StringBuilder();
196
197 sb.append( "KRB-PRIV : {\n" );
198 sb.append( " pvno: " ).append( getProtocolVersionNumber() ).append( '\n' );
199 sb.append( " msgType: " ).append( getMessageType() ).append( '\n' );
200 sb.append( " msgType: " ).append( getEncPart() ).append( '\n' );
201 sb.append( "}\n" );
202
203 return sb.toString();
204 }
205 }