import  json 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  Crypto . PublicKey  import  RSA 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  pathlib  import  Path 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  openpilot . common . params  import  Params 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  openpilot . system . athena . registration  import  register ,  UNREGISTERED_DONGLE_ID 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  openpilot . system . athena . tests . helpers  import  MockResponse 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  openpilot . system . hardware . hw  import  Paths 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								class  TestRegistration : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  def  setup_method ( self ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    # clear params and setup key paths 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    self . params  =  Params ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    persist_dir  =  Path ( Paths . persist_root ( ) )  /  " comma " 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    persist_dir . mkdir ( parents = True ,  exist_ok = True ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    self . priv_key  =  persist_dir  /  " id_rsa " 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    self . pub_key  =  persist_dir  /  " id_rsa.pub " 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    self . dongle_id  =  persist_dir  /  " dongle_id " 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  def  _generate_keys ( self ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    self . pub_key . touch ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    k  =  RSA . generate ( 2048 ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    with  open ( self . priv_key ,  " wb " )  as  f : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      f . write ( k . export_key ( ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    with  open ( self . pub_key ,  " wb " )  as  f : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      f . write ( k . publickey ( ) . export_key ( ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  def  test_valid_cache ( self ,  mocker ) : 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    # if all params are written, return the cached dongle id. 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    # should work with a dongle ID on either /persist/ or normal params 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    self . _generate_keys ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    dongle  =  " DONGLE_ID_123 " 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    m  =  mocker . patch ( " openpilot.system.athena.registration.api_get " ,  autospec = True ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  persist ,  params  in  [ ( True ,  True ) ,  ( True ,  False ) ,  ( False ,  True ) ] : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      self . params . put ( " DongleId " ,  dongle  if  params  else  " " ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      with  open ( self . dongle_id ,  " w " )  as  f : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        f . write ( dongle  if  persist  else  " " ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      assert  register ( )  ==  dongle 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      assert  not  m . called 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  def  test_no_keys ( self ,  mocker ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    # missing pubkey 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    m  =  mocker . patch ( " openpilot.system.athena.registration.api_get " ,  autospec = True ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    dongle  =  register ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    assert  m . call_count  ==  0 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    assert  dongle  ==  UNREGISTERED_DONGLE_ID 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    assert  self . params . get ( " DongleId " ,  encoding = ' utf-8 ' )  ==  dongle 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  def  test_missing_cache ( self ,  mocker ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    # keys exist but no dongle id 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    self . _generate_keys ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    m  =  mocker . patch ( " openpilot.system.athena.registration.api_get " ,  autospec = True ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    dongle  =  " DONGLE_ID_123 " 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    m . return_value  =  MockResponse ( json . dumps ( { ' dongle_id ' :  dongle } ) ,  200 ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    assert  register ( )  ==  dongle 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    assert  m . call_count  ==  1 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    # call again, shouldn't hit the API this time 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    assert  register ( )  ==  dongle 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    assert  m . call_count  ==  1 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    assert  self . params . get ( " DongleId " ,  encoding = ' utf-8 ' )  ==  dongle 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  def  test_unregistered ( self ,  mocker ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    # keys exist, but unregistered 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    self . _generate_keys ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    m  =  mocker . patch ( " openpilot.system.athena.registration.api_get " ,  autospec = True ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    m . return_value  =  MockResponse ( None ,  402 ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    dongle  =  register ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    assert  m . call_count  ==  1 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    assert  dongle  ==  UNREGISTERED_DONGLE_ID 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    assert  self . params . get ( " DongleId " ,  encoding = ' utf-8 ' )  ==  dongle