fix(android): OAEP masks with SHA-1, which is the only MGF1 the key allows
The read failed with IllegalBlockSizeException and, in logcat, KeymasterUtils status -28. setDigests() authorises the MESSAGE digest only; the MGF1 digest is a separate authorisation whose default is SHA-1 and stays SHA-1 unless setMgf1Digests is called (API 31+). Asking for MGF1-SHA-256 at decrypt time therefore hands the hardware a key that refuses. Encryption did not complain, because the rebuilt public key is served by the software provider, which accepts any MGF1. So we produced perfectly valid ciphertext that the hardware would not read - the worst shape of bug, since it only surfaces on the next launch. Both sides now pass SHA-256 for the message and SHA-1 for the mask; SHA-1 there weakens nothing, a mask generation function needs no collision resistance. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -476,15 +476,32 @@ begin
|
||||
Result.load(nil); // le magasin Android ne prend pas de flux
|
||||
end;
|
||||
|
||||
/// Parametres OAEP explicites. Sans eux, le Keystore et le fournisseur par
|
||||
/// defaut ne s'accordent pas sur le MGF1 - SHA-1 d'un cote, SHA-256 de
|
||||
/// l'autre - et le dechiffrement echoue sur un chiffre pourtant valide.
|
||||
/// Parametres OAEP explicites, identiques au chiffrement et au dechiffrement.
|
||||
///
|
||||
/// DEUX DIGESTS DIFFERENTS, ET C'EST VOULU : SHA-256 pour le message, SHA-1
|
||||
/// pour le MGF1.
|
||||
///
|
||||
/// setDigests() n'autorise que le digest DU MESSAGE. Celui du MGF1 relevait
|
||||
/// d'une autorisation distincte, dont le defaut est SHA-1 et le reste tant
|
||||
/// qu'on n'appelle pas setMgf1Digests (API 31+). Demander MGF1-SHA-256 au
|
||||
/// dechiffrement donne donc une cle qui refuse :
|
||||
///
|
||||
/// KeymasterUtils: rsp_header->status: -28
|
||||
/// javax.crypto.IllegalBlockSizeException
|
||||
///
|
||||
/// Le chiffrement, lui, passait : la cle publique reconstruite est servie par
|
||||
/// le fournisseur logiciel, qui accepte n'importe quel MGF1. D'ou un chiffre
|
||||
/// parfaitement valide que le materiel refuse de lire - le pire des symptomes,
|
||||
/// puisqu'il n'apparait qu'a la relecture.
|
||||
///
|
||||
/// SHA-1 en MGF1 n'affaiblit pas OAEP : la fonction de masque n'a pas besoin
|
||||
/// de resistance aux collisions.
|
||||
function OaepParams: JAlgorithmParameterSpecX;
|
||||
begin
|
||||
Result := TJOAEPParameterSpec.JavaClass.init(
|
||||
StringToJString('SHA-256'),
|
||||
StringToJString('MGF1'),
|
||||
TJMGF1ParameterSpec.JavaClass.init(StringToJString('SHA-256')),
|
||||
TJMGF1ParameterSpec.JavaClass.init(StringToJString('SHA-1')),
|
||||
TJPSource_PSpecified.JavaClass.DEFAULT);
|
||||
end;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user