in java/src/main/java/com/alexa/awisapi/AuthenticationHelper.java [240:289]
private RespondToAuthChallengeRequest userSrpAuthRequest(InitiateAuthResult challenge,
String password
) {
String userIdForSRP = challenge.getChallengeParameters().get("USER_ID_FOR_SRP");
String usernameInternal = challenge.getChallengeParameters().get("USERNAME");
BigInteger B = new BigInteger(challenge.getChallengeParameters().get("SRP_B"), 16);
if (B.mod(AuthenticationHelper.N).equals(BigInteger.ZERO)) {
throw new SecurityException("SRP error, B cannot be zero");
}
BigInteger salt = new BigInteger(challenge.getChallengeParameters().get("SALT"), 16);
byte[] key = getPasswordAuthenticationKey(userIdForSRP, password, B, salt);
Date timestamp = new Date();
byte[] hmac = null;
try {
Mac mac = Mac.getInstance("HmacSHA256");
SecretKeySpec keySpec = new SecretKeySpec(key, "HmacSHA256");
mac.init(keySpec);
mac.update(this.userPoolID.split("_", 2)[1].getBytes(StringUtils.UTF8));
mac.update(userIdForSRP.getBytes(StringUtils.UTF8));
byte[] secretBlock = Base64.decode(challenge.getChallengeParameters().get("SECRET_BLOCK"));
mac.update(secretBlock);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEE MMM d HH:mm:ss z yyyy", Locale.US);
simpleDateFormat.setTimeZone(new SimpleTimeZone(SimpleTimeZone.UTC_TIME, "UTC"));
String dateString = simpleDateFormat.format(timestamp);
byte[] dateBytes = dateString.getBytes(StringUtils.UTF8);
hmac = mac.doFinal(dateBytes);
} catch (Exception e) {
System.out.println(e);
}
SimpleDateFormat formatTimestamp = new SimpleDateFormat("EEE MMM d HH:mm:ss z yyyy", Locale.US);
formatTimestamp.setTimeZone(new SimpleTimeZone(SimpleTimeZone.UTC_TIME, "UTC"));
Map<String, String> srpAuthResponses = new HashMap<>();
srpAuthResponses.put("PASSWORD_CLAIM_SECRET_BLOCK", challenge.getChallengeParameters().get("SECRET_BLOCK"));
srpAuthResponses.put("PASSWORD_CLAIM_SIGNATURE", new String(Base64.encode(hmac), StringUtils.UTF8));
srpAuthResponses.put("TIMESTAMP", formatTimestamp.format(timestamp));
srpAuthResponses.put("USERNAME", usernameInternal);
RespondToAuthChallengeRequest authChallengeRequest = new RespondToAuthChallengeRequest();
authChallengeRequest.setChallengeName(challenge.getChallengeName());
authChallengeRequest.setClientId(clientId);
authChallengeRequest.setSession(challenge.getSession());
authChallengeRequest.setChallengeResponses(srpAuthResponses);
return authChallengeRequest;
}