mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 05:40:04 +00:00 
			
		
		
		
	UDS: Use the ToDS and FromDS fields to properly calculate the AAD used during encryption.
This commit is contained in:
		
							parent
							
								
									1f1739d366
								
							
						
					
					
						commit
						2eb174713b
					
				
					 1 changed files with 32 additions and 15 deletions
				
			
		|  | @ -103,7 +103,8 @@ static std::array<u8, CryptoPP::AES::BLOCKSIZE> GenerateDataCCMPKey( | ||||||
|  * Generates the Additional Authenticated Data (AAD) for an UDS 802.11 encrypted data frame. |  * Generates the Additional Authenticated Data (AAD) for an UDS 802.11 encrypted data frame. | ||||||
|  * @returns a buffer with the bytes of the AAD. |  * @returns a buffer with the bytes of the AAD. | ||||||
|  */ |  */ | ||||||
| static std::vector<u8> GenerateCCMPAAD(const MacAddress& sender, const MacAddress& receiver) { | static std::vector<u8> GenerateCCMPAAD(const MacAddress& sender, const MacAddress& receiver, | ||||||
|  |                                        const MacAddress& bssid, u16 frame_control) { | ||||||
|     // Reference: IEEE 802.11-2007
 |     // Reference: IEEE 802.11-2007
 | ||||||
| 
 | 
 | ||||||
|     // 8.3.3.3.2 Construct AAD (22-30 bytes)
 |     // 8.3.3.3.2 Construct AAD (22-30 bytes)
 | ||||||
|  | @ -113,20 +114,34 @@ static std::vector<u8> GenerateCCMPAAD(const MacAddress& sender, const MacAddres | ||||||
|     // Control field are masked to 0.
 |     // Control field are masked to 0.
 | ||||||
|     struct { |     struct { | ||||||
|         u16_be FC; // MPDU Frame Control field
 |         u16_be FC; // MPDU Frame Control field
 | ||||||
|         MacAddress receiver; |         MacAddress A1; | ||||||
|         MacAddress transmitter; |         MacAddress A2; | ||||||
|         MacAddress destination; |         MacAddress A3; | ||||||
|         u16_be SC; // MPDU Sequence Control field
 |         u16_be SC; // MPDU Sequence Control field
 | ||||||
|     } aad_struct{}; |     } aad_struct{}; | ||||||
| 
 | 
 | ||||||
|     // Default FC value of DataFrame | Protected | ToDS
 |     constexpr u16 AADFrameControlMask = 0x8FC7; | ||||||
|     constexpr u16 DefaultFrameControl = 0x0841; |     aad_struct.FC = frame_control & AADFrameControlMask; | ||||||
| 
 |  | ||||||
|     aad_struct.FC = DefaultFrameControl; |  | ||||||
|     aad_struct.SC = 0; |     aad_struct.SC = 0; | ||||||
|     aad_struct.transmitter = sender; | 
 | ||||||
|     aad_struct.receiver = receiver; |     bool to_ds = (frame_control & (1 << 0)) != 0; | ||||||
|     aad_struct.destination = receiver; |     bool from_ds = (frame_control & (1 << 1)) != 0; | ||||||
|  |     // In the 802.11 standard, ToDS = 1 and FromDS = 1 is a valid configuration,
 | ||||||
|  |     // however, the 3DS doesn't seem to transmit frames with such combination.
 | ||||||
|  |     ASSERT_MSG(to_ds != from_ds, "Invalid combination"); | ||||||
|  | 
 | ||||||
|  |     // The meaning of the address fields depends on the ToDS and FromDS fields.
 | ||||||
|  |     if (from_ds) { | ||||||
|  |         aad_struct.A1 = receiver; | ||||||
|  |         aad_struct.A2 = bssid; | ||||||
|  |         aad_struct.A3 = sender; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (to_ds) { | ||||||
|  |         aad_struct.A1 = bssid; | ||||||
|  |         aad_struct.A2 = sender; | ||||||
|  |         aad_struct.A3 = receiver; | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     std::vector<u8> aad(sizeof(aad_struct)); |     std::vector<u8> aad(sizeof(aad_struct)); | ||||||
|     std::memcpy(aad.data(), &aad_struct, sizeof(aad_struct)); |     std::memcpy(aad.data(), &aad_struct, sizeof(aad_struct)); | ||||||
|  | @ -141,11 +156,12 @@ static std::vector<u8> GenerateCCMPAAD(const MacAddress& sender, const MacAddres | ||||||
| static std::vector<u8> DecryptDataFrame(const std::vector<u8>& encrypted_payload, | static std::vector<u8> DecryptDataFrame(const std::vector<u8>& encrypted_payload, | ||||||
|                                         const std::array<u8, CryptoPP::AES::BLOCKSIZE>& ccmp_key, |                                         const std::array<u8, CryptoPP::AES::BLOCKSIZE>& ccmp_key, | ||||||
|                                         const MacAddress& sender, const MacAddress& receiver, |                                         const MacAddress& sender, const MacAddress& receiver, | ||||||
|                                         u16 sequence_number) { |                                         const MacAddress& bssid, u16 sequence_number, | ||||||
|  |                                         u16 frame_control) { | ||||||
| 
 | 
 | ||||||
|     // Reference: IEEE 802.11-2007
 |     // Reference: IEEE 802.11-2007
 | ||||||
| 
 | 
 | ||||||
|     std::vector<u8> aad = GenerateCCMPAAD(sender, receiver); |     std::vector<u8> aad = GenerateCCMPAAD(sender, receiver, bssid, frame_control); | ||||||
| 
 | 
 | ||||||
|     std::vector<u8> packet_number{0, |     std::vector<u8> packet_number{0, | ||||||
|                                   0, |                                   0, | ||||||
|  | @ -200,10 +216,11 @@ static std::vector<u8> DecryptDataFrame(const std::vector<u8>& encrypted_payload | ||||||
| static std::vector<u8> EncryptDataFrame(const std::vector<u8>& payload, | static std::vector<u8> EncryptDataFrame(const std::vector<u8>& payload, | ||||||
|                                         const std::array<u8, CryptoPP::AES::BLOCKSIZE>& ccmp_key, |                                         const std::array<u8, CryptoPP::AES::BLOCKSIZE>& ccmp_key, | ||||||
|                                         const MacAddress& sender, const MacAddress& receiver, |                                         const MacAddress& sender, const MacAddress& receiver, | ||||||
|                                         u16 sequence_number) { |                                         const MacAddress& bssid, u16 sequence_number, | ||||||
|  |                                         u16 frame_control) { | ||||||
|     // Reference: IEEE 802.11-2007
 |     // Reference: IEEE 802.11-2007
 | ||||||
| 
 | 
 | ||||||
|     std::vector<u8> aad = GenerateCCMPAAD(sender, receiver); |     std::vector<u8> aad = GenerateCCMPAAD(sender, receiver, bssid, frame_control); | ||||||
| 
 | 
 | ||||||
|     std::vector<u8> packet_number{0, |     std::vector<u8> packet_number{0, | ||||||
|                                   0, |                                   0, | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue