/* * Blowfish key schedule */ int blowfish_setkey( blowfish_context *ctx, const unsigned char *key, unsigned int keysize ) { unsigned int i, j, k; uint32_t data, datal, datar; if( keysize < BLOWFISH_MIN_KEY || keysize > BLOWFISH_MAX_KEY || ( keysize % 8 ) ) { return POLARSSL_ERR_BLOWFISH_INVALID_KEY_LENGTH; } keysize >>= 3; for( i = 0; i < 4; i++ ) { for( j = 0; j < 256; j++ ) ctx->S[i][j] = S[i][j]; } j = 0; for( i = 0; i < BLOWFISH_ROUNDS + 2; ++i ) { data = 0x00000000; for( k = 0; k < 4; ++k ) { data = ( data << 8 ) | key[j++]; if( j >= keysize ) j = 0; } ctx->P[i] = P[i] ^ data; } datal = 0x00000000; datar = 0x00000000; for( i = 0; i < BLOWFISH_ROUNDS + 2; i += 2 ) { blowfish_enc( ctx, &datal, &datar ); ctx->P[i] = datal; ctx->P[i + 1] = datar; } for( i = 0; i < 4; i++ ) { for( j = 0; j < 256; j += 2 ) { blowfish_enc( ctx, &datal, &datar ); ctx->S[i][j] = datal; ctx->S[i][j + 1] = datar; } } return( 0 ); }
/* * Blowfish key schedule */ int mbedtls_blowfish_setkey( mbedtls_blowfish_context *ctx, const unsigned char *key, unsigned int keybits ) { unsigned int i, j, k; uint32_t data, datal, datar; if( keybits < MBEDTLS_BLOWFISH_MIN_KEY_BITS || keybits > MBEDTLS_BLOWFISH_MAX_KEY_BITS || ( keybits % 8 ) ) { return( MBEDTLS_ERR_BLOWFISH_INVALID_KEY_LENGTH ); } keybits >>= 3; for( i = 0; i < 4; i++ ) { for( j = 0; j < 256; j++ ) ctx->S[i][j] = S[i][j]; } j = 0; for( i = 0; i < MBEDTLS_BLOWFISH_ROUNDS + 2; ++i ) { data = 0x00000000; for( k = 0; k < 4; ++k ) { data = ( data << 8 ) | key[j++]; if( j >= keybits ) j = 0; } ctx->P[i] = P[i] ^ data; } datal = 0x00000000; datar = 0x00000000; for( i = 0; i < MBEDTLS_BLOWFISH_ROUNDS + 2; i += 2 ) { blowfish_enc( ctx, &datal, &datar ); ctx->P[i] = datal; ctx->P[i + 1] = datar; } for( i = 0; i < 4; i++ ) { for( j = 0; j < 256; j += 2 ) { blowfish_enc( ctx, &datal, &datar ); ctx->S[i][j] = datal; ctx->S[i][j + 1] = datar; } } return( 0 ); }
//Digests the file then encrypts the digest with the supplied key //length of verification will be stored in len unsigned char *create_file_verification(unsigned char *key, char *filename, int *len) { //printf("Creating file verification for %s\n", filename); unsigned char *digest = digest_file(filename, len); unsigned char *out = NULL; //printf("%s DIGEST: ", filename); print_hash(digest, *len); if(digest != NULL) { out = blowfish_enc(key, digest, *len); //printf("Enc Digest: "); print_hash(out, *len); free(digest); } return out; }
/* * Blowfish-ECB block encryption/decryption */ int mbedtls_blowfish_crypt_ecb(mbedtls_blowfish_context *ctx, int mode, const unsigned char input[MBEDTLS_BLOWFISH_BLOCKSIZE], unsigned char output[MBEDTLS_BLOWFISH_BLOCKSIZE]) { uint32_t X0, X1; GET_UINT32_BE(X0, input, 0); GET_UINT32_BE(X1, input, 4); if (mode == MBEDTLS_BLOWFISH_DECRYPT) { blowfish_dec(ctx, &X0, &X1); } else { /* MBEDTLS_BLOWFISH_ENCRYPT */ blowfish_enc(ctx, &X0, &X1); } PUT_UINT32_BE(X0, output, 0); PUT_UINT32_BE(X1, output, 4); return (0); }