extracted challenge-response calculator

This commit is contained in:
antelle 2020-05-30 08:19:47 +02:00
parent 2ba9a03e2c
commit b4fe0af53a
No known key found for this signature in database
GPG Key ID: 63C9777AAB7C563C
2 changed files with 43 additions and 22 deletions

View File

@ -0,0 +1,41 @@
import { Logger } from 'util/logger';
import { YubiKey } from 'comp/app/yubikey';
const logger = new Logger('chal-resp');
const ChalRespCalculator = {
cache: {},
build(params) {
if (!params) {
return null;
}
return challenge => {
return new Promise((resolve, reject) => {
const ts = logger.ts();
challenge = Buffer.from(challenge);
const hexChallenge = challenge.toString('hex');
const key = `${params.vid}:${params.pid}:${params.serial}:${hexChallenge}`;
if (this.cache[key]) {
logger.debug('Found ChalResp in cache');
return resolve(Buffer.from(this.cache[key], 'hex'));
}
logger.debug('Calculating ChalResp using a YubiKey');
YubiKey.calculateChalResp(params, challenge, (err, response) => {
if (err) {
return reject(err);
}
this.cache[key] = response.toString('hex');
logger.info('Calculated ChalResp', logger.ts(ts));
resolve(response);
});
});
};
}
};
export { ChalRespCalculator };

View File

@ -8,7 +8,7 @@ import { GroupModel } from 'models/group-model';
import { IconUrlFormat } from 'util/formatting/icon-url-format';
import { Logger } from 'util/logger';
import { mapObject } from 'util/fn';
import { YubiKey } from 'comp/app/yubikey';
import { ChalRespCalculator } from 'comp/app/chal-resp-calculator';
const logger = new Logger('file');
@ -23,7 +23,7 @@ class FileModel extends Model {
open(password, fileData, keyFileData, chalResp, callback) {
try {
const challengeResponse = this.makeChallengeResponse(chalResp);
const challengeResponse = ChalRespCalculator.build(chalResp);
const credentials = new kdbxweb.Credentials(password, keyFileData, challengeResponse);
const ts = logger.ts();
@ -69,26 +69,6 @@ class FileModel extends Model {
}
}
makeChallengeResponse(params) {
if (!params) {
return null;
}
return challenge => {
return new Promise((resolve, reject) => {
logger.debug('Calculating ChalResp using a YubiKey');
const ts = logger.ts();
challenge = Buffer.from(challenge);
YubiKey.calculateChalResp(params, challenge, (err, response) => {
if (err) {
return reject(err);
}
logger.info('Calculated ChalResp', logger.ts(ts));
resolve(response);
});
});
};
}
kdfArgsToString(header) {
if (header.kdfParameters) {
return header.kdfParameters