diff options
Diffstat (limited to 'libpiano/src/crypt.c')
-rw-r--r-- | libpiano/src/crypt.c | 41 |
1 files changed, 27 insertions, 14 deletions
diff --git a/libpiano/src/crypt.c b/libpiano/src/crypt.c index 67e2467..9b21516 100644 --- a/libpiano/src/crypt.c +++ b/libpiano/src/crypt.c @@ -38,20 +38,24 @@ THE SOFTWARE. /* decrypt hex-encoded, blowfish-crypted string: decode 2 hex-encoded blocks, * decrypt, byteswap * @param hex string - * @return decrypted string + * @return decrypted string or NULL */ #define INITIAL_SHIFT 28 #define SHIFT_DEC 4 unsigned char *PianoDecryptString (const unsigned char *strInput) { /* hex-decode => strlen/2 + null-byte */ - uint32_t *iDecrypt = calloc (strlen ((char *) strInput)/2/sizeof (*iDecrypt)+1, sizeof (*iDecrypt)); - unsigned char *strDecrypted = (unsigned char *) iDecrypt; - unsigned char shift = INITIAL_SHIFT; - unsigned char intsDecoded = 0; - unsigned char j; + uint32_t *iDecrypt; + unsigned char *strDecrypted; + unsigned char shift = INITIAL_SHIFT, intsDecoded = 0, j; /* blowfish blocks, 32-bit */ uint32_t f, l, r, lrExchange; + if ((iDecrypt = calloc (strlen ((char *) strInput)/2/sizeof (*iDecrypt)+1, + sizeof (*iDecrypt))) == NULL) { + return NULL; + } + strDecrypted = (unsigned char *) iDecrypt; + while (*strInput != '\0') { /* hex-decode string */ if (*strInput >= '0' && *strInput <= '9') { @@ -115,20 +119,29 @@ unsigned char *PianoEncryptString (const unsigned char *strInput) { const size_t strInputN = strlen ((char *) strInput); /* num of 64-bit blocks, rounded to next block */ size_t blockN = strInputN / 8 + 1; - uint32_t *blockInput = calloc (blockN*2, sizeof (*blockInput)); - uint32_t *blockPtr = blockInput; - /* encryption blocks */ - uint32_t f, lrExchange; - register uint32_t l, r; + uint32_t *blockInput, *blockPtr; /* output string */ - unsigned char *strHex = calloc (blockN*8*2 + 1, sizeof (*strHex)); - unsigned char *hexPtr = strHex; + unsigned char *strHex, *hexPtr; const char *hexmap = "0123456789abcdef"; - size_t i; + + if ((blockInput = calloc (blockN*2, sizeof (*blockInput))) == NULL) { + return NULL; + } + blockPtr = blockInput; + + if ((strHex = calloc (blockN*8*2 + 1, sizeof (*strHex))) == NULL) { + return NULL; + } + hexPtr = strHex; memcpy (blockInput, strInput, strInputN); while (blockN > 0) { + /* encryption blocks */ + uint32_t f, lrExchange; + register uint32_t l, r; + int i; + l = byteswap32 (*blockPtr); r = byteswap32 (*(blockPtr+1)); |