53 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			53 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								Tech Note 0002
							 | 
						||
| 
								 | 
							
								How to avoid non-intrusive timing attacks with online computations
							 | 
						||
| 
								 | 
							
								Tom St Denis
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Introduction
							 | 
						||
| 
								 | 
							
								------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								A timing attack is when an attacker can observe a side channel of the device (in this case time).  In this tech note
							 | 
						||
| 
								 | 
							
								we consider only non-intrusive timing attacks with respect to online computations.  That is an attacker can
							 | 
						||
| 
								 | 
							
								determine when a computation (such as a public key encryption) begins and ends but cannot observe the device 
							 | 
						||
| 
								 | 
							
								directly.  This is specifically important for applications which transmit data via a public network.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Consider a Diffie-Hellman encryption which requires the sender to make up a public key "y = g^x mod p".  Libtomcrypt
							 | 
						||
| 
								 | 
							
								uses the MPI bignum library to perform the operation.  The time it takes to compute y is controlled by the number
							 | 
						||
| 
								 | 
							
								of 1 bits in the exponent 'x'.  To a large extent there will be the same number of squaring operations.  "1" bits in
							 | 
						||
| 
								 | 
							
								the exponent require the sender to perform a multiplication.  This means to a certain extent an attacker can 
							 | 
						||
| 
								 | 
							
								determine not only the magnitude of 'x' but the number of one bits.  With this information the attacker cannot directly
							 | 
						||
| 
								 | 
							
								learn the key used.  However, good cryptography mandates the close scrutiny of any practical side channel.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Similar logic applies to the other various routines.  Fortunately for this case there is a simple solution.  First, 
							 | 
						||
| 
								 | 
							
								determine the maximum time the particular operation can require.  For instance, on an Athlon 1.53Ghz XP processor a
							 | 
						||
| 
								 | 
							
								DH-768 encryption requires roughly 50 milliseconds.  Take that time and round it up.  Now place a delay after the call.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								For example, 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void demo(void) {
							 | 
						||
| 
								 | 
							
								   clock_t t1;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   // get initial clock
							 | 
						||
| 
								 | 
							
								   t1 = clock();
							 | 
						||
| 
								 | 
							
								   
							 | 
						||
| 
								 | 
							
								   // some PK function
							 | 
						||
| 
								 | 
							
								   
							 | 
						||
| 
								 | 
							
								   // now delay 
							 | 
						||
| 
								 | 
							
								   while (clock() < (t1 + 100));
							 | 
						||
| 
								 | 
							
								   
							 | 
						||
| 
								 | 
							
								   // transmit data...
							 | 
						||
| 
								 | 
							
								   
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This code has the effect of taking at least 100 ms always.  In effect someone analyzing the traffic will see that the
							 | 
						||
| 
								 | 
							
								operations always take a fixed amount of time.  Since no two platforms are the same this type of fix has not been 
							 | 
						||
| 
								 | 
							
								incorporated into libtomcrypt (nor is it desired for many platforms).  This requires on the developers part to profile
							 | 
						||
| 
								 | 
							
								the code to determine the delays required.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Note that this "quick" fix has no effect against an intrusive attacker.  For example, power consumption will drop
							 | 
						||
| 
								 | 
							
								significantly in the loop after the operation.  However, this type of fix is more important to secure the user of the 
							 | 
						||
| 
								 | 
							
								application/device.  For example, a user placing an order online won't try to cheat themselves by cracking open their
							 | 
						||
| 
								 | 
							
								device and performing side-channel cryptanalysis.  An attacker over a network might try to use the timing information
							 | 
						||
| 
								 | 
							
								against the user.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 |