diff --git a/.gitmodules b/.gitmodules
index c753963..fe722ec 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -5,3 +5,6 @@
 	path = contrib/libtl
 	url = https://review.trustedfirmware.org/shared/transfer-list-library
 	shallow = true
+[submodule "libeventlog"]
+	path = contrib/libeventlog
+	url = https://gerrit.oss.arm.com/trusted-firmware/libEventLog
diff --git a/Makefile b/Makefile
index d5a18be..3ebf566 100644
--- a/Makefile
+++ b/Makefile
@@ -98,9 +98,6 @@
 
 DOCS_PATH		:=	docs
 
-# Path to Transfer List Library (LibTL)
-LIBTL_PATH		:=	contrib/libtl
-
 ifeq (${PLAT},)
   $(error "Error: Unknown platform. Please use PLAT=<platform name> to specify the platform")
 endif
diff --git a/contrib/libeventlog b/contrib/libeventlog
new file mode 160000
index 0000000..762d494
--- /dev/null
+++ b/contrib/libeventlog
@@ -0,0 +1 @@
+Subproject commit 762d494d6f4c0295627e4116f111b6f2c09c3db1
diff --git a/include/drivers/auth/crypto_mod.h b/include/drivers/auth/crypto_mod.h
deleted file mode 100644
index bec19da..0000000
--- a/include/drivers/auth/crypto_mod.h
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Copyright (c) 2015-2023, Arm Limited and Contributors. All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-#ifndef CRYPTO_MOD_H
-#define CRYPTO_MOD_H
-
-#define	CRYPTO_AUTH_VERIFY_ONLY			1
-#define	CRYPTO_HASH_CALC_ONLY			2
-#define	CRYPTO_AUTH_VERIFY_AND_HASH_CALC	3
-
-/* Return values */
-enum crypto_ret_value {
-	CRYPTO_SUCCESS = 0,
-	CRYPTO_ERR_INIT,
-	CRYPTO_ERR_HASH,
-	CRYPTO_ERR_SIGNATURE,
-	CRYPTO_ERR_DECRYPTION,
-	CRYPTO_ERR_UNKNOWN
-};
-
-#define CRYPTO_MAX_IV_SIZE		16U
-#define CRYPTO_MAX_TAG_SIZE		16U
-
-/* Decryption algorithm */
-enum crypto_dec_algo {
-	CRYPTO_GCM_DECRYPT = 0
-};
-
-/* Message digest algorithm */
-enum crypto_md_algo {
-	CRYPTO_MD_SHA256,
-	CRYPTO_MD_SHA384,
-	CRYPTO_MD_SHA512,
-};
-
-/* Maximum size as per the known stronger hash algorithm i.e.SHA512 */
-#define CRYPTO_MD_MAX_SIZE		64U
-
-/*
- * Cryptographic library descriptor
- */
-typedef struct crypto_lib_desc_s {
-	const char *name;
-
-	/* Initialize library. This function is not expected to fail. All errors
-	 * must be handled inside the function, asserting or panicking in case of
-	 * a non-recoverable error */
-	void (*init)(void);
-
-	/* Verify a digital signature. Return one of the
-	 * 'enum crypto_ret_value' options */
-	int (*verify_signature)(void *data_ptr, unsigned int data_len,
-				void *sig_ptr, unsigned int sig_len,
-				void *sig_alg, unsigned int sig_alg_len,
-				void *pk_ptr, unsigned int pk_len);
-
-	/* Verify a hash. Return one of the 'enum crypto_ret_value' options */
-	int (*verify_hash)(void *data_ptr, unsigned int data_len,
-			   void *digest_info_ptr, unsigned int digest_info_len);
-
-	/* Calculate a hash. Return hash value */
-	int (*calc_hash)(enum crypto_md_algo md_alg, void *data_ptr,
-			 unsigned int data_len,
-			 unsigned char output[CRYPTO_MD_MAX_SIZE]);
-
-	/* Convert Public key (optional) */
-	int (*convert_pk)(void *full_pk_ptr, unsigned int full_pk_len,
-			  void **hashed_pk_ptr, unsigned int *hashed_pk_len);
-
-	/*
-	 * Authenticated decryption. Return one of the
-	 * 'enum crypto_ret_value' options.
-	 */
-	int (*auth_decrypt)(enum crypto_dec_algo dec_algo, void *data_ptr,
-			    size_t len, const void *key, unsigned int key_len,
-			    unsigned int key_flags, const void *iv,
-			    unsigned int iv_len, const void *tag,
-			    unsigned int tag_len);
-} crypto_lib_desc_t;
-
-/* Public functions */
-#if CRYPTO_SUPPORT
-void crypto_mod_init(void);
-#else
-static inline void crypto_mod_init(void)
-{
-}
-#endif /* CRYPTO_SUPPORT */
-
-#if (CRYPTO_SUPPORT == CRYPTO_AUTH_VERIFY_ONLY) || \
-    (CRYPTO_SUPPORT == CRYPTO_AUTH_VERIFY_AND_HASH_CALC)
-int crypto_mod_verify_signature(void *data_ptr, unsigned int data_len,
-				void *sig_ptr, unsigned int sig_len,
-				void *sig_alg_ptr, unsigned int sig_alg_len,
-				void *pk_ptr, unsigned int pk_len);
-int crypto_mod_verify_hash(void *data_ptr, unsigned int data_len,
-			   void *digest_info_ptr, unsigned int digest_info_len);
-#endif /* (CRYPTO_SUPPORT == CRYPTO_AUTH_VERIFY_ONLY) || \
-	  (CRYPTO_SUPPORT == CRYPTO_AUTH_VERIFY_AND_HASH_CALC) */
-
-int crypto_mod_auth_decrypt(enum crypto_dec_algo dec_algo, void *data_ptr,
-			    size_t len, const void *key, unsigned int key_len,
-			    unsigned int key_flags, const void *iv,
-			    unsigned int iv_len, const void *tag,
-			    unsigned int tag_len);
-
-#if (CRYPTO_SUPPORT == CRYPTO_HASH_CALC_ONLY) || \
-    (CRYPTO_SUPPORT == CRYPTO_AUTH_VERIFY_AND_HASH_CALC)
-int crypto_mod_calc_hash(enum crypto_md_algo alg, void *data_ptr,
-			 unsigned int data_len,
-			 unsigned char output[CRYPTO_MD_MAX_SIZE]);
-#endif /* (CRYPTO_SUPPORT == CRYPTO_HASH_CALC_ONLY) || \
-	  (CRYPTO_SUPPORT == CRYPTO_AUTH_VERIFY_AND_HASH_CALC) */
-
-int crypto_mod_convert_pk(void *full_pk_ptr, unsigned int full_pk_len,
-			  void **hashed_pk_ptr, unsigned int *hashed_pk_len);
-
-/* Macro to register a cryptographic library */
-#define REGISTER_CRYPTO_LIB(_name, _init, _verify_signature, _verify_hash, \
-			    _calc_hash, _auth_decrypt, _convert_pk) \
-	const crypto_lib_desc_t crypto_lib_desc = { \
-		.name = _name, \
-		.init = _init, \
-		.verify_signature = _verify_signature, \
-		.verify_hash = _verify_hash, \
-		.calc_hash = _calc_hash, \
-		.auth_decrypt = _auth_decrypt, \
-		.convert_pk = _convert_pk \
-	}
-
-extern const crypto_lib_desc_t crypto_lib_desc;
-
-#endif /* CRYPTO_MOD_H */
diff --git a/include/drivers/measured_boot/event_log/tcg.h b/include/drivers/measured_boot/event_log/tcg.h
deleted file mode 100644
index 653f9c2..0000000
--- a/include/drivers/measured_boot/event_log/tcg.h
+++ /dev/null
@@ -1,304 +0,0 @@
-/*
- * Copyright (c) 2020-2022, Arm Limited. All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-#ifndef TCG_H
-#define TCG_H
-
-#include <stdint.h>
-#include <common/sha_common_macros.h>
-
-#define TCG_ID_EVENT_SIGNATURE_03	"Spec ID Event03"
-#define TCG_STARTUP_LOCALITY_SIGNATURE	"StartupLocality"
-
-#define TCG_SPEC_VERSION_MAJOR_TPM2   2
-#define TCG_SPEC_VERSION_MINOR_TPM2   0
-#define TCG_SPEC_ERRATA_TPM2          2
-
-/*
- * Event types
- * Ref. Table 9 Events
- * TCG PC Client Platform Firmware Profile Specification.
- */
-#define EV_PREBOOT_CERT				U(0x00000000)
-#define EV_POST_CODE				U(0x00000001)
-#define	EV_UNUSED				U(0x00000002)
-#define EV_NO_ACTION				U(0x00000003)
-#define EV_SEPARATOR				U(0x00000004)
-#define EV_ACTION				U(0x00000005)
-#define	EV_EVENT_TAG				U(0x00000006)
-#define EV_S_CRTM_CONTENTS			U(0x00000007)
-#define EV_S_CRTM_VERSION			U(0x00000008)
-#define EV_CPU_MICROCODE			U(0x00000009)
-#define EV_PLATFORM_CONFIG_FLAGS		U(0x0000000A)
-#define EV_TABLE_OF_DEVICES			U(0x0000000B)
-#define EV_COMPACT_HASH				U(0x0000000C)
-#define	EV_IPL					U(0x0000000D)
-#define	EV_IPL_PARTITION_DATA			U(0x0000000E)
-#define EV_NONHOST_CODE				U(0x0000000F)
-#define EV_NONHOST_CONFIG			U(0x00000010)
-#define EV_NONHOST_INFO				U(0x00000011)
-#define EV_OMIT_BOOT_DEVICE_EVENTS		U(0x00000012)
-#define	EV_EFI_EVENT_BASE			U(0x80000000)
-#define	EV_EFI_VARIABLE_DRIVER_CONFIG		U(0x80000001)
-#define EV_EFI_VARIABLE_BOOT			U(0x80000002)
-#define	EV_EFI_BOOT_SERVICES_APPLICATION	U(0x80000003)
-#define	EV_EFI_BOOT_SERVICES_DRIVER		U(0x80000004)
-#define	EV_EFI_RUNTIME_SERVICES_DRIVER		U(0x80000005)
-#define	EV_EFI_GPT_EVENT			U(0x80000006)
-#define	EV_EFI_ACTION				U(0x80000007)
-#define	EV_EFI_PLATFORM_FIRMWARE_BLOB		U(0x80000008)
-#define	EV_EFI_HANDOFF_TABLES			U(0x80000009)
-#define	EV_EFI_HCRTM_EVENT			U(0x80000010)
-#define	EV_EFI_VARIABLE_AUTHORITY		U(0x800000E0)
-
-/*
- * TPM_ALG_ID constants.
- * Ref. Table 9 - Definition of (UINT16) TPM_ALG_ID Constants
- * Trusted Platform Module Library. Part 2: Structures
- */
-#define TPM_ALG_SHA256		0x000B
-#define TPM_ALG_SHA384		0x000C
-#define TPM_ALG_SHA512		0x000D
-
-/* TCG Platform Type */
-#define PLATFORM_CLASS_CLIENT   0
-#define PLATFORM_CLASS_SERVER   1
-
-enum {
-	/*
-	 * SRTM, BIOS, Host Platform Extensions, Embedded
-	 * Option ROMs and PI Drivers
-	 */
-	PCR_0 = 0,
-	/* Host Platform Configuration */
-	PCR_1,
-	/* UEFI driver and application Code */
-	PCR_2,
-	/* UEFI driver and application Configuration and Data */
-	PCR_3,
-	/* UEFI Boot Manager Code (usually the MBR) and Boot Attempts */
-	PCR_4,
-	/*
-	 * Boot Manager Code Configuration and Data (for use
-	 * by the Boot Manager Code) and GPT/Partition Table
-	 */
-	PCR_5,
-	/* Host Platform Manufacturer Specific */
-	PCR_6,
-	/* Secure Boot Policy */
-	PCR_7,
-	/* 8-15: Defined for use by the Static OS */
-	PCR_8,
-	/* Debug */
-	PCR_16 = 16,
-
-	/* D-CRTM-measurements by DRTM implementation */
-	PCR_17 = 17,
-	/* DCE measurements by DRTM implementation */
-	PCR_18 = 18
-};
-
-#pragma pack(push, 1)
-
-/*
- * PCR Event Header
- * TCG EFI Protocol Specification
- * 5.3 Event Log Header
- */
-typedef struct {
-	/* PCRIndex:
-	 * The PCR Index to which this event is extended
-	 */
-	uint32_t	pcr_index;
-
-	/* EventType:
-	 * SHALL be an EV_NO_ACTION event
-	 */
-	uint32_t	event_type;
-
-	/* SHALL be 20 Bytes of 0x00 */
-	uint8_t		digest[SHA1_DIGEST_SIZE];
-
-	/* The size of the event */
-	uint32_t	event_size;
-
-	/* SHALL be a TCG_EfiSpecIdEvent */
-	uint8_t		event[];	/* [event_data_size] */
-} tcg_pcr_event_t;
-
-/*
- * Log Header Entry Data
- * Ref. Table 14 TCG_EfiSpecIdEventAlgorithmSize
- * TCG PC Client Platform Firmware Profile 9.4.5.1
- */
-typedef struct {
-	/* Algorithm ID (hashAlg) of the Hash used by BIOS */
-	uint16_t	algorithm_id;
-
-	/* The size of the digest produced by the implemented Hash algorithm */
-	uint16_t	digest_size;
-} id_event_algorithm_size_t;
-
-/*
- * TCG_EfiSpecIdEvent structure
- * Ref. Table 15 TCG_EfiSpecIdEvent
- * TCG PC Client Platform Firmware Profile 9.4.5.1
- */
-typedef struct {
-	/*
-	 * The NUL-terminated ASCII string "Spec ID Event03".
-	 * SHALL be set to {0x53, 0x70, 0x65, 0x63, 0x20, 0x49, 0x44,
-	 * 0x20, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x33, 0x00}.
-	 */
-	uint8_t		signature[16];
-
-	/*
-	 * The value for the Platform Class.
-	 * The enumeration is defined in the TCG ACPI Specification Client
-	 * Common Header.
-	 */
-	uint32_t	platform_class;
-
-	/*
-	 * The PC Client Platform Profile Specification minor version number
-	 * this BIOS supports.
-	 * Any BIOS supporting this version (2.0) MUST set this value to 0x00.
-	 */
-	uint8_t		spec_version_minor;
-
-	/*
-	 * The PC Client Platform Profile Specification major version number
-	 * this BIOS supports.
-	 * Any BIOS supporting this version (2.0) MUST set this value to 0x02.
-	 */
-	uint8_t		spec_version_major;
-
-	/*
-	 * The PC Client Platform Profile Specification errata version number
-	 * this BIOS supports.
-	 * Any BIOS supporting this version (2.0) MUST set this value to 0x02.
-	 */
-	uint8_t		spec_errata;
-
-	/*
-	 * Specifies the size of the UINTN fields used in various data
-	 * structures used in this specification.
-	 * 0x01 indicates UINT32 and 0x02 indicates UINT64.
-	 */
-	uint8_t		uintn_size;
-
-	/*
-	 * The number of Hash algorithms in the digestSizes field.
-	 * This field MUST be set to a value of 0x01 or greater.
-	 */
-	uint32_t	number_of_algorithms;
-
-	/*
-	 * Each TCG_EfiSpecIdEventAlgorithmSize SHALL contain an algorithmId
-	 * and digestSize for each hash algorithm used in the TCG_PCR_EVENT2
-	 * structure, the first of which is a Hash algorithmID and the second
-	 * is the size of the respective digest.
-	 */
-	id_event_algorithm_size_t    digest_size[]; /* number_of_algorithms */
-} id_event_struct_header_t;
-
-typedef struct {
-	/*
-	 * Size in bytes of the VendorInfo field.
-	 * Maximum value MUST be FFh bytes.
-	 */
-	uint8_t		vendor_info_size;
-
-	/*
-	 * Provided for use by Platform Firmware implementer. The value might
-	 * be used, for example, to provide more detailed information about the
-	 * specific BIOS such as BIOS revision numbers, etc. The values within
-	 * this field are not standardized and are implementer-specific.
-	 * Platform-specific or -unique information MUST NOT be provided in
-	 * this field.
-	 *
-	 */
-	uint8_t		vendor_info[];	/* [vendorInfoSize] */
-} id_event_struct_data_t;
-
-typedef struct {
-	id_event_struct_header_t	struct_header;
-	id_event_struct_data_t		struct_data;
-} id_event_struct_t;
-
-typedef struct {
-	tcg_pcr_event_t			header;
-	id_event_struct_header_t	struct_header;
-} id_event_headers_t;
-
-/* TPMT_HA Structure */
-typedef struct {
-	/* Selector of the hash contained in the digest that implies
-	 * the size of the digest
-	 */
-	uint16_t	algorithm_id;	/* AlgorithmId */
-
-	/* Digest, depends on AlgorithmId */
-	uint8_t		digest[];	/* Digest[] */
-} tpmt_ha;
-
-/*
- * TPML_DIGEST_VALUES Structure
- */
-typedef struct {
-	/* The number of digests in the list */
-	uint32_t	count;			/* Count */
-
-	/* The list of tagged digests, as sent to the TPM as part of a
-	 * TPM2_PCR_Extend or as received from a TPM2_PCR_Event command
-	 */
-	tpmt_ha		digests[];		/* Digests[Count] */
-} tpml_digest_values;
-
-/*
- * TCG_PCR_EVENT2 header
- */
-typedef struct {
-	 /* The PCR Index to which this event was extended */
-	uint32_t		pcr_index;	/* PCRIndex */
-
-	/* Type of event */
-	uint32_t		event_type;	/* EventType */
-
-	/* Digests:
-	 * A counted list of tagged digests, which contain the digest of
-	 * the event data (or external data) for all active PCR banks
-	 */
-	tpml_digest_values	digests;	/* Digests */
-} event2_header_t;
-
-typedef struct event2_data {
-	/* The size of the event data */
-	uint32_t		event_size;	/* EventSize */
-
-	/* The data of the event */
-	uint8_t			event[];	/* Event[EventSize] */
-} event2_data_t;
-
-/*
- * Startup Locality Event
- * Ref. TCG PC Client Platform Firmware Profile 9.4.5.3
- */
-typedef struct {
-	/*
-	 * The NUL-terminated ASCII string "StartupLocality" SHALL be
-	 * set to {0x53 0x74 0x61 0x72 0x74 0x75 0x70 0x4C 0x6F 0x63
-	 * 0x61 0x6C 0x69 0x74 0x79 0x00}
-	 */
-	uint8_t		signature[16];
-
-	/* The Locality Indicator which sent the TPM2_Startup command */
-	uint8_t		startup_locality;
-} startup_locality_event_t;
-
-#pragma pack(pop)
-
-#endif /* TCG_H */
diff --git a/include/lib/event_log/event_handoff.h b/include/lib/event_log/event_handoff.h
deleted file mode 100644
index f8c8716..0000000
--- a/include/lib/event_log/event_handoff.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (c) 2025, Arm Limited. All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-
-#ifndef HANDOFF_H
-#define HANDOFF_H
-
-#include <stdint.h>
-
-#include <transfer_list.h>
-
-/**
- * Initializes or extends the TPM event log in the transfer list.
- *
- * If an event log entry exists, attempts to resize it. Otherwise, adds a new entry.
- * Copies old data if needed. Updates free to reflect available space.
- *
- * @param tl         Pointer to the transfer list header.
- * @param req_size   Requested size (bytes)
- * @param free       Available size (bytes)
- * @return           Pointer to writable space in the log, or NULL on failure.
- */
-uint8_t *transfer_list_event_log_extend(struct transfer_list_header *tl,
-					size_t req_size, size_t *free);
-
-/**
- * Finalizes the event log after writing is complete.
- *
- * Resizes the event log to match actual data written, updates checksum,
- * and flushes cache for the next stage.
- *
- * @param tl         Pointer to the transfer list header.
- * @param cursor     End offset of written log data.
- * @return           Pointer to finalized log data (past reserved bytes), or NULL.
- */
-uint8_t *transfer_list_event_log_finish(struct transfer_list_header *tl,
-					uintptr_t cursor);
-
-#define EVENT_LOG_RESERVED_BYTES U(4)
-
-#endif /* HANDOFF_H */
diff --git a/include/lib/event_log/event_log.h b/include/lib/event_log/event_log.h
deleted file mode 100644
index 964f80a..0000000
--- a/include/lib/event_log/event_log.h
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * Copyright (c) 2020-2025, Arm Limited. All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-#ifndef EVENT_LOG_H
-#define EVENT_LOG_H
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <lib/utils_def.h>
-#include <drivers/auth/crypto_mod.h>
-#include "event_handoff.h"
-#include "tcg.h"
-
-/*
- * Set Event Log debug level to one of:
- *
- * LOG_LEVEL_ERROR
- * LOG_LEVEL_INFO
- * LOG_LEVEL_WARNING
- * LOG_LEVEL_VERBOSE
- */
-#if EVENT_LOG_LEVEL   == LOG_LEVEL_ERROR
-#define	LOG_EVENT	ERROR
-#elif EVENT_LOG_LEVEL == LOG_LEVEL_NOTICE
-#define	LOG_EVENT	NOTICE
-#elif EVENT_LOG_LEVEL == LOG_LEVEL_WARNING
-#define	LOG_EVENT	WARN
-#elif EVENT_LOG_LEVEL == LOG_LEVEL_INFO
-#define	LOG_EVENT	INFO
-#elif EVENT_LOG_LEVEL == LOG_LEVEL_VERBOSE
-#define	LOG_EVENT	VERBOSE
-#else
-#define LOG_EVENT printf
-#endif
-
-/* Number of hashing algorithms supported */
-#define HASH_ALG_COUNT		1U
-
-#define EVLOG_INVALID_ID	UINT32_MAX
-
-#define MEMBER_SIZE(type, member) sizeof(((type *)0)->member)
-
-typedef struct {
-	unsigned int id;
-	const char *name;
-	unsigned int pcr;
-} event_log_metadata_t;
-
-#define	ID_EVENT_SIZE	(sizeof(id_event_headers_t) + \
-			(sizeof(id_event_algorithm_size_t) * HASH_ALG_COUNT) + \
-			sizeof(id_event_struct_data_t))
-
-#define	LOC_EVENT_SIZE	(sizeof(event2_header_t) + \
-			sizeof(tpmt_ha) + TCG_DIGEST_SIZE + \
-			sizeof(event2_data_t) + \
-			sizeof(startup_locality_event_t))
-
-#define	LOG_MIN_SIZE	(ID_EVENT_SIZE + LOC_EVENT_SIZE)
-
-#define EVENT2_HDR_SIZE	(sizeof(event2_header_t) + \
-			sizeof(tpmt_ha) + TCG_DIGEST_SIZE + \
-			sizeof(event2_data_t))
-
-/* Functions' declarations */
-
-/**
- * Initialize the Event Log buffer.
- *
- * Sets global pointers to manage the Event Log memory region,
- * allowing subsequent log operations to write into the buffer.
- *
- * @param[in] event_log_start  Pointer to the start of the Event Log buffer.
- * @param[in] event_log_finish Pointer to the end of the buffer
- *                             (i.e., one byte past the last valid address).
- *
- * @return 0 on success, or -EINVAL if the input range is invalid.
- */
-int event_log_buf_init(uint8_t *event_log_start, uint8_t *event_log_finish);
-
-/**
- * Dump the contents of the Event Log.
- *
- * Outputs the raw contents of the Event Log buffer, typically
- * for debugging or audit purposes.
- *
- * @param[in] log_addr Pointer to the start of the Event Log buffer.
- * @param[in] log_size Size of the Event Log buffer in bytes.
- *
- * @return 0 on success, or a negative error code on failure.
- */
-int event_log_dump(uint8_t *log_addr, size_t log_size);
-
-/**
- * Initialize the Event Log subsystem.
- *
- * Wrapper around `event_log_buf_init()` to configure the memory range
- * for the Event Log buffer.
- *
- * @param[in] event_log_start  Pointer to the start of the Event Log buffer.
- * @param[in] event_log_finish Pointer to the end of the buffer
- *                             (i.e., one byte past the last valid address).
- *
- * @return 0 on success, or a negative error code on failure.
- */
-int event_log_init(uint8_t *event_log_start, uint8_t *event_log_finish);
-
-/**
- * Measure input data and log its hash to the Event Log.
- *
- * Computes the cryptographic hash of the specified data and records it
- * in the Event Log as a TCG_PCR_EVENT2 structure using event type EV_POST_CODE.
- * Useful for firmware or image attestation.
- *
- * @param[in] data_base     Pointer to the base of the data to be measured.
- * @param[in] data_size     Size of the data in bytes.
- * @param[in] data_id       Identifier used to match against metadata.
- * @param[in] metadata_ptr  Pointer to an array of event_log_metadata_t.
- *
- * @return 0 on success, or a negative error code on failure.
- */
-int event_log_measure_and_record(uintptr_t data_base, uint32_t data_size,
-				 uint32_t data_id,
-				 const event_log_metadata_t *metadata_ptr);
-
-/**
- * Measure the input data and return its hash.
- *
- * Computes the cryptographic hash of the specified memory region using
- * the default hashing algorithm configured in the Event Log subsystem.
- *
- * @param[in]  data_base  Pointer to the base of the data to be measured.
- * @param[in]  data_size  Size of the data in bytes.
- * @param[out] hash_data  Buffer to hold the resulting hash output
- *                        (must be at least CRYPTO_MD_MAX_SIZE bytes).
- *
- * @return 0 on success, or an error code on failure.
- */
-int event_log_measure(uintptr_t data_base, uint32_t data_size,
-		      unsigned char hash_data[CRYPTO_MD_MAX_SIZE]);
-
-/**
- * Record a measurement event in the Event Log.
- *
- * Writes a TCG_PCR_EVENT2 structure to the Event Log using the
- * provided hash and metadata. This function assumes the buffer
- * has enough space and that `event_log_buf_init()` has been called.
- *
- * @param[in] hash         Pointer to the digest (TCG_DIGEST_SIZE bytes).
- * @param[in] event_type   Type of the event, as defined in tcg.h.
- * @param[in] metadata_ptr Pointer to an event_log_metadata_t structure
- *                         providing event-specific context (e.g., PCR index, name).
- *
- * @return 0 on success, or -ENOMEM if the buffer has insufficient space.
- */
-int event_log_record(const uint8_t *hash, uint32_t event_type,
-		     const event_log_metadata_t *metadata_ptr);
-
-/**
- * Initialize the Event Log with mandatory header events.
- *
- * Writes the Specification ID (SpecID) and Startup Locality events
- * as required by the TCG PC Client Platform Firmware Profile.
- * These must be the first entries in the Event Log.
- *
- * @return 0 on success, or a negative error code on failure.
- */
-int event_log_write_header(void);
-
-/**
- * Write the SpecID event to the Event Log.
- *
- * Records the TCG_EfiSpecIDEventStruct to declare the structure
- * and supported algorithms of the Event Log format.
- *
- * @return 0 on success, or a negative error code on failure.
- */
-int event_log_write_specid_event(void);
-
-/**
- * Get the current size of the Event Log.
- *
- * Calculates how many bytes of the Event Log buffer have been used,
- * based on the current log pointer and the start of the buffer.
- *
- * @param[in] event_log_start Pointer to the start of the Event Log buffer.
- *
- * @return The number of bytes currently used in the Event Log.
- */
-size_t event_log_get_cur_size(uint8_t *event_log_start);
-
-#endif /* EVENT_LOG_H */
diff --git a/include/lib/event_log/tcg.h b/include/lib/event_log/tcg.h
deleted file mode 100644
index 653f9c2..0000000
--- a/include/lib/event_log/tcg.h
+++ /dev/null
@@ -1,304 +0,0 @@
-/*
- * Copyright (c) 2020-2022, Arm Limited. All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-#ifndef TCG_H
-#define TCG_H
-
-#include <stdint.h>
-#include <common/sha_common_macros.h>
-
-#define TCG_ID_EVENT_SIGNATURE_03	"Spec ID Event03"
-#define TCG_STARTUP_LOCALITY_SIGNATURE	"StartupLocality"
-
-#define TCG_SPEC_VERSION_MAJOR_TPM2   2
-#define TCG_SPEC_VERSION_MINOR_TPM2   0
-#define TCG_SPEC_ERRATA_TPM2          2
-
-/*
- * Event types
- * Ref. Table 9 Events
- * TCG PC Client Platform Firmware Profile Specification.
- */
-#define EV_PREBOOT_CERT				U(0x00000000)
-#define EV_POST_CODE				U(0x00000001)
-#define	EV_UNUSED				U(0x00000002)
-#define EV_NO_ACTION				U(0x00000003)
-#define EV_SEPARATOR				U(0x00000004)
-#define EV_ACTION				U(0x00000005)
-#define	EV_EVENT_TAG				U(0x00000006)
-#define EV_S_CRTM_CONTENTS			U(0x00000007)
-#define EV_S_CRTM_VERSION			U(0x00000008)
-#define EV_CPU_MICROCODE			U(0x00000009)
-#define EV_PLATFORM_CONFIG_FLAGS		U(0x0000000A)
-#define EV_TABLE_OF_DEVICES			U(0x0000000B)
-#define EV_COMPACT_HASH				U(0x0000000C)
-#define	EV_IPL					U(0x0000000D)
-#define	EV_IPL_PARTITION_DATA			U(0x0000000E)
-#define EV_NONHOST_CODE				U(0x0000000F)
-#define EV_NONHOST_CONFIG			U(0x00000010)
-#define EV_NONHOST_INFO				U(0x00000011)
-#define EV_OMIT_BOOT_DEVICE_EVENTS		U(0x00000012)
-#define	EV_EFI_EVENT_BASE			U(0x80000000)
-#define	EV_EFI_VARIABLE_DRIVER_CONFIG		U(0x80000001)
-#define EV_EFI_VARIABLE_BOOT			U(0x80000002)
-#define	EV_EFI_BOOT_SERVICES_APPLICATION	U(0x80000003)
-#define	EV_EFI_BOOT_SERVICES_DRIVER		U(0x80000004)
-#define	EV_EFI_RUNTIME_SERVICES_DRIVER		U(0x80000005)
-#define	EV_EFI_GPT_EVENT			U(0x80000006)
-#define	EV_EFI_ACTION				U(0x80000007)
-#define	EV_EFI_PLATFORM_FIRMWARE_BLOB		U(0x80000008)
-#define	EV_EFI_HANDOFF_TABLES			U(0x80000009)
-#define	EV_EFI_HCRTM_EVENT			U(0x80000010)
-#define	EV_EFI_VARIABLE_AUTHORITY		U(0x800000E0)
-
-/*
- * TPM_ALG_ID constants.
- * Ref. Table 9 - Definition of (UINT16) TPM_ALG_ID Constants
- * Trusted Platform Module Library. Part 2: Structures
- */
-#define TPM_ALG_SHA256		0x000B
-#define TPM_ALG_SHA384		0x000C
-#define TPM_ALG_SHA512		0x000D
-
-/* TCG Platform Type */
-#define PLATFORM_CLASS_CLIENT   0
-#define PLATFORM_CLASS_SERVER   1
-
-enum {
-	/*
-	 * SRTM, BIOS, Host Platform Extensions, Embedded
-	 * Option ROMs and PI Drivers
-	 */
-	PCR_0 = 0,
-	/* Host Platform Configuration */
-	PCR_1,
-	/* UEFI driver and application Code */
-	PCR_2,
-	/* UEFI driver and application Configuration and Data */
-	PCR_3,
-	/* UEFI Boot Manager Code (usually the MBR) and Boot Attempts */
-	PCR_4,
-	/*
-	 * Boot Manager Code Configuration and Data (for use
-	 * by the Boot Manager Code) and GPT/Partition Table
-	 */
-	PCR_5,
-	/* Host Platform Manufacturer Specific */
-	PCR_6,
-	/* Secure Boot Policy */
-	PCR_7,
-	/* 8-15: Defined for use by the Static OS */
-	PCR_8,
-	/* Debug */
-	PCR_16 = 16,
-
-	/* D-CRTM-measurements by DRTM implementation */
-	PCR_17 = 17,
-	/* DCE measurements by DRTM implementation */
-	PCR_18 = 18
-};
-
-#pragma pack(push, 1)
-
-/*
- * PCR Event Header
- * TCG EFI Protocol Specification
- * 5.3 Event Log Header
- */
-typedef struct {
-	/* PCRIndex:
-	 * The PCR Index to which this event is extended
-	 */
-	uint32_t	pcr_index;
-
-	/* EventType:
-	 * SHALL be an EV_NO_ACTION event
-	 */
-	uint32_t	event_type;
-
-	/* SHALL be 20 Bytes of 0x00 */
-	uint8_t		digest[SHA1_DIGEST_SIZE];
-
-	/* The size of the event */
-	uint32_t	event_size;
-
-	/* SHALL be a TCG_EfiSpecIdEvent */
-	uint8_t		event[];	/* [event_data_size] */
-} tcg_pcr_event_t;
-
-/*
- * Log Header Entry Data
- * Ref. Table 14 TCG_EfiSpecIdEventAlgorithmSize
- * TCG PC Client Platform Firmware Profile 9.4.5.1
- */
-typedef struct {
-	/* Algorithm ID (hashAlg) of the Hash used by BIOS */
-	uint16_t	algorithm_id;
-
-	/* The size of the digest produced by the implemented Hash algorithm */
-	uint16_t	digest_size;
-} id_event_algorithm_size_t;
-
-/*
- * TCG_EfiSpecIdEvent structure
- * Ref. Table 15 TCG_EfiSpecIdEvent
- * TCG PC Client Platform Firmware Profile 9.4.5.1
- */
-typedef struct {
-	/*
-	 * The NUL-terminated ASCII string "Spec ID Event03".
-	 * SHALL be set to {0x53, 0x70, 0x65, 0x63, 0x20, 0x49, 0x44,
-	 * 0x20, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x33, 0x00}.
-	 */
-	uint8_t		signature[16];
-
-	/*
-	 * The value for the Platform Class.
-	 * The enumeration is defined in the TCG ACPI Specification Client
-	 * Common Header.
-	 */
-	uint32_t	platform_class;
-
-	/*
-	 * The PC Client Platform Profile Specification minor version number
-	 * this BIOS supports.
-	 * Any BIOS supporting this version (2.0) MUST set this value to 0x00.
-	 */
-	uint8_t		spec_version_minor;
-
-	/*
-	 * The PC Client Platform Profile Specification major version number
-	 * this BIOS supports.
-	 * Any BIOS supporting this version (2.0) MUST set this value to 0x02.
-	 */
-	uint8_t		spec_version_major;
-
-	/*
-	 * The PC Client Platform Profile Specification errata version number
-	 * this BIOS supports.
-	 * Any BIOS supporting this version (2.0) MUST set this value to 0x02.
-	 */
-	uint8_t		spec_errata;
-
-	/*
-	 * Specifies the size of the UINTN fields used in various data
-	 * structures used in this specification.
-	 * 0x01 indicates UINT32 and 0x02 indicates UINT64.
-	 */
-	uint8_t		uintn_size;
-
-	/*
-	 * The number of Hash algorithms in the digestSizes field.
-	 * This field MUST be set to a value of 0x01 or greater.
-	 */
-	uint32_t	number_of_algorithms;
-
-	/*
-	 * Each TCG_EfiSpecIdEventAlgorithmSize SHALL contain an algorithmId
-	 * and digestSize for each hash algorithm used in the TCG_PCR_EVENT2
-	 * structure, the first of which is a Hash algorithmID and the second
-	 * is the size of the respective digest.
-	 */
-	id_event_algorithm_size_t    digest_size[]; /* number_of_algorithms */
-} id_event_struct_header_t;
-
-typedef struct {
-	/*
-	 * Size in bytes of the VendorInfo field.
-	 * Maximum value MUST be FFh bytes.
-	 */
-	uint8_t		vendor_info_size;
-
-	/*
-	 * Provided for use by Platform Firmware implementer. The value might
-	 * be used, for example, to provide more detailed information about the
-	 * specific BIOS such as BIOS revision numbers, etc. The values within
-	 * this field are not standardized and are implementer-specific.
-	 * Platform-specific or -unique information MUST NOT be provided in
-	 * this field.
-	 *
-	 */
-	uint8_t		vendor_info[];	/* [vendorInfoSize] */
-} id_event_struct_data_t;
-
-typedef struct {
-	id_event_struct_header_t	struct_header;
-	id_event_struct_data_t		struct_data;
-} id_event_struct_t;
-
-typedef struct {
-	tcg_pcr_event_t			header;
-	id_event_struct_header_t	struct_header;
-} id_event_headers_t;
-
-/* TPMT_HA Structure */
-typedef struct {
-	/* Selector of the hash contained in the digest that implies
-	 * the size of the digest
-	 */
-	uint16_t	algorithm_id;	/* AlgorithmId */
-
-	/* Digest, depends on AlgorithmId */
-	uint8_t		digest[];	/* Digest[] */
-} tpmt_ha;
-
-/*
- * TPML_DIGEST_VALUES Structure
- */
-typedef struct {
-	/* The number of digests in the list */
-	uint32_t	count;			/* Count */
-
-	/* The list of tagged digests, as sent to the TPM as part of a
-	 * TPM2_PCR_Extend or as received from a TPM2_PCR_Event command
-	 */
-	tpmt_ha		digests[];		/* Digests[Count] */
-} tpml_digest_values;
-
-/*
- * TCG_PCR_EVENT2 header
- */
-typedef struct {
-	 /* The PCR Index to which this event was extended */
-	uint32_t		pcr_index;	/* PCRIndex */
-
-	/* Type of event */
-	uint32_t		event_type;	/* EventType */
-
-	/* Digests:
-	 * A counted list of tagged digests, which contain the digest of
-	 * the event data (or external data) for all active PCR banks
-	 */
-	tpml_digest_values	digests;	/* Digests */
-} event2_header_t;
-
-typedef struct event2_data {
-	/* The size of the event data */
-	uint32_t		event_size;	/* EventSize */
-
-	/* The data of the event */
-	uint8_t			event[];	/* Event[EventSize] */
-} event2_data_t;
-
-/*
- * Startup Locality Event
- * Ref. TCG PC Client Platform Firmware Profile 9.4.5.3
- */
-typedef struct {
-	/*
-	 * The NUL-terminated ASCII string "StartupLocality" SHALL be
-	 * set to {0x53 0x74 0x61 0x72 0x74 0x75 0x70 0x4C 0x6F 0x63
-	 * 0x61 0x6C 0x69 0x74 0x79 0x00}
-	 */
-	uint8_t		signature[16];
-
-	/* The Locality Indicator which sent the TPM2_Startup command */
-	uint8_t		startup_locality;
-} startup_locality_event_t;
-
-#pragma pack(pop)
-
-#endif /* TCG_H */
diff --git a/lib/event_log/event_handoff.c b/lib/event_log/event_handoff.c
deleted file mode 100644
index 238ea27..0000000
--- a/lib/event_log/event_handoff.c
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright (c) 2025, Arm Limited. All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-#include <stddef.h>
-
-#include <common/debug.h>
-#include <drivers/measured_boot/event_log/event_handoff.h>
-
-#include <platform_def.h>
-
-static uint8_t *get_log_ptr(struct transfer_list_entry *te, size_t offset)
-{
-	uint8_t *base_ptr = transfer_list_entry_data(te);
-
-	if (base_ptr == NULL) {
-		return NULL;
-	}
-
-	return base_ptr + offset;
-}
-
-uint8_t *transfer_list_event_log_extend(struct transfer_list_header *tl,
-					size_t req_size, size_t *free)
-{
-	struct transfer_list_entry *existing_entry;
-	struct transfer_list_entry *new_entry;
-	uint8_t *old_data;
-	size_t existing_offset;
-	size_t old_size;
-
-	if (tl == NULL || free == NULL || req_size == 0) {
-		ERROR("Invalid arguments to event log extend.\n");
-		return NULL;
-	}
-
-	existing_entry = transfer_list_find(tl, TL_TAG_TPM_EVLOG);
-	existing_offset = EVENT_LOG_RESERVED_BYTES;
-
-	if (existing_entry != NULL) {
-		existing_offset = existing_entry->data_size;
-
-		if (transfer_list_set_data_size(tl, existing_entry,
-						req_size + existing_offset)) {
-			VERBOSE("TPM event log entry resized: new space %zu bytes at offset %zu\n",
-				req_size, existing_offset);
-
-			*free = existing_entry->data_size - existing_offset;
-
-			return get_log_ptr(existing_entry, existing_offset);
-		}
-	}
-
-	/* Add new entry (resize failed or no existing entry) */
-	new_entry = transfer_list_add(tl, TL_TAG_TPM_EVLOG,
-				      req_size + existing_offset, NULL);
-
-	if (new_entry == NULL) {
-		ERROR("Failed to add TPM event log entry to transfer list.\n");
-		return NULL;
-	}
-
-	VERBOSE("New TPM event log entry added at %p\n",
-		transfer_list_entry_data(new_entry));
-
-	if (existing_entry != NULL) {
-		old_data = transfer_list_entry_data(existing_entry);
-		old_size = existing_offset;
-
-		VERBOSE("Copying existing event log (%zu bytes) to new entry at %p\n",
-			old_size, transfer_list_entry_data(new_entry));
-
-		memmove(transfer_list_entry_data(new_entry), old_data,
-			old_size);
-
-		transfer_list_rem(tl, existing_entry);
-	}
-
-	*free = new_entry->data_size - existing_offset;
-
-	return get_log_ptr(new_entry, existing_offset);
-}
-
-uint8_t *transfer_list_event_log_finish(struct transfer_list_header *tl,
-					uintptr_t cursor)
-{
-	uintptr_t entry_data_base;
-	size_t final_log_size;
-	struct transfer_list_entry *entry;
-
-	entry = transfer_list_find(tl, TL_TAG_TPM_EVLOG);
-	entry_data_base = (uintptr_t)transfer_list_entry_data(entry);
-
-	if (cursor < entry_data_base ||
-	    cursor >= entry_data_base + entry->data_size) {
-		ERROR("Invalid cursor: outside event log bounds.\n");
-		return NULL;
-	}
-
-	final_log_size = cursor - entry_data_base;
-
-	if (!transfer_list_set_data_size(tl, entry, final_log_size)) {
-		ERROR("Unable to resize event log TE.\n");
-		return NULL;
-	}
-
-	transfer_list_update_checksum(tl);
-
-	VERBOSE("TPM event log finalized: trimmed to %zu bytes",
-		final_log_size - EVENT_LOG_RESERVED_BYTES);
-
-	/* Ensure changes are visible to the next stage. */
-	flush_dcache_range((uintptr_t)tl, tl->size);
-
-	return get_log_ptr(entry, EVENT_LOG_RESERVED_BYTES);
-}
diff --git a/lib/event_log/event_log.c b/lib/event_log/event_log.c
deleted file mode 100644
index 761ff29..0000000
--- a/lib/event_log/event_log.c
+++ /dev/null
@@ -1,302 +0,0 @@
-/*
- * Copyright (c) 2020-2025, Arm Limited. All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-#include <assert.h>
-#include <errno.h>
-#include <string.h>
-
-#include "crypto_mod.h"
-#include "event_log.h"
-
-#if TPM_ALG_ID == TPM_ALG_SHA512
-#define	CRYPTO_MD_ID	CRYPTO_MD_SHA512
-#elif TPM_ALG_ID == TPM_ALG_SHA384
-#define	CRYPTO_MD_ID	CRYPTO_MD_SHA384
-#elif TPM_ALG_ID == TPM_ALG_SHA256
-#define	CRYPTO_MD_ID	CRYPTO_MD_SHA256
-#else
-#  error Invalid TPM algorithm.
-#endif /* TPM_ALG_ID */
-
-/* Running Event Log Pointer */
-static uint8_t *log_ptr;
-
-/* Pointer to the first byte past end of the Event Log buffer */
-static uintptr_t log_end;
-
-/* TCG_EfiSpecIdEvent */
-static const id_event_headers_t id_event_header = {
-	.header = {
-		.pcr_index = PCR_0,
-		.event_type = EV_NO_ACTION,
-		.digest = {0},
-		.event_size = (uint32_t)(sizeof(id_event_struct_t) +
-				(sizeof(id_event_algorithm_size_t) *
-				HASH_ALG_COUNT))
-	},
-
-	.struct_header = {
-		.signature = TCG_ID_EVENT_SIGNATURE_03,
-		.platform_class = PLATFORM_CLASS_CLIENT,
-		.spec_version_minor = TCG_SPEC_VERSION_MINOR_TPM2,
-		.spec_version_major = TCG_SPEC_VERSION_MAJOR_TPM2,
-		.spec_errata = TCG_SPEC_ERRATA_TPM2,
-		.uintn_size = (uint8_t)(sizeof(unsigned int) /
-					sizeof(uint32_t)),
-		.number_of_algorithms = HASH_ALG_COUNT
-	}
-};
-
-static const event2_header_t locality_event_header = {
-	/*
-	 * All EV_NO_ACTION events SHALL set
-	 * TCG_PCR_EVENT2.pcrIndex = 0, unless otherwise specified
-	 */
-	.pcr_index = PCR_0,
-
-	/*
-	 * All EV_NO_ACTION events SHALL set
-	 * TCG_PCR_EVENT2.eventType = 03h
-	 */
-	.event_type = EV_NO_ACTION,
-
-	/*
-	 * All EV_NO_ACTION events SHALL set TCG_PCR_EVENT2.digests to all
-	 * 0x00's for each allocated Hash algorithm
-	 */
-	.digests = {
-		.count = HASH_ALG_COUNT
-	}
-};
-
-int event_log_record(const uint8_t *hash, uint32_t event_type,
-		      const event_log_metadata_t *metadata_ptr)
-{
-	void *ptr = log_ptr;
-	uint32_t name_len = 0U;
-
-	/* event_log_buf_init() must have been called prior to this. */
-	if (hash == NULL || metadata_ptr == NULL || log_ptr == NULL) {
-		return -EINVAL;
-	}
-
-	if (metadata_ptr->name != NULL) {
-		name_len = (uint32_t)strlen(metadata_ptr->name) + 1U;
-	}
-
-	/* Check for space in Event Log buffer */
-	if (((uintptr_t)ptr + (uint32_t)EVENT2_HDR_SIZE + name_len) > log_end) {
-		return -ENOMEM;
-	}
-
-	/*
-	 * As per TCG specifications, firmware components that are measured
-	 * into PCR[0] must be logged in the event log using the event type
-	 * EV_POST_CODE.
-	 */
-	/* TCG_PCR_EVENT2.PCRIndex */
-	((event2_header_t *)ptr)->pcr_index = metadata_ptr->pcr;
-
-	/* TCG_PCR_EVENT2.EventType */
-	((event2_header_t *)ptr)->event_type = event_type;
-
-	/* TCG_PCR_EVENT2.Digests.Count */
-	ptr = (uint8_t *)ptr + offsetof(event2_header_t, digests);
-	((tpml_digest_values *)ptr)->count = HASH_ALG_COUNT;
-
-	/* TCG_PCR_EVENT2.Digests[] */
-	ptr = (uint8_t *)((uintptr_t)ptr +
-			offsetof(tpml_digest_values, digests));
-
-	/* TCG_PCR_EVENT2.Digests[].AlgorithmId */
-	((tpmt_ha *)ptr)->algorithm_id = TPM_ALG_ID;
-
-	/* TCG_PCR_EVENT2.Digests[].Digest[] */
-	ptr = (uint8_t *)((uintptr_t)ptr + offsetof(tpmt_ha, digest));
-
-	/* Copy digest */
-	(void)memcpy(ptr, (const void *)hash, TCG_DIGEST_SIZE);
-
-	/* TCG_PCR_EVENT2.EventSize */
-	ptr = (uint8_t *)((uintptr_t)ptr + TCG_DIGEST_SIZE);
-	((event2_data_t *)ptr)->event_size = name_len;
-
-	/* Copy event data to TCG_PCR_EVENT2.Event */
-	if (metadata_ptr->name != NULL) {
-		(void)memcpy((void *)(((event2_data_t *)ptr)->event),
-				(const void *)metadata_ptr->name, name_len);
-	}
-
-	/* End of event data */
-	log_ptr = (uint8_t *)((uintptr_t)ptr +
-			offsetof(event2_data_t, event) + name_len);
-
-	return 0;
-}
-
-int event_log_buf_init(uint8_t *event_log_start, uint8_t *event_log_finish)
-{
-	if (event_log_start == NULL || event_log_finish == NULL ||
-	    event_log_start > event_log_finish) {
-		return -EINVAL;
-	}
-
-	log_ptr = event_log_start;
-	log_end = (uintptr_t)event_log_finish;
-
-	return 0;
-}
-
-int event_log_init(uint8_t *event_log_start, uint8_t *event_log_finish)
-{
-	return event_log_buf_init(event_log_start, event_log_finish);
-}
-
-int event_log_write_specid_event(void)
-{
-	void *ptr;
-
-	/* event_log_buf_init() must have been called prior to this. */
-	if (log_ptr == NULL) {
-		return -EFAULT;
-	}
-
-	if (((uintptr_t)log_ptr + ID_EVENT_SIZE) > log_end) {
-		return -ENOMEM;
-	}
-
-	ptr = log_ptr;
-
-	/*
-	 * Add Specification ID Event first
-	 *
-	 * Copy TCG_EfiSpecIDEventStruct structure header
-	 */
-	(void)memcpy(ptr, (const void *)&id_event_header,
-			sizeof(id_event_header));
-	ptr = (uint8_t *)((uintptr_t)ptr + sizeof(id_event_header));
-
-	/* TCG_EfiSpecIdEventAlgorithmSize structure */
-	((id_event_algorithm_size_t *)ptr)->algorithm_id = TPM_ALG_ID;
-	((id_event_algorithm_size_t *)ptr)->digest_size = TCG_DIGEST_SIZE;
-	ptr = (uint8_t *)((uintptr_t)ptr + sizeof(id_event_algorithm_size_t));
-
-	/*
-	 * TCG_EfiSpecIDEventStruct.vendorInfoSize
-	 * No vendor data
-	 */
-	((id_event_struct_data_t *)ptr)->vendor_info_size = 0;
-	log_ptr = (uint8_t *)((uintptr_t)ptr +
-			offsetof(id_event_struct_data_t, vendor_info));
-
-	return 0;
-}
-
-int event_log_write_header(void)
-{
-	const char locality_signature[] = TCG_STARTUP_LOCALITY_SIGNATURE;
-	void *ptr;
-	int rc;
-
-	rc = event_log_write_specid_event();
-	if (rc < 0) {
-		return rc;
-	}
-
-	if (((uintptr_t)log_ptr + LOC_EVENT_SIZE) > log_end) {
-		return -ENOMEM;
-	}
-
-	ptr = log_ptr;
-
-	/*
-	 * The Startup Locality event should be placed in the log before
-	 * any event which extends PCR[0].
-	 *
-	 * Ref. TCG PC Client Platform Firmware Profile 9.4.5.3
-	 */
-
-	/* Copy Startup Locality Event Header */
-	(void)memcpy(ptr, (const void *)&locality_event_header,
-			sizeof(locality_event_header));
-	ptr = (uint8_t *)((uintptr_t)ptr + sizeof(locality_event_header));
-
-	/* TCG_PCR_EVENT2.Digests[].AlgorithmId */
-	((tpmt_ha *)ptr)->algorithm_id = TPM_ALG_ID;
-
-	/* TCG_PCR_EVENT2.Digests[].Digest[] */
-	(void)memset(&((tpmt_ha *)ptr)->digest, 0, TCG_DIGEST_SIZE);
-	ptr = (uint8_t *)((uintptr_t)ptr +
-			offsetof(tpmt_ha, digest) + TCG_DIGEST_SIZE);
-
-	/* TCG_PCR_EVENT2.EventSize */
-	((event2_data_t *)ptr)->event_size =
-		(uint32_t)sizeof(startup_locality_event_t);
-	ptr = (uint8_t *)((uintptr_t)ptr + offsetof(event2_data_t, event));
-
-	/* TCG_EfiStartupLocalityEvent.Signature */
-	(void)memcpy(ptr, (const void *)locality_signature,
-		sizeof(TCG_STARTUP_LOCALITY_SIGNATURE));
-
-	/*
-	 * TCG_EfiStartupLocalityEvent.StartupLocality = 0:
-	 * the platform's boot firmware
-	 */
-	((startup_locality_event_t *)ptr)->startup_locality = 0U;
-	log_ptr = (uint8_t *)((uintptr_t)ptr + sizeof(startup_locality_event_t));
-
-	return 0;
-}
-
-int event_log_measure(uintptr_t data_base, uint32_t data_size,
-		      unsigned char hash_data[CRYPTO_MD_MAX_SIZE])
-{
-	/* Calculate hash */
-	return crypto_mod_calc_hash(CRYPTO_MD_ID,
-				    (void *)data_base, data_size, hash_data);
-}
-
-int event_log_measure_and_record(uintptr_t data_base, uint32_t data_size,
-				 uint32_t data_id,
-				 const event_log_metadata_t *metadata_ptr)
-{
-	unsigned char hash_data[CRYPTO_MD_MAX_SIZE];
-	int rc;
-
-	if (metadata_ptr == NULL) {
-		return -EINVAL;
-	}
-
-	/* Get the metadata associated with this image. */
-	while (metadata_ptr->id != data_id) {
-		if (metadata_ptr->id == EVLOG_INVALID_ID) {
-			return -EINVAL;
-		}
-
-		metadata_ptr++;
-	}
-
-	/* Measure the payload with algorithm selected by EventLog driver */
-	rc = event_log_measure(data_base, data_size, hash_data);
-	if (rc != 0) {
-		return rc;
-	}
-
-	rc = event_log_record(hash_data, EV_POST_CODE, metadata_ptr);
-	if (rc != 0) {
-		return rc;
-	}
-
-	return 0;
-}
-
-size_t event_log_get_cur_size(uint8_t *event_log_start)
-{
-	assert(event_log_start != NULL);
-	assert(log_ptr >= event_log_start);
-
-	return (size_t)((uintptr_t)log_ptr - (uintptr_t)event_log_start);
-}
diff --git a/lib/event_log/event_log.mk b/lib/event_log/event_log.mk
index df55c62..5e41158 100644
--- a/lib/event_log/event_log.mk
+++ b/lib/event_log/event_log.mk
@@ -4,51 +4,9 @@
 # SPDX-License-Identifier: BSD-3-Clause
 #
 
