Beispiel #1
0
/*
 * 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 );
}
Beispiel #2
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 );
}
Beispiel #3
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;
}
Beispiel #4
0
/*
 * 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);
}