Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Se05x HSM support in thermostat example #22220

Merged
Changes from 20 commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
1262d25
fix - pbkdf integration
sujaygkulkarni-nxp Aug 23, 2022
90f23b4
Merge branch 'project-chip:master' into feature/device-attestation-si…
sujaygkulkarni-nxp Aug 23, 2022
d4d16df
added se05x platform support for thermostat example
sujaygkulkarni-nxp Aug 23, 2022
29546f8
device attest with internal sign working
sujaygkulkarni-nxp Aug 25, 2022
9f7824e
code clean up
sujaygkulkarni-nxp Aug 26, 2022
f959076
Merge branch 'project-chip:master' into feature/device-attestation-si…
sujaygkulkarni-nxp Aug 26, 2022
6d9ff62
updated simw repo commit id
sujaygkulkarni-nxp Aug 26, 2022
e9ba2cb
restyler
sujaygkulkarni-nxp Aug 26, 2022
da21eb0
updated api names
sujaygkulkarni-nxp Aug 26, 2022
bd6375b
Merge branch 'project-chip:master' into feature/device-attestation-si…
sujaygkulkarni-nxp Aug 29, 2022
cb53360
Merge branch 'project-chip:master' into feature/device-attestation-si…
sujaygkulkarni-nxp Aug 29, 2022
1592ed1
restyler
sujaygkulkarni-nxp Aug 29, 2022
eacc3fb
deleting tlv objects after use
sujaygkulkarni-nxp Aug 29, 2022
b0f9238
updated tlv parsing code
sujaygkulkarni-nxp Sep 1, 2022
5440608
updated error checks for TLV lengths
sujaygkulkarni-nxp Sep 4, 2022
856a83e
using GetRemainingLength() insted of recomputing the length
sujaygkulkarni-nxp Sep 11, 2022
caf6d1c
restyler
sujaygkulkarni-nxp Sep 11, 2022
54d3cff
using length of TLV after Get() member is called
sujaygkulkarni-nxp Sep 11, 2022
d35dbf0
Merge branch 'master' into feature/device-attestation-sign-using-se05x
sujaygkulkarni-nxp Sep 11, 2022
cf45b00
Merge branch 'project-chip:master' into feature/device-attestation-si…
Jagadish-NXP Sep 19, 2022
9d1a84a
Merge branch 'project-chip:master' into feature/device-attestation-si…
sujaygkulkarni-nxp Sep 27, 2022
9c053fa
Merge branch 'master' into feature/device-attestation-sign-using-se05x
sujaygkulkarni-nxp Sep 30, 2022
be4770c
Merge branch 'master' into feature/device-attestation-sign-using-se05x
sujaygkulkarni-nxp Sep 30, 2022
ac37f45
Merge branch 'master' into feature/device-attestation-sign-using-se05x
sujaygkulkarni-nxp Oct 3, 2022
0bd1383
Merge branch 'master' into feature/device-attestation-sign-using-se05x
sujaygkulkarni-nxp Oct 4, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -30,8 +30,9 @@

#include <crypto/hsm/nxp/CHIPCryptoPALHsm_SE05X_utils.h>

#define DEV_ATTESTATION_KEY_ID 0xDADADADA
#define DEV_ATTESTATION_CERT_ID 0xDADADADB
/* Device attestation key ids */
#define DEV_ATTESTATION_KEY_SE05X_ID 0x7D300000
#define DEV_ATTESTATION_CERT_SE05X_ID 0x7D300001

extern CHIP_ERROR se05xGetCertificate(uint32_t keyId, uint8_t * buf, size_t * buflen);

