aws-cognito-srp-client
Version:
SRP Client for AWS Cognito UserPools SRP Auth Flow
104 lines (103 loc) • 4.68 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var bigInteger_1 = (0, tslib_1.__importDefault)(require("./bigInteger"));
var cryptoUtils_1 = require("./cryptoUtils");
var enc_base64_1 = (0, tslib_1.__importDefault)(require("crypto-js/enc-base64"));
var enc_hex_1 = (0, tslib_1.__importDefault)(require("crypto-js/enc-hex"));
var enc_utf8_1 = (0, tslib_1.__importDefault)(require("crypto-js/enc-utf8"));
var initN = "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" +
"29024E088A67CC74020BBEA63B139B22514A08798E3404DD" +
"EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" +
"E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" +
"EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D" +
"C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F" +
"83655D23DCA3AD961C62F356208552BB9ED529077096966D" +
"670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B" +
"E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9" +
"DE2BCBF6955817183995497CEA956AE515D2261898FA0510" +
"15728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64" +
"ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7" +
"ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6B" +
"F12FFA06D98A0864D87602733EC86A64521F2B18177B200C" +
"BBE117577A615D6C770988C0BAD946E208E24FA074E5AB31" +
"43DB5BFCE0FD108E4B82D120A93AD2CAFFFFFFFFFFFFFFFF";
var Srp = /** @class */ (function () {
function Srp(poolId) {
this.g = (0, bigInteger_1.default)("2", 16);
this.N = (0, bigInteger_1.default)(initN, 16);
this.k = (0, bigInteger_1.default)((0, cryptoUtils_1.hexHash)((0, cryptoUtils_1.padHex)(this.N) + (0, cryptoUtils_1.padHex)(this.g)), 16);
this.poolName = poolId.split("_")[1];
}
Srp.prototype.getA = function () {
this.a = (0, cryptoUtils_1.randomValue)(128);
this.A = this.g.modPow(this.a, this.N);
if (this.A.mod(this.N).isZero()) {
new Error("Illegal paramater. A mod N cannot be 0.");
}
return this.A.toString(16);
};
Srp.prototype.getSignature = function (username, strB, strSalt, secretBlock, password) {
var B = (0, bigInteger_1.default)(strB, 16);
if (B.mod(this.N).isZero()) {
new Error("Illegal paramater. B mod N cannot be 0.");
}
var salt = (0, bigInteger_1.default)(strSalt, 16);
var U = (0, bigInteger_1.default)((0, cryptoUtils_1.hexHash)((0, cryptoUtils_1.padHex)(this.A) + (0, cryptoUtils_1.padHex)(B)), 16);
if (U.isZero()) {
throw new Error("U cannot be zero.");
}
var usernamePasswordHash = (0, cryptoUtils_1.hash)(enc_utf8_1.default.parse(this.poolName + username + ":" + password));
var x = (0, bigInteger_1.default)((0, cryptoUtils_1.hexHash)((0, cryptoUtils_1.padHex)(salt) + usernamePasswordHash), 16);
var S = B.subtract(this.k.multiply(this.g.modPow(x, this.N))).modPow(this.a.add(U.multiply(x)), this.N);
var paddedS = (0, cryptoUtils_1.padHex)(S);
var hkdf = (0, cryptoUtils_1.computehkdf)(enc_hex_1.default.parse(paddedS), enc_hex_1.default.parse((0, cryptoUtils_1.padHex)(U)));
var timestamp = getNowString();
var message = enc_utf8_1.default
.parse(this.poolName)
.concat(enc_utf8_1.default.parse(username))
.concat(enc_base64_1.default.parse(secretBlock))
.concat(enc_utf8_1.default.parse(timestamp));
var signature = (0, cryptoUtils_1.computeSignature)(message, hkdf);
return { timestamp: timestamp, signature: signature };
};
return Srp;
}());
exports.default = Srp;
var getNowString = function () {
var now = new Date();
var monthNames = [
"Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
"Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec"
];
var weekNames = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
var weekDay = weekNames[now.getUTCDay()];
var month = monthNames[now.getUTCMonth()];
var day = now.getUTCDate();
var hours = now.getUTCHours();
if (hours < 10) {
hours = "0".concat(hours);
}
var minutes = now.getUTCMinutes();
if (minutes < 10) {
minutes = "0".concat(minutes);
}
var seconds = now.getUTCSeconds();
if (seconds < 10) {
seconds = "0".concat(seconds);
}
var year = now.getUTCFullYear();
// ddd MMM D HH:mm:ss UTC YYYY
var dateNow = "".concat(weekDay, " ").concat(month, " ").concat(day, " ").concat(hours, ":").concat(minutes, ":").concat(seconds, " UTC ").concat(year);
return dateNow;
};