Changeset 99404 in vbox for trunk/src/VBox/Devices/EFI/FirmwareNew/NetworkPkg/TlsDxe/TlsProtocol.c
- Timestamp:
- Apr 14, 2023 3:17:44 PM (22 months ago)
- Location:
- trunk/src/VBox/Devices/EFI/FirmwareNew
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/EFI/FirmwareNew
-
Property svn:mergeinfo
changed from (toggle deleted branches)
to (toggle deleted branches)/vendor/edk2/current 103735-103757,103769-103776,129194-145445 /vendor/edk2/current 103735-103757,103769-103776,129194-156846
-
Property svn:mergeinfo
changed from (toggle deleted branches)
-
trunk/src/VBox/Devices/EFI/FirmwareNew/NetworkPkg/TlsDxe/TlsProtocol.c
r85718 r99404 46 46 EFIAPI 47 47 TlsSetSessionData ( 48 IN EFI_TLS_PROTOCOL 49 IN EFI_TLS_SESSION_DATA_TYPE 50 IN VOID 51 IN UINTN 48 IN EFI_TLS_PROTOCOL *This, 49 IN EFI_TLS_SESSION_DATA_TYPE DataType, 50 IN VOID *Data, 51 IN UINTN DataSize 52 52 ) 53 53 { 54 EFI_STATUS Status;55 TLS_INSTANCE *Instance;56 UINT16 *CipherId;57 CONST EFI_TLS_CIPHER *TlsCipherList;58 UINTN CipherCount;59 CONST EFI_TLS_VERIFY_HOST *TlsVerifyHost;60 EFI_TLS_VERIFY VerifyMethod;61 UINTN VerifyMethodSize;62 UINTN Index;63 64 EFI_TPL 54 EFI_STATUS Status; 55 TLS_INSTANCE *Instance; 56 UINT16 *CipherId; 57 CONST EFI_TLS_CIPHER *TlsCipherList; 58 UINTN CipherCount; 59 CONST EFI_TLS_VERIFY_HOST *TlsVerifyHost; 60 EFI_TLS_VERIFY VerifyMethod; 61 UINTN VerifyMethodSize; 62 UINTN Index; 63 64 EFI_TPL OldTpl; 65 65 66 66 Status = EFI_SUCCESS; … … 68 68 VerifyMethodSize = sizeof (EFI_TLS_VERIFY); 69 69 70 if ( This == NULL || Data == NULL || DataSize == 0) {70 if ((This == NULL) || (Data == NULL) || (DataSize == 0)) { 71 71 return EFI_INVALID_PARAMETER; 72 72 } … … 76 76 Instance = TLS_INSTANCE_FROM_PROTOCOL (This); 77 77 78 if ( DataType != EfiTlsSessionState && Instance->TlsSessionState != EfiTlsSessionNotStarted){78 if ((DataType != EfiTlsSessionState) && (Instance->TlsSessionState != EfiTlsSessionNotStarted)) { 79 79 Status = EFI_NOT_READY; 80 80 goto ON_EXIT; … … 82 82 83 83 switch (DataType) { 84 // 85 // Session Configuration 86 // 87 case EfiTlsVersion: 88 if (DataSize != sizeof (EFI_TLS_VERSION)) { 89 Status = EFI_INVALID_PARAMETER; 84 // 85 // Session Configuration 86 // 87 case EfiTlsVersion: 88 if (DataSize != sizeof (EFI_TLS_VERSION)) { 89 Status = EFI_INVALID_PARAMETER; 90 goto ON_EXIT; 91 } 92 93 Status = TlsSetVersion (Instance->TlsConn, ((EFI_TLS_VERSION *)Data)->Major, ((EFI_TLS_VERSION *)Data)->Minor); 94 break; 95 case EfiTlsConnectionEnd: 96 if (DataSize != sizeof (EFI_TLS_CONNECTION_END)) { 97 Status = EFI_INVALID_PARAMETER; 98 goto ON_EXIT; 99 } 100 101 Status = TlsSetConnectionEnd (Instance->TlsConn, *((EFI_TLS_CONNECTION_END *)Data)); 102 break; 103 case EfiTlsCipherList: 104 if (DataSize % sizeof (EFI_TLS_CIPHER) != 0) { 105 Status = EFI_INVALID_PARAMETER; 106 goto ON_EXIT; 107 } 108 109 CipherId = AllocatePool (DataSize); 110 if (CipherId == NULL) { 111 Status = EFI_OUT_OF_RESOURCES; 112 goto ON_EXIT; 113 } 114 115 TlsCipherList = (CONST EFI_TLS_CIPHER *)Data; 116 CipherCount = DataSize / sizeof (EFI_TLS_CIPHER); 117 for (Index = 0; Index < CipherCount; Index++) { 118 CipherId[Index] = ((TlsCipherList[Index].Data1 << 8) | 119 TlsCipherList[Index].Data2); 120 } 121 122 Status = TlsSetCipherList (Instance->TlsConn, CipherId, CipherCount); 123 124 FreePool (CipherId); 125 break; 126 case EfiTlsCompressionMethod: 127 // 128 // TLS seems only define one CompressionMethod.null, which specifies that data exchanged via the 129 // record protocol will not be compressed. 130 // More information from OpenSSL: http://www.openssl.org/docs/manmaster/ssl/SSL_COMP_add_compression_method.html 131 // The TLS RFC does however not specify compression methods or their corresponding identifiers, 132 // so there is currently no compatible way to integrate compression with unknown peers. 133 // It is therefore currently not recommended to integrate compression into applications. 134 // Applications for non-public use may agree on certain compression methods. 135 // Using different compression methods with the same identifier will lead to connection failure. 136 // 137 for (Index = 0; Index < DataSize / sizeof (EFI_TLS_COMPRESSION); Index++) { 138 Status = TlsSetCompressionMethod (*((UINT8 *)Data + Index)); 139 if (EFI_ERROR (Status)) { 140 break; 141 } 142 } 143 144 break; 145 case EfiTlsExtensionData: 146 Status = EFI_UNSUPPORTED; 90 147 goto ON_EXIT; 91 } 92 93 Status = TlsSetVersion (Instance->TlsConn, ((EFI_TLS_VERSION *) Data)->Major, ((EFI_TLS_VERSION *) Data)->Minor); 94 break; 95 case EfiTlsConnectionEnd: 96 if (DataSize != sizeof (EFI_TLS_CONNECTION_END)) { 97 Status = EFI_INVALID_PARAMETER; 98 goto ON_EXIT; 99 } 100 101 Status = TlsSetConnectionEnd (Instance->TlsConn, *((EFI_TLS_CONNECTION_END *) Data)); 102 break; 103 case EfiTlsCipherList: 104 if (DataSize % sizeof (EFI_TLS_CIPHER) != 0) { 105 Status = EFI_INVALID_PARAMETER; 106 goto ON_EXIT; 107 } 108 109 CipherId = AllocatePool (DataSize); 110 if (CipherId == NULL) { 111 Status = EFI_OUT_OF_RESOURCES; 112 goto ON_EXIT; 113 } 114 115 TlsCipherList = (CONST EFI_TLS_CIPHER *) Data; 116 CipherCount = DataSize / sizeof (EFI_TLS_CIPHER); 117 for (Index = 0; Index < CipherCount; Index++) { 118 CipherId[Index] = ((TlsCipherList[Index].Data1 << 8) | 119 TlsCipherList[Index].Data2); 120 } 121 122 Status = TlsSetCipherList (Instance->TlsConn, CipherId, CipherCount); 123 124 FreePool (CipherId); 125 break; 126 case EfiTlsCompressionMethod: 127 // 128 // TLS seems only define one CompressionMethod.null, which specifies that data exchanged via the 129 // record protocol will not be compressed. 130 // More information from OpenSSL: http://www.openssl.org/docs/manmaster/ssl/SSL_COMP_add_compression_method.html 131 // The TLS RFC does however not specify compression methods or their corresponding identifiers, 132 // so there is currently no compatible way to integrate compression with unknown peers. 133 // It is therefore currently not recommended to integrate compression into applications. 134 // Applications for non-public use may agree on certain compression methods. 135 // Using different compression methods with the same identifier will lead to connection failure. 136 // 137 for (Index = 0; Index < DataSize / sizeof (EFI_TLS_COMPRESSION); Index++) { 138 Status = TlsSetCompressionMethod (*((UINT8 *) Data + Index)); 148 case EfiTlsVerifyMethod: 149 if (DataSize != sizeof (EFI_TLS_VERIFY)) { 150 Status = EFI_INVALID_PARAMETER; 151 goto ON_EXIT; 152 } 153 154 TlsSetVerify (Instance->TlsConn, *((UINT32 *)Data)); 155 break; 156 case EfiTlsVerifyHost: 157 if (DataSize != sizeof (EFI_TLS_VERIFY_HOST)) { 158 Status = EFI_INVALID_PARAMETER; 159 goto ON_EXIT; 160 } 161 162 TlsVerifyHost = (CONST EFI_TLS_VERIFY_HOST *)Data; 163 164 if (((TlsVerifyHost->Flags & EFI_TLS_VERIFY_FLAG_ALWAYS_CHECK_SUBJECT) != 0) && 165 ((TlsVerifyHost->Flags & EFI_TLS_VERIFY_FLAG_NEVER_CHECK_SUBJECT) != 0)) 166 { 167 Status = EFI_INVALID_PARAMETER; 168 goto ON_EXIT; 169 } 170 171 if (((TlsVerifyHost->Flags & EFI_TLS_VERIFY_FLAG_NO_WILDCARDS) != 0) && 172 (((TlsVerifyHost->Flags & EFI_TLS_VERIFY_FLAG_NO_PARTIAL_WILDCARDS) != 0) || 173 ((TlsVerifyHost->Flags & EFI_TLS_VERIFY_FLAG_MULTI_LABEL_WILDCARDS) != 0))) 174 { 175 Status = EFI_INVALID_PARAMETER; 176 goto ON_EXIT; 177 } 178 179 Status = This->GetSessionData (This, EfiTlsVerifyMethod, &VerifyMethod, &VerifyMethodSize); 139 180 if (EFI_ERROR (Status)) { 140 break; 141 } 142 } 143 144 break; 145 case EfiTlsExtensionData: 146 Status = EFI_UNSUPPORTED; 147 goto ON_EXIT; 148 case EfiTlsVerifyMethod: 149 if (DataSize != sizeof (EFI_TLS_VERIFY)) { 150 Status = EFI_INVALID_PARAMETER; 151 goto ON_EXIT; 152 } 153 154 TlsSetVerify (Instance->TlsConn, *((UINT32 *) Data)); 155 break; 156 case EfiTlsVerifyHost: 157 if (DataSize != sizeof (EFI_TLS_VERIFY_HOST)) { 158 Status = EFI_INVALID_PARAMETER; 159 goto ON_EXIT; 160 } 161 162 TlsVerifyHost = (CONST EFI_TLS_VERIFY_HOST *) Data; 163 164 if ((TlsVerifyHost->Flags & EFI_TLS_VERIFY_FLAG_ALWAYS_CHECK_SUBJECT) != 0 && 165 (TlsVerifyHost->Flags & EFI_TLS_VERIFY_FLAG_NEVER_CHECK_SUBJECT) != 0) { 166 Status = EFI_INVALID_PARAMETER; 167 goto ON_EXIT; 168 } 169 170 if ((TlsVerifyHost->Flags & EFI_TLS_VERIFY_FLAG_NO_WILDCARDS) != 0 && 171 ((TlsVerifyHost->Flags & EFI_TLS_VERIFY_FLAG_NO_PARTIAL_WILDCARDS) != 0 || 172 (TlsVerifyHost->Flags & EFI_TLS_VERIFY_FLAG_MULTI_LABEL_WILDCARDS) != 0)) { 173 Status = EFI_INVALID_PARAMETER; 174 goto ON_EXIT; 175 } 176 177 Status = This->GetSessionData (This, EfiTlsVerifyMethod, &VerifyMethod, &VerifyMethodSize); 178 if (EFI_ERROR (Status)) { 179 goto ON_EXIT; 180 } 181 182 if ((VerifyMethod & EFI_TLS_VERIFY_PEER) == 0) { 183 Status = EFI_INVALID_PARAMETER; 184 goto ON_EXIT; 185 } 186 187 Status = TlsSetVerifyHost (Instance->TlsConn, TlsVerifyHost->Flags, TlsVerifyHost->HostName); 188 189 break; 190 case EfiTlsSessionID: 191 if (DataSize != sizeof (EFI_TLS_SESSION_ID)) { 192 Status = EFI_INVALID_PARAMETER; 193 goto ON_EXIT; 194 } 195 196 Status = TlsSetSessionId ( 197 Instance->TlsConn, 198 ((EFI_TLS_SESSION_ID *) Data)->Data, 199 ((EFI_TLS_SESSION_ID *) Data)->Length 200 ); 201 break; 202 case EfiTlsSessionState: 203 if (DataSize != sizeof (EFI_TLS_SESSION_STATE)) { 204 Status = EFI_INVALID_PARAMETER; 205 goto ON_EXIT; 206 } 207 208 Instance->TlsSessionState = *(EFI_TLS_SESSION_STATE *) Data; 209 break; 210 // 211 // Session information 212 // 213 case EfiTlsClientRandom: 214 Status = EFI_ACCESS_DENIED; 215 break; 216 case EfiTlsServerRandom: 217 Status = EFI_ACCESS_DENIED; 218 break; 219 case EfiTlsKeyMaterial: 220 Status = EFI_ACCESS_DENIED; 221 break; 222 // 223 // Unsupported type. 224 // 225 default: 226 Status = EFI_UNSUPPORTED; 181 goto ON_EXIT; 182 } 183 184 if ((VerifyMethod & EFI_TLS_VERIFY_PEER) == 0) { 185 Status = EFI_INVALID_PARAMETER; 186 goto ON_EXIT; 187 } 188 189 Status = TlsSetVerifyHost (Instance->TlsConn, TlsVerifyHost->Flags, TlsVerifyHost->HostName); 190 191 break; 192 case EfiTlsSessionID: 193 if (DataSize != sizeof (EFI_TLS_SESSION_ID)) { 194 Status = EFI_INVALID_PARAMETER; 195 goto ON_EXIT; 196 } 197 198 Status = TlsSetSessionId ( 199 Instance->TlsConn, 200 ((EFI_TLS_SESSION_ID *)Data)->Data, 201 ((EFI_TLS_SESSION_ID *)Data)->Length 202 ); 203 break; 204 case EfiTlsSessionState: 205 if (DataSize != sizeof (EFI_TLS_SESSION_STATE)) { 206 Status = EFI_INVALID_PARAMETER; 207 goto ON_EXIT; 208 } 209 210 Instance->TlsSessionState = *(EFI_TLS_SESSION_STATE *)Data; 211 break; 212 // 213 // Session information 214 // 215 case EfiTlsClientRandom: 216 Status = EFI_ACCESS_DENIED; 217 break; 218 case EfiTlsServerRandom: 219 Status = EFI_ACCESS_DENIED; 220 break; 221 case EfiTlsKeyMaterial: 222 Status = EFI_ACCESS_DENIED; 223 break; 224 // 225 // Unsupported type. 226 // 227 default: 228 Status = EFI_UNSUPPORTED; 227 229 } 228 230 … … 258 260 EFIAPI 259 261 TlsGetSessionData ( 260 IN EFI_TLS_PROTOCOL 261 IN EFI_TLS_SESSION_DATA_TYPE 262 IN OUT VOID *Data, OPTIONAL263 IN OUT UINTN 262 IN EFI_TLS_PROTOCOL *This, 263 IN EFI_TLS_SESSION_DATA_TYPE DataType, 264 IN OUT VOID *Data OPTIONAL, 265 IN OUT UINTN *DataSize 264 266 ) 265 267 { 266 EFI_STATUS 267 TLS_INSTANCE 268 269 EFI_TPL 268 EFI_STATUS Status; 269 TLS_INSTANCE *Instance; 270 271 EFI_TPL OldTpl; 270 272 271 273 Status = EFI_SUCCESS; 272 274 273 if ( This == NULL || DataSize == NULL || (Data == NULL && *DataSize != 0)) {275 if ((This == NULL) || (DataSize == NULL) || ((Data == NULL) && (*DataSize != 0))) { 274 276 return EFI_INVALID_PARAMETER; 275 277 } … … 279 281 Instance = TLS_INSTANCE_FROM_PROTOCOL (This); 280 282 281 if (Instance->TlsSessionState == EfiTlsSessionNotStarted && 282 (DataType == EfiTlsSessionID || DataType == EfiTlsClientRandom || 283 DataType == EfiTlsServerRandom || DataType == EfiTlsKeyMaterial)) { 283 if ((Instance->TlsSessionState == EfiTlsSessionNotStarted) && 284 ((DataType == EfiTlsSessionID) || (DataType == EfiTlsClientRandom) || 285 (DataType == EfiTlsServerRandom) || (DataType == EfiTlsKeyMaterial))) 286 { 284 287 Status = EFI_NOT_READY; 285 288 goto ON_EXIT; … … 287 290 288 291 switch (DataType) { 289 case EfiTlsVersion: 290 if (*DataSize < sizeof (EFI_TLS_VERSION)) { 291 *DataSize = sizeof (EFI_TLS_VERSION); 292 Status = EFI_BUFFER_TOO_SMALL; 292 case EfiTlsVersion: 293 if (*DataSize < sizeof (EFI_TLS_VERSION)) { 294 *DataSize = sizeof (EFI_TLS_VERSION); 295 Status = EFI_BUFFER_TOO_SMALL; 296 goto ON_EXIT; 297 } 298 299 *DataSize = sizeof (EFI_TLS_VERSION); 300 *((UINT16 *)Data) = HTONS (TlsGetVersion (Instance->TlsConn)); 301 break; 302 case EfiTlsConnectionEnd: 303 if (*DataSize < sizeof (EFI_TLS_CONNECTION_END)) { 304 *DataSize = sizeof (EFI_TLS_CONNECTION_END); 305 Status = EFI_BUFFER_TOO_SMALL; 306 goto ON_EXIT; 307 } 308 309 *DataSize = sizeof (EFI_TLS_CONNECTION_END); 310 *((UINT8 *)Data) = TlsGetConnectionEnd (Instance->TlsConn); 311 break; 312 case EfiTlsCipherList: 313 // 314 // Get the current session cipher suite. 315 // 316 if (*DataSize < sizeof (EFI_TLS_CIPHER)) { 317 *DataSize = sizeof (EFI_TLS_CIPHER); 318 Status = EFI_BUFFER_TOO_SMALL; 319 goto ON_EXIT; 320 } 321 322 *DataSize = sizeof (EFI_TLS_CIPHER); 323 Status = TlsGetCurrentCipher (Instance->TlsConn, (UINT16 *)Data); 324 *((UINT16 *)Data) = HTONS (*((UINT16 *)Data)); 325 break; 326 case EfiTlsCompressionMethod: 327 // 328 // Get the current session compression method. 329 // 330 if (*DataSize < sizeof (EFI_TLS_COMPRESSION)) { 331 *DataSize = sizeof (EFI_TLS_COMPRESSION); 332 Status = EFI_BUFFER_TOO_SMALL; 333 goto ON_EXIT; 334 } 335 336 *DataSize = sizeof (EFI_TLS_COMPRESSION); 337 Status = TlsGetCurrentCompressionId (Instance->TlsConn, (UINT8 *)Data); 338 break; 339 case EfiTlsExtensionData: 340 Status = EFI_UNSUPPORTED; 293 341 goto ON_EXIT; 294 } 295 *DataSize = sizeof (EFI_TLS_VERSION); 296 *((UINT16 *) Data) = HTONS (TlsGetVersion (Instance->TlsConn)); 297 break; 298 case EfiTlsConnectionEnd: 299 if (*DataSize < sizeof (EFI_TLS_CONNECTION_END)) { 300 *DataSize = sizeof (EFI_TLS_CONNECTION_END); 301 Status = EFI_BUFFER_TOO_SMALL; 302 goto ON_EXIT; 303 } 304 *DataSize = sizeof (EFI_TLS_CONNECTION_END); 305 *((UINT8 *) Data) = TlsGetConnectionEnd (Instance->TlsConn); 306 break; 307 case EfiTlsCipherList: 308 // 309 // Get the current session cipher suite. 310 // 311 if (*DataSize < sizeof (EFI_TLS_CIPHER)) { 312 *DataSize = sizeof (EFI_TLS_CIPHER); 313 Status = EFI_BUFFER_TOO_SMALL; 314 goto ON_EXIT; 315 } 316 *DataSize = sizeof(EFI_TLS_CIPHER); 317 Status = TlsGetCurrentCipher (Instance->TlsConn, (UINT16 *) Data); 318 *((UINT16 *) Data) = HTONS (*((UINT16 *) Data)); 319 break; 320 case EfiTlsCompressionMethod: 321 // 322 // Get the current session compression method. 323 // 324 if (*DataSize < sizeof (EFI_TLS_COMPRESSION)) { 325 *DataSize = sizeof (EFI_TLS_COMPRESSION); 326 Status = EFI_BUFFER_TOO_SMALL; 327 goto ON_EXIT; 328 } 329 *DataSize = sizeof (EFI_TLS_COMPRESSION); 330 Status = TlsGetCurrentCompressionId (Instance->TlsConn, (UINT8 *) Data); 331 break; 332 case EfiTlsExtensionData: 333 Status = EFI_UNSUPPORTED; 334 goto ON_EXIT; 335 case EfiTlsVerifyMethod: 336 if (*DataSize < sizeof (EFI_TLS_VERIFY)) { 337 *DataSize = sizeof (EFI_TLS_VERIFY); 338 Status = EFI_BUFFER_TOO_SMALL; 339 goto ON_EXIT; 340 } 341 *DataSize = sizeof (EFI_TLS_VERIFY); 342 *((UINT32 *) Data) = TlsGetVerify (Instance->TlsConn); 343 break; 344 case EfiTlsSessionID: 345 if (*DataSize < sizeof (EFI_TLS_SESSION_ID)) { 342 case EfiTlsVerifyMethod: 343 if (*DataSize < sizeof (EFI_TLS_VERIFY)) { 344 *DataSize = sizeof (EFI_TLS_VERIFY); 345 Status = EFI_BUFFER_TOO_SMALL; 346 goto ON_EXIT; 347 } 348 349 *DataSize = sizeof (EFI_TLS_VERIFY); 350 *((UINT32 *)Data) = TlsGetVerify (Instance->TlsConn); 351 break; 352 case EfiTlsSessionID: 353 if (*DataSize < sizeof (EFI_TLS_SESSION_ID)) { 354 *DataSize = sizeof (EFI_TLS_SESSION_ID); 355 Status = EFI_BUFFER_TOO_SMALL; 356 goto ON_EXIT; 357 } 358 346 359 *DataSize = sizeof (EFI_TLS_SESSION_ID); 347 Status = EFI_BUFFER_TOO_SMALL; 348 goto ON_EXIT; 349 } 350 *DataSize = sizeof (EFI_TLS_SESSION_ID); 351 Status = TlsGetSessionId ( 352 Instance->TlsConn, 353 ((EFI_TLS_SESSION_ID *) Data)->Data, 354 &(((EFI_TLS_SESSION_ID *) Data)->Length) 355 ); 356 break; 357 case EfiTlsSessionState: 358 if (*DataSize < sizeof (EFI_TLS_SESSION_STATE)) { 360 Status = TlsGetSessionId ( 361 Instance->TlsConn, 362 ((EFI_TLS_SESSION_ID *)Data)->Data, 363 &(((EFI_TLS_SESSION_ID *)Data)->Length) 364 ); 365 break; 366 case EfiTlsSessionState: 367 if (*DataSize < sizeof (EFI_TLS_SESSION_STATE)) { 368 *DataSize = sizeof (EFI_TLS_SESSION_STATE); 369 Status = EFI_BUFFER_TOO_SMALL; 370 goto ON_EXIT; 371 } 372 359 373 *DataSize = sizeof (EFI_TLS_SESSION_STATE); 360 Status = EFI_BUFFER_TOO_SMALL; 361 goto ON_EXIT; 362 } 363 *DataSize = sizeof (EFI_TLS_SESSION_STATE); 364 CopyMem (Data, &Instance->TlsSessionState, *DataSize); 365 break; 366 case EfiTlsClientRandom: 367 if (*DataSize < sizeof (EFI_TLS_RANDOM)) { 374 CopyMem (Data, &Instance->TlsSessionState, *DataSize); 375 break; 376 case EfiTlsClientRandom: 377 if (*DataSize < sizeof (EFI_TLS_RANDOM)) { 378 *DataSize = sizeof (EFI_TLS_RANDOM); 379 Status = EFI_BUFFER_TOO_SMALL; 380 goto ON_EXIT; 381 } 382 368 383 *DataSize = sizeof (EFI_TLS_RANDOM); 369 Status = EFI_BUFFER_TOO_SMALL; 370 goto ON_EXIT; 371 } 372 *DataSize = sizeof (EFI_TLS_RANDOM); 373 TlsGetClientRandom (Instance->TlsConn, (UINT8 *) Data); 374 break; 375 case EfiTlsServerRandom: 376 if (*DataSize < sizeof (EFI_TLS_RANDOM)) { 384 TlsGetClientRandom (Instance->TlsConn, (UINT8 *)Data); 385 break; 386 case EfiTlsServerRandom: 387 if (*DataSize < sizeof (EFI_TLS_RANDOM)) { 388 *DataSize = sizeof (EFI_TLS_RANDOM); 389 Status = EFI_BUFFER_TOO_SMALL; 390 goto ON_EXIT; 391 } 392 377 393 *DataSize = sizeof (EFI_TLS_RANDOM); 378 Status = EFI_BUFFER_TOO_SMALL; 379 goto ON_EXIT; 380 } 381 *DataSize = sizeof (EFI_TLS_RANDOM); 382 TlsGetServerRandom (Instance->TlsConn, (UINT8 *) Data); 383 break; 384 case EfiTlsKeyMaterial: 385 if (*DataSize < sizeof (EFI_TLS_MASTER_SECRET)) { 394 TlsGetServerRandom (Instance->TlsConn, (UINT8 *)Data); 395 break; 396 case EfiTlsKeyMaterial: 397 if (*DataSize < sizeof (EFI_TLS_MASTER_SECRET)) { 398 *DataSize = sizeof (EFI_TLS_MASTER_SECRET); 399 Status = EFI_BUFFER_TOO_SMALL; 400 goto ON_EXIT; 401 } 402 386 403 *DataSize = sizeof (EFI_TLS_MASTER_SECRET); 387 Status = EFI_BUFFER_TOO_SMALL; 388 goto ON_EXIT; 389 } 390 *DataSize = sizeof (EFI_TLS_MASTER_SECRET); 391 Status = TlsGetKeyMaterial (Instance->TlsConn, (UINT8 *) Data); 392 break; 393 // 394 // Unsupported type. 395 // 396 default: 397 Status = EFI_UNSUPPORTED; 404 Status = TlsGetKeyMaterial (Instance->TlsConn, (UINT8 *)Data); 405 break; 406 // 407 // Unsupported type. 408 // 409 default: 410 Status = EFI_UNSUPPORTED; 398 411 } 399 412 … … 444 457 EFIAPI 445 458 TlsBuildResponsePacket ( 446 IN EFI_TLS_PROTOCOL 447 IN UINT8 *RequestBuffer, OPTIONAL448 IN UINTN RequestSize, OPTIONAL449 OUT UINT8 *Buffer, OPTIONAL450 IN OUT UINTN 459 IN EFI_TLS_PROTOCOL *This, 460 IN UINT8 *RequestBuffer OPTIONAL, 461 IN UINTN RequestSize OPTIONAL, 462 OUT UINT8 *Buffer OPTIONAL, 463 IN OUT UINTN *BufferSize 451 464 ) 452 465 { 453 EFI_STATUS 454 TLS_INSTANCE 455 EFI_TPL 466 EFI_STATUS Status; 467 TLS_INSTANCE *Instance; 468 EFI_TPL OldTpl; 456 469 457 470 Status = EFI_SUCCESS; 458 471 459 472 if ((This == NULL) || (BufferSize == NULL) || 460 (RequestBuffer == NULL && RequestSize != 0) || 461 (RequestBuffer != NULL && RequestSize == 0) || 462 (Buffer == NULL && *BufferSize !=0)) { 473 ((RequestBuffer == NULL) && (RequestSize != 0)) || 474 ((RequestBuffer != NULL) && (RequestSize == 0)) || 475 ((Buffer == NULL) && (*BufferSize != 0))) 476 { 463 477 return EFI_INVALID_PARAMETER; 464 478 } … … 468 482 Instance = TLS_INSTANCE_FROM_PROTOCOL (This); 469 483 470 if (RequestBuffer == NULL && RequestSize == 0) {484 if ((RequestBuffer == NULL) && (RequestSize == 0)) { 471 485 switch (Instance->TlsSessionState) { 472 case EfiTlsSessionNotStarted:473 //474 // ClientHello.475 //476 Status = TlsDoHandshake (477 Instance->TlsConn,478 NULL,479 0,480 Buffer,481 BufferSize482 );483 if (EFI_ERROR (Status)) {484 goto ON_EXIT;485 }486 487 //488 // *BufferSize should not be zero when ClientHello.489 //490 if (*BufferSize == 0) {491 Status = EFI_ABORTED;492 goto ON_EXIT;493 }494 495 Instance->TlsSessionState = EfiTlsSessionHandShaking;496 497 break;498 case EfiTlsSessionClosing:499 //500 // TLS session will be closed and response packet needs to be CloseNotify.501 //502 Status = TlsCloseNotify (503 Instance->TlsConn,504 Buffer,505 BufferSize506 );507 if (EFI_ERROR (Status)) {508 goto ON_EXIT;509 }510 511 //512 // *BufferSize should not be zero when build CloseNotify message.513 //514 if (*BufferSize == 0) {515 Status = EFI_ABORTED;516 goto ON_EXIT;517 }518 519 break;520 case EfiTlsSessionError:521 //522 // TLS session has errors and the response packet needs to be Alert523 // message based on error type.524 //525 Status = TlsHandleAlert (526 Instance->TlsConn,527 NULL,528 0,529 Buffer,530 BufferSize531 );532 if (EFI_ERROR (Status)) {533 goto ON_EXIT;534 }535 536 break;537 default:538 //539 // Current TLS session state is NOT ready to build ResponsePacket.540 //541 Status = EFI_NOT_READY;486 case EfiTlsSessionNotStarted: 487 // 488 // ClientHello. 489 // 490 Status = TlsDoHandshake ( 491 Instance->TlsConn, 492 NULL, 493 0, 494 Buffer, 495 BufferSize 496 ); 497 if (EFI_ERROR (Status)) { 498 goto ON_EXIT; 499 } 500 501 // 502 // *BufferSize should not be zero when ClientHello. 503 // 504 if (*BufferSize == 0) { 505 Status = EFI_ABORTED; 506 goto ON_EXIT; 507 } 508 509 Instance->TlsSessionState = EfiTlsSessionHandShaking; 510 511 break; 512 case EfiTlsSessionClosing: 513 // 514 // TLS session will be closed and response packet needs to be CloseNotify. 515 // 516 Status = TlsCloseNotify ( 517 Instance->TlsConn, 518 Buffer, 519 BufferSize 520 ); 521 if (EFI_ERROR (Status)) { 522 goto ON_EXIT; 523 } 524 525 // 526 // *BufferSize should not be zero when build CloseNotify message. 527 // 528 if (*BufferSize == 0) { 529 Status = EFI_ABORTED; 530 goto ON_EXIT; 531 } 532 533 break; 534 case EfiTlsSessionError: 535 // 536 // TLS session has errors and the response packet needs to be Alert 537 // message based on error type. 538 // 539 Status = TlsHandleAlert ( 540 Instance->TlsConn, 541 NULL, 542 0, 543 Buffer, 544 BufferSize 545 ); 546 if (EFI_ERROR (Status)) { 547 goto ON_EXIT; 548 } 549 550 break; 551 default: 552 // 553 // Current TLS session state is NOT ready to build ResponsePacket. 554 // 555 Status = EFI_NOT_READY; 542 556 } 543 557 } else { … … 567 581 // Must be alert message, Decrypt it and build the ResponsePacket. 568 582 // 569 ASSERT (((TLS_RECORD_HEADER *) 583 ASSERT (((TLS_RECORD_HEADER *)RequestBuffer)->ContentType == TlsContentTypeAlert); 570 584 571 585 Status = TlsHandleAlert ( … … 628 642 EFIAPI 629 643 TlsProcessPacket ( 630 IN EFI_TLS_PROTOCOL 631 IN OUT EFI_TLS_FRAGMENT_DATA 632 IN UINT32 633 IN EFI_TLS_CRYPT_MODE 644 IN EFI_TLS_PROTOCOL *This, 645 IN OUT EFI_TLS_FRAGMENT_DATA **FragmentTable, 646 IN UINT32 *FragmentCount, 647 IN EFI_TLS_CRYPT_MODE CryptMode 634 648 ) 635 649 { 636 EFI_STATUS 637 TLS_INSTANCE 638 639 EFI_TPL 650 EFI_STATUS Status; 651 TLS_INSTANCE *Instance; 652 653 EFI_TPL OldTpl; 640 654 641 655 Status = EFI_SUCCESS; 642 656 643 if ( This == NULL || FragmentTable == NULL || FragmentCount == NULL) {657 if ((This == NULL) || (FragmentTable == NULL) || (FragmentCount == NULL)) { 644 658 return EFI_INVALID_PARAMETER; 645 659 } … … 660 674 // 661 675 switch (CryptMode) { 662 case EfiTlsEncrypt:663 Status = TlsEncryptPacket (Instance, FragmentTable, FragmentCount);664 break;665 case EfiTlsDecrypt:666 Status = TlsDecryptPacket (Instance, FragmentTable, FragmentCount);667 break;668 default:669 return EFI_INVALID_PARAMETER;676 case EfiTlsEncrypt: 677 Status = TlsEncryptPacket (Instance, FragmentTable, FragmentCount); 678 break; 679 case EfiTlsDecrypt: 680 Status = TlsDecryptPacket (Instance, FragmentTable, FragmentCount); 681 break; 682 default: 683 return EFI_INVALID_PARAMETER; 670 684 } 671 685 … … 674 688 return Status; 675 689 } 676
Note:
See TracChangeset
for help on using the changeset viewer.