1*1e8b5354SBoyan Karatotev/* 2*1e8b5354SBoyan Karatotev * Copyright (c) 2020-2024, Arm Limited. All rights reserved. 3*1e8b5354SBoyan Karatotev * 4*1e8b5354SBoyan Karatotev * SPDX-License-Identifier: BSD-3-Clause 5*1e8b5354SBoyan Karatotev */ 6*1e8b5354SBoyan Karatotev 7*1e8b5354SBoyan Karatotev#if USE_TBBR_DEFS 8*1e8b5354SBoyan Karatotev#include <tools_share/tbbr_oid.h> 9*1e8b5354SBoyan Karatotev#else 10*1e8b5354SBoyan Karatotev#include <platform_oid.h> 11*1e8b5354SBoyan Karatotev#endif 12*1e8b5354SBoyan Karatotev 13*1e8b5354SBoyan Karatotev#include <common/tbbr/tbbr_img_def.h> 14*1e8b5354SBoyan Karatotev#include <common/nv_cntr_ids.h> 15*1e8b5354SBoyan Karatotev 16*1e8b5354SBoyan Karatotevcot { 17*1e8b5354SBoyan Karatotev manifests { 18*1e8b5354SBoyan Karatotev compatible = "arm, cert-descs"; 19*1e8b5354SBoyan Karatotev 20*1e8b5354SBoyan Karatotev trusted_boot_fw_cert: trusted_boot_fw_cert { 21*1e8b5354SBoyan Karatotev root-certificate; 22*1e8b5354SBoyan Karatotev image-id =<TRUSTED_BOOT_FW_CERT_ID>; 23*1e8b5354SBoyan Karatotev antirollback-counter = <&trusted_nv_ctr>; 24*1e8b5354SBoyan Karatotev 25*1e8b5354SBoyan Karatotev tb_fw_hash: tb_fw_hash { 26*1e8b5354SBoyan Karatotev oid = TRUSTED_BOOT_FW_HASH_OID; 27*1e8b5354SBoyan Karatotev }; 28*1e8b5354SBoyan Karatotev tb_fw_config_hash: tb_fw_config_hash { 29*1e8b5354SBoyan Karatotev oid = TRUSTED_BOOT_FW_CONFIG_HASH_OID; 30*1e8b5354SBoyan Karatotev }; 31*1e8b5354SBoyan Karatotev hw_config_hash: hw_config_hash { 32*1e8b5354SBoyan Karatotev oid = HW_CONFIG_HASH_OID; 33*1e8b5354SBoyan Karatotev }; 34*1e8b5354SBoyan Karatotev fw_config_hash: fw_config_hash { 35*1e8b5354SBoyan Karatotev oid = FW_CONFIG_HASH_OID; 36*1e8b5354SBoyan Karatotev }; 37*1e8b5354SBoyan Karatotev }; 38*1e8b5354SBoyan Karatotev 39*1e8b5354SBoyan Karatotev trusted_key_cert: trusted_key_cert { 40*1e8b5354SBoyan Karatotev root-certificate; 41*1e8b5354SBoyan Karatotev image-id = <TRUSTED_KEY_CERT_ID>; 42*1e8b5354SBoyan Karatotev antirollback-counter = <&trusted_nv_ctr>; 43*1e8b5354SBoyan Karatotev 44*1e8b5354SBoyan Karatotev trusted_world_pk: trusted_world_pk { 45*1e8b5354SBoyan Karatotev oid = TRUSTED_WORLD_PK_OID; 46*1e8b5354SBoyan Karatotev }; 47*1e8b5354SBoyan Karatotev non_trusted_world_pk: non_trusted_world_pk { 48*1e8b5354SBoyan Karatotev oid = NON_TRUSTED_WORLD_PK_OID; 49*1e8b5354SBoyan Karatotev }; 50*1e8b5354SBoyan Karatotev }; 51*1e8b5354SBoyan Karatotev 52*1e8b5354SBoyan Karatotev scp_fw_key_cert: scp_fw_key_cert { 53*1e8b5354SBoyan Karatotev image-id = <SCP_FW_KEY_CERT_ID>; 54*1e8b5354SBoyan Karatotev parent = <&trusted_key_cert>; 55*1e8b5354SBoyan Karatotev signing-key = <&trusted_world_pk>; 56*1e8b5354SBoyan Karatotev antirollback-counter = <&trusted_nv_ctr>; 57*1e8b5354SBoyan Karatotev 58*1e8b5354SBoyan Karatotev scp_fw_content_pk: scp_fw_content_pk { 59*1e8b5354SBoyan Karatotev oid = SCP_FW_CONTENT_CERT_PK_OID; 60*1e8b5354SBoyan Karatotev }; 61*1e8b5354SBoyan Karatotev }; 62*1e8b5354SBoyan Karatotev 63*1e8b5354SBoyan Karatotev scp_fw_content_cert: scp_fw_content_cert { 64*1e8b5354SBoyan Karatotev image-id = <SCP_FW_CONTENT_CERT_ID>; 65*1e8b5354SBoyan Karatotev parent = <&scp_fw_key_cert>; 66*1e8b5354SBoyan Karatotev signing-key = <&scp_fw_content_pk>; 67*1e8b5354SBoyan Karatotev antirollback-counter = <&trusted_nv_ctr>; 68*1e8b5354SBoyan Karatotev 69*1e8b5354SBoyan Karatotev scp_fw_hash: scp_fw_hash { 70*1e8b5354SBoyan Karatotev oid = SCP_FW_HASH_OID; 71*1e8b5354SBoyan Karatotev }; 72*1e8b5354SBoyan Karatotev }; 73*1e8b5354SBoyan Karatotev 74*1e8b5354SBoyan Karatotev soc_fw_key_cert: soc_fw_key_cert { 75*1e8b5354SBoyan Karatotev image-id = <SOC_FW_KEY_CERT_ID>; 76*1e8b5354SBoyan Karatotev parent = <&trusted_key_cert>; 77*1e8b5354SBoyan Karatotev signing-key = <&trusted_world_pk>; 78*1e8b5354SBoyan Karatotev antirollback-counter = <&trusted_nv_ctr>; 79*1e8b5354SBoyan Karatotev soc_fw_content_pk: soc_fw_content_pk { 80*1e8b5354SBoyan Karatotev oid = SOC_FW_CONTENT_CERT_PK_OID; 81*1e8b5354SBoyan Karatotev }; 82*1e8b5354SBoyan Karatotev }; 83*1e8b5354SBoyan Karatotev 84*1e8b5354SBoyan Karatotev soc_fw_content_cert: soc_fw_content_cert { 85*1e8b5354SBoyan Karatotev image-id = <SOC_FW_CONTENT_CERT_ID>; 86*1e8b5354SBoyan Karatotev parent = <&soc_fw_key_cert>; 87*1e8b5354SBoyan Karatotev signing-key = <&soc_fw_content_pk>; 88*1e8b5354SBoyan Karatotev antirollback-counter = <&trusted_nv_ctr>; 89*1e8b5354SBoyan Karatotev 90*1e8b5354SBoyan Karatotev soc_fw_hash: soc_fw_hash { 91*1e8b5354SBoyan Karatotev oid = SOC_AP_FW_HASH_OID; 92*1e8b5354SBoyan Karatotev }; 93*1e8b5354SBoyan Karatotev soc_fw_config_hash: soc_fw_config_hash { 94*1e8b5354SBoyan Karatotev oid = SOC_FW_CONFIG_HASH_OID; 95*1e8b5354SBoyan Karatotev }; 96*1e8b5354SBoyan Karatotev }; 97*1e8b5354SBoyan Karatotev 98*1e8b5354SBoyan Karatotev trusted_os_fw_key_cert: trusted_os_fw_key_cert { 99*1e8b5354SBoyan Karatotev image-id = <TRUSTED_OS_FW_KEY_CERT_ID>; 100*1e8b5354SBoyan Karatotev parent = <&trusted_key_cert>; 101*1e8b5354SBoyan Karatotev signing-key = <&trusted_world_pk>; 102*1e8b5354SBoyan Karatotev antirollback-counter = <&trusted_nv_ctr>; 103*1e8b5354SBoyan Karatotev 104*1e8b5354SBoyan Karatotev tos_fw_content_pk: tos_fw_content_pk { 105*1e8b5354SBoyan Karatotev oid = TRUSTED_OS_FW_CONTENT_CERT_PK_OID; 106*1e8b5354SBoyan Karatotev }; 107*1e8b5354SBoyan Karatotev }; 108*1e8b5354SBoyan Karatotev 109*1e8b5354SBoyan Karatotev trusted_os_fw_content_cert: trusted_os_fw_content_cert { 110*1e8b5354SBoyan Karatotev image-id = <TRUSTED_OS_FW_CONTENT_CERT_ID>; 111*1e8b5354SBoyan Karatotev parent = <&trusted_os_fw_key_cert>; 112*1e8b5354SBoyan Karatotev signing-key = <&tos_fw_content_pk>; 113*1e8b5354SBoyan Karatotev antirollback-counter = <&trusted_nv_ctr>; 114*1e8b5354SBoyan Karatotev 115*1e8b5354SBoyan Karatotev tos_fw_hash: tos_fw_hash { 116*1e8b5354SBoyan Karatotev oid = TRUSTED_OS_FW_HASH_OID; 117*1e8b5354SBoyan Karatotev }; 118*1e8b5354SBoyan Karatotev tos_fw_extra1_hash: tos_fw_extra1_hash { 119*1e8b5354SBoyan Karatotev oid = TRUSTED_OS_FW_EXTRA1_HASH_OID; 120*1e8b5354SBoyan Karatotev }; 121*1e8b5354SBoyan Karatotev tos_fw_extra2_hash: tos_fw_extra2_hash { 122*1e8b5354SBoyan Karatotev oid = TRUSTED_OS_FW_EXTRA2_HASH_OID; 123*1e8b5354SBoyan Karatotev }; 124*1e8b5354SBoyan Karatotev tos_fw_config_hash: tos_fw_config_hash { 125*1e8b5354SBoyan Karatotev oid = TRUSTED_OS_FW_CONFIG_HASH_OID; 126*1e8b5354SBoyan Karatotev }; 127*1e8b5354SBoyan Karatotev }; 128*1e8b5354SBoyan Karatotev 129*1e8b5354SBoyan Karatotev non_trusted_fw_key_cert: non_trusted_fw_key_cert { 130*1e8b5354SBoyan Karatotev image-id = <NON_TRUSTED_FW_KEY_CERT_ID>; 131*1e8b5354SBoyan Karatotev parent = <&trusted_key_cert>; 132*1e8b5354SBoyan Karatotev signing-key = <&non_trusted_world_pk>; 133*1e8b5354SBoyan Karatotev antirollback-counter = <&non_trusted_nv_ctr>; 134*1e8b5354SBoyan Karatotev 135*1e8b5354SBoyan Karatotev nt_fw_content_pk: nt_fw_content_pk { 136*1e8b5354SBoyan Karatotev oid = NON_TRUSTED_FW_CONTENT_CERT_PK_OID; 137*1e8b5354SBoyan Karatotev }; 138*1e8b5354SBoyan Karatotev }; 139*1e8b5354SBoyan Karatotev 140*1e8b5354SBoyan Karatotev non_trusted_fw_content_cert: non_trusted_fw_content_cert { 141*1e8b5354SBoyan Karatotev image-id = <NON_TRUSTED_FW_CONTENT_CERT_ID>; 142*1e8b5354SBoyan Karatotev parent = <&non_trusted_fw_key_cert>; 143*1e8b5354SBoyan Karatotev signing-key = <&nt_fw_content_pk>; 144*1e8b5354SBoyan Karatotev antirollback-counter = <&non_trusted_nv_ctr>; 145*1e8b5354SBoyan Karatotev 146*1e8b5354SBoyan Karatotev nt_world_bl_hash: nt_world_bl_hash { 147*1e8b5354SBoyan Karatotev oid = NON_TRUSTED_WORLD_BOOTLOADER_HASH_OID; 148*1e8b5354SBoyan Karatotev }; 149*1e8b5354SBoyan Karatotev nt_fw_config_hash: nt_fw_config_hash { 150*1e8b5354SBoyan Karatotev oid = NON_TRUSTED_FW_CONFIG_HASH_OID; 151*1e8b5354SBoyan Karatotev }; 152*1e8b5354SBoyan Karatotev }; 153*1e8b5354SBoyan Karatotev 154*1e8b5354SBoyan Karatotev#if defined(SPD_spmd) 155*1e8b5354SBoyan Karatotev sip_sp_content_cert: sip_sp_content_cert { 156*1e8b5354SBoyan Karatotev image-id = <SIP_SP_CONTENT_CERT_ID>; 157*1e8b5354SBoyan Karatotev parent = <&trusted_key_cert>; 158*1e8b5354SBoyan Karatotev signing-key = <&trusted_world_pk>; 159*1e8b5354SBoyan Karatotev antirollback-counter = <&trusted_nv_ctr>; 160*1e8b5354SBoyan Karatotev 161*1e8b5354SBoyan Karatotev sp_pkg1_hash: sp_pkg1_hash { 162*1e8b5354SBoyan Karatotev oid = SP_PKG1_HASH_OID; 163*1e8b5354SBoyan Karatotev }; 164*1e8b5354SBoyan Karatotev sp_pkg2_hash: sp_pkg2_hash { 165*1e8b5354SBoyan Karatotev oid = SP_PKG2_HASH_OID; 166*1e8b5354SBoyan Karatotev }; 167*1e8b5354SBoyan Karatotev sp_pkg3_hash: sp_pkg3_hash { 168*1e8b5354SBoyan Karatotev oid = SP_PKG3_HASH_OID; 169*1e8b5354SBoyan Karatotev }; 170*1e8b5354SBoyan Karatotev sp_pkg4_hash: sp_pkg4_hash { 171*1e8b5354SBoyan Karatotev oid = SP_PKG4_HASH_OID; 172*1e8b5354SBoyan Karatotev }; 173*1e8b5354SBoyan Karatotev sp_pkg5_hash: sp_pkg5_hash { 174*1e8b5354SBoyan Karatotev oid = SP_PKG5_HASH_OID; 175*1e8b5354SBoyan Karatotev }; 176*1e8b5354SBoyan Karatotev sp_pkg6_hash: sp_pkg6_hash { 177*1e8b5354SBoyan Karatotev oid = SP_PKG6_HASH_OID; 178*1e8b5354SBoyan Karatotev }; 179*1e8b5354SBoyan Karatotev sp_pkg7_hash: sp_pkg7_hash { 180*1e8b5354SBoyan Karatotev oid = SP_PKG7_HASH_OID; 181*1e8b5354SBoyan Karatotev }; 182*1e8b5354SBoyan Karatotev sp_pkg8_hash: sp_pkg8_hash { 183*1e8b5354SBoyan Karatotev oid = SP_PKG8_HASH_OID; 184*1e8b5354SBoyan Karatotev }; 185*1e8b5354SBoyan Karatotev }; 186*1e8b5354SBoyan Karatotev#endif 187*1e8b5354SBoyan Karatotev }; 188*1e8b5354SBoyan Karatotev 189*1e8b5354SBoyan Karatotev images { 190*1e8b5354SBoyan Karatotev compatible = "arm, img-descs"; 191*1e8b5354SBoyan Karatotev 192*1e8b5354SBoyan Karatotev hw_config { 193*1e8b5354SBoyan Karatotev image-id = <HW_CONFIG_ID>; 194*1e8b5354SBoyan Karatotev parent = <&trusted_boot_fw_cert>; 195*1e8b5354SBoyan Karatotev hash = <&hw_config_hash>; 196*1e8b5354SBoyan Karatotev }; 197*1e8b5354SBoyan Karatotev 198*1e8b5354SBoyan Karatotev fw_config { 199*1e8b5354SBoyan Karatotev image-id = <FW_CONFIG_ID>; 200*1e8b5354SBoyan Karatotev parent = <&trusted_boot_fw_cert>; 201*1e8b5354SBoyan Karatotev hash = <&fw_config_hash>; 202*1e8b5354SBoyan Karatotev }; 203*1e8b5354SBoyan Karatotev 204*1e8b5354SBoyan Karatotev scp_bl2_image { 205*1e8b5354SBoyan Karatotev image-id = <SCP_BL2_IMAGE_ID>; 206*1e8b5354SBoyan Karatotev parent = <&scp_fw_content_cert>; 207*1e8b5354SBoyan Karatotev hash = <&scp_fw_hash>; 208*1e8b5354SBoyan Karatotev }; 209*1e8b5354SBoyan Karatotev 210*1e8b5354SBoyan Karatotev bl31_image { 211*1e8b5354SBoyan Karatotev image-id = <BL31_IMAGE_ID>; 212*1e8b5354SBoyan Karatotev parent = <&soc_fw_content_cert>; 213*1e8b5354SBoyan Karatotev hash = <&soc_fw_hash>; 214*1e8b5354SBoyan Karatotev }; 215*1e8b5354SBoyan Karatotev 216*1e8b5354SBoyan Karatotev soc_fw_config { 217*1e8b5354SBoyan Karatotev image-id = <SOC_FW_CONFIG_ID>; 218*1e8b5354SBoyan Karatotev parent = <&soc_fw_content_cert>; 219*1e8b5354SBoyan Karatotev hash = <&soc_fw_config_hash>; 220*1e8b5354SBoyan Karatotev }; 221*1e8b5354SBoyan Karatotev 222*1e8b5354SBoyan Karatotev bl32_image { 223*1e8b5354SBoyan Karatotev image-id = <BL32_IMAGE_ID>; 224*1e8b5354SBoyan Karatotev parent = <&trusted_os_fw_content_cert>; 225*1e8b5354SBoyan Karatotev hash = <&tos_fw_hash>; 226*1e8b5354SBoyan Karatotev }; 227*1e8b5354SBoyan Karatotev 228*1e8b5354SBoyan Karatotev bl32_extra1_image { 229*1e8b5354SBoyan Karatotev image-id = <BL32_EXTRA1_IMAGE_ID>; 230*1e8b5354SBoyan Karatotev parent = <&trusted_os_fw_content_cert>; 231*1e8b5354SBoyan Karatotev hash = <&tos_fw_extra1_hash>; 232*1e8b5354SBoyan Karatotev }; 233*1e8b5354SBoyan Karatotev 234*1e8b5354SBoyan Karatotev bl32_extra2_image { 235*1e8b5354SBoyan Karatotev image-id = <BL32_EXTRA2_IMAGE_ID>; 236*1e8b5354SBoyan Karatotev parent = <&trusted_os_fw_content_cert>; 237*1e8b5354SBoyan Karatotev hash = <&tos_fw_extra2_hash>; 238*1e8b5354SBoyan Karatotev }; 239*1e8b5354SBoyan Karatotev 240*1e8b5354SBoyan Karatotev tos_fw_config { 241*1e8b5354SBoyan Karatotev image-id = <TOS_FW_CONFIG_ID>; 242*1e8b5354SBoyan Karatotev parent = <&trusted_os_fw_content_cert>; 243*1e8b5354SBoyan Karatotev hash = <&tos_fw_config_hash>; 244*1e8b5354SBoyan Karatotev }; 245*1e8b5354SBoyan Karatotev 246*1e8b5354SBoyan Karatotev bl33_image { 247*1e8b5354SBoyan Karatotev image-id = <BL33_IMAGE_ID>; 248*1e8b5354SBoyan Karatotev parent = <&non_trusted_fw_content_cert>; 249*1e8b5354SBoyan Karatotev hash = <&nt_world_bl_hash>; 250*1e8b5354SBoyan Karatotev }; 251*1e8b5354SBoyan Karatotev 252*1e8b5354SBoyan Karatotev nt_fw_config { 253*1e8b5354SBoyan Karatotev image-id = <NT_FW_CONFIG_ID>; 254*1e8b5354SBoyan Karatotev parent = <&non_trusted_fw_content_cert>; 255*1e8b5354SBoyan Karatotev hash = <&nt_fw_config_hash>; 256*1e8b5354SBoyan Karatotev }; 257*1e8b5354SBoyan Karatotev 258*1e8b5354SBoyan Karatotev#if defined(SPD_spmd) 259*1e8b5354SBoyan Karatotev sp_pkg1 { 260*1e8b5354SBoyan Karatotev image-id = <SP_PKG1_ID>; 261*1e8b5354SBoyan Karatotev parent = <&sip_sp_content_cert>; 262*1e8b5354SBoyan Karatotev hash = <&sp_pkg1_hash>; 263*1e8b5354SBoyan Karatotev }; 264*1e8b5354SBoyan Karatotev 265*1e8b5354SBoyan Karatotev sp_pkg2 { 266*1e8b5354SBoyan Karatotev image-id = <SP_PKG2_ID>; 267*1e8b5354SBoyan Karatotev parent = <&sip_sp_content_cert>; 268*1e8b5354SBoyan Karatotev hash = <&sp_pkg2_hash>; 269*1e8b5354SBoyan Karatotev }; 270*1e8b5354SBoyan Karatotev 271*1e8b5354SBoyan Karatotev sp_pkg3 { 272*1e8b5354SBoyan Karatotev image-id = <SP_PKG3_ID>; 273*1e8b5354SBoyan Karatotev parent = <&sip_sp_content_cert>; 274*1e8b5354SBoyan Karatotev hash = <&sp_pkg3_hash>; 275*1e8b5354SBoyan Karatotev }; 276*1e8b5354SBoyan Karatotev 277*1e8b5354SBoyan Karatotev sp_pkg4 { 278*1e8b5354SBoyan Karatotev image-id = <SP_PKG4_ID>; 279*1e8b5354SBoyan Karatotev parent = <&sip_sp_content_cert>; 280*1e8b5354SBoyan Karatotev hash = <&sp_pkg4_hash>; 281*1e8b5354SBoyan Karatotev }; 282*1e8b5354SBoyan Karatotev 283*1e8b5354SBoyan Karatotev sp_pkg5 { 284*1e8b5354SBoyan Karatotev image-id = <SP_PKG5_ID>; 285*1e8b5354SBoyan Karatotev parent = <&sip_sp_content_cert>; 286*1e8b5354SBoyan Karatotev hash = <&sp_pkg5_hash>; 287*1e8b5354SBoyan Karatotev }; 288*1e8b5354SBoyan Karatotev 289*1e8b5354SBoyan Karatotev sp_pkg6 { 290*1e8b5354SBoyan Karatotev image-id = <SP_PKG6_ID>; 291*1e8b5354SBoyan Karatotev parent = <&sip_sp_content_cert>; 292*1e8b5354SBoyan Karatotev hash = <&sp_pkg6_hash>; 293*1e8b5354SBoyan Karatotev }; 294*1e8b5354SBoyan Karatotev 295*1e8b5354SBoyan Karatotev sp_pkg7 { 296*1e8b5354SBoyan Karatotev image-id = <SP_PKG7_ID>; 297*1e8b5354SBoyan Karatotev parent = <&sip_sp_content_cert>; 298*1e8b5354SBoyan Karatotev hash = <&sp_pkg7_hash>; 299*1e8b5354SBoyan Karatotev }; 300*1e8b5354SBoyan Karatotev 301*1e8b5354SBoyan Karatotev sp_pkg8 { 302*1e8b5354SBoyan Karatotev image-id = <SP_PKG8_ID>; 303*1e8b5354SBoyan Karatotev parent = <&sip_sp_content_cert>; 304*1e8b5354SBoyan Karatotev hash = <&sp_pkg8_hash>; 305*1e8b5354SBoyan Karatotev }; 306*1e8b5354SBoyan Karatotev#endif 307*1e8b5354SBoyan Karatotev }; 308*1e8b5354SBoyan Karatotev}; 309*1e8b5354SBoyan Karatotev 310*1e8b5354SBoyan Karatotevnon_volatile_counters: non_volatile_counters { 311*1e8b5354SBoyan Karatotev compatible = "arm, non-volatile-counter"; 312*1e8b5354SBoyan Karatotev 313*1e8b5354SBoyan Karatotev #address-cells = <1>; 314*1e8b5354SBoyan Karatotev #size-cells = <0>; 315*1e8b5354SBoyan Karatotev 316*1e8b5354SBoyan Karatotev trusted_nv_ctr: trusted_nv_ctr { 317*1e8b5354SBoyan Karatotev id = <TRUSTED_NV_CTR_ID>; 318*1e8b5354SBoyan Karatotev oid = TRUSTED_FW_NVCOUNTER_OID; 319*1e8b5354SBoyan Karatotev }; 320*1e8b5354SBoyan Karatotev 321*1e8b5354SBoyan Karatotev non_trusted_nv_ctr: non_trusted_nv_ctr { 322*1e8b5354SBoyan Karatotev id = <NON_TRUSTED_NV_CTR_ID>; 323*1e8b5354SBoyan Karatotev oid = NON_TRUSTED_FW_NVCOUNTER_OID; 324*1e8b5354SBoyan Karatotev }; 325*1e8b5354SBoyan Karatotev}; 326