'resolution_scope_unverified','erasure_complete'=>false,'may_resume'=>false); try { // Expected store is trusted caller context, never taken from a page. if($expectedStore===''||strlen($expectedStore)>253||$expectedStore!==strtolower(trim($expectedStore))||preg_match('/^[\x21-\x7e]+$/D',$expectedStore)!==1){return $unknown;} if(strlen($review)>8192){return $unknown;} $keys=OG_Native_Receipt_Keys::active($keys,$revoked); $bound=OG_Native_Remote_Binding::receipt($request,$review,$keys,$environment); if(($bound['status']??'')!=='authenticated_remote_review'){return $unknown;} $reviewValue=json_decode(json_decode($review,true,16,JSON_THROW_ON_ERROR)['receipt'],true,16,JSON_THROW_ON_ERROR); if(!array_is_list($pages)||count($pages)<1||count($pages)>128){return $unknown;} $previous=str_repeat('0',64);$last='';$refs=array();$generation=null;$total=null;$created=null;$expires=null;$now=time(); $supplied=array_column($request['orders'],'ref'); foreach($pages as $index=>$raw){ if(!is_string($raw)||strlen($raw)>32768){return $unknown;} $page=json_decode($raw,true,16,JSON_THROW_ON_ERROR); if(!is_array($page)||array_keys($page)!==array('format','environment','key_id','case_id','generation','store_domain','created_seconds','expires_seconds','operation_id','request_digest','page','page_count','ref_count','previous_digest','refs','purpose','erasure_complete','signature')||OG_Native_Remote_Binding::canonical($page)!==$raw){return $unknown;} if($page['store_domain']!==$expectedStore){return $unknown;} foreach(array('created_seconds','expires_seconds') as $field){ if(!is_string($page[$field])||preg_match('/^[1-9][0-9]{0,9}$/D',$page[$field])!==1){return $unknown;} } if((int)$page['created_seconds']>$now+60||(int)$page['expires_seconds']<=$now||(int)$page['expires_seconds']<=(int)$page['created_seconds']||(int)$page['expires_seconds']-(int)$page['created_seconds']>86400){return $unknown;} if($index===0){$created=$page['created_seconds'];$expires=$page['expires_seconds'];} if($created!==$page['created_seconds']||$expires!==$page['expires_seconds']){return $unknown;} if($page['format']!=='og-native-resolution-scope-v1'||$page['environment']!==$environment||$page['case_id']!==$reviewValue['case_id']||$page['operation_id']!==$request['operation_id']||$page['request_digest']!==OG_Native_Remote_Binding::digest($request)||$page['page']!==$index||$page['page_count']!==count($pages)||$page['previous_digest']!==$previous||$page['purpose']!=='scope_proposal_only'||$page['erasure_complete']!==false){return $unknown;} if(!is_string($page['generation'])||!preg_match('/^[a-f0-9]{64}$/D',$page['generation'])||!is_int($page['ref_count'])||$page['ref_count']<0||$page['ref_count']>64000){return $unknown;} if($index===0){$generation=$page['generation'];$total=$page['ref_count'];} if($generation!==$page['generation']||$total!==$page['ref_count']||count($pages)!==max(1,(int)ceil($total/500))){return $unknown;} $expected=min(500,$total-$index*500); if(!is_array($page['refs'])||!array_is_list($page['refs'])||count($page['refs'])!==$expected){return $unknown;} $validated=OG_Native_Remote_Binding::addedScope($page['refs']); foreach($validated as $ref){ if(!preg_match('/^[1-9][0-9]{0,18}$/D',$ref)||(strlen($ref)===19&&strcmp($ref,'9223372036854775807')>0)){return $unknown;} if(($last!==''&&strcmp($last,$ref)>=0)||in_array($ref,$supplied,true)){return $unknown;} $refs[]=$ref;$last=$ref; } $kid=$page['key_id'];$signature=$page['signature']; if(!is_string($kid)||!preg_match('/^'.($environment==='production'?'prod':'test').'\-[a-z0-9-]{1,48}$/D',$kid)||!isset($keys[$kid])||!is_string($signature)||!preg_match('/^[a-f0-9]{128}$/D',$signature)){return $unknown;} unset($page['signature']); if(!sodium_crypto_sign_verify_detached(hex2bin($signature),"og-native-resolution-scope-signature-v1\n".OG_Native_Remote_Binding::canonical($page),hex2bin($keys[$kid]))){return $unknown;} $previous=hash('sha256',"og-native-resolution-page-v1\n".$raw); } return array('status'=>'authenticated_resolution_scope','case_id'=>$reviewValue['case_id'],'generation'=>$generation,'store_domain'=>$expectedStore,'created_seconds'=>$created,'expires_seconds'=>$expires,'manifest_digest'=>$previous,'refs'=>$refs,'erasure_complete'=>false,'may_resume'=>false); }catch(Throwable $error){return $unknown;} } }