1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- using System;
- using System.Collections.Generic;
- using System.Text;
- using Utilities;
- namespace SMBLibrary.Authentication
- {
- public abstract class SimpleProtectedNegotiationToken
- {
- public const byte ApplicationTag = 0x60;
- public static readonly byte[] SPNEGOIdentifier = new byte[] { 0x2b, 0x06, 0x01, 0x05, 0x05, 0x02 };
- public abstract byte[] GetBytes();
-
-
-
- public static SimpleProtectedNegotiationToken ReadToken(byte[] tokenBytes, int offset)
- {
- byte tag = ByteReader.ReadByte(tokenBytes, ref offset);
- if (tag == ApplicationTag)
- {
-
-
- int tokenLength = DerEncodingHelper.ReadLength(tokenBytes, ref offset);
- tag = ByteReader.ReadByte(tokenBytes, ref offset);
- if (tag == (byte)DerEncodingTag.ObjectIdentifier)
- {
- int objectIdentifierLength = DerEncodingHelper.ReadLength(tokenBytes, ref offset);
- byte[] objectIdentifier = ByteReader.ReadBytes(tokenBytes, ref offset, objectIdentifierLength);
- if (ByteUtils.AreByteArraysEqual(objectIdentifier, SPNEGOIdentifier))
- {
- tag = ByteReader.ReadByte(tokenBytes, ref offset);
- if (tag == SimpleProtectedNegotiationTokenInit.NegTokenInitTag)
- {
- return new SimpleProtectedNegotiationTokenInit(tokenBytes, offset);
- }
- }
- }
- }
- else if (tag == SimpleProtectedNegotiationTokenResponse.NegTokenRespTag)
- {
- return new SimpleProtectedNegotiationTokenResponse(tokenBytes, offset);
- }
- return null;
- }
-
-
-
- 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();
- }
- }
- }
- }
|