1*f334afcfSToomas Soome /** @file 2*f334afcfSToomas Soome TPM2 Protocol as defined in TCG PC Client Platform EFI Protocol Specification Family "2.0". 3*f334afcfSToomas Soome See http://trustedcomputinggroup.org for the latest specification 4*f334afcfSToomas Soome 5*f334afcfSToomas Soome Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR> 6*f334afcfSToomas Soome SPDX-License-Identifier: BSD-2-Clause-Patent 7*f334afcfSToomas Soome 8*f334afcfSToomas Soome **/ 9*f334afcfSToomas Soome 10*f334afcfSToomas Soome #ifndef __TCG2_PROTOCOL_H__ 11*f334afcfSToomas Soome #define __TCG2_PROTOCOL_H__ 12*f334afcfSToomas Soome 13*f334afcfSToomas Soome #include <IndustryStandard/UefiTcgPlatform.h> 14*f334afcfSToomas Soome #include <IndustryStandard/Tpm20.h> 15*f334afcfSToomas Soome 16*f334afcfSToomas Soome #define EFI_TCG2_PROTOCOL_GUID \ 17*f334afcfSToomas Soome {0x607f766c, 0x7455, 0x42be, { 0x93, 0x0b, 0xe4, 0xd7, 0x6d, 0xb2, 0x72, 0x0f }} 18*f334afcfSToomas Soome 19*f334afcfSToomas Soome typedef struct tdEFI_TCG2_PROTOCOL EFI_TCG2_PROTOCOL; 20*f334afcfSToomas Soome 21*f334afcfSToomas Soome typedef struct tdEFI_TCG2_VERSION { 22*f334afcfSToomas Soome UINT8 Major; 23*f334afcfSToomas Soome UINT8 Minor; 24*f334afcfSToomas Soome } EFI_TCG2_VERSION; 25*f334afcfSToomas Soome 26*f334afcfSToomas Soome typedef UINT32 EFI_TCG2_EVENT_LOG_BITMAP; 27*f334afcfSToomas Soome typedef UINT32 EFI_TCG2_EVENT_LOG_FORMAT; 28*f334afcfSToomas Soome typedef UINT32 EFI_TCG2_EVENT_ALGORITHM_BITMAP; 29*f334afcfSToomas Soome 30*f334afcfSToomas Soome #define EFI_TCG2_EVENT_LOG_FORMAT_TCG_1_2 0x00000001 31*f334afcfSToomas Soome #define EFI_TCG2_EVENT_LOG_FORMAT_TCG_2 0x00000002 32*f334afcfSToomas Soome 33*f334afcfSToomas Soome typedef struct tdEFI_TCG2_BOOT_SERVICE_CAPABILITY { 34*f334afcfSToomas Soome // 35*f334afcfSToomas Soome // Allocated size of the structure 36*f334afcfSToomas Soome // 37*f334afcfSToomas Soome UINT8 Size; 38*f334afcfSToomas Soome // 39*f334afcfSToomas Soome // Version of the EFI_TCG2_BOOT_SERVICE_CAPABILITY structure itself. 40*f334afcfSToomas Soome // For this version of the protocol, the Major version shall be set to 1 41*f334afcfSToomas Soome // and the Minor version shall be set to 1. 42*f334afcfSToomas Soome // 43*f334afcfSToomas Soome EFI_TCG2_VERSION StructureVersion; 44*f334afcfSToomas Soome // 45*f334afcfSToomas Soome // Version of the EFI TCG2 protocol. 46*f334afcfSToomas Soome // For this version of the protocol, the Major version shall be set to 1 47*f334afcfSToomas Soome // and the Minor version shall be set to 1. 48*f334afcfSToomas Soome // 49*f334afcfSToomas Soome EFI_TCG2_VERSION ProtocolVersion; 50*f334afcfSToomas Soome // 51*f334afcfSToomas Soome // Supported hash algorithms (this bitmap is determined by the supported PCR 52*f334afcfSToomas Soome // banks in the TPM and the hashing algorithms supported by the firmware) 53*f334afcfSToomas Soome // 54*f334afcfSToomas Soome EFI_TCG2_EVENT_ALGORITHM_BITMAP HashAlgorithmBitmap; 55*f334afcfSToomas Soome // 56*f334afcfSToomas Soome // Bitmap of supported event log formats 57*f334afcfSToomas Soome // 58*f334afcfSToomas Soome EFI_TCG2_EVENT_LOG_BITMAP SupportedEventLogs; 59*f334afcfSToomas Soome // 60*f334afcfSToomas Soome // False = TPM not present 61*f334afcfSToomas Soome // 62*f334afcfSToomas Soome BOOLEAN TPMPresentFlag; 63*f334afcfSToomas Soome // 64*f334afcfSToomas Soome // Max size (in bytes) of a command that can be sent to the TPM 65*f334afcfSToomas Soome // 66*f334afcfSToomas Soome UINT16 MaxCommandSize; 67*f334afcfSToomas Soome // 68*f334afcfSToomas Soome // Max size (in bytes) of a response that can be provided by the TPM 69*f334afcfSToomas Soome // 70*f334afcfSToomas Soome UINT16 MaxResponseSize; 71*f334afcfSToomas Soome // 72*f334afcfSToomas Soome // 4-byte Vendor ID 73*f334afcfSToomas Soome // (see TCG Vendor ID registry, Section "TPM Capabilities Vendor ID") 74*f334afcfSToomas Soome // 75*f334afcfSToomas Soome UINT32 ManufacturerID; 76*f334afcfSToomas Soome // 77*f334afcfSToomas Soome // Maximum number of PCR banks (hashing algorithms) supported. 78*f334afcfSToomas Soome // No granularity is provided to support a specific set of algorithms. 79*f334afcfSToomas Soome // Minimum value is 1. 80*f334afcfSToomas Soome // 81*f334afcfSToomas Soome UINT32 NumberOfPCRBanks; 82*f334afcfSToomas Soome // 83*f334afcfSToomas Soome // A bitmap of currently active PCR banks (hashing algorithms). 84*f334afcfSToomas Soome // This is a subset of the supported hashing algorithms reported in HashAlgorithmBitMap. 85*f334afcfSToomas Soome // NumberOfPcrBanks defines the number of bits that are set. 86*f334afcfSToomas Soome // 87*f334afcfSToomas Soome EFI_TCG2_EVENT_ALGORITHM_BITMAP ActivePcrBanks; 88*f334afcfSToomas Soome } EFI_TCG2_BOOT_SERVICE_CAPABILITY; 89*f334afcfSToomas Soome 90*f334afcfSToomas Soome #define EFI_TCG2_BOOT_HASH_ALG_SHA1 0x00000001 91*f334afcfSToomas Soome #define EFI_TCG2_BOOT_HASH_ALG_SHA256 0x00000002 92*f334afcfSToomas Soome #define EFI_TCG2_BOOT_HASH_ALG_SHA384 0x00000004 93*f334afcfSToomas Soome #define EFI_TCG2_BOOT_HASH_ALG_SHA512 0x00000008 94*f334afcfSToomas Soome #define EFI_TCG2_BOOT_HASH_ALG_SM3_256 0x00000010 95*f334afcfSToomas Soome 96*f334afcfSToomas Soome // 97*f334afcfSToomas Soome // This bit is shall be set when an event shall be extended but not logged. 98*f334afcfSToomas Soome // 99*f334afcfSToomas Soome #define EFI_TCG2_EXTEND_ONLY 0x0000000000000001 100*f334afcfSToomas Soome // 101*f334afcfSToomas Soome // This bit shall be set when the intent is to measure a PE/COFF image. 102*f334afcfSToomas Soome // 103*f334afcfSToomas Soome #define PE_COFF_IMAGE 0x0000000000000010 104*f334afcfSToomas Soome 105*f334afcfSToomas Soome #define MAX_PCR_INDEX 23 106*f334afcfSToomas Soome 107*f334afcfSToomas Soome #pragma pack(1) 108*f334afcfSToomas Soome 109*f334afcfSToomas Soome #define EFI_TCG2_EVENT_HEADER_VERSION 1 110*f334afcfSToomas Soome 111*f334afcfSToomas Soome typedef struct { 112*f334afcfSToomas Soome // 113*f334afcfSToomas Soome // Size of the event header itself (sizeof(EFI_TCG2_EVENT_HEADER)). 114*f334afcfSToomas Soome // 115*f334afcfSToomas Soome UINT32 HeaderSize; 116*f334afcfSToomas Soome // 117*f334afcfSToomas Soome // Header version. For this version of this specification, the value shall be 1. 118*f334afcfSToomas Soome // 119*f334afcfSToomas Soome UINT16 HeaderVersion; 120*f334afcfSToomas Soome // 121*f334afcfSToomas Soome // Index of the PCR that shall be extended (0 - 23). 122*f334afcfSToomas Soome // 123*f334afcfSToomas Soome TCG_PCRINDEX PCRIndex; 124*f334afcfSToomas Soome // 125*f334afcfSToomas Soome // Type of the event that shall be extended (and optionally logged). 126*f334afcfSToomas Soome // 127*f334afcfSToomas Soome TCG_EVENTTYPE EventType; 128*f334afcfSToomas Soome } EFI_TCG2_EVENT_HEADER; 129*f334afcfSToomas Soome 130*f334afcfSToomas Soome typedef struct tdEFI_TCG2_EVENT { 131*f334afcfSToomas Soome // 132*f334afcfSToomas Soome // Total size of the event including the Size component, the header and the Event data. 133*f334afcfSToomas Soome // 134*f334afcfSToomas Soome UINT32 Size; 135*f334afcfSToomas Soome EFI_TCG2_EVENT_HEADER Header; 136*f334afcfSToomas Soome UINT8 Event[1]; 137*f334afcfSToomas Soome } EFI_TCG2_EVENT; 138*f334afcfSToomas Soome 139*f334afcfSToomas Soome #pragma pack() 140*f334afcfSToomas Soome 141*f334afcfSToomas Soome /** 142*f334afcfSToomas Soome The EFI_TCG2_PROTOCOL GetCapability function call provides protocol 143*f334afcfSToomas Soome capability information and state information. 144*f334afcfSToomas Soome 145*f334afcfSToomas Soome @param[in] This Indicates the calling context 146*f334afcfSToomas Soome @param[in, out] ProtocolCapability The caller allocates memory for a EFI_TCG2_BOOT_SERVICE_CAPABILITY 147*f334afcfSToomas Soome structure and sets the size field to the size of the structure allocated. 148*f334afcfSToomas Soome The callee fills in the fields with the EFI protocol capability information 149*f334afcfSToomas Soome and the current EFI TCG2 state information up to the number of fields which 150*f334afcfSToomas Soome fit within the size of the structure passed in. 151*f334afcfSToomas Soome 152*f334afcfSToomas Soome @retval EFI_SUCCESS Operation completed successfully. 153*f334afcfSToomas Soome @retval EFI_DEVICE_ERROR The command was unsuccessful. 154*f334afcfSToomas Soome The ProtocolCapability variable will not be populated. 155*f334afcfSToomas Soome @retval EFI_INVALID_PARAMETER One or more of the parameters are incorrect. 156*f334afcfSToomas Soome The ProtocolCapability variable will not be populated. 157*f334afcfSToomas Soome @retval EFI_BUFFER_TOO_SMALL The ProtocolCapability variable is too small to hold the full response. 158*f334afcfSToomas Soome It will be partially populated (required Size field will be set). 159*f334afcfSToomas Soome **/ 160*f334afcfSToomas Soome typedef 161*f334afcfSToomas Soome EFI_STATUS 162*f334afcfSToomas Soome (EFIAPI *EFI_TCG2_GET_CAPABILITY)( 163*f334afcfSToomas Soome IN EFI_TCG2_PROTOCOL *This, 164*f334afcfSToomas Soome IN OUT EFI_TCG2_BOOT_SERVICE_CAPABILITY *ProtocolCapability 165*f334afcfSToomas Soome ); 166*f334afcfSToomas Soome 167*f334afcfSToomas Soome /** 168*f334afcfSToomas Soome The EFI_TCG2_PROTOCOL Get Event Log function call allows a caller to 169*f334afcfSToomas Soome retrieve the address of a given event log and its last entry. 170*f334afcfSToomas Soome 171*f334afcfSToomas Soome @param[in] This Indicates the calling context 172*f334afcfSToomas Soome @param[in] EventLogFormat The type of the event log for which the information is requested. 173*f334afcfSToomas Soome @param[out] EventLogLocation A pointer to the memory address of the event log. 174*f334afcfSToomas Soome @param[out] EventLogLastEntry If the Event Log contains more than one entry, this is a pointer to the 175*f334afcfSToomas Soome address of the start of the last entry in the event log in memory. 176*f334afcfSToomas Soome @param[out] EventLogTruncated If the Event Log is missing at least one entry because an event would 177*f334afcfSToomas Soome have exceeded the area allocated for events, this value is set to TRUE. 178*f334afcfSToomas Soome Otherwise, the value will be FALSE and the Event Log will be complete. 179*f334afcfSToomas Soome 180*f334afcfSToomas Soome @retval EFI_SUCCESS Operation completed successfully. 181*f334afcfSToomas Soome @retval EFI_INVALID_PARAMETER One or more of the parameters are incorrect 182*f334afcfSToomas Soome (e.g. asking for an event log whose format is not supported). 183*f334afcfSToomas Soome **/ 184*f334afcfSToomas Soome typedef 185*f334afcfSToomas Soome EFI_STATUS 186*f334afcfSToomas Soome (EFIAPI *EFI_TCG2_GET_EVENT_LOG)( 187*f334afcfSToomas Soome IN EFI_TCG2_PROTOCOL *This, 188*f334afcfSToomas Soome IN EFI_TCG2_EVENT_LOG_FORMAT EventLogFormat, 189*f334afcfSToomas Soome OUT EFI_PHYSICAL_ADDRESS *EventLogLocation, 190*f334afcfSToomas Soome OUT EFI_PHYSICAL_ADDRESS *EventLogLastEntry, 191*f334afcfSToomas Soome OUT BOOLEAN *EventLogTruncated 192*f334afcfSToomas Soome ); 193*f334afcfSToomas Soome 194*f334afcfSToomas Soome /** 195*f334afcfSToomas Soome The EFI_TCG2_PROTOCOL HashLogExtendEvent function call provides callers with 196*f334afcfSToomas Soome an opportunity to extend and optionally log events without requiring 197*f334afcfSToomas Soome knowledge of actual TPM commands. 198*f334afcfSToomas Soome The extend operation will occur even if this function cannot create an event 199*f334afcfSToomas Soome log entry (e.g. due to the event log being full). 200*f334afcfSToomas Soome 201*f334afcfSToomas Soome @param[in] This Indicates the calling context 202*f334afcfSToomas Soome @param[in] Flags Bitmap providing additional information. 203*f334afcfSToomas Soome @param[in] DataToHash Physical address of the start of the data buffer to be hashed. 204*f334afcfSToomas Soome @param[in] DataToHashLen The length in bytes of the buffer referenced by DataToHash. 205*f334afcfSToomas Soome @param[in] EfiTcgEvent Pointer to data buffer containing information about the event. 206*f334afcfSToomas Soome 207*f334afcfSToomas Soome @retval EFI_SUCCESS Operation completed successfully. 208*f334afcfSToomas Soome @retval EFI_DEVICE_ERROR The command was unsuccessful. 209*f334afcfSToomas Soome @retval EFI_VOLUME_FULL The extend operation occurred, but the event could not be written to one or more event logs. 210*f334afcfSToomas Soome @retval EFI_INVALID_PARAMETER One or more of the parameters are incorrect. 211*f334afcfSToomas Soome @retval EFI_UNSUPPORTED The PE/COFF image type is not supported. 212*f334afcfSToomas Soome **/ 213*f334afcfSToomas Soome typedef 214*f334afcfSToomas Soome EFI_STATUS 215*f334afcfSToomas Soome (EFIAPI *EFI_TCG2_HASH_LOG_EXTEND_EVENT)( 216*f334afcfSToomas Soome IN EFI_TCG2_PROTOCOL *This, 217*f334afcfSToomas Soome IN UINT64 Flags, 218*f334afcfSToomas Soome IN EFI_PHYSICAL_ADDRESS DataToHash, 219*f334afcfSToomas Soome IN UINT64 DataToHashLen, 220*f334afcfSToomas Soome IN EFI_TCG2_EVENT *EfiTcgEvent 221*f334afcfSToomas Soome ); 222*f334afcfSToomas Soome 223*f334afcfSToomas Soome /** 224*f334afcfSToomas Soome This service enables the sending of commands to the TPM. 225*f334afcfSToomas Soome 226*f334afcfSToomas Soome @param[in] This Indicates the calling context 227*f334afcfSToomas Soome @param[in] InputParameterBlockSize Size of the TPM input parameter block. 228*f334afcfSToomas Soome @param[in] InputParameterBlock Pointer to the TPM input parameter block. 229*f334afcfSToomas Soome @param[in] OutputParameterBlockSize Size of the TPM output parameter block. 230*f334afcfSToomas Soome @param[in] OutputParameterBlock Pointer to the TPM output parameter block. 231*f334afcfSToomas Soome 232*f334afcfSToomas Soome @retval EFI_SUCCESS The command byte stream was successfully sent to the device and a response was successfully received. 233*f334afcfSToomas Soome @retval EFI_DEVICE_ERROR The command was not successfully sent to the device or a response was not successfully received from the device. 234*f334afcfSToomas Soome @retval EFI_INVALID_PARAMETER One or more of the parameters are incorrect. 235*f334afcfSToomas Soome @retval EFI_BUFFER_TOO_SMALL The output parameter block is too small. 236*f334afcfSToomas Soome **/ 237*f334afcfSToomas Soome typedef 238*f334afcfSToomas Soome EFI_STATUS 239*f334afcfSToomas Soome (EFIAPI *EFI_TCG2_SUBMIT_COMMAND)( 240*f334afcfSToomas Soome IN EFI_TCG2_PROTOCOL *This, 241*f334afcfSToomas Soome IN UINT32 InputParameterBlockSize, 242*f334afcfSToomas Soome IN UINT8 *InputParameterBlock, 243*f334afcfSToomas Soome IN UINT32 OutputParameterBlockSize, 244*f334afcfSToomas Soome IN UINT8 *OutputParameterBlock 245*f334afcfSToomas Soome ); 246*f334afcfSToomas Soome 247*f334afcfSToomas Soome /** 248*f334afcfSToomas Soome This service returns the currently active PCR banks. 249*f334afcfSToomas Soome 250*f334afcfSToomas Soome @param[in] This Indicates the calling context 251*f334afcfSToomas Soome @param[out] ActivePcrBanks Pointer to the variable receiving the bitmap of currently active PCR banks. 252*f334afcfSToomas Soome 253*f334afcfSToomas Soome @retval EFI_SUCCESS The bitmap of active PCR banks was stored in the ActivePcrBanks parameter. 254*f334afcfSToomas Soome @retval EFI_INVALID_PARAMETER One or more of the parameters are incorrect. 255*f334afcfSToomas Soome **/ 256*f334afcfSToomas Soome typedef 257*f334afcfSToomas Soome EFI_STATUS 258*f334afcfSToomas Soome (EFIAPI *EFI_TCG2_GET_ACTIVE_PCR_BANKS)( 259*f334afcfSToomas Soome IN EFI_TCG2_PROTOCOL *This, 260*f334afcfSToomas Soome OUT UINT32 *ActivePcrBanks 261*f334afcfSToomas Soome ); 262*f334afcfSToomas Soome 263*f334afcfSToomas Soome /** 264*f334afcfSToomas Soome This service sets the currently active PCR banks. 265*f334afcfSToomas Soome 266*f334afcfSToomas Soome @param[in] This Indicates the calling context 267*f334afcfSToomas Soome @param[in] ActivePcrBanks Bitmap of the requested active PCR banks. At least one bit SHALL be set. 268*f334afcfSToomas Soome 269*f334afcfSToomas Soome @retval EFI_SUCCESS The bitmap in ActivePcrBank parameter is already active. 270*f334afcfSToomas Soome @retval EFI_INVALID_PARAMETER One or more of the parameters are incorrect. 271*f334afcfSToomas Soome **/ 272*f334afcfSToomas Soome typedef 273*f334afcfSToomas Soome EFI_STATUS 274*f334afcfSToomas Soome (EFIAPI *EFI_TCG2_SET_ACTIVE_PCR_BANKS)( 275*f334afcfSToomas Soome IN EFI_TCG2_PROTOCOL *This, 276*f334afcfSToomas Soome IN UINT32 ActivePcrBanks 277*f334afcfSToomas Soome ); 278*f334afcfSToomas Soome 279*f334afcfSToomas Soome /** 280*f334afcfSToomas Soome This service retrieves the result of a previous invocation of SetActivePcrBanks. 281*f334afcfSToomas Soome 282*f334afcfSToomas Soome @param[in] This Indicates the calling context 283*f334afcfSToomas Soome @param[out] OperationPresent Non-zero value to indicate a SetActivePcrBank operation was invoked during the last boot. 284*f334afcfSToomas Soome @param[out] Response The response from the SetActivePcrBank request. 285*f334afcfSToomas Soome 286*f334afcfSToomas Soome @retval EFI_SUCCESS The result value could be returned. 287*f334afcfSToomas Soome @retval EFI_INVALID_PARAMETER One or more of the parameters are incorrect. 288*f334afcfSToomas Soome **/ 289*f334afcfSToomas Soome typedef 290*f334afcfSToomas Soome EFI_STATUS 291*f334afcfSToomas Soome (EFIAPI *EFI_TCG2_GET_RESULT_OF_SET_ACTIVE_PCR_BANKS)( 292*f334afcfSToomas Soome IN EFI_TCG2_PROTOCOL *This, 293*f334afcfSToomas Soome OUT UINT32 *OperationPresent, 294*f334afcfSToomas Soome OUT UINT32 *Response 295*f334afcfSToomas Soome ); 296*f334afcfSToomas Soome 297*f334afcfSToomas Soome struct tdEFI_TCG2_PROTOCOL { 298*f334afcfSToomas Soome EFI_TCG2_GET_CAPABILITY GetCapability; 299*f334afcfSToomas Soome EFI_TCG2_GET_EVENT_LOG GetEventLog; 300*f334afcfSToomas Soome EFI_TCG2_HASH_LOG_EXTEND_EVENT HashLogExtendEvent; 301*f334afcfSToomas Soome EFI_TCG2_SUBMIT_COMMAND SubmitCommand; 302*f334afcfSToomas Soome EFI_TCG2_GET_ACTIVE_PCR_BANKS GetActivePcrBanks; 303*f334afcfSToomas Soome EFI_TCG2_SET_ACTIVE_PCR_BANKS SetActivePcrBanks; 304*f334afcfSToomas Soome EFI_TCG2_GET_RESULT_OF_SET_ACTIVE_PCR_BANKS GetResultOfSetActivePcrBanks; 305*f334afcfSToomas Soome }; 306*f334afcfSToomas Soome 307*f334afcfSToomas Soome extern EFI_GUID gEfiTcg2ProtocolGuid; 308*f334afcfSToomas Soome 309*f334afcfSToomas Soome // 310*f334afcfSToomas Soome // Log entries after Get Event Log service 311*f334afcfSToomas Soome // 312*f334afcfSToomas Soome 313*f334afcfSToomas Soome #define EFI_TCG2_FINAL_EVENTS_TABLE_GUID \ 314*f334afcfSToomas Soome {0x1e2ed096, 0x30e2, 0x4254, { 0xbd, 0x89, 0x86, 0x3b, 0xbe, 0xf8, 0x23, 0x25 }} 315*f334afcfSToomas Soome 316*f334afcfSToomas Soome extern EFI_GUID gEfiTcg2FinalEventsTableGuid; 317*f334afcfSToomas Soome 318*f334afcfSToomas Soome typedef struct tdEFI_TCG2_FINAL_EVENTS_TABLE { 319*f334afcfSToomas Soome // 320*f334afcfSToomas Soome // The version of this structure. 321*f334afcfSToomas Soome // 322*f334afcfSToomas Soome UINT64 Version; 323*f334afcfSToomas Soome // 324*f334afcfSToomas Soome // Number of events recorded after invocation of GetEventLog API 325*f334afcfSToomas Soome // 326*f334afcfSToomas Soome UINT64 NumberOfEvents; 327*f334afcfSToomas Soome // 328*f334afcfSToomas Soome // List of events of type TCG_PCR_EVENT2. 329*f334afcfSToomas Soome // 330*f334afcfSToomas Soome // TCG_PCR_EVENT2 Event[1]; 331*f334afcfSToomas Soome } EFI_TCG2_FINAL_EVENTS_TABLE; 332*f334afcfSToomas Soome 333*f334afcfSToomas Soome #define EFI_TCG2_FINAL_EVENTS_TABLE_VERSION 1 334*f334afcfSToomas Soome 335*f334afcfSToomas Soome #endif 336