@@ -317,40 +317,47 @@ public static function verify_detached($sig, $message, $pk)
317317 if ($ d === 0 ) {
318318 throw new SodiumException ('All zero public key ' );
319319 }
320+ if (self ::small_order ($ pk )) {
321+ throw new SodiumException ('Public key has small order ' );
322+ }
320323
321324 /** @var bool The original value of ParagonIE_Sodium_Compat::$fastMult */
322325 $ orig = ParagonIE_Sodium_Compat::$ fastMult ;
323326
324327 // Set ParagonIE_Sodium_Compat::$fastMult to true to speed up verification.
325328 ParagonIE_Sodium_Compat::$ fastMult = true ;
329+ try {
330+ /** @var ParagonIE_Sodium_Core_Curve25519_Ge_P3 $A */
331+ $ A = self ::ge_frombytes_negate_vartime ($ pk );
332+ if (!self ::is_on_main_subgroup ($ A )) {
333+ throw new SodiumException ('Public key is not on a member of the main subgroup ' );
334+ }
326335
327- /** @var ParagonIE_Sodium_Core_Curve25519_Ge_P3 $A */
328- $ A = self ::ge_frombytes_negate_vartime ($ pk );
329- if (!self ::is_on_main_subgroup ($ A )) {
330- throw new SodiumException ('Public key is not on a member of the main subgroup ' );
331- }
332-
333- /** @var string $hDigest */
334- $ hDigest = hash (
335- 'sha512 ' ,
336- self ::substr ($ sig , 0 , 32 ) .
337- self ::substr ($ pk , 0 , 32 ) .
338- $ message ,
339- true
340- );
336+ /** @var string $hDigest */
337+ $ hDigest = hash (
338+ 'sha512 ' ,
339+ self ::substr ($ sig , 0 , 32 ) .
340+ self ::substr ($ pk , 0 , 32 ) .
341+ $ message ,
342+ true
343+ );
341344
342- /** @var string $h */
343- $ h = self ::sc_reduce ($ hDigest ) . self ::substr ($ hDigest , 32 );
345+ /** @var string $h */
346+ $ h = self ::sc_reduce ($ hDigest ) . self ::substr ($ hDigest , 32 );
344347
345- /** @var ParagonIE_Sodium_Core_Curve25519_Ge_P2 $R */
346- $ R = self ::ge_double_scalarmult_vartime (
347- $ h ,
348- $ A ,
349- self ::substr ($ sig , 32 )
350- );
348+ /** @var ParagonIE_Sodium_Core_Curve25519_Ge_P2 $R */
349+ $ R = self ::ge_double_scalarmult_vartime (
350+ $ h ,
351+ $ A ,
352+ self ::substr ($ sig , 32 )
353+ );
351354
352- /** @var string $rcheck */
353- $ rcheck = self ::ge_tobytes ($ R );
355+ /** @var string $rcheck */
356+ $ rcheck = self ::ge_tobytes ($ R );
357+ } catch (Exception $ ex ) {
358+ ParagonIE_Sodium_Compat::$ fastMult = $ orig ;
359+ throw $ ex ;
360+ }
354361
355362 // Reset ParagonIE_Sodium_Compat::$fastMult to what it was before.
356363 ParagonIE_Sodium_Compat::$ fastMult = $ orig ;
0 commit comments