Skip to content

Commit efe0419

Browse files
committed
Merge branch 'issue152' into fork-dev
2 parents 51cb811 + e6ce456 commit efe0419

12 files changed

+272
-219
lines changed

Gruntfile.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ module.exports = function(grunt) {
3434
{expand: true, cwd: 'bower_components/angular-animate/', src: 'angular-animate.min.js', dest: 'lib/'},
3535
{expand: true, cwd: 'bower_components/angular-route/', src: 'angular-route.min.js', dest: 'lib/'},
3636
{expand: true, cwd: 'bower_components/angular-sanitize/', src: 'angular-sanitize.min.js', dest: 'lib/'},
37-
{expand: true, cwd: 'bower_components/animate.css/', src: 'animate.css', dest: 'lib/'}
37+
{expand: true, cwd: 'bower_components/animate.css/', src: 'animate.css', dest: 'lib/'},
38+
{expand: true, cwd: 'bower_components/kdbxweb/dist/', src: 'kdbxweb.js', dest: 'lib/'}
3839
]
3940
},
4041
appjs: {

bower.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@
2828
"mocha": "~2.1.0",
2929
"should": "shouldjs/should.js#~5.0.0",
3030
"sinonjs": "~1.10.2",
31-
"angular-sanitize": "~1.4"
31+
"angular-sanitize": "~1.4",
32+
"kdbxweb": "keeweb/kdbxweb#1.0.1"
3233
},
3334
"devDependencies": {
3435
"angular-mocks": "~1.4"

lib/argon2-asm.min.js

+17
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/argon2.js

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
'use strict';
2+
3+
function argon2(password, salt, memory, iterations, length, parallelism, type, version) {
4+
var Module = A2Module;
5+
var passwordLen = password.byteLength;
6+
password = Module.allocate(new Uint8Array(password), 'i8', Module.ALLOC_NORMAL);
7+
var saltLen = salt.byteLength;
8+
salt = Module.allocate(new Uint8Array(salt), 'i8', Module.ALLOC_NORMAL);
9+
var hash = Module.allocate(new Array(length), 'i8', Module.ALLOC_NORMAL);
10+
var encodedLen = 512;
11+
var encoded = Module.allocate(new Array(encodedLen), 'i8', Module.ALLOC_NORMAL);
12+
// jshint camelcase:false
13+
try {
14+
var res = Module._argon2_hash(iterations, memory, parallelism,
15+
password, passwordLen, salt, saltLen,
16+
hash, length, encoded, encodedLen, type, version);
17+
if (res) {
18+
return Promise.reject('Argon2 error ' + res);
19+
}
20+
var hashArr = new Uint8Array(length);
21+
for (var i = 0; i < length; i++) {
22+
hashArr[i] = Module.HEAP8[hash + i];
23+
}
24+
Module._free(password);
25+
Module._free(salt);
26+
Module._free(hash);
27+
Module._free(encoded);
28+
return Promise.resolve(hashArr);
29+
} catch (e) {
30+
return Promise.reject(e);
31+
}
32+
}

lib/kdbxweb.js

+7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

popups/controllers/masterPasswordController.js

+27-8
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,14 @@ function MasterPasswordController($scope, $routeParams, $location, keepass, unlo
6969
//tweak UI based on what we know about the database file
7070
$scope.hidePassword = (usage.requiresPassword === false);
7171
$scope.hideKeyFile = (usage.requiresKeyfile === false);
72-
passwordKey = usage.passwordKey ? Base64.decode(usage.passwordKey): undefined;
72+
if (usage.passwordKey) {
73+
if (usage.version >= 3)
74+
passwordKey = usage.passwordKey;
75+
else
76+
passwordKey = Base64.decode(usage.passwordKey);
77+
} else {
78+
passwordKey = undefined;
79+
}
7380
$scope.rememberedPassword = !!passwordKey;
7481
if ($scope.rememberedPassword) {
7582
$scope.rememberPassword = true;
@@ -147,23 +154,35 @@ function MasterPasswordController($scope, $routeParams, $location, keepass, unlo
147154

148155
var passwordKeyPromise;
149156
if (!passwordKey) {
150-
passwordKeyPromise = keepass.getMasterKey($scope.masterPassword, $scope.selectedKeyFile)
157+
passwordKeyPromise = keepass.getMasterKey($scope.masterPassword, $scope.selectedKeyFile);
151158
} else {
152159
passwordKeyPromise = Promise.resolve(passwordKey);
153160
}
154161

155162
passwordKeyPromise.then(function(newPasswordKey) {
156163
passwordKey = newPasswordKey;
157-
return keepass.getPasswords(passwordKey);
158-
}).then(function(entries) {
159-
//remember usage for next time:
160-
settings.saveCurrentDatabaseUsage({
164+
return keepass.getDecryptedData(passwordKey);
165+
}).then(function(decryptedData) {
166+
//remember usage for next time
167+
var entries = decryptedData.entries;
168+
var version = decryptedData.version;
169+
var databaseUsage = {
161170
requiresPassword: $scope.masterPassword ? true : false,
162171
requiresKeyfile: $scope.selectedKeyFile ? true : false,
163-
passwordKey: $scope.rememberPassword ? Base64.encode(passwordKey) : undefined,
172+
passwordKey: undefined,
173+
version: version,
164174
keyFileName: $scope.selectedKeyFile ? $scope.selectedKeyFile.name : "",
165175
rememberPeriod: $scope.rememberPeriod
166-
});
176+
}
177+
if ($scope.rememberPassword){
178+
if (version >= 3) {
179+
databaseUsage['passwordKey'] = passwordKey;
180+
}
181+
else {
182+
databaseUsage['passwordKey'] = Base64.encode(passwordKey);
183+
}
184+
settings.saveCurrentDatabaseUsage(databaseUsage);
185+
}
167186
settings.saveDefaultRememberOptions($scope.rememberPassword, $scope.rememberPeriod);
168187

169188
if ($scope.rememberPeriod) {

popups/popup.html

+3
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,11 @@
1313
<script type="text/javascript" src="/lib/angular-sanitize.min.js"></script>
1414
<script type="text/javascript" src="/lib/pako.min.js"></script>
1515
<script type="text/javascript" src="/lib/salsa20.js"></script>
16+
<script type="text/javascript" src="/lib/argon2-asm.min.js"></script>
17+
<script type="text/javascript" src="/lib/argon2.js"></script>
1618
<script type="text/javascript" src="/lib/base64.js"></script>
1719
<script type="text/javascript" src="/lib/case.min.js"></script>
20+
<script type="text/javascript" src="/lib/kdbxweb.js"></script>
1821
<script type="text/javascript" src="/services/settings.js"></script>
1922
<script type="text/javascript" src="/services/optionsLink.js"></script>
2023
<script type="text/javascript" src="/services/unlockedState.js"></script>

services/keepassHeader.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ function KeepassHeader() {
5858
}
5959

6060
if (h.sigKeePassType == DBSIG_KDBX || h.sigKeePassType == DBSIG_KDBX_ALPHA) {
61-
readKdbxHeader(buf, 8, h);
61+
h.kdbx = true;
6262
} else {
6363
readKdbHeader(buf, 8, h);
6464
}

services/keepassReference.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,12 @@ function KeepassReference(streamCipher) {
6262
}
6363

6464
my.getFieldValue = function(currentEntry, fieldName, allEntries) {
65-
var plainText = streamCipher.getDecryptedFieldValue(currentEntry, fieldName);
65+
// entries are JSON serializable.
66+
// Convert back to a keeweb.ProtectedValue for parsing.
67+
var keewebProtectedValue = new kdbxweb.ProtectedValue(
68+
currentEntry['protectedData'][fieldName].value,
69+
currentEntry['protectedData'][fieldName].salt);
70+
var plainText = keewebProtectedValue.getText();
6671
return my.processAllReferences(plainText, currentEntry, allEntries);
6772
}
6873

0 commit comments

Comments
 (0)