Software /
code /
prosody
Annotate
util/sasl/scram.lua @ 12932:9bb044705ea1
util.ip: Add ip.truncate() to return a new IP with only the prefix of another
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Tue, 14 Mar 2023 18:24:58 +0000 |
parent | 12596:78f874441e21 |
child | 12941:e77c607e8da8 |
rev | line source |
---|---|
2194
41d42d253a1d
Initial commit of SCRAM SASL mechanism.
Tobias Markmann <tm@ayena.de>
parents:
diff
changeset
|
1 -- sasl.lua v0.4 |
3094
5f625411b463
util.sasl: 2009 -> 2010 in copyright header.
Tobias Markmann <tm@ayena.de>
parents:
2648
diff
changeset
|
2 -- Copyright (C) 2008-2010 Tobias Markmann |
2194
41d42d253a1d
Initial commit of SCRAM SASL mechanism.
Tobias Markmann <tm@ayena.de>
parents:
diff
changeset
|
3 -- |
3099
2c4d06e7e3d3
util.sasl.scram: Check nonce in client final message. Check channel binding flag in client first message. Adding some TODOs on more strict parsing. (thanks Marc Santamaria)
Tobias Markmann <tm@ayena.de>
parents:
3098
diff
changeset
|
4 -- All rights reserved. |
2194
41d42d253a1d
Initial commit of SCRAM SASL mechanism.
Tobias Markmann <tm@ayena.de>
parents:
diff
changeset
|
5 -- |
3099
2c4d06e7e3d3
util.sasl.scram: Check nonce in client final message. Check channel binding flag in client first message. Adding some TODOs on more strict parsing. (thanks Marc Santamaria)
Tobias Markmann <tm@ayena.de>
parents:
3098
diff
changeset
|
6 -- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: |
2194
41d42d253a1d
Initial commit of SCRAM SASL mechanism.
Tobias Markmann <tm@ayena.de>
parents:
diff
changeset
|
7 -- |
3099
2c4d06e7e3d3
util.sasl.scram: Check nonce in client final message. Check channel binding flag in client first message. Adding some TODOs on more strict parsing. (thanks Marc Santamaria)
Tobias Markmann <tm@ayena.de>
parents:
3098
diff
changeset
|
8 -- * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. |
2c4d06e7e3d3
util.sasl.scram: Check nonce in client final message. Check channel binding flag in client first message. Adding some TODOs on more strict parsing. (thanks Marc Santamaria)
Tobias Markmann <tm@ayena.de>
parents:
3098
diff
changeset
|
9 -- * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. |
2c4d06e7e3d3
util.sasl.scram: Check nonce in client final message. Check channel binding flag in client first message. Adding some TODOs on more strict parsing. (thanks Marc Santamaria)
Tobias Markmann <tm@ayena.de>
parents:
3098
diff
changeset
|
10 -- * Neither the name of Tobias Markmann nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. |
2194
41d42d253a1d
Initial commit of SCRAM SASL mechanism.
Tobias Markmann <tm@ayena.de>
parents:
diff
changeset
|
11 -- |
3099
2c4d06e7e3d3
util.sasl.scram: Check nonce in client final message. Check channel binding flag in client first message. Adding some TODOs on more strict parsing. (thanks Marc Santamaria)
Tobias Markmann <tm@ayena.de>
parents:
3098
diff
changeset
|
12 -- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
2194
41d42d253a1d
Initial commit of SCRAM SASL mechanism.
Tobias Markmann <tm@ayena.de>
parents:
diff
changeset
|
13 |
41d42d253a1d
Initial commit of SCRAM SASL mechanism.
Tobias Markmann <tm@ayena.de>
parents:
diff
changeset
|
14 local s_match = string.match; |
2198
d18b4d22b8da
Making interop with libpurple. (Thanks darkrain).
Tobias Markmann <tm@ayena.de>
parents:
2197
diff
changeset
|
15 local type = type |
2194
41d42d253a1d
Initial commit of SCRAM SASL mechanism.
Tobias Markmann <tm@ayena.de>
parents:
diff
changeset
|
16 local base64 = require "util.encodings".base64; |
10216
a51d017e6173
util.sasl.scram: Factor out SHA-1 specific getAuthenticationDatabaseSHA1
Kim Alvefur <zash@zash.se>
parents:
8728
diff
changeset
|
17 local hashes = require "util.hashes"; |
2196
614c839c30c5
Completed SCRAM-SHA-1 implementation to a ready-to-test state.
Tobias Markmann <tm@ayena.de>
parents:
2194
diff
changeset
|
18 local generate_uuid = require "util.uuid".generate; |
2199
08a6b91bfe7b
SASLprep usernames and passwords.
Tobias Markmann <tm@ayena.de>
parents:
2198
diff
changeset
|
19 local saslprep = require "util.encodings".stringprep.saslprep; |
5301
6279caf921f1
util.sasl.{plain,scram,digest-md5}: nodeprep username before passing to callbacks, so callbacks don't have to.
Waqas Hussain <waqas20@gmail.com>
parents:
4368
diff
changeset
|
20 local nodeprep = require "util.encodings".stringprep.nodeprep; |
2199
08a6b91bfe7b
SASLprep usernames and passwords.
Tobias Markmann <tm@ayena.de>
parents:
2198
diff
changeset
|
21 local log = require "util.logger".init("sasl"); |
11174
ddc17e9c66e4
util.sasl.scram: Use util.strbitop for XOR step
Kim Alvefur <zash@zash.se>
parents:
10916
diff
changeset
|
22 local binaryXOR = require "util.strbitop".sxor; |
2194
41d42d253a1d
Initial commit of SCRAM SASL mechanism.
Tobias Markmann <tm@ayena.de>
parents:
diff
changeset
|
23 |
6786
3deeb38d79ab
util.sasl.scram: Get rid of module call
Kim Alvefur <zash@zash.se>
parents:
5871
diff
changeset
|
24 local _ENV = nil; |
8555
4f0f5b49bb03
vairious: Add annotation when an empty environment is set [luacheck]
Kim Alvefur <zash@zash.se>
parents:
8382
diff
changeset
|
25 -- luacheck: std none |
2194
41d42d253a1d
Initial commit of SCRAM SASL mechanism.
Tobias Markmann <tm@ayena.de>
parents:
diff
changeset
|
26 |
41d42d253a1d
Initial commit of SCRAM SASL mechanism.
Tobias Markmann <tm@ayena.de>
parents:
diff
changeset
|
27 --========================= |
3374
ce52f1d5cb74
util.sasl.scram: Reference actual RFC instead of the draft.
Tobias Markmann <tm@ayena.de>
parents:
3206
diff
changeset
|
28 --SASL SCRAM-SHA-1 according to RFC 5802 |
3097
9341ef1a3345
util.sasl.scram: Adding documentation on SCRAM authentication backend.
Tobias Markmann <tm@ayena.de>
parents:
3096
diff
changeset
|
29 |
9341ef1a3345
util.sasl.scram: Adding documentation on SCRAM authentication backend.
Tobias Markmann <tm@ayena.de>
parents:
3096
diff
changeset
|
30 --[[ |
9341ef1a3345
util.sasl.scram: Adding documentation on SCRAM authentication backend.
Tobias Markmann <tm@ayena.de>
parents:
3096
diff
changeset
|
31 Supported Authentication Backends |
9341ef1a3345
util.sasl.scram: Adding documentation on SCRAM authentication backend.
Tobias Markmann <tm@ayena.de>
parents:
3096
diff
changeset
|
32 |
3122
579f17b9f948
util.sasl.*: Adjusting authentication provider names. All '-' replaced with '_'
Tobias Markmann <tm@ayena.de>
parents:
3118
diff
changeset
|
33 scram_{MECH}: |
579f17b9f948
util.sasl.*: Adjusting authentication provider names. All '-' replaced with '_'
Tobias Markmann <tm@ayena.de>
parents:
3118
diff
changeset
|
34 -- MECH being a standard hash name (like those at IANA's hash registry) with '-' replaced with '_' |
3097
9341ef1a3345
util.sasl.scram: Adding documentation on SCRAM authentication backend.
Tobias Markmann <tm@ayena.de>
parents:
3096
diff
changeset
|
35 function(username, realm) |
3205
2dcd826bbbc6
mod_auth_internal_hashed: Store StoredKey and ServerKey instead of salted hashed password.
Tobias Markmann <tm@ayena.de>
parents:
3196
diff
changeset
|
36 return stored_key, server_key, iteration_count, salt, state; |
3097
9341ef1a3345
util.sasl.scram: Adding documentation on SCRAM authentication backend.
Tobias Markmann <tm@ayena.de>
parents:
3096
diff
changeset
|
37 end |
5836
fa8cfe830fef
util.sasl.scram: Adding reference to RFC 5929 'Channel Bindings for TLS'.
Tobias Markmann <tm@ayena.de>
parents:
5835
diff
changeset
|
38 |
fa8cfe830fef
util.sasl.scram: Adding reference to RFC 5929 'Channel Bindings for TLS'.
Tobias Markmann <tm@ayena.de>
parents:
5835
diff
changeset
|
39 Supported Channel Binding Backends |
fa8cfe830fef
util.sasl.scram: Adding reference to RFC 5929 'Channel Bindings for TLS'.
Tobias Markmann <tm@ayena.de>
parents:
5835
diff
changeset
|
40 |
fa8cfe830fef
util.sasl.scram: Adding reference to RFC 5929 'Channel Bindings for TLS'.
Tobias Markmann <tm@ayena.de>
parents:
5835
diff
changeset
|
41 'tls-unique' according to RFC 5929 |
3097
9341ef1a3345
util.sasl.scram: Adding documentation on SCRAM authentication backend.
Tobias Markmann <tm@ayena.de>
parents:
3096
diff
changeset
|
42 ]] |
9341ef1a3345
util.sasl.scram: Adding documentation on SCRAM authentication backend.
Tobias Markmann <tm@ayena.de>
parents:
3096
diff
changeset
|
43 |
12128
593e823566e1
mod_auth_internal_hashed: Up iteration count to 10000 per XEP-0438
Kim Alvefur <zash@zash.se>
parents:
12024
diff
changeset
|
44 local default_i = 10000 |
2194
41d42d253a1d
Initial commit of SCRAM SASL mechanism.
Tobias Markmann <tm@ayena.de>
parents:
diff
changeset
|
45 |
5301
6279caf921f1
util.sasl.{plain,scram,digest-md5}: nodeprep username before passing to callbacks, so callbacks don't have to.
Waqas Hussain <waqas20@gmail.com>
parents:
4368
diff
changeset
|
46 local function validate_username(username, _nodeprep) |
2194
41d42d253a1d
Initial commit of SCRAM SASL mechanism.
Tobias Markmann <tm@ayena.de>
parents:
diff
changeset
|
47 -- check for forbidden char sequences |
2198
d18b4d22b8da
Making interop with libpurple. (Thanks darkrain).
Tobias Markmann <tm@ayena.de>
parents:
2197
diff
changeset
|
48 for eq in username:gmatch("=(.?.?)") do |
4204
edd7b0610c2c
util.sasl.scram: Fix bug in validate_username function. (Thanks Florob)
Tobias Markmann <tm@ayena.de>
parents:
4113
diff
changeset
|
49 if eq ~= "2C" and eq ~= "3D" then |
3540
bc139431830b
Monster whitespace commit (beware the whitespace monster).
Waqas Hussain <waqas20@gmail.com>
parents:
3405
diff
changeset
|
50 return false |
bc139431830b
Monster whitespace commit (beware the whitespace monster).
Waqas Hussain <waqas20@gmail.com>
parents:
3405
diff
changeset
|
51 end |
2198
d18b4d22b8da
Making interop with libpurple. (Thanks darkrain).
Tobias Markmann <tm@ayena.de>
parents:
2197
diff
changeset
|
52 end |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5538
diff
changeset
|
53 |
4204
edd7b0610c2c
util.sasl.scram: Fix bug in validate_username function. (Thanks Florob)
Tobias Markmann <tm@ayena.de>
parents:
4113
diff
changeset
|
54 -- replace =2C with , and =3D with = |
edd7b0610c2c
util.sasl.scram: Fix bug in validate_username function. (Thanks Florob)
Tobias Markmann <tm@ayena.de>
parents:
4113
diff
changeset
|
55 username = username:gsub("=2C", ","); |
2265
7fe644057dc2
util.sasl.scram: Making =2D and =3D substitution actually work.
Tobias Markmann <tm@ayena.de>
parents:
2255
diff
changeset
|
56 username = username:gsub("=3D", "="); |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5538
diff
changeset
|
57 |
2194
41d42d253a1d
Initial commit of SCRAM SASL mechanism.
Tobias Markmann <tm@ayena.de>
parents:
diff
changeset
|
58 -- apply SASLprep |
2199
08a6b91bfe7b
SASLprep usernames and passwords.
Tobias Markmann <tm@ayena.de>
parents:
2198
diff
changeset
|
59 username = saslprep(username); |
5301
6279caf921f1
util.sasl.{plain,scram,digest-md5}: nodeprep username before passing to callbacks, so callbacks don't have to.
Waqas Hussain <waqas20@gmail.com>
parents:
4368
diff
changeset
|
60 |
6279caf921f1
util.sasl.{plain,scram,digest-md5}: nodeprep username before passing to callbacks, so callbacks don't have to.
Waqas Hussain <waqas20@gmail.com>
parents:
4368
diff
changeset
|
61 if username and _nodeprep ~= false then |
6279caf921f1
util.sasl.{plain,scram,digest-md5}: nodeprep username before passing to callbacks, so callbacks don't have to.
Waqas Hussain <waqas20@gmail.com>
parents:
4368
diff
changeset
|
62 username = (_nodeprep or nodeprep)(username); |
6279caf921f1
util.sasl.{plain,scram,digest-md5}: nodeprep username before passing to callbacks, so callbacks don't have to.
Waqas Hussain <waqas20@gmail.com>
parents:
4368
diff
changeset
|
63 end |
6279caf921f1
util.sasl.{plain,scram,digest-md5}: nodeprep username before passing to callbacks, so callbacks don't have to.
Waqas Hussain <waqas20@gmail.com>
parents:
4368
diff
changeset
|
64 |
4368
916834f22d1b
util.sasl.scram: Return proper error and don't touch datastores on empty username.
Waqas Hussain <waqas20@gmail.com>
parents:
4204
diff
changeset
|
65 return username and #username>0 and username; |
2194
41d42d253a1d
Initial commit of SCRAM SASL mechanism.
Tobias Markmann <tm@ayena.de>
parents:
diff
changeset
|
66 end |
41d42d253a1d
Initial commit of SCRAM SASL mechanism.
Tobias Markmann <tm@ayena.de>
parents:
diff
changeset
|
67 |
3155 | 68 local function hashprep(hashname) |
69 return hashname:lower():gsub("-", "_"); | |
3122
579f17b9f948
util.sasl.*: Adjusting authentication provider names. All '-' replaced with '_'
Tobias Markmann <tm@ayena.de>
parents:
3118
diff
changeset
|
70 end |
579f17b9f948
util.sasl.*: Adjusting authentication provider names. All '-' replaced with '_'
Tobias Markmann <tm@ayena.de>
parents:
3118
diff
changeset
|
71 |
10216
a51d017e6173
util.sasl.scram: Factor out SHA-1 specific getAuthenticationDatabaseSHA1
Kim Alvefur <zash@zash.se>
parents:
8728
diff
changeset
|
72 local function get_scram_hasher(H, HMAC, Hi) |
a51d017e6173
util.sasl.scram: Factor out SHA-1 specific getAuthenticationDatabaseSHA1
Kim Alvefur <zash@zash.se>
parents:
8728
diff
changeset
|
73 return function (password, salt, iteration_count) |
a51d017e6173
util.sasl.scram: Factor out SHA-1 specific getAuthenticationDatabaseSHA1
Kim Alvefur <zash@zash.se>
parents:
8728
diff
changeset
|
74 if type(password) ~= "string" or type(salt) ~= "string" or type(iteration_count) ~= "number" then |
a51d017e6173
util.sasl.scram: Factor out SHA-1 specific getAuthenticationDatabaseSHA1
Kim Alvefur <zash@zash.se>
parents:
8728
diff
changeset
|
75 return false, "inappropriate argument types" |
a51d017e6173
util.sasl.scram: Factor out SHA-1 specific getAuthenticationDatabaseSHA1
Kim Alvefur <zash@zash.se>
parents:
8728
diff
changeset
|
76 end |
a51d017e6173
util.sasl.scram: Factor out SHA-1 specific getAuthenticationDatabaseSHA1
Kim Alvefur <zash@zash.se>
parents:
8728
diff
changeset
|
77 if iteration_count < 4096 then |
a51d017e6173
util.sasl.scram: Factor out SHA-1 specific getAuthenticationDatabaseSHA1
Kim Alvefur <zash@zash.se>
parents:
8728
diff
changeset
|
78 log("warn", "Iteration count < 4096 which is the suggested minimum according to RFC 5802.") |
a51d017e6173
util.sasl.scram: Factor out SHA-1 specific getAuthenticationDatabaseSHA1
Kim Alvefur <zash@zash.se>
parents:
8728
diff
changeset
|
79 end |
10916 | 80 password = saslprep(password); |
81 if not password then | |
82 return false, "password fails SASLprep"; | |
83 end | |
10216
a51d017e6173
util.sasl.scram: Factor out SHA-1 specific getAuthenticationDatabaseSHA1
Kim Alvefur <zash@zash.se>
parents:
8728
diff
changeset
|
84 local salted_password = Hi(password, salt, iteration_count); |
a51d017e6173
util.sasl.scram: Factor out SHA-1 specific getAuthenticationDatabaseSHA1
Kim Alvefur <zash@zash.se>
parents:
8728
diff
changeset
|
85 local stored_key = H(HMAC(salted_password, "Client Key")) |
a51d017e6173
util.sasl.scram: Factor out SHA-1 specific getAuthenticationDatabaseSHA1
Kim Alvefur <zash@zash.se>
parents:
8728
diff
changeset
|
86 local server_key = HMAC(salted_password, "Server Key"); |
a51d017e6173
util.sasl.scram: Factor out SHA-1 specific getAuthenticationDatabaseSHA1
Kim Alvefur <zash@zash.se>
parents:
8728
diff
changeset
|
87 return true, stored_key, server_key |
3104
32150b4a8603
util.sasl.scram: Providing an API function to generate a salted password for the SCRAM-SHA-1 mechanism.
Tobias Markmann <tm@ayena.de>
parents:
3103
diff
changeset
|
88 end |
32150b4a8603
util.sasl.scram: Providing an API function to generate a salted password for the SCRAM-SHA-1 mechanism.
Tobias Markmann <tm@ayena.de>
parents:
3103
diff
changeset
|
89 end |
32150b4a8603
util.sasl.scram: Providing an API function to generate a salted password for the SCRAM-SHA-1 mechanism.
Tobias Markmann <tm@ayena.de>
parents:
3103
diff
changeset
|
90 |
10774
207691ad98fe
util.sasl.scram: Mention if clients try PLUS without channel binding
Kim Alvefur <zash@zash.se>
parents:
10499
diff
changeset
|
91 local function scram_gen(hash_name, H_f, HMAC_f, get_auth_db, expect_cb) |
5870
61f748d363e1
util.sasl.scram: Cache profile name instead of concatenating when used
Kim Alvefur <zash@zash.se>
parents:
5869
diff
changeset
|
92 local profile_name = "scram_" .. hashprep(hash_name); |
3096
e69282792686
util.sasl: Abstracting out the hash function used since SCRAM is independent of it. Adding scram-{mech} authentication backend support.
Tobias Markmann <tm@ayena.de>
parents:
3094
diff
changeset
|
93 local function scram_hash(self, message) |
5833
b1fa865ee6b2
util.sasl.scram: Use self.profile.cb for detection whether channel binding is supported or not.
Tobias Markmann <tm@ayena.de>
parents:
5829
diff
changeset
|
94 local support_channel_binding = false; |
b1fa865ee6b2
util.sasl.scram: Use self.profile.cb for detection whether channel binding is supported or not.
Tobias Markmann <tm@ayena.de>
parents:
5829
diff
changeset
|
95 if self.profile.cb then support_channel_binding = true; end |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5538
diff
changeset
|
96 |
3106
f4341cac3ae1
util.sasl.scram: Fixing issue #177.
Tobias Markmann <tm@ayena.de>
parents:
3104
diff
changeset
|
97 if type(message) ~= "string" or #message == 0 then return "failure", "malformed-request" end |
5868
bc37c6758f3a
util.sasl.scram: Create the state table as late as possible, keep state in locals for faster access
Kim Alvefur <zash@zash.se>
parents:
5867
diff
changeset
|
98 local state = self.state; |
bc37c6758f3a
util.sasl.scram: Create the state table as late as possible, keep state in locals for faster access
Kim Alvefur <zash@zash.se>
parents:
5867
diff
changeset
|
99 if not state then |
3096
e69282792686
util.sasl: Abstracting out the hash function used since SCRAM is independent of it. Adding scram-{mech} authentication backend support.
Tobias Markmann <tm@ayena.de>
parents:
3094
diff
changeset
|
100 -- we are processing client_first_message |
e69282792686
util.sasl: Abstracting out the hash function used since SCRAM is independent of it. Adding scram-{mech} authentication backend support.
Tobias Markmann <tm@ayena.de>
parents:
3094
diff
changeset
|
101 local client_first_message = message; |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5538
diff
changeset
|
102 |
3099
2c4d06e7e3d3
util.sasl.scram: Check nonce in client final message. Check channel binding flag in client first message. Adding some TODOs on more strict parsing. (thanks Marc Santamaria)
Tobias Markmann <tm@ayena.de>
parents:
3098
diff
changeset
|
103 -- TODO: fail if authzid is provided, since we don't support them yet |
10499
79c568d4146c
util.sasl.scram: Ignore unused authzid variable (strict lint)
Kim Alvefur <zash@zash.se>
parents:
10306
diff
changeset
|
104 -- luacheck: ignore 211/authzid |
5871
e80916ce8d32
util.sasl.scram: Rename variable for clarity
Kim Alvefur <zash@zash.se>
parents:
5870
diff
changeset
|
105 local gs2_header, gs2_cbind_flag, gs2_cbind_name, authzid, client_first_message_bare, username, clientnonce |
5869
35780ef2d689
util.sasl.scram: Rewrite patterns and capture client-first-message-bare, client-final-message-without-proof
Kim Alvefur <zash@zash.se>
parents:
5868
diff
changeset
|
106 = s_match(client_first_message, "^(([pny])=?([^,]*),([^,]*),)(m?=?[^,]*,?n=([^,]*),r=([^,]*),?.*)$"); |
3100
6731dff05c99
util.sasl.scram: Parsing client-first-message in a more strict way. (thanks Marc Santamaria)
Tobias Markmann <tm@ayena.de>
parents:
3099
diff
changeset
|
107 |
5844
4f545674b0bc
util.sasl.scram: Simplify validation of client-first-message
Kim Alvefur <zash@zash.se>
parents:
5843
diff
changeset
|
108 if not gs2_cbind_flag then |
4f545674b0bc
util.sasl.scram: Simplify validation of client-first-message
Kim Alvefur <zash@zash.se>
parents:
5843
diff
changeset
|
109 return "failure", "malformed-request"; |
5839
a65b56348034
util.sasl.scram: Checking the GS2 header for valid start flag.
Tobias Markmann <tm@ayena.de>
parents:
5837
diff
changeset
|
110 end |
a65b56348034
util.sasl.scram: Checking the GS2 header for valid start flag.
Tobias Markmann <tm@ayena.de>
parents:
5837
diff
changeset
|
111 |
5844
4f545674b0bc
util.sasl.scram: Simplify validation of client-first-message
Kim Alvefur <zash@zash.se>
parents:
5843
diff
changeset
|
112 if support_channel_binding and gs2_cbind_flag == "y" then |
4f545674b0bc
util.sasl.scram: Simplify validation of client-first-message
Kim Alvefur <zash@zash.se>
parents:
5843
diff
changeset
|
113 -- "y" -> client does support channel binding |
4f545674b0bc
util.sasl.scram: Simplify validation of client-first-message
Kim Alvefur <zash@zash.se>
parents:
5843
diff
changeset
|
114 -- but thinks the server does not. |
5828
24de22c01f8d
Adding some code for channel binding advertising.
Tobias Markmann <tm@ayena.de>
parents:
3981
diff
changeset
|
115 return "failure", "malformed-request"; |
24de22c01f8d
Adding some code for channel binding advertising.
Tobias Markmann <tm@ayena.de>
parents:
3981
diff
changeset
|
116 end |
5844
4f545674b0bc
util.sasl.scram: Simplify validation of client-first-message
Kim Alvefur <zash@zash.se>
parents:
5843
diff
changeset
|
117 |
4f545674b0bc
util.sasl.scram: Simplify validation of client-first-message
Kim Alvefur <zash@zash.se>
parents:
5843
diff
changeset
|
118 if gs2_cbind_flag == "n" then |
4f545674b0bc
util.sasl.scram: Simplify validation of client-first-message
Kim Alvefur <zash@zash.se>
parents:
5843
diff
changeset
|
119 -- "n" -> client doesn't support channel binding. |
10774
207691ad98fe
util.sasl.scram: Mention if clients try PLUS without channel binding
Kim Alvefur <zash@zash.se>
parents:
10499
diff
changeset
|
120 if expect_cb then |
207691ad98fe
util.sasl.scram: Mention if clients try PLUS without channel binding
Kim Alvefur <zash@zash.se>
parents:
10499
diff
changeset
|
121 log("debug", "Client unexpectedly doesn't support channel binding"); |
207691ad98fe
util.sasl.scram: Mention if clients try PLUS without channel binding
Kim Alvefur <zash@zash.se>
parents:
10499
diff
changeset
|
122 -- XXX Is it sensible to abort if the client starts -PLUS but doesn't use channel binding? |
207691ad98fe
util.sasl.scram: Mention if clients try PLUS without channel binding
Kim Alvefur <zash@zash.se>
parents:
10499
diff
changeset
|
123 end |
5844
4f545674b0bc
util.sasl.scram: Simplify validation of client-first-message
Kim Alvefur <zash@zash.se>
parents:
5843
diff
changeset
|
124 support_channel_binding = false; |
4f545674b0bc
util.sasl.scram: Simplify validation of client-first-message
Kim Alvefur <zash@zash.se>
parents:
5843
diff
changeset
|
125 end |
4f545674b0bc
util.sasl.scram: Simplify validation of client-first-message
Kim Alvefur <zash@zash.se>
parents:
5843
diff
changeset
|
126 |
4f545674b0bc
util.sasl.scram: Simplify validation of client-first-message
Kim Alvefur <zash@zash.se>
parents:
5843
diff
changeset
|
127 if support_channel_binding and gs2_cbind_flag == "p" then |
5829
40c16475194e
Check whether we support the proposed channel binding type.
Tobias Markmann <tm@ayena.de>
parents:
5828
diff
changeset
|
128 -- check whether we support the proposed channel binding type |
5868
bc37c6758f3a
util.sasl.scram: Create the state table as late as possible, keep state in locals for faster access
Kim Alvefur <zash@zash.se>
parents:
5867
diff
changeset
|
129 if not self.profile.cb[gs2_cbind_name] then |
5829
40c16475194e
Check whether we support the proposed channel binding type.
Tobias Markmann <tm@ayena.de>
parents:
5828
diff
changeset
|
130 return "failure", "malformed-request", "Proposed channel binding type isn't supported."; |
40c16475194e
Check whether we support the proposed channel binding type.
Tobias Markmann <tm@ayena.de>
parents:
5828
diff
changeset
|
131 end |
5828
24de22c01f8d
Adding some code for channel binding advertising.
Tobias Markmann <tm@ayena.de>
parents:
3981
diff
changeset
|
132 else |
5844
4f545674b0bc
util.sasl.scram: Simplify validation of client-first-message
Kim Alvefur <zash@zash.se>
parents:
5843
diff
changeset
|
133 -- no channel binding, |
5868
bc37c6758f3a
util.sasl.scram: Create the state table as late as possible, keep state in locals for faster access
Kim Alvefur <zash@zash.se>
parents:
5867
diff
changeset
|
134 gs2_cbind_name = nil; |
3099
2c4d06e7e3d3
util.sasl.scram: Check nonce in client final message. Check channel binding flag in client first message. Adding some TODOs on more strict parsing. (thanks Marc Santamaria)
Tobias Markmann <tm@ayena.de>
parents:
3098
diff
changeset
|
135 end |
2c4d06e7e3d3
util.sasl.scram: Check nonce in client final message. Check channel binding flag in client first message. Adding some TODOs on more strict parsing. (thanks Marc Santamaria)
Tobias Markmann <tm@ayena.de>
parents:
3098
diff
changeset
|
136 |
5871
e80916ce8d32
util.sasl.scram: Rename variable for clarity
Kim Alvefur <zash@zash.se>
parents:
5870
diff
changeset
|
137 username = validate_username(username, self.profile.nodeprep); |
e80916ce8d32
util.sasl.scram: Rename variable for clarity
Kim Alvefur <zash@zash.se>
parents:
5870
diff
changeset
|
138 if not username then |
3096
e69282792686
util.sasl: Abstracting out the hash function used since SCRAM is independent of it. Adding scram-{mech} authentication backend support.
Tobias Markmann <tm@ayena.de>
parents:
3094
diff
changeset
|
139 log("debug", "Username violates either SASLprep or contains forbidden character sequences.") |
e69282792686
util.sasl: Abstracting out the hash function used since SCRAM is independent of it. Adding scram-{mech} authentication backend support.
Tobias Markmann <tm@ayena.de>
parents:
3094
diff
changeset
|
140 return "failure", "malformed-request", "Invalid username."; |
e69282792686
util.sasl: Abstracting out the hash function used since SCRAM is independent of it. Adding scram-{mech} authentication backend support.
Tobias Markmann <tm@ayena.de>
parents:
3094
diff
changeset
|
141 end |
8095
57192cf193c7
util.sasl.plain,scram: Record username in sasl state earlier
Kim Alvefur <zash@zash.se>
parents:
7218
diff
changeset
|
142 self.username = username; |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5538
diff
changeset
|
143 |
8728
41c959c5c84b
Fix spelling throughout the codebase [codespell]
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
144 -- retrieve credentials |
5868
bc37c6758f3a
util.sasl.scram: Create the state table as late as possible, keep state in locals for faster access
Kim Alvefur <zash@zash.se>
parents:
5867
diff
changeset
|
145 local stored_key, server_key, salt, iteration_count; |
3096
e69282792686
util.sasl: Abstracting out the hash function used since SCRAM is independent of it. Adding scram-{mech} authentication backend support.
Tobias Markmann <tm@ayena.de>
parents:
3094
diff
changeset
|
146 if self.profile.plain then |
7216
65e36b81d56a
util.sasl.scram: Rename variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents:
6786
diff
changeset
|
147 local password, status = self.profile.plain(self, username, self.realm) |
65e36b81d56a
util.sasl.scram: Rename variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents:
6786
diff
changeset
|
148 if status == nil then return "failure", "not-authorized" |
65e36b81d56a
util.sasl.scram: Rename variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents:
6786
diff
changeset
|
149 elseif status == false then return "failure", "account-disabled" end |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5538
diff
changeset
|
150 |
3096
e69282792686
util.sasl: Abstracting out the hash function used since SCRAM is independent of it. Adding scram-{mech} authentication backend support.
Tobias Markmann <tm@ayena.de>
parents:
3094
diff
changeset
|
151 password = saslprep(password); |
e69282792686
util.sasl: Abstracting out the hash function used since SCRAM is independent of it. Adding scram-{mech} authentication backend support.
Tobias Markmann <tm@ayena.de>
parents:
3094
diff
changeset
|
152 if not password then |
e69282792686
util.sasl: Abstracting out the hash function used since SCRAM is independent of it. Adding scram-{mech} authentication backend support.
Tobias Markmann <tm@ayena.de>
parents:
3094
diff
changeset
|
153 log("debug", "Password violates SASLprep."); |
e69282792686
util.sasl: Abstracting out the hash function used since SCRAM is independent of it. Adding scram-{mech} authentication backend support.
Tobias Markmann <tm@ayena.de>
parents:
3094
diff
changeset
|
154 return "failure", "not-authorized", "Invalid password." |
e69282792686
util.sasl: Abstracting out the hash function used since SCRAM is independent of it. Adding scram-{mech} authentication backend support.
Tobias Markmann <tm@ayena.de>
parents:
3094
diff
changeset
|
155 end |
3104
32150b4a8603
util.sasl.scram: Providing an API function to generate a salted password for the SCRAM-SHA-1 mechanism.
Tobias Markmann <tm@ayena.de>
parents:
3103
diff
changeset
|
156 |
5868
bc37c6758f3a
util.sasl.scram: Create the state table as late as possible, keep state in locals for faster access
Kim Alvefur <zash@zash.se>
parents:
5867
diff
changeset
|
157 salt = generate_uuid(); |
bc37c6758f3a
util.sasl.scram: Create the state table as late as possible, keep state in locals for faster access
Kim Alvefur <zash@zash.se>
parents:
5867
diff
changeset
|
158 iteration_count = default_i; |
3104
32150b4a8603
util.sasl.scram: Providing an API function to generate a salted password for the SCRAM-SHA-1 mechanism.
Tobias Markmann <tm@ayena.de>
parents:
3103
diff
changeset
|
159 |
7217
0a43b7ffa3af
util.sasl.scram: Remove unused initial value [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7216
diff
changeset
|
160 local succ; |
10216
a51d017e6173
util.sasl.scram: Factor out SHA-1 specific getAuthenticationDatabaseSHA1
Kim Alvefur <zash@zash.se>
parents:
8728
diff
changeset
|
161 succ, stored_key, server_key = get_auth_db(password, salt, iteration_count); |
3104
32150b4a8603
util.sasl.scram: Providing an API function to generate a salted password for the SCRAM-SHA-1 mechanism.
Tobias Markmann <tm@ayena.de>
parents:
3103
diff
changeset
|
162 if not succ then |
5868
bc37c6758f3a
util.sasl.scram: Create the state table as late as possible, keep state in locals for faster access
Kim Alvefur <zash@zash.se>
parents:
5867
diff
changeset
|
163 log("error", "Generating authentication database failed. Reason: %s", stored_key); |
3104
32150b4a8603
util.sasl.scram: Providing an API function to generate a salted password for the SCRAM-SHA-1 mechanism.
Tobias Markmann <tm@ayena.de>
parents:
3103
diff
changeset
|
164 return "failure", "temporary-auth-failure"; |
32150b4a8603
util.sasl.scram: Providing an API function to generate a salted password for the SCRAM-SHA-1 mechanism.
Tobias Markmann <tm@ayena.de>
parents:
3103
diff
changeset
|
165 end |
5870
61f748d363e1
util.sasl.scram: Cache profile name instead of concatenating when used
Kim Alvefur <zash@zash.se>
parents:
5869
diff
changeset
|
166 elseif self.profile[profile_name] then |
7216
65e36b81d56a
util.sasl.scram: Rename variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents:
6786
diff
changeset
|
167 local status; |
65e36b81d56a
util.sasl.scram: Rename variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents:
6786
diff
changeset
|
168 stored_key, server_key, iteration_count, salt, status = self.profile[profile_name](self, username, self.realm); |
7218
6226307f6ac4
util.sasl.scram: Rename variable in places missed in 65e36b81d56a (thanks mt)
Kim Alvefur <zash@zash.se>
parents:
7217
diff
changeset
|
169 if status == nil then return "failure", "not-authorized" |
6226307f6ac4
util.sasl.scram: Rename variable in places missed in 65e36b81d56a (thanks mt)
Kim Alvefur <zash@zash.se>
parents:
7217
diff
changeset
|
170 elseif status == false then return "failure", "account-disabled" end |
3096
e69282792686
util.sasl: Abstracting out the hash function used since SCRAM is independent of it. Adding scram-{mech} authentication backend support.
Tobias Markmann <tm@ayena.de>
parents:
3094
diff
changeset
|
171 end |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5538
diff
changeset
|
172 |
5868
bc37c6758f3a
util.sasl.scram: Create the state table as late as possible, keep state in locals for faster access
Kim Alvefur <zash@zash.se>
parents:
5867
diff
changeset
|
173 local nonce = clientnonce .. generate_uuid(); |
10306
c0a94419c28e
util.sasl.scram: Avoid implicit coersion of number to string
Kim Alvefur <zash@zash.se>
parents:
10295
diff
changeset
|
174 local server_first_message = ("r=%s,s=%s,i=%d"):format(nonce, base64.encode(salt), iteration_count); |
5868
bc37c6758f3a
util.sasl.scram: Create the state table as late as possible, keep state in locals for faster access
Kim Alvefur <zash@zash.se>
parents:
5867
diff
changeset
|
175 self.state = { |
bc37c6758f3a
util.sasl.scram: Create the state table as late as possible, keep state in locals for faster access
Kim Alvefur <zash@zash.se>
parents:
5867
diff
changeset
|
176 gs2_header = gs2_header; |
bc37c6758f3a
util.sasl.scram: Create the state table as late as possible, keep state in locals for faster access
Kim Alvefur <zash@zash.se>
parents:
5867
diff
changeset
|
177 gs2_cbind_name = gs2_cbind_name; |
12024
9184bdda22be
util.sasl.scram: Store username property rather than cached local (#399)
Matthew Wild <mwild1@gmail.com>
parents:
11174
diff
changeset
|
178 username = self.username; -- Reference property instead of local, in case it was modified by the profile |
5868
bc37c6758f3a
util.sasl.scram: Create the state table as late as possible, keep state in locals for faster access
Kim Alvefur <zash@zash.se>
parents:
5867
diff
changeset
|
179 nonce = nonce; |
bc37c6758f3a
util.sasl.scram: Create the state table as late as possible, keep state in locals for faster access
Kim Alvefur <zash@zash.se>
parents:
5867
diff
changeset
|
180 |
bc37c6758f3a
util.sasl.scram: Create the state table as late as possible, keep state in locals for faster access
Kim Alvefur <zash@zash.se>
parents:
5867
diff
changeset
|
181 server_key = server_key; |
bc37c6758f3a
util.sasl.scram: Create the state table as late as possible, keep state in locals for faster access
Kim Alvefur <zash@zash.se>
parents:
5867
diff
changeset
|
182 stored_key = stored_key; |
5869
35780ef2d689
util.sasl.scram: Rewrite patterns and capture client-first-message-bare, client-final-message-without-proof
Kim Alvefur <zash@zash.se>
parents:
5868
diff
changeset
|
183 client_first_message_bare = client_first_message_bare; |
5868
bc37c6758f3a
util.sasl.scram: Create the state table as late as possible, keep state in locals for faster access
Kim Alvefur <zash@zash.se>
parents:
5867
diff
changeset
|
184 server_first_message = server_first_message; |
bc37c6758f3a
util.sasl.scram: Create the state table as late as possible, keep state in locals for faster access
Kim Alvefur <zash@zash.se>
parents:
5867
diff
changeset
|
185 } |
3096
e69282792686
util.sasl: Abstracting out the hash function used since SCRAM is independent of it. Adding scram-{mech} authentication backend support.
Tobias Markmann <tm@ayena.de>
parents:
3094
diff
changeset
|
186 return "challenge", server_first_message |
e69282792686
util.sasl: Abstracting out the hash function used since SCRAM is independent of it. Adding scram-{mech} authentication backend support.
Tobias Markmann <tm@ayena.de>
parents:
3094
diff
changeset
|
187 else |
e69282792686
util.sasl: Abstracting out the hash function used since SCRAM is independent of it. Adding scram-{mech} authentication backend support.
Tobias Markmann <tm@ayena.de>
parents:
3094
diff
changeset
|
188 -- we are processing client_final_message |
e69282792686
util.sasl: Abstracting out the hash function used since SCRAM is independent of it. Adding scram-{mech} authentication backend support.
Tobias Markmann <tm@ayena.de>
parents:
3094
diff
changeset
|
189 local client_final_message = message; |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5538
diff
changeset
|
190 |
5869
35780ef2d689
util.sasl.scram: Rewrite patterns and capture client-first-message-bare, client-final-message-without-proof
Kim Alvefur <zash@zash.se>
parents:
5868
diff
changeset
|
191 local client_final_message_without_proof, channelbinding, nonce, proof |
35780ef2d689
util.sasl.scram: Rewrite patterns and capture client-first-message-bare, client-final-message-without-proof
Kim Alvefur <zash@zash.se>
parents:
5868
diff
changeset
|
192 = s_match(client_final_message, "(c=([^,]*),r=([^,]*),?.-),p=(.*)$"); |
5835
a5f4de8c0b40
util.sasl.scram: Validate channel binding data of client final message.
Tobias Markmann <tm@ayena.de>
parents:
5833
diff
changeset
|
193 |
5868
bc37c6758f3a
util.sasl.scram: Create the state table as late as possible, keep state in locals for faster access
Kim Alvefur <zash@zash.se>
parents:
5867
diff
changeset
|
194 if not proof or not nonce or not channelbinding then |
5840
4b484e8feafc
sasl.util.scarm: Rearrage some code so it makes more sense.
Tobias Markmann <tm@ayena.de>
parents:
5839
diff
changeset
|
195 return "failure", "malformed-request", "Missing an attribute(p, r or c) in SASL message."; |
4b484e8feafc
sasl.util.scarm: Rearrage some code so it makes more sense.
Tobias Markmann <tm@ayena.de>
parents:
5839
diff
changeset
|
196 end |
4b484e8feafc
sasl.util.scarm: Rearrage some code so it makes more sense.
Tobias Markmann <tm@ayena.de>
parents:
5839
diff
changeset
|
197 |
5868
bc37c6758f3a
util.sasl.scram: Create the state table as late as possible, keep state in locals for faster access
Kim Alvefur <zash@zash.se>
parents:
5867
diff
changeset
|
198 local client_gs2_header = base64.decode(channelbinding) |
bc37c6758f3a
util.sasl.scram: Create the state table as late as possible, keep state in locals for faster access
Kim Alvefur <zash@zash.se>
parents:
5867
diff
changeset
|
199 local our_client_gs2_header = state["gs2_header"] |
bc37c6758f3a
util.sasl.scram: Create the state table as late as possible, keep state in locals for faster access
Kim Alvefur <zash@zash.se>
parents:
5867
diff
changeset
|
200 if state.gs2_cbind_name then |
5840
4b484e8feafc
sasl.util.scarm: Rearrage some code so it makes more sense.
Tobias Markmann <tm@ayena.de>
parents:
5839
diff
changeset
|
201 -- we support channelbinding, so check if the value is valid |
5868
bc37c6758f3a
util.sasl.scram: Create the state table as late as possible, keep state in locals for faster access
Kim Alvefur <zash@zash.se>
parents:
5867
diff
changeset
|
202 our_client_gs2_header = our_client_gs2_header .. self.profile.cb[state.gs2_cbind_name](self); |
5867
72d49d1e2d11
util.sasl.scram: Compare gs2-header to cbind-input (Thanks Tobias)
Kim Alvefur <zash@zash.se>
parents:
5856
diff
changeset
|
203 end |
72d49d1e2d11
util.sasl.scram: Compare gs2-header to cbind-input (Thanks Tobias)
Kim Alvefur <zash@zash.se>
parents:
5856
diff
changeset
|
204 if client_gs2_header ~= our_client_gs2_header then |
72d49d1e2d11
util.sasl.scram: Compare gs2-header to cbind-input (Thanks Tobias)
Kim Alvefur <zash@zash.se>
parents:
5856
diff
changeset
|
205 return "failure", "malformed-request", "Invalid channel binding value."; |
3096
e69282792686
util.sasl: Abstracting out the hash function used since SCRAM is independent of it. Adding scram-{mech} authentication backend support.
Tobias Markmann <tm@ayena.de>
parents:
3094
diff
changeset
|
206 end |
3099
2c4d06e7e3d3
util.sasl.scram: Check nonce in client final message. Check channel binding flag in client first message. Adding some TODOs on more strict parsing. (thanks Marc Santamaria)
Tobias Markmann <tm@ayena.de>
parents:
3098
diff
changeset
|
207 |
5868
bc37c6758f3a
util.sasl.scram: Create the state table as late as possible, keep state in locals for faster access
Kim Alvefur <zash@zash.se>
parents:
5867
diff
changeset
|
208 if nonce ~= state.nonce then |
3101
9e4439378cf8
util.sasl.scram: Fix in nonce check of client-final-message.
Tobias Markmann <tm@ayena.de>
parents:
3100
diff
changeset
|
209 return "failure", "malformed-request", "Wrong nonce in client-final-message."; |
3099
2c4d06e7e3d3
util.sasl.scram: Check nonce in client final message. Check channel binding flag in client first message. Adding some TODOs on more strict parsing. (thanks Marc Santamaria)
Tobias Markmann <tm@ayena.de>
parents:
3098
diff
changeset
|
210 end |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5538
diff
changeset
|
211 |
5868
bc37c6758f3a
util.sasl.scram: Create the state table as late as possible, keep state in locals for faster access
Kim Alvefur <zash@zash.se>
parents:
5867
diff
changeset
|
212 local ServerKey = state.server_key; |
bc37c6758f3a
util.sasl.scram: Create the state table as late as possible, keep state in locals for faster access
Kim Alvefur <zash@zash.se>
parents:
5867
diff
changeset
|
213 local StoredKey = state.stored_key; |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5538
diff
changeset
|
214 |
5869
35780ef2d689
util.sasl.scram: Rewrite patterns and capture client-first-message-bare, client-final-message-without-proof
Kim Alvefur <zash@zash.se>
parents:
5868
diff
changeset
|
215 local AuthMessage = state.client_first_message_bare .. "," .. state.server_first_message .. "," .. client_final_message_without_proof |
3096
e69282792686
util.sasl: Abstracting out the hash function used since SCRAM is independent of it. Adding scram-{mech} authentication backend support.
Tobias Markmann <tm@ayena.de>
parents:
3094
diff
changeset
|
216 local ClientSignature = HMAC_f(StoredKey, AuthMessage) |
5868
bc37c6758f3a
util.sasl.scram: Create the state table as late as possible, keep state in locals for faster access
Kim Alvefur <zash@zash.se>
parents:
5867
diff
changeset
|
217 local ClientKey = binaryXOR(ClientSignature, base64.decode(proof)) |
3096
e69282792686
util.sasl: Abstracting out the hash function used since SCRAM is independent of it. Adding scram-{mech} authentication backend support.
Tobias Markmann <tm@ayena.de>
parents:
3094
diff
changeset
|
218 local ServerSignature = HMAC_f(ServerKey, AuthMessage) |
3099
2c4d06e7e3d3
util.sasl.scram: Check nonce in client final message. Check channel binding flag in client first message. Adding some TODOs on more strict parsing. (thanks Marc Santamaria)
Tobias Markmann <tm@ayena.de>
parents:
3098
diff
changeset
|
219 |
3206
ff1d3f751da1
util.sasl.scram: Authenticate clients by calculated StoredKey instead of ClientProof.
Tobias Markmann <tm@ayena.de>
parents:
3205
diff
changeset
|
220 if StoredKey == H_f(ClientKey) then |
3096
e69282792686
util.sasl: Abstracting out the hash function used since SCRAM is independent of it. Adding scram-{mech} authentication backend support.
Tobias Markmann <tm@ayena.de>
parents:
3094
diff
changeset
|
221 local server_final_message = "v="..base64.encode(ServerSignature); |
e69282792686
util.sasl: Abstracting out the hash function used since SCRAM is independent of it. Adding scram-{mech} authentication backend support.
Tobias Markmann <tm@ayena.de>
parents:
3094
diff
changeset
|
222 return "success", server_final_message; |
e69282792686
util.sasl: Abstracting out the hash function used since SCRAM is independent of it. Adding scram-{mech} authentication backend support.
Tobias Markmann <tm@ayena.de>
parents:
3094
diff
changeset
|
223 else |
e69282792686
util.sasl: Abstracting out the hash function used since SCRAM is independent of it. Adding scram-{mech} authentication backend support.
Tobias Markmann <tm@ayena.de>
parents:
3094
diff
changeset
|
224 return "failure", "not-authorized", "The response provided by the client doesn't match the one we calculated."; |
2199
08a6b91bfe7b
SASLprep usernames and passwords.
Tobias Markmann <tm@ayena.de>
parents:
2198
diff
changeset
|
225 end |
2196
614c839c30c5
Completed SCRAM-SHA-1 implementation to a ready-to-test state.
Tobias Markmann <tm@ayena.de>
parents:
2194
diff
changeset
|
226 end |
2194
41d42d253a1d
Initial commit of SCRAM SASL mechanism.
Tobias Markmann <tm@ayena.de>
parents:
diff
changeset
|
227 end |
3096
e69282792686
util.sasl: Abstracting out the hash function used since SCRAM is independent of it. Adding scram-{mech} authentication backend support.
Tobias Markmann <tm@ayena.de>
parents:
3094
diff
changeset
|
228 return scram_hash; |
2194
41d42d253a1d
Initial commit of SCRAM SASL mechanism.
Tobias Markmann <tm@ayena.de>
parents:
diff
changeset
|
229 end |
41d42d253a1d
Initial commit of SCRAM SASL mechanism.
Tobias Markmann <tm@ayena.de>
parents:
diff
changeset
|
230 |
10216
a51d017e6173
util.sasl.scram: Factor out SHA-1 specific getAuthenticationDatabaseSHA1
Kim Alvefur <zash@zash.se>
parents:
8728
diff
changeset
|
231 local auth_db_getters = {} |
6786
3deeb38d79ab
util.sasl.scram: Get rid of module call
Kim Alvefur <zash@zash.se>
parents:
5871
diff
changeset
|
232 local function init(registerMechanism) |
10216
a51d017e6173
util.sasl.scram: Factor out SHA-1 specific getAuthenticationDatabaseSHA1
Kim Alvefur <zash@zash.se>
parents:
8728
diff
changeset
|
233 local function registerSCRAMMechanism(hash_name, hash, hmac_hash, pbkdf2) |
a51d017e6173
util.sasl.scram: Factor out SHA-1 specific getAuthenticationDatabaseSHA1
Kim Alvefur <zash@zash.se>
parents:
8728
diff
changeset
|
234 local get_auth_db = get_scram_hasher(hash, hmac_hash, pbkdf2); |
a51d017e6173
util.sasl.scram: Factor out SHA-1 specific getAuthenticationDatabaseSHA1
Kim Alvefur <zash@zash.se>
parents:
8728
diff
changeset
|
235 auth_db_getters[hash_name] = get_auth_db; |
8382
e5d00bf4a4d5
util: Various minor changes to please [luacheck]
Kim Alvefur <zash@zash.se>
parents:
8095
diff
changeset
|
236 registerMechanism("SCRAM-"..hash_name, |
e5d00bf4a4d5
util: Various minor changes to please [luacheck]
Kim Alvefur <zash@zash.se>
parents:
8095
diff
changeset
|
237 {"plain", "scram_"..(hashprep(hash_name))}, |
10216
a51d017e6173
util.sasl.scram: Factor out SHA-1 specific getAuthenticationDatabaseSHA1
Kim Alvefur <zash@zash.se>
parents:
8728
diff
changeset
|
238 scram_gen(hash_name:lower(), hash, hmac_hash, get_auth_db)); |
5844
4f545674b0bc
util.sasl.scram: Simplify validation of client-first-message
Kim Alvefur <zash@zash.se>
parents:
5843
diff
changeset
|
239 |
5828
24de22c01f8d
Adding some code for channel binding advertising.
Tobias Markmann <tm@ayena.de>
parents:
3981
diff
changeset
|
240 -- register channel binding equivalent |
8382
e5d00bf4a4d5
util: Various minor changes to please [luacheck]
Kim Alvefur <zash@zash.se>
parents:
8095
diff
changeset
|
241 registerMechanism("SCRAM-"..hash_name.."-PLUS", |
e5d00bf4a4d5
util: Various minor changes to please [luacheck]
Kim Alvefur <zash@zash.se>
parents:
8095
diff
changeset
|
242 {"plain", "scram_"..(hashprep(hash_name))}, |
12596
78f874441e21
util.sasl.scram: Add 'tls-exporter' as recognised channel binding method
Kim Alvefur <zash@zash.se>
parents:
12128
diff
changeset
|
243 scram_gen(hash_name:lower(), hash, hmac_hash, get_auth_db, true), {"tls-unique", "tls-exporter"}); |
3096
e69282792686
util.sasl: Abstracting out the hash function used since SCRAM is independent of it. Adding scram-{mech} authentication backend support.
Tobias Markmann <tm@ayena.de>
parents:
3094
diff
changeset
|
244 end |
3099
2c4d06e7e3d3
util.sasl.scram: Check nonce in client final message. Check channel binding flag in client first message. Adding some TODOs on more strict parsing. (thanks Marc Santamaria)
Tobias Markmann <tm@ayena.de>
parents:
3098
diff
changeset
|
245 |
10216
a51d017e6173
util.sasl.scram: Factor out SHA-1 specific getAuthenticationDatabaseSHA1
Kim Alvefur <zash@zash.se>
parents:
8728
diff
changeset
|
246 registerSCRAMMechanism("SHA-1", hashes.sha1, hashes.hmac_sha1, hashes.pbkdf2_hmac_sha1); |
10217
60b445183d84
util.sasl.scram: Add support for SCRAM-SHA-256
Kim Alvefur <zash@zash.se>
parents:
10216
diff
changeset
|
247 registerSCRAMMechanism("SHA-256", hashes.sha256, hashes.hmac_sha256, hashes.pbkdf2_hmac_sha256); |
2194
41d42d253a1d
Initial commit of SCRAM SASL mechanism.
Tobias Markmann <tm@ayena.de>
parents:
diff
changeset
|
248 end |
41d42d253a1d
Initial commit of SCRAM SASL mechanism.
Tobias Markmann <tm@ayena.de>
parents:
diff
changeset
|
249 |
6786
3deeb38d79ab
util.sasl.scram: Get rid of module call
Kim Alvefur <zash@zash.se>
parents:
5871
diff
changeset
|
250 return { |
10216
a51d017e6173
util.sasl.scram: Factor out SHA-1 specific getAuthenticationDatabaseSHA1
Kim Alvefur <zash@zash.se>
parents:
8728
diff
changeset
|
251 get_hash = get_scram_hasher; |
a51d017e6173
util.sasl.scram: Factor out SHA-1 specific getAuthenticationDatabaseSHA1
Kim Alvefur <zash@zash.se>
parents:
8728
diff
changeset
|
252 hashers = auth_db_getters; |
10295 | 253 getAuthenticationDatabaseSHA1 = get_scram_hasher(hashes.sha1, hashes.hmac_sha1, hashes.pbkdf2_hmac_sha1); -- COMPAT |
6786
3deeb38d79ab
util.sasl.scram: Get rid of module call
Kim Alvefur <zash@zash.se>
parents:
5871
diff
changeset
|
254 init = init; |
3deeb38d79ab
util.sasl.scram: Get rid of module call
Kim Alvefur <zash@zash.se>
parents:
5871
diff
changeset
|
255 } |