blob: f784e2ac24564d762d24ed7ef99d1b0a5611a042 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System.Text;
using Apache.Qpid.Proton.Buffer;
using NUnit.Framework;
namespace Apache.Qpid.Proton.Engine.Sasl.Client
{
[TestFixture, Timeout(20000)]
public class ScramSHA256MechanismTest : AbstractScramSHAMechanismTestBase
{
private static readonly string TEST_USERNAME = "user";
private static readonly string TEST_PASSWORD = "pencil";
private static readonly string CLIENT_NONCE = "rOprNGfwEbeRWgbNEkqO";
private static readonly IProtonBuffer EXPECTED_CLIENT_INITIAL_RESPONSE = ProtonByteBufferAllocator.Instance.Wrap(
Encoding.UTF8.GetBytes("n,,n=user,r=rOprNGfwEbeRWgbNEkqO"));
private static readonly IProtonBuffer SERVER_FIRST_MESSAGE = ProtonByteBufferAllocator.Instance.Wrap(
Encoding.UTF8.GetBytes("r=rOprNGfwEbeRWgbNEkqO%hvYDpWUa2RaTCAfuxFIlj)hNlF$k0,s=W22ZaJ0SNY7soEsUEjb6gQ==,i=4096"));
private static readonly IProtonBuffer EXPECTED_CLIENT_FINAL_MESSAGE = ProtonByteBufferAllocator.Instance.Wrap(
Encoding.UTF8.GetBytes("c=biws,r=rOprNGfwEbeRWgbNEkqO%hvYDpWUa2RaTCAfuxFIlj)hNlF$k0,p=dHzbZapWIk4jUhN+Ute9ytag9zjfMHgsqmmiz7AndVQ="));
private static readonly IProtonBuffer SERVER_FINAL_MESSAGE = ProtonByteBufferAllocator.Instance.Wrap(
Encoding.UTF8.GetBytes("v=6rriTRBi23WpRR/wtup+mMhUZUn/dB5nLTJRsjl95G4="));
public ScramSHA256MechanismTest() : base(EXPECTED_CLIENT_INITIAL_RESPONSE,
SERVER_FIRST_MESSAGE,
EXPECTED_CLIENT_FINAL_MESSAGE,
SERVER_FINAL_MESSAGE)
{
}
protected override IMechanism GetMechanismForTesting()
{
return new ScramSHA256Mechanism(CLIENT_NONCE);
}
protected override ISaslCredentialsProvider GetTestCredentials()
{
return Credentials(TEST_USERNAME, TEST_PASSWORD);
}
[Test]
public void TestGetNameMatchesValueInSaslMechanismsEnum()
{
Assert.AreEqual(SaslMechanism.ScramSHA256.ToSymbol(), GetMechanismForTesting().Name);
}
[Test]
public void TestDifferentClientNonceOnEachInstance()
{
ScramSHA256Mechanism mech1 = new ScramSHA256Mechanism();
ScramSHA256Mechanism mech2 = new ScramSHA256Mechanism();
IProtonBuffer clientInitialResponse1 = mech1.GetInitialResponse(GetTestCredentials());
IProtonBuffer clientInitialResponse2 = mech2.GetInitialResponse(GetTestCredentials());
Assert.IsTrue(clientInitialResponse1.ToString(Encoding.UTF8).StartsWith("n,,n=user,r="));
Assert.IsTrue(clientInitialResponse2.ToString(Encoding.UTF8).StartsWith("n,,n=user,r="));
Assert.AreNotEqual(clientInitialResponse1, clientInitialResponse2);
}
[Test]
public void TestUsernameCommaEqualsCharactersEscaped()
{
string originalUsername = "user,name=";
string escapedUsername = "user=2Cname=3D";
string expectedInitialResponseString = "n,,n=" + escapedUsername + ",r=" + CLIENT_NONCE;
IProtonBuffer expectedInitialResponseBuffer = ProtonByteBufferAllocator.Instance.Wrap(
Encoding.UTF8.GetBytes(expectedInitialResponseString));
ScramSHA256Mechanism mech = new ScramSHA256Mechanism(CLIENT_NONCE);
IProtonBuffer clientInitialResponse = mech.GetInitialResponse(Credentials(originalUsername, "password"));
Assert.AreEqual(expectedInitialResponseBuffer, clientInitialResponse);
}
[Test]
public void TestPasswordCommaEqualsCharactersNotEscaped()
{
IMechanism mechanism = GetMechanismForTesting();
ISaslCredentialsProvider credentials = Credentials(TEST_USERNAME, TEST_PASSWORD + ",=");
IProtonBuffer clientInitialResponse = mechanism.GetInitialResponse(credentials);
Assert.AreEqual(EXPECTED_CLIENT_INITIAL_RESPONSE, clientInitialResponse);
IProtonBuffer serverFirstMessage = ProtonByteBufferAllocator.Instance.Wrap(
Encoding.UTF8.GetBytes("r=rOprNGfwEbeRWgbNEkqOb291012f-b281-47d3-acbc-fefffaad60f2,s=fQwuXmWB4XES7vNK4oBlLtH9cbWAmtxO+Z+tZ9m5W54=,i=4096"));
IProtonBuffer expectedClientFinalMessage = ProtonByteBufferAllocator.Instance.Wrap(
Encoding.UTF8.GetBytes("c=biws,r=rOprNGfwEbeRWgbNEkqOb291012f-b281-47d3-acbc-fefffaad60f2,p=PNeUNfKwyqBPjMssgF7yk4iLt8W24NS/D99HjBbXwyw="));
IProtonBuffer clientFinalMessage = mechanism.GetChallengeResponse(credentials, serverFirstMessage);
Assert.AreEqual(expectedClientFinalMessage, clientFinalMessage);
IProtonBuffer serverFinalMessage = ProtonByteBufferAllocator.Instance.Wrap(
Encoding.UTF8.GetBytes("v=/N9SY26AOvz2QZkJZkyXpomWknaFWSN6zBGqg5RNG9w="));
IProtonBuffer expectedFinalChallengeResponse = ProtonByteBufferAllocator.Instance.Wrap(Encoding.UTF8.GetBytes(""));
Assert.AreEqual(expectedFinalChallengeResponse, mechanism.GetChallengeResponse(credentials, serverFinalMessage));
mechanism.VerifyCompletion();
}
}
}