author | ulf69 <ulf69> | 2004-11-07 02:10:50 (UTC) |
---|---|---|
committer | ulf69 <ulf69> | 2004-11-07 02:10:50 (UTC) |
commit | 31c3fc0e0673b9403fb4ef4a9836305d1d49ff83 (patch) (unidiff) | |
tree | f5a44f4402294d6fd61e204489cdd776acb804aa /pwmanager/pwmanager/libgcryptif.cpp | |
parent | 2b6072e39edbc8c9ab36e1e835b252a799db97a1 (diff) | |
download | kdepimpi-31c3fc0e0673b9403fb4ef4a9836305d1d49ff83.zip kdepimpi-31c3fc0e0673b9403fb4ef4a9836305d1d49ff83.tar.gz kdepimpi-31c3fc0e0673b9403fb4ef4a9836305d1d49ff83.tar.bz2 |
Fixed nasty PwM/Pi file reading bug, when
the used hash algo of file is different then the global
hash algo.
CVS ----------------------------------------------------------------------
Diffstat (limited to 'pwmanager/pwmanager/libgcryptif.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | pwmanager/pwmanager/libgcryptif.cpp | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/pwmanager/pwmanager/libgcryptif.cpp b/pwmanager/pwmanager/libgcryptif.cpp index ff94bf6..15f6cef 100644 --- a/pwmanager/pwmanager/libgcryptif.cpp +++ b/pwmanager/pwmanager/libgcryptif.cpp | |||
@@ -41,7 +41,9 @@ PwMerror LibGCryptIf::encrypt(unsigned char **outBuf, | |||
41 | size_t inBufLen, | 41 | size_t inBufLen, |
42 | const unsigned char *key, | 42 | const unsigned char *key, |
43 | size_t keylen, | 43 | size_t keylen, |
44 | char _algo) | 44 | char _algo, |
45 | char _hashalgo //US BUG: pass _hashalgo because we need it in hashPassphrase | ||
46 | ) | ||
45 | { | 47 | { |
46 | PwMerror ret = e_success; | 48 | PwMerror ret = e_success; |
47 | gcry_error_t err; | 49 | gcry_error_t err; |
@@ -105,7 +107,7 @@ PwMerror LibGCryptIf::encrypt(unsigned char **outBuf, | |||
105 | } | 107 | } |
106 | // hash the "key" to a fixed size hash matching "cipherKeylen" | 108 | // hash the "key" to a fixed size hash matching "cipherKeylen" |
107 | hashedKey = new unsigned char[cipherKeylen]; | 109 | hashedKey = new unsigned char[cipherKeylen]; |
108 | hashPassphrase(key, keylen, salt, hashedKey, cipherKeylen, true); | 110 | hashPassphrase(key, keylen, salt, hashedKey, cipherKeylen, true, _hashalgo); |
109 | // so now set the hashed key | 111 | // so now set the hashed key |
110 | err = gcry_cipher_setkey(handle, hashedKey, cipherKeylen); | 112 | err = gcry_cipher_setkey(handle, hashedKey, cipherKeylen); |
111 | if (err != GPG_ERR_NO_ERROR) { | 113 | if (err != GPG_ERR_NO_ERROR) { |
@@ -152,7 +154,9 @@ PwMerror LibGCryptIf::decrypt(unsigned char **outBuf, | |||
152 | size_t inBufLen, | 154 | size_t inBufLen, |
153 | const unsigned char *key, | 155 | const unsigned char *key, |
154 | size_t keylen, | 156 | size_t keylen, |
155 | char _algo) | 157 | char _algo, |
158 | char _hashalgo //US BUG: pass _hashalgo because we need it in hashPassphrase | ||
159 | ) | ||
156 | { | 160 | { |
157 | PwMerror ret = e_success; | 161 | PwMerror ret = e_success; |
158 | gcry_error_t err; | 162 | gcry_error_t err; |
@@ -201,7 +205,7 @@ PwMerror LibGCryptIf::decrypt(unsigned char **outBuf, | |||
201 | } | 205 | } |
202 | // hash the "key" to a fixed size hash matching "cipherKeylen" | 206 | // hash the "key" to a fixed size hash matching "cipherKeylen" |
203 | hashedKey = new unsigned char[cipherKeylen]; | 207 | hashedKey = new unsigned char[cipherKeylen]; |
204 | hashPassphrase(key, keylen, salt, hashedKey, cipherKeylen, false); | 208 | hashPassphrase(key, keylen, salt, hashedKey, cipherKeylen, false, _hashalgo); |
205 | // so now set the hashed key | 209 | // so now set the hashed key |
206 | err = gcry_cipher_setkey(handle, hashedKey, cipherKeylen); | 210 | err = gcry_cipher_setkey(handle, hashedKey, cipherKeylen); |
207 | if (err != GPG_ERR_NO_ERROR) { | 211 | if (err != GPG_ERR_NO_ERROR) { |
@@ -314,7 +318,9 @@ bool LibGCryptIf::hashPassphrase(const unsigned char *pw, | |||
314 | unsigned char *salt, | 318 | unsigned char *salt, |
315 | unsigned char *key, | 319 | unsigned char *key, |
316 | size_t keylen, | 320 | size_t keylen, |
317 | bool create) | 321 | bool create, |
322 | char _hashalgo //US BUG: pass _hashalgo because we need it in hashPassphrase | ||
323 | ) | ||
318 | { | 324 | { |
319 | DEK dek; | 325 | DEK dek; |
320 | STRING2KEY s2k; | 326 | STRING2KEY s2k; |
@@ -322,7 +328,10 @@ bool LibGCryptIf::hashPassphrase(const unsigned char *pw, | |||
322 | 328 | ||
323 | dek.keylen = keylen; | 329 | dek.keylen = keylen; |
324 | s2k.mode = 1; | 330 | s2k.mode = 1; |
325 | s2k.hash_algo = mapHashId(conf()->confGlobHashAlgo()); | 331 | //US bug: do not use the global hash algo here. Use the passed ago instead. The hashalgo stored in the file can |
332 | // be different from the one in the configuration. | ||
333 | s2k.hash_algo = mapHashId(_hashalgo //conf()->confGlobHashAlgo() | ||
334 | ); | ||
326 | s2k.count = 0; | 335 | s2k.count = 0; |
327 | if (!create) | 336 | if (!create) |
328 | memcpy(s2k.salt, salt, STRING2KEY_SALTLEN); | 337 | memcpy(s2k.salt, salt, STRING2KEY_SALTLEN); |
@@ -439,7 +448,7 @@ void LibGCryptIf::unpadData(const unsigned char *buf, | |||
439 | BUG_ON(*bufLen % 8); | 448 | BUG_ON(*bufLen % 8); |
440 | pos = *bufLen - 1; | 449 | pos = *bufLen - 1; |
441 | while (buf[pos] != static_cast<char>(0x01)) { | 450 | while (buf[pos] != static_cast<char>(0x01)) { |
442 | qDebug("pos %d %d %d", pos, buf[pos], static_cast<char>(0x01) ); | 451 | //qDebug("pos %d %d %d", pos, buf[pos], static_cast<char>(0x01) ); |
443 | BUG_ON(!pos); | 452 | BUG_ON(!pos); |
444 | //LR BUG we should terminte the loop if p == 0 | 453 | //LR BUG we should terminte the loop if p == 0 |
445 | if ( pos == 0 ) | 454 | if ( pos == 0 ) |
@@ -447,7 +456,7 @@ void LibGCryptIf::unpadData(const unsigned char *buf, | |||
447 | --pos; | 456 | --pos; |
448 | } | 457 | } |
449 | *bufLen = pos; | 458 | *bufLen = pos; |
450 | qDebug("ente "); | 459 | //qDebug("ente "); |
451 | } | 460 | } |
452 | 461 | ||
453 | #endif // CONFIG_PWMANAGER_GCRY | 462 | #endif // CONFIG_PWMANAGER_GCRY |