@@ -57,8 +58,8 @@ CHIP_ERROR ExampleSe05xDACProvider::GetDeviceAttestationCert(MutableByteSpan & o
return CopySpanToMutableSpan(DevelopmentCerts::kDacCert, out_dac_buffer);
#else
size_t buflen = out_dac_buffer.size();
ChipLogDetail(Crypto, "Get certificate from se05x");
ReturnErrorOnFailure(se05xGetCertificate(DEV_ATTESTATION_CERT_ID, out_dac_buffer.data(), &buflen));
ChipLogDetail(Crypto, "Get DA certificate from se05x");
ReturnErrorOnFailure(se05xGetCertificate(DEV_ATTESTATION_CERT_SE05X_ID, out_dac_buffer.data(), &buflen));
out_dac_buffer.reduce_size(buflen);
return CHIP_NO_ERROR;
#endif
@@ -142,7 +143,7 @@ CHIP_ERROR ExampleSe05xDACProvider::SignWithDeviceAttestationKey(const ByteSpan
VerifyOrReturnError(IsSpanUsable(message_to_sign), CHIP_ERROR_INVALID_ARGUMENT);
VerifyOrReturnError(out_signature_buffer.size() >= signature.Capacity(), CHIP_ERROR_BUFFER_TOO_SMALL);

keypair.SetKeyId(DEV_ATTESTATION_KEY_ID);
keypair.SetKeyId(DEV_ATTESTATION_KEY_SE05X_ID);
keypair.provisioned_key = true;
keypair.Initialize();

1 change: 1 addition & 0 deletions examples/platform/nxp/se05x/DeviceAttestationSe05xCredsExample.h
100644 → 100755
Original file line number Diff line number Diff line change
@@ -30,6 +30,7 @@ namespace Examples {
* storage abstractions.
*/
DeviceAttestationCredentialsProvider * GetExampleSe05xDACProvider();
DeviceAttestationCredentialsProvider * GetExampleSe05xDACProviderv2();

} // namespace Examples
} // namespace Credentials
Original file line number Diff line number Diff line change
@@ -0,0 +1,298 @@
/*
*
* Copyright (c) 2021 Project CHIP Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "DeviceAttestationSe05xCredsExample.h"

#include <credentials/examples/ExampleDACs.h>
#include <credentials/examples/ExamplePAI.h>
#include <crypto/CHIPCryptoPAL.h>
#include <lib/core/CHIPError.h>
#include <lib/core/CHIPTLV.h>
#include <lib/core/CHIPTLVTags.h>
#include <lib/core/CHIPTLVTypes.h>
#include <lib/core/CHIPTLVUtilities.hpp>
#include <lib/support/Span.h>

#if CHIP_CRYPTO_HSM
#include <crypto/hsm/CHIPCryptoPALHsm.h>
#endif

#ifdef ENABLE_HSM_DEVICE_ATTESTATION

#include <crypto/hsm/nxp/CHIPCryptoPALHsm_SE05X_utils.h>

/* Device attestation key ids */
#define DEV_ATTESTATION_KEY_SE05X_ID 0x7D300000
#define DEV_ATTESTATION_CERT_SE05X_ID 0x7D300001

/* Device attestation key ids (Used with internal sign) */
#define CD_DEV_ATTESTATION_KEY_SE05X_ID 0x7D300002
#define NOCSR_DEV_ATTESTATION_KEY_SE05X_ID 0x7D300004

/* Device attestation data ids (for Cert decl) */
#define CD_CERT_DECLARATION_DATA_SE05X_ID 0x7D300009
#define CD_ATTEST_NONCE_DATA_SE05X_ID 0x7D30000C
#define CD_TIME_STAMP_LEN_SE05X_ID 0x7D30000E
#define CD_TIME_STAMP_DATA_SE05X_ID 0x7D30000F
#define CD_ATTEST_CHALLENGE_SE05X_ID 0x7D300011

/* Device attestation data ids (for CSR) */
#define NOCSR_CSR_LEN_SE05X_ID 0x7D300014
#define NOCSR_CSR_DATA_SE05X_ID 0x7D300015
#define NOCSR_CSR_NONCE_DATA_SE05X_ID 0x7D300018
#define NOCSR_ATTEST_CHALLENGE_SE05X_ID 0x7D30001A

extern CHIP_ERROR se05xGetCertificate(uint32_t keyId, uint8_t * buf, size_t * buflen);
extern CHIP_ERROR se05xSetCertificate(uint32_t keyId, const uint8_t * buf, size_t buflen);
extern CHIP_ERROR se05xPerformInternalSign(uint32_t keyId, uint8_t * sigBuf, size_t * sigBufLen);
extern void se05x_delete_key(uint32_t keyid);

namespace chip {
namespace Credentials {
namespace Examples {

namespace {

class ExampleSe05xDACProviderv2 : public DeviceAttestationCredentialsProvider
{
public:
CHIP_ERROR GetCertificationDeclaration(MutableByteSpan & out_cd_buffer) override;
CHIP_ERROR GetFirmwareInformation(MutableByteSpan & out_firmware_info_buffer) override;
CHIP_ERROR GetDeviceAttestationCert(MutableByteSpan & out_dac_buffer) override;
CHIP_ERROR GetProductAttestationIntermediateCert(MutableByteSpan & out_pai_buffer) override;
CHIP_ERROR SignWithDeviceAttestationKey(const ByteSpan & message_to_sign, MutableByteSpan & out_signature_buffer) override;
};

CHIP_ERROR ExampleSe05xDACProviderv2::GetDeviceAttestationCert(MutableByteSpan & out_dac_buffer)
{
#if 0
return CopySpanToMutableSpan(DevelopmentCerts::kDacCert, out_dac_buffer);
#else
size_t buflen = out_dac_buffer.size();
ChipLogDetail(Crypto, "Get DA certificate from se05x");
ReturnErrorOnFailure(se05xGetCertificate(DEV_ATTESTATION_CERT_SE05X_ID, out_dac_buffer.data(), &buflen));
out_dac_buffer.reduce_size(buflen);
return CHIP_NO_ERROR;
#endif
}

CHIP_ERROR ExampleSe05xDACProviderv2::GetProductAttestationIntermediateCert(MutableByteSpan & out_pai_buffer)
{
return CopySpanToMutableSpan(ByteSpan(DevelopmentCerts::kPaiCert), out_pai_buffer);
}

CHIP_ERROR ExampleSe05xDACProviderv2::GetCertificationDeclaration(MutableByteSpan & out_cd_buffer)
{
//-> format_version = 1
//-> vendor_id = 0xFFF1
//-> product_id_array = [ 0x8000, 0x8001, 0x8002, 0x8003, 0x8004, 0x8005, 0x8006, 0x8007, 0x8008, 0x8009, 0x800A, 0x800B,
// 0x800C, 0x800D, 0x800E, 0x800F, 0x8010, 0x8011, 0x8012, 0x8013, 0x8014, 0x8015, 0x8016, 0x8017, 0x8018, 0x8019, 0x801A,
// 0x801B, 0x801C, 0x801D, 0x801E, 0x801F, 0x8020, 0x8021, 0x8022, 0x8023, 0x8024, 0x8025, 0x8026, 0x8027, 0x8028, 0x8029,
// 0x802A, 0x802B, 0x802C, 0x802D, 0x802E, 0x802F, 0x8030, 0x8031, 0x8032, 0x8033, 0x8034, 0x8035, 0x8036, 0x8037, 0x8038,
// 0x8039, 0x803A, 0x803B, 0x803C, 0x803D, 0x803E, 0x803F, 0x8040, 0x8041, 0x8042, 0x8043, 0x8044, 0x8045, 0x8046, 0x8047,
// 0x8048, 0x8049, 0x804A, 0x804B, 0x804C, 0x804D, 0x804E, 0x804F, 0x8050, 0x8051, 0x8052, 0x8053, 0x8054, 0x8055, 0x8056,
// 0x8057, 0x8058, 0x8059, 0x805A, 0x805B, 0x805C, 0x805D, 0x805E, 0x805F, 0x8060, 0x8061, 0x8062, 0x8063 ]
//-> device_type_id = 0x0016
//-> certificate_id = "ZIG20142ZB330003-24"
//-> security_level = 0
//-> security_information = 0
//-> version_number = 0x2694
//-> certification_type = 0
//-> dac_origin_vendor_id is not present
//-> dac_origin_product_id is not present
#if 0
const uint8_t kCdForAllExamples[541] = {
0x30, 0x82, 0x02, 0x19, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x02, 0xa0, 0x82, 0x02, 0x0a, 0x30,
0x82, 0x02, 0x06, 0x02, 0x01, 0x03, 0x31, 0x0d, 0x30, 0x0b, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02,
0x01, 0x30, 0x82, 0x01, 0x71, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x01, 0xa0, 0x82, 0x01, 0x62,
0x04, 0x82, 0x01, 0x5e, 0x15, 0x24, 0x00, 0x01, 0x25, 0x01, 0xf1, 0xff, 0x36, 0x02, 0x05, 0x00, 0x80, 0x05, 0x01, 0x80,
0x05, 0x02, 0x80, 0x05, 0x03, 0x80, 0x05, 0x04, 0x80, 0x05, 0x05, 0x80, 0x05, 0x06, 0x80, 0x05, 0x07, 0x80, 0x05, 0x08,
0x80, 0x05, 0x09, 0x80, 0x05, 0x0a, 0x80, 0x05, 0x0b, 0x80, 0x05, 0x0c, 0x80, 0x05, 0x0d, 0x80, 0x05, 0x0e, 0x80, 0x05,
0x0f, 0x80, 0x05, 0x10, 0x80, 0x05, 0x11, 0x80, 0x05, 0x12, 0x80, 0x05, 0x13, 0x80, 0x05, 0x14, 0x80, 0x05, 0x15, 0x80,
0x05, 0x16, 0x80, 0x05, 0x17, 0x80, 0x05, 0x18, 0x80, 0x05, 0x19, 0x80, 0x05, 0x1a, 0x80, 0x05, 0x1b, 0x80, 0x05, 0x1c,
0x80, 0x05, 0x1d, 0x80, 0x05, 0x1e, 0x80, 0x05, 0x1f, 0x80, 0x05, 0x20, 0x80, 0x05, 0x21, 0x80, 0x05, 0x22, 0x80, 0x05,
0x23, 0x80, 0x05, 0x24, 0x80, 0x05, 0x25, 0x80, 0x05, 0x26, 0x80, 0x05, 0x27, 0x80, 0x05, 0x28, 0x80, 0x05, 0x29, 0x80,
0x05, 0x2a, 0x80, 0x05, 0x2b, 0x80, 0x05, 0x2c, 0x80, 0x05, 0x2d, 0x80, 0x05, 0x2e, 0x80, 0x05, 0x2f, 0x80, 0x05, 0x30,
0x80, 0x05, 0x31, 0x80, 0x05, 0x32, 0x80, 0x05, 0x33, 0x80, 0x05, 0x34, 0x80, 0x05, 0x35, 0x80, 0x05, 0x36, 0x80, 0x05,
0x37, 0x80, 0x05, 0x38, 0x80, 0x05, 0x39, 0x80, 0x05, 0x3a, 0x80, 0x05, 0x3b, 0x80, 0x05, 0x3c, 0x80, 0x05, 0x3d, 0x80,
0x05, 0x3e, 0x80, 0x05, 0x3f, 0x80, 0x05, 0x40, 0x80, 0x05, 0x41, 0x80, 0x05, 0x42, 0x80, 0x05, 0x43, 0x80, 0x05, 0x44,
0x80, 0x05, 0x45, 0x80, 0x05, 0x46, 0x80, 0x05, 0x47, 0x80, 0x05, 0x48, 0x80, 0x05, 0x49, 0x80, 0x05, 0x4a, 0x80, 0x05,
0x4b, 0x80, 0x05, 0x4c, 0x80, 0x05, 0x4d, 0x80, 0x05, 0x4e, 0x80, 0x05, 0x4f, 0x80, 0x05, 0x50, 0x80, 0x05, 0x51, 0x80,
0x05, 0x52, 0x80, 0x05, 0x53, 0x80, 0x05, 0x54, 0x80, 0x05, 0x55, 0x80, 0x05, 0x56, 0x80, 0x05, 0x57, 0x80, 0x05, 0x58,
0x80, 0x05, 0x59, 0x80, 0x05, 0x5a, 0x80, 0x05, 0x5b, 0x80, 0x05, 0x5c, 0x80, 0x05, 0x5d, 0x80, 0x05, 0x5e, 0x80, 0x05,
0x5f, 0x80, 0x05, 0x60, 0x80, 0x05, 0x61, 0x80, 0x05, 0x62, 0x80, 0x05, 0x63, 0x80, 0x18, 0x24, 0x03, 0x16, 0x2c, 0x04,
0x13, 0x5a, 0x49, 0x47, 0x32, 0x30, 0x31, 0x34, 0x32, 0x5a, 0x42, 0x33, 0x33, 0x30, 0x30, 0x30, 0x33, 0x2d, 0x32, 0x34,
0x24, 0x05, 0x00, 0x24, 0x06, 0x00, 0x25, 0x07, 0x94, 0x26, 0x24, 0x08, 0x00, 0x18, 0x31, 0x7d, 0x30, 0x7b, 0x02, 0x01,
0x03, 0x80, 0x14, 0x62, 0xfa, 0x82, 0x33, 0x59, 0xac, 0xfa, 0xa9, 0x96, 0x3e, 0x1c, 0xfa, 0x14, 0x0a, 0xdd, 0xf5, 0x04,
0xf3, 0x71, 0x60, 0x30, 0x0b, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x30, 0x0a, 0x06, 0x08,
0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x04, 0x47, 0x30, 0x45, 0x02, 0x20, 0x24, 0xe5, 0xd1, 0xf4, 0x7a, 0x7d,
0x7b, 0x0d, 0x20, 0x6a, 0x26, 0xef, 0x69, 0x9b, 0x7c, 0x97, 0x57, 0xb7, 0x2d, 0x46, 0x90, 0x89, 0xde, 0x31, 0x92, 0xe6,
0x78, 0xc7, 0x45, 0xe7, 0xf6, 0x0c, 0x02, 0x21, 0x00, 0xf8, 0xaa, 0x2f, 0xa7, 0x11, 0xfc, 0xb7, 0x9b, 0x97, 0xe3, 0x97,
0xce, 0xda, 0x66, 0x7b, 0xae, 0x46, 0x4e, 0x2b, 0xd3, 0xff, 0xdf, 0xc3, 0xcc, 0xed, 0x7a, 0xa8, 0xca, 0x5f, 0x4c, 0x1a,
0x7c,
};

return CopySpanToMutableSpan(ByteSpan{ kCdForAllExamples }, out_cd_buffer);

#else
size_t buflen = out_cd_buffer.size();
ChipLogDetail(Crypto, "Get certificate declaration from se05x");
ReturnErrorOnFailure(se05xGetCertificate(CD_CERT_DECLARATION_DATA_SE05X_ID, out_cd_buffer.data(), &buflen));
out_cd_buffer.reduce_size(buflen);
return CHIP_NO_ERROR;
#endif
}

CHIP_ERROR ExampleSe05xDACProviderv2::GetFirmwareInformation(MutableByteSpan & out_firmware_info_buffer)
{
// TODO: We need a real example FirmwareInformation to be populated.
out_firmware_info_buffer.reduce_size(0);

return CHIP_NO_ERROR;
}

CHIP_ERROR ExampleSe05xDACProviderv2::SignWithDeviceAttestationKey(const ByteSpan & message_to_sign,
MutableByteSpan & out_signature_buffer)
{
CHIP_ERROR err = CHIP_NO_ERROR;
VerifyOrReturnError(IsSpanUsable(out_signature_buffer), CHIP_ERROR_INVALID_ARGUMENT);
VerifyOrReturnError(IsSpanUsable(message_to_sign), CHIP_ERROR_INVALID_ARGUMENT);

ChipLogDetail(Crypto, "Sign using DA key from se05x (Using internal sign)");

TLV::TLVReader msg_reader;
TLV::TLVReader tagReader;

msg_reader.Init(message_to_sign);

/* To be removed. Use common key id to sign message */
static bool sign_cert_decl_attest = 1;

if (sign_cert_decl_attest)
{
/* Check if certificate declaration tag is present and Skip certificate declaration tag */
ReturnErrorOnFailure(TLV::Utilities::Find(msg_reader, TLV::ContextTag(1), tagReader));

ReturnErrorOnFailure(TLV::Utilities::Find(msg_reader, TLV::ContextTag(2), tagReader));
uint8_t attlen = tagReader.GetLength();
VerifyOrReturnError(attlen > 0, CHIP_ERROR_INVALID_TLV_TAG);
/* Get attestation nonce */
ByteSpan attest_nonce;
ReturnErrorOnFailure(tagReader.Get(attest_nonce));
/* Set attestation nonce */
VerifyOrReturnError(CHIP_NO_ERROR ==
se05xSetCertificate(CD_ATTEST_NONCE_DATA_SE05X_ID, attest_nonce.data(), attest_nonce.size()),
CHIP_ERROR_INTERNAL);

ReturnErrorOnFailure(TLV::Utilities::Find(msg_reader, TLV::ContextTag(3), tagReader));
uint8_t tslen = tagReader.GetLength();
if (tslen > 0)
{
ByteSpan time_stamp;
ReturnErrorOnFailure(tagReader.Get(time_stamp));
/* Set time stamp data */
VerifyOrReturnError(CHIP_NO_ERROR ==
se05xSetCertificate(CD_TIME_STAMP_DATA_SE05X_ID, time_stamp.data(), time_stamp.size()),
CHIP_ERROR_INTERNAL);
}
/* Set time stamp length */
VerifyOrReturnError(CHIP_NO_ERROR == se05xSetCertificate(CD_TIME_STAMP_LEN_SE05X_ID, &tslen, 1), CHIP_ERROR_INTERNAL);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why isn't this using time_stamp.size()? That is, what is the point of tslen at all? It seems like an attractive nuisance, as do most of the GetLength calls here.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

get() member will return error in case the tag length is 0. So using the GetLength() before get() member is called.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wait, what? Why would Get return an error on 0 length? It most certainly does not do that...

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have created the issue to check this as well as other changes you suggested in the previous conversation. (#23064). Will address these in the next PR.


if ((tagReader.GetRemainingLength() + 1 /* End container */) >= 16)
{
/* Set attestation challenge */
VerifyOrReturnError(CHIP_NO_ERROR ==
se05xSetCertificate(CD_ATTEST_CHALLENGE_SE05X_ID, (message_to_sign.end() - 16), 16),
CHIP_ERROR_INTERNAL);
}
}
else
{
ReturnErrorOnFailure(TLV::Utilities::Find(msg_reader, TLV::ContextTag(1), tagReader));
uint8_t csrlen = tagReader.GetLength();
VerifyOrReturnError(csrlen > 0, CHIP_ERROR_INVALID_TLV_TAG);
ByteSpan csr_data;
/* Get nocsr */
ReturnErrorOnFailure(tagReader.Get(csr_data));
/* Set nocsr length */
VerifyOrReturnError(CHIP_NO_ERROR == se05xSetCertificate(NOCSR_CSR_LEN_SE05X_ID, &csrlen, 1), CHIP_ERROR_INTERNAL);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not initializing csrlen from csr_data.size()?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

get() member will return error in case the tag length is 0. So using the GetLength() before get() member is called.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Again, Get does not return error on zero length....

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have created the issue to check this as well as other changes you suggested in the previous conversation. (#23064). Will address these in the next PR.

/* Set nocsr data */
se05x_delete_key(NOCSR_CSR_DATA_SE05X_ID);
VerifyOrReturnError(CHIP_NO_ERROR == se05xSetCertificate(NOCSR_CSR_DATA_SE05X_ID, csr_data.data(), csr_data.size()),
CHIP_ERROR_INTERNAL);

ReturnErrorOnFailure(TLV::Utilities::Find(msg_reader, TLV::ContextTag(2), tagReader));
uint8_t noncelen = tagReader.GetLength();
VerifyOrReturnError(noncelen > 0, CHIP_ERROR_INVALID_TLV_TAG);
/* Get nocsr nonce */
ByteSpan nocsr_nonce;
ReturnErrorOnFailure(tagReader.Get(nocsr_nonce));
/* Set nocsr nonce data */
VerifyOrReturnError(CHIP_NO_ERROR ==
se05xSetCertificate(NOCSR_CSR_NONCE_DATA_SE05X_ID, nocsr_nonce.data(), nocsr_nonce.size()),
CHIP_ERROR_INTERNAL);

if ((tagReader.GetRemainingLength() + 1 /* End container */) >= 16)
{
/* Set attestation challenge */
VerifyOrReturnError(CHIP_NO_ERROR ==
se05xSetCertificate(NOCSR_ATTEST_CHALLENGE_SE05X_ID, (message_to_sign.end() - 16), 16),
CHIP_ERROR_INTERNAL);
}
}

uint8_t signature_se05x[Crypto::kMax_ECDSA_Signature_Length_Der] = { 0 };
size_t signature_se05x_len = sizeof(signature_se05x);

if (sign_cert_decl_attest)
{
err = se05xPerformInternalSign(CD_DEV_ATTESTATION_KEY_SE05X_ID, signature_se05x, &signature_se05x_len);
se05x_delete_key(CD_ATTEST_NONCE_DATA_SE05X_ID);
se05x_delete_key(CD_TIME_STAMP_LEN_SE05X_ID);
se05x_delete_key(CD_TIME_STAMP_DATA_SE05X_ID);
se05x_delete_key(CD_ATTEST_CHALLENGE_SE05X_ID);
sign_cert_decl_attest = 0;
}
else
{
err = se05xPerformInternalSign(NOCSR_DEV_ATTESTATION_KEY_SE05X_ID, signature_se05x, &signature_se05x_len);
se05x_delete_key(NOCSR_CSR_LEN_SE05X_ID);
se05x_delete_key(NOCSR_CSR_DATA_SE05X_ID);
se05x_delete_key(NOCSR_CSR_NONCE_DATA_SE05X_ID);
se05x_delete_key(NOCSR_ATTEST_CHALLENGE_SE05X_ID);
sign_cert_decl_attest = 1;
}

ReturnErrorOnFailure(err);

return chip::Crypto::EcdsaAsn1SignatureToRaw(chip::Crypto::kP256_FE_Length, ByteSpan{ signature_se05x, signature_se05x_len },
out_signature_buffer);
}

} // namespace

DeviceAttestationCredentialsProvider * GetExampleSe05xDACProviderv2()
{
static ExampleSe05xDACProviderv2 example_dac_provider;

return &example_dac_provider;
}

} // namespace Examples
} // namespace Credentials
} // namespace chip

#endif //#ifdef ENABLE_HSM_DEVICE_ATTESTATION
448 changes: 448 additions & 0 deletions examples/platform/nxp/se05x/linux/AppMain.cpp

Large diffs are not rendered by default.

120 changes: 120 additions & 0 deletions examples/platform/nxp/se05x/linux/BUILD.gn
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
# Copyright (c) 2020 Project CHIP Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import("//build_overrides/chip.gni")
import("${chip_root}/examples/common/pigweed/pigweed_rpcs.gni")
import("${chip_root}/src/app/common_flags.gni")
import("${chip_root}/src/crypto/crypto.gni")
import("${chip_root}/src/lib/core/core.gni")
import("${chip_root}/src/lib/lib.gni")

config("app-main-config") {
include_dirs = [ "." ]
}

source_set("ota-test-event-trigger") {
sources = [
"${chip_root}/src/app/clusters/ota-requestor/OTATestEventTriggerDelegate.h",
]
}

source_set("app-main") {
defines = []
sources = [
"${chip_root}/examples/platform/linux/AppMain.h",
"${chip_root}/examples/platform/linux/CommissionableInit.cpp",
"${chip_root}/examples/platform/linux/CommissionableInit.h",
"${chip_root}/examples/platform/linux/CommissioneeShellCommands.cpp",
"${chip_root}/examples/platform/linux/CommissioneeShellCommands.h",
"${chip_root}/examples/platform/linux/CommissionerMain.cpp",
"${chip_root}/examples/platform/linux/CommissionerMain.h",
"${chip_root}/examples/platform/linux/ControllerShellCommands.cpp",
"${chip_root}/examples/platform/linux/ControllerShellCommands.h",
"${chip_root}/examples/platform/linux/LinuxCommissionableDataProvider.cpp",
"${chip_root}/examples/platform/linux/LinuxCommissionableDataProvider.h",
"${chip_root}/examples/platform/linux/NamedPipeCommands.cpp",
"${chip_root}/examples/platform/linux/NamedPipeCommands.h",
"${chip_root}/examples/platform/linux/Options.cpp",
"${chip_root}/examples/platform/linux/Options.h",
"${chip_root}/examples/platform/linux/testing/CustomCSRResponse.cpp",
"${chip_root}/examples/platform/linux/testing/CustomCSRResponse.h",
"${chip_root}/examples/platform/linux/testing/CustomCSRResponseOperationalKeyStore.cpp",
"${chip_root}/examples/platform/linux/testing/CustomCSRResponseOperationalKeyStore.h",
"${chip_root}/examples/platform/nxp/se05x/DeviceAttestationSe05xCredsExample.cpp",
"${chip_root}/examples/platform/nxp/se05x/DeviceAttestationSe05xCredsExample_v2.cpp",
"AppMain.cpp",
]

include_dirs = [
"${chip_root}/examples/platform/linux",
"${chip_root}/examples/platform/nxp/se05x",
]

defines = []

if (chip_enable_pw_rpc) {
defines += [ "PW_RPC_ENABLED" ]
}
if (chip_build_libshell) {
defines += [ "ENABLE_CHIP_SHELL" ]
}

public_deps = [
":ota-test-event-trigger",
"${chip_root}/examples/providers:device_info_provider",
"${chip_root}/src/app/server",
"${chip_root}/src/credentials:default_attestation_verifier",
"${chip_root}/src/lib",
"${chip_root}/src/lib/shell",
"${chip_root}/src/lib/shell:shell_core",
]

if (chip_enable_transport_trace) {
public_deps +=
[ "${chip_root}/examples/common/tracing:trace_handlers_decoder" ]
}

public_configs = [ ":app-main-config" ]
}

source_set("commissioner-main") {
defines = []
sources = [
"${chip_root}/examples/platform/linux/CommissionerMain.cpp",
"${chip_root}/examples/platform/linux/CommissionerMain.h",
]

defines = []

if (chip_enable_pw_rpc) {
defines += [ "PW_RPC_ENABLED" ]
}
if (chip_build_libshell) {
defines += [ "ENABLE_CHIP_SHELL" ]
}

public_deps = [
"${chip_root}/src/app/server",
"${chip_root}/src/credentials:default_attestation_verifier",
"${chip_root}/src/lib",
"${chip_root}/src/lib/shell",
"${chip_root}/src/lib/shell:shell_core",
]

if (chip_enable_transport_trace) {
public_deps += [ "${chip_root}/examples/common/tracing:trace_handlers" ]
}

public_configs = [ ":app-main-config" ]
}
25 changes: 25 additions & 0 deletions examples/thermostat/nxp/linux-se05x/.gn
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Copyright (c) 2020 Project CHIP Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import("//build_overrides/build.gni")

# The location of the build configuration file.
buildconfig = "${build_root}/config/BUILDCONFIG.gn"

# CHIP uses angle bracket includes.
check_system_includes = true

default_args = {
import("//args.gni")
}
32 changes: 32 additions & 0 deletions examples/thermostat/nxp/linux-se05x/BUILD.gn
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Copyright (c) 2020 Project CHIP Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import("//build_overrides/build.gni")
import("//build_overrides/chip.gni")

executable("thermostat-se05x-app") {
sources = [ "${chip_root}/examples/thermostat/linux/main.cpp" ]

include_dirs = [ "${chip_root}/examples/platform/linux" ]

deps = [
"${chip_root}/examples/platform/nxp/se05x/linux:app-main",
"${chip_root}/examples/thermostat/thermostat-common",
"${chip_root}/src/lib",
]

cflags = [ "-Wconversion" ]

output_dir = root_out_dir
}
18 changes: 18 additions & 0 deletions examples/thermostat/nxp/linux-se05x/args.gni
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Copyright (c) 2020 Project CHIP Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import("//build_overrides/chip.gni")
import("${chip_root}/config/standalone/args.gni")
chip_with_se05x = 1
host = "host_linux"
1 change: 1 addition & 0 deletions examples/thermostat/nxp/linux-se05x/build_overrides
4 changes: 0 additions & 4 deletions src/credentials/BUILD.gn
Original file line number Diff line number Diff line change
@@ -69,10 +69,6 @@ static_library("credentials") {
]
}

if (chip_with_se05x == 1) {
sources += [ "${chip_root}/examples/platform/nxp/se05x/DeviceAttestationSe05xCredsExample.cpp" ]
}

if (chip_device_platform == "esp32" || chip_device_platform == "nrfconnect" ||
chip_device_platform == "efr32") {
defines = [ "CURRENT_TIME_NOT_IMPLEMENTED=1" ]
4 changes: 0 additions & 4 deletions src/crypto/BUILD.gn
Original file line number Diff line number Diff line change
@@ -58,10 +58,6 @@ buildconfig_header("crypto_buildconfig") {
defines += [ "CHIP_CRYPTO_HSM=0" ]
defines += [ "CHIP_CRYPTO_HSM_NXP=0" ]
}

if (chip_with_se05x_da == 1) {
defines += [ "ENABLE_HSM_DEVICE_ATTESTATION=1" ]
}
}

source_set("public_headers") {
1 change: 0 additions & 1 deletion src/crypto/crypto.gni
Original file line number Diff line number Diff line change
@@ -16,5 +16,4 @@ declare_args() {
# Crypto implementation: mbedtls, openssl, tinycrypt, boringssl, platform.
chip_crypto = ""
chip_with_se05x = 0
chip_with_se05x_da = 0
}
3 changes: 2 additions & 1 deletion src/crypto/hsm/CHIPCryptoPALHsm_config.h
Original file line number Diff line number Diff line change
@@ -25,7 +25,7 @@
/*
* Enable HSM for SPAKE VERIFIER
*/
#define ENABLE_HSM_SPAKE_VERIFIER 1
#define ENABLE_HSM_SPAKE_VERIFIER 0

/*
* Enable HSM for SPAKE PROVER
@@ -59,6 +59,7 @@
#if ((CHIP_CRYPTO_HSM) && (ENABLE_HSM_GENERATE_EC_KEY))
#define ENABLE_HSM_EC_KEY
//#define ENABLE_HSM_ECDSA_VERIFY
//#define ENABLE_HSM_DEVICE_ATTESTATION
#endif

#if ((CHIP_CRYPTO_HSM) && (ENABLE_HSM_PBKDF2_SHA256))
32 changes: 28 additions & 4 deletions src/crypto/hsm/nxp/CHIPCryptoPALHsm_SE05X_PBKDF.cpp
Original file line number Diff line number Diff line change
@@ -50,6 +50,28 @@ CHIP_ERROR PBKDF2_sha256HSM::pbkdf2_sha256(const uint8_t * password, size_t plen

VerifyOrReturnError(keyid != kKeyId_NotInitialized, CHIP_ERROR_HSM);

ChipLogDetail(Crypto, "Using se05x for pbkdf2 sha256");

static sss_policy_u commonPol;
commonPol.type = KPolicy_Common;
commonPol.auth_obj_id = 0;
commonPol.policy.common.req_Sm = 0;
commonPol.policy.common.can_Delete = 1;
commonPol.policy.common.can_Read = 1;
commonPol.policy.common.can_Write = 1;

static sss_policy_u hmac_withPol;
hmac_withPol.type = KPolicy_Sym_Key;
hmac_withPol.auth_obj_id = 0;
hmac_withPol.policy.symmkey.can_Write = 1;
hmac_withPol.policy.symmkey.can_PBKDF = 1;
hmac_withPol.policy.symmkey.can_PBKDF = 1;

sss_policy_t policy_for_hmac_key;
policy_for_hmac_key.nPolicies = 2;
policy_for_hmac_key.policies[0] = &hmac_withPol;
policy_for_hmac_key.policies[1] = &commonPol;

se05x_sessionOpen();
VerifyOrReturnError(gex_sss_chip_ctx.ks.session != NULL, CHIP_ERROR_INTERNAL);

@@ -63,12 +85,14 @@ CHIP_ERROR PBKDF2_sha256HSM::pbkdf2_sha256(const uint8_t * password, size_t plen
kKeyObject_Mode_Transient);
VerifyOrReturnError(status == kStatus_SSS_Success, CHIP_ERROR_INTERNAL);

status = sss_key_store_set_key(&gex_sss_chip_ctx.ks, &hmacKeyObj, password, plen, plen * 8, NULL, 0);
status = sss_key_store_set_key(&gex_sss_chip_ctx.ks, &hmacKeyObj, password, plen, plen * 8, &policy_for_hmac_key,
sizeof(policy_for_hmac_key));
VerifyOrReturnError(status == kStatus_SSS_Success, CHIP_ERROR_INTERNAL);

const smStatus_t smStatus =
Se05x_API_PBKDF2(&((sss_se05x_session_t *) &gex_sss_chip_ctx.session)->s_ctx, keyid, kSE05x_Pbkdf2_HMAC_SHA256, salt, slen,
(uint16_t) iteration_count, (uint16_t) key_length, output, (size_t *) &key_length);
const smStatus_t smStatus = Se05x_API_PBKDF2_extended(
&((sss_se05x_session_t *) &gex_sss_chip_ctx.session)->s_ctx, keyid, salt, slen, 0, /*saltID*/
(uint16_t) iteration_count, kSE05x_MACAlgo_HMAC_SHA256, (uint16_t) key_length, 0, /* derivedSessionKeyID */
output, (size_t *) &key_length);
VerifyOrExit(smStatus == SM_OK, error = CHIP_ERROR_INTERNAL);
error = CHIP_NO_ERROR;
exit:
8 changes: 4 additions & 4 deletions src/crypto/hsm/nxp/CHIPCryptoPALHsm_SE05X_Spake2p.cpp
Original file line number Diff line number Diff line change
@@ -261,8 +261,8 @@ CHIP_ERROR Spake2pHSM_P256_SHA256_HKDF_HMAC::BeginVerifier(const uint8_t * my_id
SE05x_SPAKE2PLUS_DEVICE_TYPE_B);
VerifyOrReturnError(smstatus == SM_OK, CHIP_ERROR(chip::ChipError::Range::kPlatform, smstatus));

ReturnErrorOnFailure(se05x_set_key(w0in_id_v, w0in_mod, w0in_mod_len, kSSS_KeyPart_Default, kSSS_CipherType_HMAC));
ReturnErrorOnFailure(se05x_set_key(Lin_id_v, Lin, Lin_len, kSSS_KeyPart_Default, kSSS_CipherType_HMAC));
ReturnErrorOnFailure(se05x_set_key_for_spake(w0in_id_v, w0in_mod, w0in_mod_len, kSSS_KeyPart_Default, kSSS_CipherType_HMAC));
ReturnErrorOnFailure(se05x_set_key_for_spake(Lin_id_v, Lin, Lin_len, kSSS_KeyPart_Default, kSSS_CipherType_HMAC));

smstatus = Se05x_API_PAKEInitDevice(&((sss_se05x_session_t *) &gex_sss_chip_ctx.session)->s_ctx, hsm_pake_context.spake_objId,
(uint8_t *) hsm_pake_context.spake_context, hsm_pake_context.spake_context_len,
@@ -321,8 +321,8 @@ CHIP_ERROR Spake2pHSM_P256_SHA256_HKDF_HMAC::BeginProver(const uint8_t * my_iden
SE05x_SPAKE2PLUS_DEVICE_TYPE_A);
VerifyOrReturnError(smstatus == SM_OK, CHIP_ERROR(chip::ChipError::Range::kPlatform, smstatus));

ReturnErrorOnFailure(se05x_set_key(w0in_id_p, w0in_mod, w0in_mod_len, kSSS_KeyPart_Default, kSSS_CipherType_HMAC));
ReturnErrorOnFailure(se05x_set_key(w1in_id_p, w1in_mod, w1in_mod_len, kSSS_KeyPart_Default, kSSS_CipherType_HMAC));
ReturnErrorOnFailure(se05x_set_key_for_spake(w0in_id_p, w0in_mod, w0in_mod_len, kSSS_KeyPart_Default, kSSS_CipherType_HMAC));
ReturnErrorOnFailure(se05x_set_key_for_spake(w1in_id_p, w1in_mod, w1in_mod_len, kSSS_KeyPart_Default, kSSS_CipherType_HMAC));

smstatus = Se05x_API_PAKEInitDevice(&((sss_se05x_session_t *) &gex_sss_chip_ctx.session)->s_ctx, hsm_pake_context.spake_objId,
(uint8_t *) hsm_pake_context.spake_context, hsm_pake_context.spake_context_len,
47 changes: 42 additions & 5 deletions src/crypto/hsm/nxp/CHIPCryptoPALHsm_SE05X_utils.cpp
Original file line number Diff line number Diff line change
@@ -146,7 +146,8 @@ void se05x_delete_key(uint32_t keyid)
}

/* Set key in se05x */
CHIP_ERROR se05x_set_key(uint32_t keyid, const uint8_t * key, size_t keylen, sss_key_part_t keyPart, sss_cipher_type_t cipherType)
CHIP_ERROR se05x_set_key_for_spake(uint32_t keyid, const uint8_t * key, size_t keylen, sss_key_part_t keyPart,
sss_cipher_type_t cipherType)
{
sss_status_t status = kStatus_SSS_Success;
sss_object_t keyObject = { 0 };
@@ -167,10 +168,10 @@ CHIP_ERROR se05x_set_key(uint32_t keyid, const uint8_t * key, size_t keylen, sss
commonPol.policy.common.can_Write = 1;

static sss_policy_u hmac_withPol;
hmac_withPol.type = KPolicy_Asym_Key;
hmac_withPol.auth_obj_id = 0;
hmac_withPol.policy.asymmkey.can_Write = 1;
hmac_withPol.policy.asymmkey.can_KA = 1;
hmac_withPol.type = KPolicy_Sym_Key;
hmac_withPol.auth_obj_id = 0;
hmac_withPol.policy.symmkey.can_Write = 1;
hmac_withPol.policy.symmkey.can_KA = 1;

sss_policy_t policy_for_hmac_key;
policy_for_hmac_key.nPolicies = 2;
@@ -236,6 +237,42 @@ CHIP_ERROR se05xGetCertificate(uint32_t keyId, uint8_t * buf, size_t * buflen)
return CHIP_NO_ERROR;
}

CHIP_ERROR se05xSetCertificate(uint32_t keyId, const uint8_t * buf, size_t buflen)
{
sss_object_t keyObject = { 0 };
sss_status_t status = kStatus_SSS_Fail;

status = sss_key_object_init(&keyObject, &gex_sss_chip_ctx.ks);
VerifyOrReturnError(status == kStatus_SSS_Success, CHIP_ERROR_INTERNAL);

status = sss_key_object_allocate_handle(&keyObject, keyId, kSSS_KeyPart_Default, kSSS_CipherType_Certificate, buflen,
kKeyObject_Mode_Transient);
VerifyOrReturnError(status == kStatus_SSS_Success, CHIP_ERROR_INTERNAL);

status = sss_key_store_set_key(&gex_sss_chip_ctx.ks, &keyObject, buf, buflen, buflen * 8, NULL, 0);
VerifyOrReturnError(status == kStatus_SSS_Success, CHIP_ERROR_INTERNAL);

return CHIP_NO_ERROR;
}

CHIP_ERROR se05xPerformInternalSign(uint32_t keyId, uint8_t * sigBuf, size_t * sigBufLen)
{
#if SSS_HAVE_APPLET_SE051_H
smStatus_t status = SM_NOT_OK;
sss_se05x_session_t * pSe05xCtx = (sss_se05x_session_t *) &gex_sss_chip_ctx.session;
uint8_t hashData[chip::Crypto::kSHA256_Hash_Length] = { 0 };
size_t hashDataLen = sizeof(hashData);

status = Se05x_API_ECDSA_Internal_Sign(&(pSe05xCtx->s_ctx), keyId, kSE05x_ECSignatureAlgo_SHA_256, sigBuf, sigBufLen, hashData,
&hashDataLen);
VerifyOrReturnError(status == SM_OK, CHIP_ERROR_INTERNAL);
return CHIP_NO_ERROR;
#else
/* Enable Se051H to use internal sign */
return CHIP_ERROR_INTERNAL;
#endif
}

#if ENABLE_REENTRANCY

/* Init crypto object mutext */
3 changes: 2 additions & 1 deletion src/crypto/hsm/nxp/CHIPCryptoPALHsm_SE05X_utils.h
Original file line number Diff line number Diff line change
@@ -77,7 +77,8 @@ void se05x_sessionOpen(void);
void se05x_delete_key(uint32_t keyid);

/* Set key in se05x */
CHIP_ERROR se05x_set_key(uint32_t keyid, const uint8_t * key, size_t keylen, sss_key_part_t keyPart, sss_cipher_type_t cipherType);
CHIP_ERROR se05x_set_key_for_spake(uint32_t keyid, const uint8_t * key, size_t keylen, sss_key_part_t keyPart,
sss_cipher_type_t cipherType);

#if ENABLE_REENTRANCY

1 change: 0 additions & 1 deletion src/crypto/hsm/nxp/README.md
Original file line number Diff line number Diff line change
@@ -24,7 +24,6 @@ Following are the list operations supported by secure element.
```
chip_with_se05x=1 ==> To enable Se05x
host = "host_k32w" ==> To set host
chip_with_se05x_da=1 ==> To enable device attestation using se05x. Provision key at key id = '0xDADADADA'. Also enable `ENABLE_HSM_GENERATE_EC_KEY` in CHIPCryptoPALHsm_config.h file.
```

## Known Limitations:
2 changes: 1 addition & 1 deletion third_party/simw-top-mini/repo