|
|
@ -288,6 +288,118 @@ vg_decode_privkey(const char *b58encoded, EC_KEY *pkey, int *addrtype) |
|
|
|
return res; |
|
|
|
return res; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if OPENSSL_VERSION_NUMBER < 0x10000000L |
|
|
|
|
|
|
|
/* The generic PBKDF2 function first appeared in OpenSSL 1.0 */ |
|
|
|
|
|
|
|
/* ====================================================================
|
|
|
|
|
|
|
|
* Copyright (c) 1999-2006 The OpenSSL Project. All rights reserved. |
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
* Redistribution and use in source and binary forms, with or without |
|
|
|
|
|
|
|
* modification, are permitted provided that the following conditions |
|
|
|
|
|
|
|
* are met: |
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
* 1. Redistributions of source code must retain the above copyright |
|
|
|
|
|
|
|
* notice, this list of conditions and the following disclaimer. |
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright |
|
|
|
|
|
|
|
* notice, this list of conditions and the following disclaimer in |
|
|
|
|
|
|
|
* the documentation and/or other materials provided with the |
|
|
|
|
|
|
|
* distribution. |
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
* 3. All advertising materials mentioning features or use of this |
|
|
|
|
|
|
|
* software must display the following acknowledgment: |
|
|
|
|
|
|
|
* "This product includes software developed by the OpenSSL Project |
|
|
|
|
|
|
|
* for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
|
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to |
|
|
|
|
|
|
|
* endorse or promote products derived from this software without |
|
|
|
|
|
|
|
* prior written permission. For written permission, please contact |
|
|
|
|
|
|
|
* licensing@OpenSSL.org. |
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
* 5. Products derived from this software may not be called "OpenSSL" |
|
|
|
|
|
|
|
* nor may "OpenSSL" appear in their names without prior written |
|
|
|
|
|
|
|
* permission of the OpenSSL Project. |
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
* 6. Redistributions of any form whatsoever must retain the following |
|
|
|
|
|
|
|
* acknowledgment: |
|
|
|
|
|
|
|
* "This product includes software developed by the OpenSSL Project |
|
|
|
|
|
|
|
* for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
|
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY |
|
|
|
|
|
|
|
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
|
|
|
|
|
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
|
|
|
|
|
|
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR |
|
|
|
|
|
|
|
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|
|
|
|
|
|
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
|
|
|
|
|
|
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
|
|
|
|
|
|
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
|
|
|
|
|
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, |
|
|
|
|
|
|
|
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
|
|
|
|
|
|
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED |
|
|
|
|
|
|
|
* OF THE POSSIBILITY OF SUCH DAMAGE. |
|
|
|
|
|
|
|
* ==================================================================== |
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
* This product includes cryptographic software written by Eric Young |
|
|
|
|
|
|
|
* (eay@cryptsoft.com). This product includes software written by Tim |
|
|
|
|
|
|
|
* Hudson (tjh@cryptsoft.com). |
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
int |
|
|
|
|
|
|
|
PKCS5_PBKDF2_HMAC(const char *pass, int passlen, |
|
|
|
|
|
|
|
const unsigned char *salt, int saltlen, int iter, |
|
|
|
|
|
|
|
const EVP_MD *digest, |
|
|
|
|
|
|
|
int keylen, unsigned char *out) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
unsigned char digtmp[EVP_MAX_MD_SIZE], *p, itmp[4]; |
|
|
|
|
|
|
|
int cplen, j, k, tkeylen, mdlen; |
|
|
|
|
|
|
|
unsigned long i = 1; |
|
|
|
|
|
|
|
HMAC_CTX hctx; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mdlen = EVP_MD_size(digest); |
|
|
|
|
|
|
|
if (mdlen < 0) |
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
HMAC_CTX_init(&hctx); |
|
|
|
|
|
|
|
p = out; |
|
|
|
|
|
|
|
tkeylen = keylen; |
|
|
|
|
|
|
|
if(!pass) |
|
|
|
|
|
|
|
passlen = 0; |
|
|
|
|
|
|
|
else if(passlen == -1) |
|
|
|
|
|
|
|
passlen = strlen(pass); |
|
|
|
|
|
|
|
while(tkeylen) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if(tkeylen > mdlen) |
|
|
|
|
|
|
|
cplen = mdlen; |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
cplen = tkeylen; |
|
|
|
|
|
|
|
/* We are unlikely to ever use more than 256 blocks (5120 bits!)
|
|
|
|
|
|
|
|
* but just in case... |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
itmp[0] = (unsigned char)((i >> 24) & 0xff); |
|
|
|
|
|
|
|
itmp[1] = (unsigned char)((i >> 16) & 0xff); |
|
|
|
|
|
|
|
itmp[2] = (unsigned char)((i >> 8) & 0xff); |
|
|
|
|
|
|
|
itmp[3] = (unsigned char)(i & 0xff); |
|
|
|
|
|
|
|
HMAC_Init_ex(&hctx, pass, passlen, digest, NULL); |
|
|
|
|
|
|
|
HMAC_Update(&hctx, salt, saltlen); |
|
|
|
|
|
|
|
HMAC_Update(&hctx, itmp, 4); |
|
|
|
|
|
|
|
HMAC_Final(&hctx, digtmp, NULL); |
|
|
|
|
|
|
|
memcpy(p, digtmp, cplen); |
|
|
|
|
|
|
|
for(j = 1; j < iter; j++) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
HMAC(digest, pass, passlen, |
|
|
|
|
|
|
|
digtmp, mdlen, digtmp, NULL); |
|
|
|
|
|
|
|
for(k = 0; k < cplen; k++) |
|
|
|
|
|
|
|
p[k] ^= digtmp[k]; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
tkeylen-= cplen; |
|
|
|
|
|
|
|
i++; |
|
|
|
|
|
|
|
p+= cplen; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
HMAC_CTX_cleanup(&hctx); |
|
|
|
|
|
|
|
return 1; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
#endif /* OPENSSL_VERSION_NUMBER < 0x10000000L */ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define VG_PROTKEY_SALT_SIZE 4 |
|
|
|
#define VG_PROTKEY_SALT_SIZE 4 |
|
|
|
#define VG_PROTKEY_HMAC_SIZE 8 |
|
|
|
#define VG_PROTKEY_HMAC_SIZE 8 |
|
|
|
#define VG_PROTKEY_HMAC_KEY_SIZE 16 |
|
|
|
#define VG_PROTKEY_HMAC_KEY_SIZE 16 |
|
|
@ -418,10 +530,11 @@ vg_protect_decode_privkey(EC_KEY *pkey, int *keytype, |
|
|
|
int res; |
|
|
|
int res; |
|
|
|
|
|
|
|
|
|
|
|
res = vg_b58_decode_check(encoded, ecenc, sizeof(ecenc)); |
|
|
|
res = vg_b58_decode_check(encoded, ecenc, sizeof(ecenc)); |
|
|
|
if (res != 45) |
|
|
|
if (res != (33 + VG_PROTKEY_HMAC_SIZE + VG_PROTKEY_SALT_SIZE)) |
|
|
|
return 0; |
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
|
|
memcpy(salt, ecenc + 41, VG_PROTKEY_SALT_SIZE); |
|
|
|
memcpy(salt, ecenc + 33 + VG_PROTKEY_HMAC_SIZE, |
|
|
|
|
|
|
|
VG_PROTKEY_SALT_SIZE); |
|
|
|
|
|
|
|
|
|
|
|
ctx = EVP_CIPHER_CTX_new(); |
|
|
|
ctx = EVP_CIPHER_CTX_new(); |
|
|
|
|
|
|
|
|
|
|
|