exporting fields so they can be serialized
This commit is contained in:
		
							parent
							
								
									e9221087f7
								
							
						
					
					
						commit
						d960dfe90e
					
				| @ -80,6 +80,8 @@ type ServerSession interface { | |||||||
| 	GenerateChallengeMessage() (*messages.Challenge, error) | 	GenerateChallengeMessage() (*messages.Challenge, error) | ||||||
| 	ProcessAuthenticateMessage(*messages.Authenticate) error | 	ProcessAuthenticateMessage(*messages.Authenticate) error | ||||||
| 
 | 
 | ||||||
|  | 	GetSessionData() *SessionData | ||||||
|  | 
 | ||||||
| 	Version() int | 	Version() int | ||||||
| 	Seal(message []byte) ([]byte, error) | 	Seal(message []byte) ([]byte, error) | ||||||
| 	Sign(message []byte) ([]byte, error) | 	Sign(message []byte) ([]byte, error) | ||||||
| @ -114,10 +116,10 @@ type SessionData struct { | |||||||
| 	sessionBaseKey            []byte | 	sessionBaseKey            []byte | ||||||
| 	mic                       []byte | 	mic                       []byte | ||||||
| 
 | 
 | ||||||
| 	clientSigningKey []byte | 	ClientSigningKey []byte | ||||||
| 	serverSigningKey []byte | 	ServerSigningKey []byte | ||||||
| 	clientSealingKey []byte | 	ClientSealingKey []byte | ||||||
| 	serverSealingKey []byte | 	ServerSealingKey []byte | ||||||
| 
 | 
 | ||||||
| 	clientHandle *rc4P.Cipher | 	clientHandle *rc4P.Cipher | ||||||
| 	serverHandle *rc4P.Cipher | 	serverHandle *rc4P.Cipher | ||||||
|  | |||||||
| @ -98,10 +98,10 @@ func (n *V1Session) calculateKeys(ntlmRevisionCurrent uint8) (err error) { | |||||||
| 		n.negotiateFlags = messages.NTLMSSP_NEGOTIATE_LM_KEY.Set(n.negotiateFlags) | 		n.negotiateFlags = messages.NTLMSSP_NEGOTIATE_LM_KEY.Set(n.negotiateFlags) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	n.clientSigningKey = signKey(n.negotiateFlags, n.exportedSessionKey, "Client") | 	n.ClientSigningKey = signKey(n.negotiateFlags, n.exportedSessionKey, "Client") | ||||||
| 	n.serverSigningKey = signKey(n.negotiateFlags, n.exportedSessionKey, "Server") | 	n.ServerSigningKey = signKey(n.negotiateFlags, n.exportedSessionKey, "Server") | ||||||
| 	n.clientSealingKey = sealKey(n.negotiateFlags, n.exportedSessionKey, "Client") | 	n.ClientSealingKey = sealKey(n.negotiateFlags, n.exportedSessionKey, "Client") | ||||||
| 	n.serverSealingKey = sealKey(n.negotiateFlags, n.exportedSessionKey, "Server") | 	n.ServerSealingKey = sealKey(n.negotiateFlags, n.exportedSessionKey, "Server") | ||||||
| 	return | 	return | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -127,22 +127,22 @@ func ntlmV1Mac(message []byte, sequenceNumber int, handle *rc4P.Cipher, sealingK | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (n *V1ServerSession) Mac(message []byte, sequenceNumber int) ([]byte, error) { | func (n *V1ServerSession) Mac(message []byte, sequenceNumber int) ([]byte, error) { | ||||||
| 	mac := ntlmV1Mac(message, sequenceNumber, n.serverHandle, n.serverSealingKey, n.serverSigningKey, n.negotiateFlags) | 	mac := ntlmV1Mac(message, sequenceNumber, n.serverHandle, n.ServerSealingKey, n.ServerSigningKey, n.negotiateFlags) | ||||||
| 	return mac, nil | 	return mac, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (n *V1ClientSession) Mac(message []byte, sequenceNumber int) ([]byte, error) { | func (n *V1ClientSession) Mac(message []byte, sequenceNumber int) ([]byte, error) { | ||||||
| 	mac := ntlmV1Mac(message, sequenceNumber, n.clientHandle, n.clientSealingKey, n.clientSigningKey, n.negotiateFlags) | 	mac := ntlmV1Mac(message, sequenceNumber, n.clientHandle, n.ClientSealingKey, n.ClientSigningKey, n.negotiateFlags) | ||||||
| 	return mac, nil | 	return mac, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (n *V1ServerSession) VerifyMac(message, expectedMac []byte, sequenceNumber int) (bool, error) { | func (n *V1ServerSession) VerifyMac(message, expectedMac []byte, sequenceNumber int) (bool, error) { | ||||||
| 	mac := ntlmV1Mac(message, sequenceNumber, n.clientHandle, n.clientSealingKey, n.clientSigningKey, n.negotiateFlags) | 	mac := ntlmV1Mac(message, sequenceNumber, n.clientHandle, n.ClientSealingKey, n.ClientSigningKey, n.negotiateFlags) | ||||||
| 	return macsEqual(mac, expectedMac), nil | 	return macsEqual(mac, expectedMac), nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (n *V1ClientSession) VerifyMac(message, expectedMac []byte, sequenceNumber int) (bool, error) { | func (n *V1ClientSession) VerifyMac(message, expectedMac []byte, sequenceNumber int) (bool, error) { | ||||||
| 	mac := ntlmV1Mac(message, sequenceNumber, n.serverHandle, n.serverSealingKey, n.serverSigningKey, n.negotiateFlags) | 	mac := ntlmV1Mac(message, sequenceNumber, n.serverHandle, n.ServerSealingKey, n.ServerSigningKey, n.negotiateFlags) | ||||||
| 	return macsEqual(mac, expectedMac), nil | 	return macsEqual(mac, expectedMac), nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -168,6 +168,10 @@ func (n *V1ServerSession) SetServerChallenge(challenge []byte) { | |||||||
| 	n.serverChallenge = challenge | 	n.serverChallenge = challenge | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (n *V1ServerSession) GetSessionData() *SessionData { | ||||||
|  | 	return &n.SessionData | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (n *V1ServerSession) ProcessAuthenticateMessage(am *messages.Authenticate) (err error) { | func (n *V1ServerSession) ProcessAuthenticateMessage(am *messages.Authenticate) (err error) { | ||||||
| 	n.authenticateMessage = am | 	n.authenticateMessage = am | ||||||
| 	n.negotiateFlags = am.NegotiateFlags | 	n.negotiateFlags = am.NegotiateFlags | ||||||
| @ -218,11 +222,11 @@ func (n *V1ServerSession) ProcessAuthenticateMessage(am *messages.Authenticate) | |||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	n.clientHandle, err = rc4Init(n.clientSealingKey) | 	n.clientHandle, err = rc4Init(n.ClientSealingKey) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	n.serverHandle, err = rc4Init(n.serverSealingKey) | 	n.serverHandle, err = rc4Init(n.ServerSealingKey) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| @ -311,11 +315,11 @@ func (n *V1ClientSession) ProcessChallengeMessage(cm *messages.Challenge) (err e | |||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	n.clientHandle, err = rc4Init(n.clientSealingKey) | 	n.clientHandle, err = rc4Init(n.ClientSealingKey) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	n.serverHandle, err = rc4Init(n.serverSealingKey) | 	n.serverHandle, err = rc4Init(n.ServerSealingKey) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
|  | |||||||
| @ -203,6 +203,6 @@ func TestNTLMv1WithClientChallenge(t *testing.T) { | |||||||
| 		t.Errorf("Could not process authenticate message: %s", err) | 		t.Errorf("Could not process authenticate message: %s", err) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	checkV1Value(t, "SealKey", server.clientSealingKey, "04dd7f014d8504d265a25cc86a3a7c06", nil) | 	checkV1Value(t, "SealKey", server.ClientSealingKey, "04dd7f014d8504d265a25cc86a3a7c06", nil) | ||||||
| 	checkV1Value(t, "SignKey", server.clientSigningKey, "60e799be5c72fc92922ae8ebe961fb8d", nil) | 	checkV1Value(t, "SignKey", server.ClientSigningKey, "60e799be5c72fc92922ae8ebe961fb8d", nil) | ||||||
| } | } | ||||||
|  | |||||||
| @ -46,6 +46,10 @@ func (n *V2Session) fetchResponseKeys() (err error) { | |||||||
| 	return | 	return | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (n *V2ServerSession) GetSessionData() *SessionData { | ||||||
|  | 	return &n.SessionData | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // Define ComputeResponse(NegFlg, ResponseKeyNT, ResponseKeyLM, CHALLENGE_MESSAGE.ServerChallenge, ClientChallenge, Time, ServerName) | // Define ComputeResponse(NegFlg, ResponseKeyNT, ResponseKeyLM, CHALLENGE_MESSAGE.ServerChallenge, ClientChallenge, Time, ServerName) | ||||||
| // ServerNameBytes - The NtChallengeResponseFields.NTLMv2_RESPONSE.NTLMv2_CLIENT_CHALLENGE.AvPairs field structure of the AUTHENTICATE_MESSAGE payload. | // ServerNameBytes - The NtChallengeResponseFields.NTLMv2_RESPONSE.NTLMv2_CLIENT_CHALLENGE.AvPairs field structure of the AUTHENTICATE_MESSAGE payload. | ||||||
| func (n *V2Session) computeExpectedResponses(timestamp []byte, avPairBytes []byte) (err error) { | func (n *V2Session) computeExpectedResponses(timestamp []byte, avPairBytes []byte) (err error) { | ||||||
| @ -71,10 +75,10 @@ func (n *V2Session) calculateKeys(ntlmRevisionCurrent uint8) (err error) { | |||||||
| 		n.negotiateFlags = messages.NTLMSSP_NEGOTIATE_LM_KEY.Set(n.negotiateFlags) | 		n.negotiateFlags = messages.NTLMSSP_NEGOTIATE_LM_KEY.Set(n.negotiateFlags) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	n.clientSigningKey = signKey(n.negotiateFlags, n.exportedSessionKey, "Client") | 	n.ClientSigningKey = signKey(n.negotiateFlags, n.exportedSessionKey, "Client") | ||||||
| 	n.serverSigningKey = signKey(n.negotiateFlags, n.exportedSessionKey, "Server") | 	n.ServerSigningKey = signKey(n.negotiateFlags, n.exportedSessionKey, "Server") | ||||||
| 	n.clientSealingKey = sealKey(n.negotiateFlags, n.exportedSessionKey, "Client") | 	n.ClientSealingKey = sealKey(n.negotiateFlags, n.exportedSessionKey, "Client") | ||||||
| 	n.serverSealingKey = sealKey(n.negotiateFlags, n.exportedSessionKey, "Server") | 	n.ServerSealingKey = sealKey(n.negotiateFlags, n.exportedSessionKey, "Server") | ||||||
| 	return | 	return | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -99,22 +103,22 @@ func ntlmV2Mac(message []byte, sequenceNumber int, handle *rc4P.Cipher, sealingK | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (n *V2ServerSession) Mac(message []byte, sequenceNumber int) ([]byte, error) { | func (n *V2ServerSession) Mac(message []byte, sequenceNumber int) ([]byte, error) { | ||||||
| 	mac := ntlmV2Mac(message, sequenceNumber, n.serverHandle, n.serverSealingKey, n.serverSigningKey, n.negotiateFlags) | 	mac := ntlmV2Mac(message, sequenceNumber, n.serverHandle, n.ServerSealingKey, n.ServerSigningKey, n.negotiateFlags) | ||||||
| 	return mac, nil | 	return mac, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (n *V2ServerSession) VerifyMac(message, expectedMac []byte, sequenceNumber int) (bool, error) { | func (n *V2ServerSession) VerifyMac(message, expectedMac []byte, sequenceNumber int) (bool, error) { | ||||||
| 	mac := ntlmV2Mac(message, sequenceNumber, n.clientHandle, n.clientSealingKey, n.clientSigningKey, n.negotiateFlags) | 	mac := ntlmV2Mac(message, sequenceNumber, n.clientHandle, n.ClientSealingKey, n.ClientSigningKey, n.negotiateFlags) | ||||||
| 	return macsEqual(mac, expectedMac), nil | 	return macsEqual(mac, expectedMac), nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (n *V2ClientSession) Mac(message []byte, sequenceNumber int) ([]byte, error) { | func (n *V2ClientSession) Mac(message []byte, sequenceNumber int) ([]byte, error) { | ||||||
| 	mac := ntlmV2Mac(message, sequenceNumber, n.clientHandle, n.clientSealingKey, n.clientSigningKey, n.negotiateFlags) | 	mac := ntlmV2Mac(message, sequenceNumber, n.clientHandle, n.ClientSealingKey, n.ClientSigningKey, n.negotiateFlags) | ||||||
| 	return mac, nil | 	return mac, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (n *V2ClientSession) VerifyMac(message, expectedMac []byte, sequenceNumber int) (bool, error) { | func (n *V2ClientSession) VerifyMac(message, expectedMac []byte, sequenceNumber int) (bool, error) { | ||||||
| 	mac := ntlmV2Mac(message, sequenceNumber, n.serverHandle, n.serverSealingKey, n.serverSigningKey, n.negotiateFlags) | 	mac := ntlmV2Mac(message, sequenceNumber, n.serverHandle, n.ServerSealingKey, n.ServerSigningKey, n.negotiateFlags) | ||||||
| 	return macsEqual(mac, expectedMac), nil | 	return macsEqual(mac, expectedMac), nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -224,11 +228,11 @@ func (n *V2ServerSession) ProcessAuthenticateMessage(am *messages.Authenticate) | |||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	n.clientHandle, err = rc4Init(n.clientSealingKey) | 	n.clientHandle, err = rc4Init(n.ClientSealingKey) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	n.serverHandle, err = rc4Init(n.serverSealingKey) | 	n.serverHandle, err = rc4Init(n.ServerSealingKey) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| @ -313,11 +317,11 @@ func (n *V2ClientSession) ProcessChallengeMessage(cm *messages.Challenge) (err e | |||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	n.clientHandle, err = rc4Init(n.clientSealingKey) | 	n.clientHandle, err = rc4Init(n.ClientSealingKey) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	n.serverHandle, err = rc4Init(n.serverSealingKey) | 	n.serverHandle, err = rc4Init(n.ServerSealingKey) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
|  | |||||||
| @ -113,8 +113,8 @@ func TestNTLMv2(t *testing.T) { | |||||||
| 	checkV2Value(t, "NTChallengeResponse", server.ntChallengeResponse[0:16], "68cd0ab851e51c96aabc927bebef6a1c", nil) | 	checkV2Value(t, "NTChallengeResponse", server.ntChallengeResponse[0:16], "68cd0ab851e51c96aabc927bebef6a1c", nil) | ||||||
| 	checkV2Value(t, "LMChallengeResponse", server.lmChallengeResponse, "86c35097ac9cec102554764a57cccc19aaaaaaaaaaaaaaaa", nil) | 	checkV2Value(t, "LMChallengeResponse", server.lmChallengeResponse, "86c35097ac9cec102554764a57cccc19aaaaaaaaaaaaaaaa", nil) | ||||||
| 
 | 
 | ||||||
| 	checkV2Value(t, "client seal key", server.clientSealingKey, "59f600973cc4960a25480a7c196e4c58", nil) | 	checkV2Value(t, "client seal key", server.ClientSealingKey, "59f600973cc4960a25480a7c196e4c58", nil) | ||||||
| 	checkV2Value(t, "client signing key", server.clientSigningKey, "4788dc861b4782f35d43fd98fe1a2d39", nil) | 	checkV2Value(t, "client signing key", server.ClientSigningKey, "4788dc861b4782f35d43fd98fe1a2d39", nil) | ||||||
| 
 | 
 | ||||||
| 	// Have the server generate an initial challenge message | 	// Have the server generate an initial challenge message | ||||||
| 	challenge, err := server.GenerateChallengeMessage() | 	challenge, err := server.GenerateChallengeMessage() | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user