SPNEGO: Minor code refactoring

This commit is contained in:
Tal Aloni 2017-09-23 16:11:32 +03:00
parent 4ef809ea68
commit eb92e824ac
3 changed files with 28 additions and 30 deletions

View file

@ -48,7 +48,7 @@ namespace SMBLibrary.Authentication.GSSAPI
{ {
token.MechanismTypeList.Add(mechanism.Identifier); token.MechanismTypeList.Add(mechanism.Identifier);
} }
return SimpleProtectedNegotiationToken.GetTokenBytes(token); return token.GetBytes(true);
} }
public virtual NTStatus AcceptSecurityContext(ref GSSContext context, byte[] inputToken, out byte[] outputToken) public virtual NTStatus AcceptSecurityContext(ref GSSContext context, byte[] inputToken, out byte[] outputToken)

View file

@ -19,6 +19,32 @@ namespace SMBLibrary.Authentication.GSSAPI
public abstract byte[] GetBytes(); public abstract byte[] GetBytes();
/// <param name="includeHeader">Prepend the generic GSSAPI header. Required for negTokenInit, optional for negTokenResp.</param>
public byte[] GetBytes(bool includeHeader)
{
byte[] tokenBytes = this.GetBytes();
if (includeHeader)
{
int objectIdentifierFieldSize = DerEncodingHelper.GetLengthFieldSize(SPNEGOIdentifier.Length);
int tokenLength = 1 + objectIdentifierFieldSize + SPNEGOIdentifier.Length + tokenBytes.Length;
int tokenLengthFieldSize = DerEncodingHelper.GetLengthFieldSize(tokenLength);
int headerLength = 1 + tokenLengthFieldSize + 1 + objectIdentifierFieldSize + SPNEGOIdentifier.Length;
byte[] buffer = new byte[headerLength + tokenBytes.Length];
int offset = 0;
ByteWriter.WriteByte(buffer, ref offset, ApplicationTag);
DerEncodingHelper.WriteLength(buffer, ref offset, tokenLength);
ByteWriter.WriteByte(buffer, ref offset, (byte)DerEncodingTag.ObjectIdentifier);
DerEncodingHelper.WriteLength(buffer, ref offset, SPNEGOIdentifier.Length);
ByteWriter.WriteBytes(buffer, ref offset, SPNEGOIdentifier);
ByteWriter.WriteBytes(buffer, ref offset, tokenBytes);
return buffer;
}
else
{
return tokenBytes;
}
}
/// <summary> /// <summary>
/// https://tools.ietf.org/html/rfc2743 /// https://tools.ietf.org/html/rfc2743
/// </summary> /// </summary>
@ -60,33 +86,5 @@ namespace SMBLibrary.Authentication.GSSAPI
} }
return null; return null;
} }
/// <summary>
/// Will append the generic GSSAPI header.
/// </summary>
public static byte[] GetTokenBytes(SimpleProtectedNegotiationToken token)
{
if (token is SimpleProtectedNegotiationTokenInit)
{
byte[] tokenBytes = token.GetBytes();
int objectIdentifierFieldSize = DerEncodingHelper.GetLengthFieldSize(SPNEGOIdentifier.Length);
int tokenLength = 1 + objectIdentifierFieldSize + SPNEGOIdentifier.Length + tokenBytes.Length;
int tokenLengthFieldSize = DerEncodingHelper.GetLengthFieldSize(tokenLength);
int headerLength = 1 + tokenLengthFieldSize + 1 + objectIdentifierFieldSize + SPNEGOIdentifier.Length;
byte[] buffer = new byte[headerLength + tokenBytes.Length];
int offset = 0;
ByteWriter.WriteByte(buffer, ref offset, ApplicationTag);
DerEncodingHelper.WriteLength(buffer, ref offset, tokenLength);
ByteWriter.WriteByte(buffer, ref offset, (byte)DerEncodingTag.ObjectIdentifier);
DerEncodingHelper.WriteLength(buffer, ref offset, SPNEGOIdentifier.Length);
ByteWriter.WriteBytes(buffer, ref offset, SPNEGOIdentifier);
ByteWriter.WriteBytes(buffer, ref offset, tokenBytes);
return buffer;
}
else
{
return token.GetBytes();
}
}
} }
} }

View file

@ -67,7 +67,7 @@ namespace SMBLibrary.Client
outputToken.MechanismTypeList = new List<byte[]>(); outputToken.MechanismTypeList = new List<byte[]>();
outputToken.MechanismTypeList.Add(GSSProvider.NTLMSSPIdentifier); outputToken.MechanismTypeList.Add(GSSProvider.NTLMSSPIdentifier);
outputToken.MechanismToken = negotiateMessage.GetBytes(); outputToken.MechanismToken = negotiateMessage.GetBytes();
return SimpleProtectedNegotiationToken.GetTokenBytes(outputToken); return outputToken.GetBytes(true);
} }
else else
{ {