ikptr ikrt_openssl_whirlpool (ikptr s_input, ikptr s_input_len, ikpcb * pcb) { #ifdef HAVE_WHIRLPOOL ik_ssl_cuchar * in = (ik_ssl_cuchar *)IK_GENERALISED_C_STRING(s_input); ik_ulong in_len = (ik_ulong)ik_generalised_c_buffer_len(s_input, s_input_len); unsigned char sum[WHIRLPOOL_DIGEST_LENGTH]; WHIRLPOOL(in, in_len, sum); return ika_bytevector_from_memory_block(pcb, sum, WHIRLPOOL_DIGEST_LENGTH); #else feature_failure(__func__); #endif }
int main (int argc,char *argv[]) { unsigned char md[WHIRLPOOL_DIGEST_LENGTH]; int i; WHIRLPOOL_CTX ctx; #ifdef OPENSSL_IA32_SSE2 /* Alternative to this is to call OpenSSL_add_all_algorithms... * The below code is retained exclusively for debugging purposes. */ { char *env; if ((env=getenv("OPENSSL_ia32cap"))) OPENSSL_ia32cap = strtoul (env,NULL,0); } #endif fprintf(stdout,"Testing Whirlpool "); WHIRLPOOL("",0,md); if (memcmp(md,iso_test_1,sizeof(iso_test_1))) { fflush(stdout); fprintf(stderr,"\nTEST 1 of 9 failed.\n"); return 1; } else fprintf(stdout,"."); fflush(stdout); WHIRLPOOL("a",1,md); if (memcmp(md,iso_test_2,sizeof(iso_test_2))) { fflush(stdout); fprintf(stderr,"\nTEST 2 of 9 failed.\n"); return 1; } else fprintf(stdout,"."); fflush(stdout); WHIRLPOOL("abc",3,md); if (memcmp(md,iso_test_3,sizeof(iso_test_3))) { fflush(stdout); fprintf(stderr,"\nTEST 3 of 9 failed.\n"); return 1; } else fprintf(stdout,"."); fflush(stdout); WHIRLPOOL("message digest",14,md); if (memcmp(md,iso_test_4,sizeof(iso_test_4))) { fflush(stdout); fprintf(stderr,"\nTEST 4 of 9 failed.\n"); return 1; } else fprintf(stdout,"."); fflush(stdout); WHIRLPOOL("abcdefghijklmnopqrstuvwxyz",26,md); if (memcmp(md,iso_test_5,sizeof(iso_test_5))) { fflush(stdout); fprintf(stderr,"\nTEST 5 of 9 failed.\n"); return 1; } else fprintf(stdout,"."); fflush(stdout); WHIRLPOOL( "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz" "0123456789",62,md); if (memcmp(md,iso_test_6,sizeof(iso_test_6))) { fflush(stdout); fprintf(stderr,"\nTEST 6 of 9 failed.\n"); return 1; } else fprintf(stdout,"."); fflush(stdout); WHIRLPOOL( "1234567890""1234567890""1234567890""1234567890" "1234567890""1234567890""1234567890""1234567890",80,md); if (memcmp(md,iso_test_7,sizeof(iso_test_7))) { fflush(stdout); fprintf(stderr,"\nTEST 7 of 9 failed.\n"); return 1; } else fprintf(stdout,"."); fflush(stdout); WHIRLPOOL("abcdbcdecdefdefgefghfghighijhijk",32,md); if (memcmp(md,iso_test_8,sizeof(iso_test_8))) { fflush(stdout); fprintf(stderr,"\nTEST 8 of 9 failed.\n"); return 1; } else fprintf(stdout,"."); fflush(stdout); WHIRLPOOL_Init (&ctx); for (i=0;i<1000000;i+=288) WHIRLPOOL_Update (&ctx, "aaaaaaaa""aaaaaaaa""aaaaaaaa""aaaaaaaa" "aaaaaaaa""aaaaaaaa""aaaaaaaa""aaaaaaaa" "aaaaaaaa""aaaaaaaa""aaaaaaaa""aaaaaaaa" "aaaaaaaa""aaaaaaaa""aaaaaaaa""aaaaaaaa" "aaaaaaaa""aaaaaaaa""aaaaaaaa""aaaaaaaa" "aaaaaaaa""aaaaaaaa""aaaaaaaa""aaaaaaaa" "aaaaaaaa""aaaaaaaa""aaaaaaaa""aaaaaaaa" "aaaaaaaa""aaaaaaaa""aaaaaaaa""aaaaaaaa" "aaaaaaaa""aaaaaaaa""aaaaaaaa""aaaaaaaa", (1000000-i)<288?1000000-i:288); WHIRLPOOL_Final (md,&ctx); if (memcmp(md,iso_test_9,sizeof(iso_test_9))) { fflush(stdout); fprintf(stderr,"\nTEST 9 of 9 failed.\n"); return 1; } else fprintf(stdout,"."); fflush(stdout); fprintf(stdout," passed.\n"); fflush(stdout); return 0; }
jbyteArray Java_ru_ivanovpv_gorets_psm_nativelib_NativeLib_generateHash( JNIEnv* env, jobject thiz, jbyteArray arr, jint hashType, jint times) { unsigned char * rawArr = NULL; unsigned arrSize = 0; unsigned i = 0; unsigned char digest1[MAX_HASH_SIZE], digest2[MAX_HASH_SIZE]; unsigned char * data = NULL, * digest = NULL, * tempArr = NULL; unsigned digestSize = 0; jbyteArray byteArr = NULL; if ( ((hashType != 1) && (hashType != 2)) || (times < 0)) { return NULL; } digestSize = MAX_HASH_SIZE; arrSize = (*env)->GetArrayLength(env, arr); if (arrSize <= 0) { goto cleanup; } if( (rawArr = (*env)->GetByteArrayElements(env, arr, NULL)) == NULL ) { goto cleanup; } switch (hashType) // { case 1: // WP if (WHIRLPOOL((const unsigned char *)rawArr, arrSize, digest1) == NULL) { goto cleanup; } data = digest1; digest = digest2; for(i = 0; i < times; i++) { if (WHIRLPOOL((const unsigned char *)data, digestSize, digest) == NULL) { goto cleanup; } tempArr = data; data = digest; digest = tempArr; } tempArr = data; data = digest; digest = tempArr; break; case 2: // SHA512 if (SHA512((const unsigned char *)rawArr, arrSize, digest1) == NULL) { goto cleanup; } data = digest1; digest = digest2; for(i = 0; i < times; i++) { if (SHA512((const unsigned char *)data, digestSize, digest) == NULL) { goto cleanup; } tempArr = data; data = digest; digest = tempArr; } tempArr = data; data = digest; digest = tempArr; break; } byteArr = (*env)->NewByteArray(env, digestSize); if (byteArr == NULL) { goto cleanup; } (*env)->SetByteArrayRegion(env, byteArr, 0, digestSize, (const jbyte*)digest); memset (digest1, 0, digestSize); memset (digest2, 0, digestSize); cleanup: if ( rawArr ) (*env)->ReleaseByteArrayElements(env, arr, rawArr, JNI_ABORT); return byteArr; }