diff -r 4ef4d55a129b -r 01fa7f06f806 src/jdk.crypto.mscapi/windows/native/libsunmscapi/security.cpp --- a/src/jdk.crypto.mscapi/windows/native/libsunmscapi/security.cpp Mon May 13 13:32:38 2019 -0700 +++ b/src/jdk.crypto.mscapi/windows/native/libsunmscapi/security.cpp Tue May 14 08:47:13 2019 +0800 @@ -649,19 +649,28 @@ if (::NCryptGetProperty( hCryptProv, NCRYPT_ALGORITHM_PROPERTY, (PBYTE)buffer, 32, &len, NCRYPT_SILENT_FLAG) == ERROR_SUCCESS) { + jstring name = env->NewStringUTF(pszNameString); + if (name == NULL) { + __leave; + } if (buffer[0] == 'E' && buffer[2] == 'C' && (dwPublicKeyLength == 256 || dwPublicKeyLength == 384 || dwPublicKeyLength == 521)) { - jstring name = env->NewStringUTF(pszNameString); - if (name == NULL) { - __leave; - } env->CallVoidMethod(obj, mGenKeyAndCertChain, 0, name, (jlong) hCryptProv, 0, dwPublicKeyLength, jArrayList); + } else if (buffer[0] == 'R' && buffer[2] == 'S' + && buffer[4] == 'A') { + env->CallVoidMethod(obj, mGenKeyAndCertChain, + 1, + name, + (jlong) hCryptProv, 0, + dwPublicKeyLength, jArrayList); + } else { + dump("Unknown NCRYPT_ALGORITHM_PROPERTY", buffer, len); } } } @@ -890,11 +899,15 @@ break; case 1: BCRYPT_PKCS1_PADDING_INFO pkcs1Info; - pkcs1Info.pszAlgId = MapHashIdentifier(env, jHashAlgorithm); - if (pkcs1Info.pszAlgId == NULL) { - ThrowExceptionWithMessage(env, SIGNATURE_EXCEPTION, - "Unrecognised hash algorithm"); - __leave; + if (jHashAlgorithm) { + pkcs1Info.pszAlgId = MapHashIdentifier(env, jHashAlgorithm); + if (pkcs1Info.pszAlgId == NULL) { + ThrowExceptionWithMessage(env, SIGNATURE_EXCEPTION, + "Unrecognised hash algorithm"); + __leave; + } + } else { + pkcs1Info.pszAlgId = NULL; } param = &pkcs1Info; dwFlags = BCRYPT_PAD_PKCS1; @@ -1121,11 +1134,15 @@ break; case 1: BCRYPT_PKCS1_PADDING_INFO pkcs1Info; - pkcs1Info.pszAlgId = MapHashIdentifier(env, jHashAlgorithm); - if (pkcs1Info.pszAlgId == NULL) { - ThrowExceptionWithMessage(env, SIGNATURE_EXCEPTION, - "Unrecognised hash algorithm"); - __leave; + if (jHashAlgorithm) { + pkcs1Info.pszAlgId = MapHashIdentifier(env, jHashAlgorithm); + if (pkcs1Info.pszAlgId == NULL) { + ThrowExceptionWithMessage(env, SIGNATURE_EXCEPTION, + "Unrecognised hash algorithm"); + __leave; + } + } else { + pkcs1Info.pszAlgId = NULL; } param = &pkcs1Info; dwFlags = NCRYPT_PAD_PKCS1_FLAG;