@@ -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
340347PALEXPORT int32_t AndroidCryptoNative_RsaGenerateKeyEx (RSA * rsa , int32_t bits )
0 commit comments