-# Path to library sources
-EVENT_LOG_SRC_DIR	:= lib/event_log/
+# Path to Event Log Library (LibEventLog)
+LIBEVLOG_PATH		?=	contrib/libeventlog
 
-# Default log level to dump the event log (LOG_LEVEL_INFO)
-EVENT_LOG_LEVEL		?= 40
+INCLUDES		+=	-I$(LIBEVLOG_PATH)/include
 
-EVENT_LOG_SOURCES	:=	${EVENT_LOG_SRC_DIR}event_print.c
-
-INCLUDES		+=	-Iinclude/lib/event_log \
-				-Iinclude/drivers/auth
-
-ifdef CRYPTO_SUPPORT
-# Measured Boot hash algorithm.
-# SHA-256 (or stronger) is required for all devices that are TPM 2.0 compliant.
-ifdef TPM_HASH_ALG
-    $(warning "TPM_HASH_ALG is deprecated. Please use MBOOT_EL_HASH_ALG instead.")
-    MBOOT_EL_HASH_ALG		:=	${TPM_HASH_ALG}
-else
-    MBOOT_EL_HASH_ALG		:=	sha256
-endif
-
-ifeq (${MBOOT_EL_HASH_ALG}, sha512)
-    TPM_ALG_ID			:=	TPM_ALG_SHA512
-    TCG_DIGEST_SIZE		:=	64U
-else ifeq (${MBOOT_EL_HASH_ALG}, sha384)
-    TPM_ALG_ID			:=	TPM_ALG_SHA384
-    TCG_DIGEST_SIZE		:=	48U
-else
-    TPM_ALG_ID			:=	TPM_ALG_SHA256
-    TCG_DIGEST_SIZE		:=	32U
-endif #MBOOT_EL_HASH_ALG
-
-# Set definitions for event log library.
-$(eval $(call add_define,TFTF_DEFINES,TPM_ALG_ID))
-$(eval $(call add_define,TFTF_DEFINES,EVENT_LOG_LEVEL))
-$(eval $(call add_define,TFTF_DEFINES,TCG_DIGEST_SIZE))
-
-EVENT_LOG_SOURCES	:=	${EVENT_LOG_SRC_DIR}event_log.c
-
-INCLUDES		+=	-Iinclude/lib/event_log \
-				-Iinclude/drivers/auth
-
-ifeq (${TRANSFER_LIST}, 1)
-EVENT_LOG_SOURCES	+= ${EVENT_LOG_SRC_DIR}/event_handoff.c
-INCLUDES		+=	-Iinclude/lib
-endif
-
-endif
+LIBEVLOG_SOURCES	+= ${LIBEVLOG_PATH}/src/event_print.c
diff --git a/lib/event_log/event_print.c b/lib/event_log/event_print.c
deleted file mode 100644
index 234a694..0000000
--- a/lib/event_log/event_print.c
+++ /dev/null
@@ -1,308 +0,0 @@
-/*
- * Copyright (c) 2020-2025, Arm Limited. All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-#include <errno.h>
-#include <stdbool.h>
-#include <stdio.h>
-#include <string.h>
-
-#include <common/debug.h>
-#include "event_log.h"
-
-/**
- * Print a TCG_EfiSpecIDEventStruct entry from the event log.
- *
- * This function extracts and prints a TCG_EfiSpecIDEventStruct
- * entry from the event log for debugging or auditing purposes.
- *
- * @param[in,out] log_addr  Pointer to the current position in the Event Log.
- *                          Updated to the next entry after processing.
- * @param[in,out] log_size  Pointer to the remaining Event Log size.
- *                          Updated to reflect the remaining bytes.
- *
- * @return 0 on success, or a negative error code on failure.
- */
-static int event_log_print_id_event(uint8_t **log_addr, size_t *log_size)
-{
-	unsigned int i;
-	uint8_t info_size, *info_size_ptr;
-	void *ptr = *log_addr;
-	id_event_headers_t *event = (id_event_headers_t *)ptr;
-	id_event_algorithm_size_t *alg_ptr;
-	uint32_t event_size, number_of_algorithms;
-	size_t digest_len;
-	const uint8_t *end_ptr = (uint8_t *)((uintptr_t)*log_addr + *log_size);
-
-	if (*log_size < sizeof(id_event_headers_t)) {
-		return -EINVAL;
-	}
-
-	/* The fields of the event log header are defined to be PCRIndex of 0,
-	 * EventType of EV_NO_ACTION, Digest of 20 bytes of 0, and
-	 * Event content defined as TCG_EfiSpecIDEventStruct.
-	 */
-	LOG_EVENT("TCG_EfiSpecIDEvent:\n");
-	LOG_EVENT("  PCRIndex           : %u\n", event->header.pcr_index);
-	if (event->header.pcr_index != (uint32_t)PCR_0) {
-		return -EINVAL;
-	}
-
-	LOG_EVENT("  EventType          : %u\n", event->header.event_type);
-	if (event->header.event_type != EV_NO_ACTION) {
-		return -EINVAL;
-	}
-
-	LOG_EVENT("  Digest             :");
-	for (i = 0U; i < sizeof(event->header.digest); ++i) {
-		uint8_t val = event->header.digest[i];
-
-		(void)printf(" %02x", val);
-		if ((i & U(0xF)) == 0U) {
-			(void)printf("\n");
-			LOG_EVENT("\t\t      :");
-		}
-	}
-
-	if ((i & U(0xF)) != 0U) {
-		(void)printf("\n");
-	}
-
-	/* EventSize */
-	event_size = event->header.event_size;
-	LOG_EVENT("  EventSize          : %u\n", event_size);
-
-	LOG_EVENT("  Signature          : %s\n",
-			event->struct_header.signature);
-	LOG_EVENT("  PlatformClass      : %u\n",
-			event->struct_header.platform_class);
-	LOG_EVENT("  SpecVersion        : %u.%u.%u\n",
-			event->struct_header.spec_version_major,
-			event->struct_header.spec_version_minor,
-			event->struct_header.spec_errata);
-	LOG_EVENT("  UintnSize          : %u\n",
-			event->struct_header.uintn_size);
-
-	/* NumberOfAlgorithms */
-	number_of_algorithms = event->struct_header.number_of_algorithms;
-	LOG_EVENT("  NumberOfAlgorithms : %u\n", number_of_algorithms);
-
-	/* Address of DigestSizes[] */
-	alg_ptr = event->struct_header.digest_size;
-
-	/* Size of DigestSizes[] */
-	digest_len = number_of_algorithms * sizeof(id_event_algorithm_size_t);
-	if (digest_len > (uintptr_t)end_ptr - (uintptr_t)alg_ptr) {
-		return -EFAULT;
-	}
-
-	LOG_EVENT("  DigestSizes        :\n");
-	for (i = 0U; i < number_of_algorithms; ++i) {
-		LOG_EVENT("    #%u AlgorithmId   : SHA", i);
-		uint16_t algorithm_id = alg_ptr[i].algorithm_id;
-
-		switch (algorithm_id) {
-		case TPM_ALG_SHA256:
-			(void)printf("256\n");
-			break;
-		case TPM_ALG_SHA384:
-			(void)printf("384\n");
-			break;
-		case TPM_ALG_SHA512:
-			(void)printf("512\n");
-			break;
-		default:
-			(void)printf("?\n");
-			ERROR("Algorithm 0x%x not found\n", algorithm_id);
-			return -ENOENT;
-		}
-
-		LOG_EVENT("       DigestSize    : %u\n",
-					alg_ptr[i].digest_size);
-	}
-
-	/* Address of VendorInfoSize */
-	info_size_ptr = (uint8_t *)((uintptr_t)alg_ptr + digest_len);
-	if ((uintptr_t)info_size_ptr > (uintptr_t)end_ptr) {
-		return -EFAULT;
-	}
-
-	info_size = *info_size_ptr++;
-	LOG_EVENT("  VendorInfoSize     : %u\n", info_size);
-
-	/* Check VendorInfo end address */
-	if (((uintptr_t)info_size_ptr + info_size) > (uintptr_t)end_ptr) {
-		return -EFAULT;
-	}
-
-	/* Check EventSize */
-	if (event_size !=
-	    (sizeof(id_event_struct_t) + digest_len + info_size)) {
-		return -EFAULT;
-	}
-
-	if (info_size != 0U) {
-		LOG_EVENT("  VendorInfo         :");
-		for (i = 0U; i < info_size; ++i) {
-			(void)printf(" %02x", *info_size_ptr++);
-		}
-		(void)printf("\n");
-	}
-
-	*log_size -= (uintptr_t)info_size_ptr - (uintptr_t)*log_addr;
-	*log_addr = info_size_ptr;
-
-	return 0;
-}
-
-/**
- * Print a TCG_PCR_EVENT2 entry from the event log.
- *
- * This function extracts and prints a TCG_PCR_EVENT2 structure
- * from the event log for debugging or auditing purposes.
- *
- * @param[in,out] log_addr  Pointer to the current position in the Event Log.
- *                          Updated to the next entry after processing.
- * @param[in,out] log_size  Pointer to the remaining Event Log size.
- *                          Updated to reflect the remaining bytes.
- *
- * @return 0 on success, or a negative error code on failure.
- */
-static int event_log_print_pcr_event2(uint8_t **log_addr, size_t *log_size)
-{
-	uint32_t event_size, count;
-	size_t sha_size, digests_size = 0U;
-	void *ptr = *log_addr;
-	const uint8_t *end_ptr = (uint8_t *)((uintptr_t)*log_addr + *log_size);
-
-	if (*log_size < sizeof(event2_header_t)) {
-		return -EINVAL;
-	}
-
-	LOG_EVENT("PCR_Event2:\n");
-	LOG_EVENT("  PCRIndex           : %u\n",
-			((event2_header_t *)ptr)->pcr_index);
-	LOG_EVENT("  EventType          : %u\n",
-			((event2_header_t *)ptr)->event_type);
-
-	count = ((event2_header_t *)ptr)->digests.count;
-	if (count < 1U) {
-		LOG_EVENT("Invalid Digests Count      : %u\n", count);
-		return -EINVAL;
-	}
-
-	LOG_EVENT("  Digests Count      : %u\n", count);
-
-	/* Address of TCG_PCR_EVENT2.Digests[] */
-	ptr = (uint8_t *)ptr + sizeof(event2_header_t);
-	if ((uintptr_t)ptr > (uintptr_t)end_ptr) {
-		return -EFAULT;
-	}
-
-	for (unsigned int i = 0U; i < count; ++i) {
-		/* Check AlgorithmId address */
-		if (((uintptr_t)ptr + offsetof(tpmt_ha, digest)) >
-		    (uintptr_t)end_ptr) {
-			return -EFAULT;
-		}
-
-		LOG_EVENT("    #%u AlgorithmId   : SHA", i);
-		switch (((tpmt_ha *)ptr)->algorithm_id) {
-		case TPM_ALG_SHA256:
-			sha_size = SHA256_DIGEST_SIZE;
-			(void)printf("256\n");
-			break;
-		case TPM_ALG_SHA384:
-			sha_size = SHA384_DIGEST_SIZE;
-			(void)printf("384\n");
-			break;
-		case TPM_ALG_SHA512:
-			sha_size = SHA512_DIGEST_SIZE;
-			(void)printf("512\n");
-			break;
-		default:
-			(void)printf("?\n");
-			printf("Algorithm 0x%x not found\n",
-				((tpmt_ha *)ptr)->algorithm_id);
-			return -ENOENT;
-		}
-
-		/* End of Digest[] */
-		ptr = (uint8_t *)((uintptr_t)ptr + offsetof(tpmt_ha, digest));
-		if (((uintptr_t)ptr + sha_size) > (uintptr_t)end_ptr) {
-			return -EFAULT;
-		}
-
-		/* Total size of all digests */
-		digests_size += sha_size;
-
-		LOG_EVENT("       Digest        :");
-		for (unsigned int j = 0U; j < sha_size; ++j) {
-			(void)printf(" %02x", *(uint8_t *)ptr++);
-			if ((j & U(0xF)) == U(0xF)) {
-				(void)printf("\n");
-				if (j < (sha_size - 1U)) {
-					LOG_EVENT("\t\t      :");
-				}
-			}
-		}
-	}
-
-	/* TCG_PCR_EVENT2.EventSize */
-	if (((uintptr_t)ptr + offsetof(event2_data_t, event)) >
-	    (uintptr_t)end_ptr) {
-		return -EFAULT;
-	}
-
-	event_size = ((event2_data_t *)ptr)->event_size;
-	LOG_EVENT("  EventSize          : %u\n", event_size);
-
-	/* Address of TCG_PCR_EVENT2.Event[EventSize] */
-	ptr = (uint8_t *)((uintptr_t)ptr + offsetof(event2_data_t, event));
-
-	/* End of TCG_PCR_EVENT2.Event[EventSize] */
-	if (((uintptr_t)ptr + event_size) > (uintptr_t)end_ptr) {
-		return -EFAULT;
-	}
-
-	if ((event_size == sizeof(startup_locality_event_t)) &&
-	     (strcmp((const char *)ptr, TCG_STARTUP_LOCALITY_SIGNATURE) == 0)) {
-		LOG_EVENT("  Signature          : %s\n",
-			((startup_locality_event_t *)ptr)->signature);
-		LOG_EVENT("  StartupLocality    : %u\n",
-			((startup_locality_event_t *)ptr)->startup_locality);
-	} else {
-		LOG_EVENT("  Event              : %s\n", (uint8_t *)ptr);
-	}
-
-	*log_size -= (uintptr_t)ptr + event_size - (uintptr_t)*log_addr;
-	*log_addr = (uint8_t *)ptr + event_size;
-
-	return 0;
-}
-
-int event_log_dump(uint8_t *log_addr, size_t log_size)
-{
-	int rc;
-
-	if (log_addr == NULL) {
-		return -EINVAL;
-	}
-
-	/* Print TCG_EfiSpecIDEvent */
-	rc = event_log_print_id_event(&log_addr, &log_size);
-
-	if (rc < 0) {
-		return rc;
-	}
-
-	while (log_size != 0U) {
-		rc = event_log_print_pcr_event2(&log_addr, &log_size);
-		if (rc < 0) {
-			return rc;
-		}
-	}
-	return 0;
-}
diff --git a/tftf/tests/misc_tests/test_firmware_handoff.c b/tftf/tests/misc_tests/test_firmware_handoff.c
index 026f057..fe93088 100644
--- a/tftf/tests/misc_tests/test_firmware_handoff.c
+++ b/tftf/tests/misc_tests/test_firmware_handoff.c
@@ -6,7 +6,7 @@
 
 #include <assert.h>
 
-#include <drivers/measured_boot/event_log/tcg.h>
+#include <tcg.h>
 #include <test_helpers.h>
 #include <tftf_lib.h>
 #include <transfer_list.h>
diff --git a/tftf/tests/tests-firmware-handoff.mk b/tftf/tests/tests-firmware-handoff.mk
index c7ca2cd..3620642 100644
--- a/tftf/tests/tests-firmware-handoff.mk
+++ b/tftf/tests/tests-firmware-handoff.mk
@@ -9,10 +9,10 @@
 include lib/event_log/event_log.mk
 include lib/libtl/libtl.mk
 
-TESTS_SOURCES	+=	$(addprefix tftf/tests/misc_tests/,		\
-	test_firmware_handoff.c						\
+TESTS_SOURCES	+=	$(addprefix tftf/tests/misc_tests/,	\
+				test_firmware_handoff.c		\
 )
 
-TESTS_SOURCES	+=	${EVENT_LOG_SOURCES} ${LIBTL_SOURCES}
+TESTS_SOURCES	+=	${LIBEVLOG_SOURCES} ${LIBTL_SOURCES}
 
 endif
