Skip to content

Commit 9d2e57e

Browse files
committed
Merge pull request #21 from jlee-r7/feature/surface-exported-session-key
Make the session key available to clients
2 parents a78c718 + 4f3b4f9 commit 9d2e57e

File tree

3 files changed

+23
-19
lines changed

3 files changed

+23
-19
lines changed

Diff for: lib/net/ntlm/client.rb

+4
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ def session
4242
@session
4343
end
4444

45+
def session_key
46+
@session.exported_session_key
47+
end
48+
4549
private
4650

4751
# @return [Message::Type1]

Diff for: lib/net/ntlm/client/session.rb

+16-16
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,24 @@ def authenticate!
3838
rc4 = OpenSSL::Cipher::Cipher.new("rc4")
3939
rc4.encrypt
4040
rc4.key = user_session_key
41-
sk = rc4.update master_key
41+
sk = rc4.update exported_session_key
4242
sk << rc4.final
4343
t3.session_key = sk
4444
end
4545
t3
4646
end
4747

48+
def exported_session_key
49+
@exported_session_key ||=
50+
begin
51+
if negotiate_key_exchange?
52+
OpenSSL::Cipher.new("rc4").random_key
53+
else
54+
user_session_key
55+
end
56+
end
57+
end
58+
4859
def sign_message(message)
4960
seq = sequence
5061
sig = OpenSSL::HMAC.digest(OpenSSL::Digest::MD5.new, client_sign_key, "#{seq}#{message}")[0..7]
@@ -75,24 +86,13 @@ def unseal_message(emessage)
7586
message + server_cipher.final
7687
end
7788

78-
7989
private
8090

8191

8292
def user_session_key
8393
@user_session_key ||= nil
8494
end
8595

86-
def master_key
87-
@master_key ||= begin
88-
if negotiate_key_exchange?
89-
OpenSSL::Cipher.new("rc4").random_key
90-
else
91-
user_session_key
92-
end
93-
end
94-
end
95-
9696
def sequence
9797
[raw_sequence].pack("V*")
9898
end
@@ -106,19 +106,19 @@ def raw_sequence
106106
end
107107

108108
def client_sign_key
109-
@client_sign_key ||= OpenSSL::Digest::MD5.digest "#{master_key}#{CLIENT_TO_SERVER_SIGNING}"
109+
@client_sign_key ||= OpenSSL::Digest::MD5.digest "#{exported_session_key}#{CLIENT_TO_SERVER_SIGNING}"
110110
end
111111

112112
def server_sign_key
113-
@server_sign_key ||= OpenSSL::Digest::MD5.digest "#{master_key}#{SERVER_TO_CLIENT_SIGNING}"
113+
@server_sign_key ||= OpenSSL::Digest::MD5.digest "#{exported_session_key}#{SERVER_TO_CLIENT_SIGNING}"
114114
end
115115

116116
def client_seal_key
117-
@client_seal_key ||= OpenSSL::Digest::MD5.digest "#{master_key}#{CLIENT_TO_SERVER_SEALING}"
117+
@client_seal_key ||= OpenSSL::Digest::MD5.digest "#{exported_session_key}#{CLIENT_TO_SERVER_SEALING}"
118118
end
119119

120120
def server_seal_key
121-
@server_seal_key ||= OpenSSL::Digest::MD5.digest "#{master_key}#{SERVER_TO_CLIENT_SEALING}"
121+
@server_seal_key ||= OpenSSL::Digest::MD5.digest "#{exported_session_key}#{SERVER_TO_CLIENT_SEALING}"
122122
end
123123

124124
def client_cipher

Diff for: spec/lib/net/ntlm/client/session_spec.rb

+3-3
Original file line numberDiff line numberDiff line change
@@ -51,17 +51,17 @@
5151
end
5252
end
5353

54-
describe "#master_key" do
54+
describe "#exported_session_key" do
5555
it "returns a random 16-byte key when negotiate_key_exchange? is true" do
5656
expect(inst).to receive(:negotiate_key_exchange?).and_return(true)
5757
expect(inst).not_to receive(:user_session_key)
58-
inst.send :master_key
58+
inst.exported_session_key
5959
end
6060

6161
it "returns the user_session_key when negotiate_key_exchange? is false" do
6262
expect(inst).to receive(:negotiate_key_exchange?).and_return(false)
6363
expect(inst).to receive(:user_session_key).and_return(user_session_key)
64-
inst.send :master_key
64+
inst.exported_session_key
6565
end
6666
end
6767

0 commit comments

Comments
 (0)