Skip to content

Commit deae3d2

Browse files
[Android] Normalize RSA no-padding output to modulus size to fix VerifyHash (#118950)
Co-authored-by: Simon Rozsival <simon@rozsival.com>
1 parent d934b8c commit deae3d2

File tree

1 file changed

+9
-2
lines changed
  • src/native/libs/System.Security.Cryptography.Native.Android

1 file changed

+9
-2
lines changed

src/native/libs/System.Security.Cryptography.Native.Android/pal_rsa.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -327,14 +327,21 @@ PALEXPORT int32_t AndroidCryptoNative_RsaVerificationPrimitive(int32_t flen, uin
327327
}
328328

329329
jsize decryptedBytesLen = (*env)->GetArrayLength(env, decryptedBytes);
330-
(*env)->GetByteArrayRegion(env, decryptedBytes, 0, decryptedBytesLen, (jbyte*) to);
330+
abort_unless(decryptedBytesLen <= flen, "Decrypted bytes length %d exceeds expected length %d", decryptedBytesLen, flen);
331+
332+
// In some versions of the Android crypto libraries, the leading 0x00 bytes are missing.
333+
// Left-pad with 0x00 so EM is always k bytes (k = modulus), as expected by .NET.
334+
int32_t leading_zero_padding_length = flen - decryptedBytesLen;
335+
memset(to, 0x00, (size_t)leading_zero_padding_length);
336+
337+
(*env)->GetByteArrayRegion(env, decryptedBytes, 0, decryptedBytesLen, (jbyte*)to + leading_zero_padding_length);
331338

332339
(*env)->DeleteLocalRef(env, cipher);
333340
(*env)->DeleteLocalRef(env, fromBytes);
334341
(*env)->DeleteLocalRef(env, decryptedBytes);
335342
(*env)->DeleteLocalRef(env, algName);
336343

337-
return (int32_t)decryptedBytesLen;
344+
return (int32_t)decryptedBytesLen + leading_zero_padding_length;
338345
}
339346

340347
PALEXPORT int32_t AndroidCryptoNative_RsaGenerateKeyEx(RSA* rsa, int32_t bits)

0 commit comments

Comments
 (0)