int FIPS_check_incore_fingerprint(void) { unsigned char sig[EVP_MAX_MD_SIZE]; unsigned int len; int rv = 0; #if defined(__sgi) && (defined(__mips) || defined(mips)) extern int __dso_displacement[]; #else extern int OPENSSL_NONPIC_relocated; #endif if (!fips_post_started(FIPS_TEST_INTEGRITY, 0, NULL)) return 1; if (FIPS_text_start()==NULL) { FIPSerr(FIPS_F_FIPS_CHECK_INCORE_FINGERPRINT,FIPS_R_UNSUPPORTED_PLATFORM); goto err; } len=FIPS_incore_fingerprint(sig,sizeof(sig)); if (len!=sizeof(FIPS_signature) || memcmp(FIPS_signature,sig,sizeof(FIPS_signature))) { if (FIPS_signature>=FIPS_rodata_start && FIPS_signature<FIPS_rodata_end) FIPSerr(FIPS_F_FIPS_CHECK_INCORE_FINGERPRINT,FIPS_R_FINGERPRINT_DOES_NOT_MATCH_SEGMENT_ALIASING); #if defined(__sgi) && (defined(__mips) || defined(mips)) else if (__dso_displacement!=NULL) #else else if (OPENSSL_NONPIC_relocated) #endif FIPSerr(FIPS_F_FIPS_CHECK_INCORE_FINGERPRINT,FIPS_R_FINGERPRINT_DOES_NOT_MATCH_NONPIC_RELOCATED); else FIPSerr(FIPS_F_FIPS_CHECK_INCORE_FINGERPRINT,FIPS_R_FINGERPRINT_DOES_NOT_MATCH); #ifdef OPENSSL_FIPS_DEBUGGER rv = 1; #endif goto err; } rv = 1; err: if (rv == 0) fips_post_failed(FIPS_TEST_INTEGRITY, 0, NULL); else if (!fips_post_success(FIPS_TEST_INTEGRITY, 0, NULL)) return 0; return rv; }
void Java_org_keysupport_provider_OpenSSLFIPSProvider_getOpenSSLFIPSIncoreSig( JNIEnv* env, jobject javaThis, jbyteArray buf) { int len = 0; len = FIPS_incore_fingerprint(Calculated_signature, sizeof(Calculated_signature)); if (len < 0) { LOGE("Failed to calculate expected signature"); } else { (*env)->SetByteArrayRegion(env, buf, 0, 20, Calculated_signature); } }