Skip to content

Commit 1f458e8

Browse files
authored
Merge pull request #17 from esl/sasl-channel-binding
Ignore optional extensions instead of erroring
2 parents 10461b4 + b21dda7 commit 1f458e8

File tree

3 files changed

+35
-16
lines changed

3 files changed

+35
-16
lines changed

src/fast_scram.erl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,8 @@ apply_rules_until_match(Input, [Rule | RulesLeft], State) ->
360360
case Rule(Input, State) of
361361
{ok, NewState} ->
362362
{RulesLeft, NewState};
363+
{keep_rule, NewState} ->
364+
{[Rule | RulesLeft], NewState};
363365
{skip_rule, State} ->
364366
apply_rules_until_match(Input, RulesLeft, State);
365367
{error, Reason} ->

src/fast_scram_parse_rules.erl

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
-type parse_return() ::
88
{ok, fast_scram:state()}
9+
| {keep_rule, fast_scram:state()}
910
| {skip_rule, fast_scram:state()}
1011
| {error, binary()}.
1112
-export_type([parse_return/0]).
@@ -124,16 +125,18 @@ parse_extensions(<<>>, _) ->
124125
{error, <<"other-error">>};
125126
parse_extensions(<<"m=", _/binary>>, _) ->
126127
{error, <<"extensions-not-supported">>};
127-
parse_extensions(<<Char:1/binary, _/binary>>, State) ->
128-
case
129-
lists:any(
130-
fun(El) -> Char =:= El end,
131-
fast_scram_attributes:reserved_scram_codes()
132-
)
133-
of
134-
true -> {skip_rule, State};
135-
false -> {error, <<"extensions-not-supported">>}
136-
end.
128+
parse_extensions(<<Char, "=", _/binary>>, State) ->
129+
case lists:member(<<Char>>, fast_scram_attributes:reserved_scram_codes()) of
130+
true ->
131+
{skip_rule, State};
132+
false ->
133+
case (Char >= $a andalso Char =< $z) orelse (Char >= $A andalso Char =< $Z) of
134+
true -> {keep_rule, State};
135+
false -> {error, <<"invalid-extensions">>}
136+
end
137+
end;
138+
parse_extensions(_, _) ->
139+
{error, <<"invalid-extensions">>}.
137140

138141
-spec parse_proof(binary(), fast_scram:state()) -> parse_return().
139142
parse_proof(<<>>, _State) ->

test/scram_SUITE.erl

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
verification_name_escapes_values_correctly/1,
2525
verification_name_does_not_escape_values_correctly/1,
2626
authentication_server_last_message_is_an_error/1,
27+
authentication_ignores_extra_extensions/1,
2728
authentication_server_rejects_the_proof/1,
2829
authentication_server_rejects_invalid_encoded_proof/1,
2930
authentication_client_rejects_the_signature/1,
@@ -52,6 +53,7 @@
5253
wrong_flag_salt/1,
5354
wrong_flag_it_count/1,
5455
wrong_it_count/1,
56+
wrong_extensions/1,
5557
too_much_input/1,
5658
not_supported_authzid/1,
5759
not_supported_mext/1,
@@ -89,6 +91,7 @@ groups() ->
8991
]},
9092
{authentication, [parallel], [
9193
authentication_server_last_message_is_an_error,
94+
authentication_ignores_extra_extensions,
9295
authentication_server_rejects_the_proof,
9396
authentication_server_rejects_invalid_encoded_proof,
9497
authentication_client_rejects_the_signature
@@ -125,6 +128,7 @@ groups() ->
125128
wrong_flag_salt,
126129
wrong_flag_it_count,
127130
wrong_it_count,
131+
wrong_extensions,
128132
too_much_input
129133
]},
130134
{not_supported, [parallel], [
@@ -398,6 +402,11 @@ authentication_server_last_message_is_an_error(_Config) ->
398402
),
399403
?assertEqual(<<"invalid">>, Reason).
400404

405+
authentication_ignores_extra_extensions(_Config) ->
406+
ServerState = typical_scram_configuration(server),
407+
ClientFirst1 = <<"n,,n=user,r=fyko+d2lbbFgONRv9qkxdawL,g=extra1,h=extra2">>,
408+
?assertMatch({continue, _, _}, fast_scram:mech_step(ServerState, ClientFirst1)).
409+
401410
configuration_client_sends_wrong_username(_Config) ->
402411
ClientState1 = typical_scram_configuration(client),
403412
ServerState0 = typical_scram_configuration(server),
@@ -671,6 +680,14 @@ wrong_it_count(_Config) ->
671680
<<"r=fyko+d2lbbFgONRv9qkxdawL3rfcNHYJY1ZVvWVs7j,s=QSXCR+Q6sek8bf92,i=wrong">>,
672681
{error, Reason, _} = fast_scram:mech_step(ClientState3, ServerWrongItCount),
673682
?assertEqual(<<"invalid-iteration-count">>, Reason).
683+
wrong_extensions(_Config) ->
684+
ServerState = typical_scram_configuration(server),
685+
ClientFirst1 = <<"n,,n=user,r=fyko+d2lbbFgONRv9qkxdawL,9=invalid">>,
686+
{error, Reason1, _} = fast_scram:mech_step(ServerState, ClientFirst1),
687+
?assertEqual(<<"invalid-extensions">>, Reason1),
688+
ClientFirst2 = <<"n,,n=user,r=fyko+d2lbbFgONRv9qkxdawL,zz=invalid">>,
689+
{error, Reason2, _} = fast_scram:mech_step(ServerState, ClientFirst2),
690+
?assertEqual(<<"invalid-extensions">>, Reason2).
674691
too_much_input(_Config) ->
675692
ServerState2 = typical_scram_configuration(server),
676693
Username = <<"n,,n=user,r=fyko+d2lbbFgONRv9qkxdawL,r=toomuch">>,
@@ -690,12 +707,9 @@ not_supported_mext(_Config) ->
690707
{error, Reason, _} = fast_scram:mech_step(ClientState3, ServerWithMext),
691708
?assertEqual(<<"extensions-not-supported">>, Reason).
692709
not_supported_extension(_Config) ->
693-
ServerState2 = typical_scram_configuration(server),
694-
ClientFirst1 = <<"n,,n=user,r=fyko+d2lbbFgONRv9qkxdawL,t=extension">>,
695-
{error, Reason, _} = fast_scram:mech_step(ServerState2, ClientFirst1),
696-
?assertEqual(<<"extensions-not-supported">>, Reason),
697-
ClientFirst2 = <<"n,,n=user,r=fyko+d2lbbFgONRv9qkxdawL,m=extension">>,
698-
{error, Reason, _} = fast_scram:mech_step(ServerState2, ClientFirst2),
710+
ServerState = typical_scram_configuration(server),
711+
ClientFirst = <<"n,,n=user,r=fyko+d2lbbFgONRv9qkxdawL,m=extension">>,
712+
{error, Reason, _} = fast_scram:mech_step(ServerState, ClientFirst),
699713
?assertEqual(<<"extensions-not-supported">>, Reason).
700714

701715
%%%===================================================================

0 commit comments

Comments
 (0)