in src/Amazon.Extensions.CognitoAuthentication/CognitoUserAuthentication.cs [174:224]
private RespondToAuthChallengeRequest CreateDevicePasswordVerifierAuthRequest(RespondToAuthChallengeResponse challenge,
string deviceKeyGroup,
string devicePassword,
Tuple<BigInteger, BigInteger> tupleAa)
{
if (challenge == null)
throw new ArgumentNullException(nameof(challenge), $"{nameof(challenge)} cannot be null");
if (challenge.ChallengeParameters == null)
throw new ArgumentNullException(nameof(challenge.ChallengeParameters), $"{nameof(challenge.ChallengeParameters)} cannot be null");
string deviceKey = challenge.ChallengeParameters[CognitoConstants.ChlgParamDeviceKey];
string username = challenge.ChallengeParameters[CognitoConstants.ChlgParamUsername];
string secretBlock = challenge.ChallengeParameters[CognitoConstants.ChlgParamSecretBlock];
string salt = challenge.ChallengeParameters[CognitoConstants.ChlgParamSalt];
BigInteger srpb = BigIntegerExtensions.FromUnsignedLittleEndianHex(challenge.ChallengeParameters[CognitoConstants.ChlgParamSrpB]);
if (srpb.TrueMod(AuthenticationHelper.N).Equals(BigInteger.Zero))
{
throw new ArgumentException("SRP error, B mod N cannot be zero.", nameof(challenge));
}
string timeStr = DateTime.UtcNow.ToString("ddd MMM d HH:mm:ss \"UTC\" yyyy", CultureInfo.InvariantCulture);
var claimBytes = AuthenticationHelper.AuthenticateDevice(username, deviceKey, devicePassword, deviceKeyGroup, salt,
challenge.ChallengeParameters[CognitoConstants.ChlgParamSrpB], secretBlock, timeStr, tupleAa);
string claimB64 = Convert.ToBase64String(claimBytes);
Dictionary<string, string> srpAuthResponses = new Dictionary<string, string>(StringComparer.Ordinal)
{
{CognitoConstants.ChlgParamPassSecretBlock, secretBlock},
{CognitoConstants.ChlgParamPassSignature, claimB64},
{CognitoConstants.ChlgParamUsername, username },
{CognitoConstants.ChlgParamTimestamp, timeStr },
{CognitoConstants.ChlgParamDeviceKey, Device.DeviceKey }
};
if (!string.IsNullOrEmpty(SecretHash))
{
srpAuthResponses.Add(CognitoConstants.ChlgParamSecretHash, SecretHash);
}
RespondToAuthChallengeRequest authChallengeRequest = new RespondToAuthChallengeRequest()
{
ChallengeName = challenge.ChallengeName,
ClientId = ClientID,
Session = challenge.Session,
ChallengeResponses = srpAuthResponses
};
return authChallengeRequest;
}