Skip to content

Commit b78b8c0

Browse files
committed
[crypto] extend Crypto Platform API to support HKDF-SHA256 for TREL
This commit adds PSA API support for HKDF-SHA256 for TREL. Signed-off-by: Łukasz Duda <lukasz.duda@nordicsemi.no>
1 parent f42af4e commit b78b8c0

File tree

3 files changed

+31
-9
lines changed

3 files changed

+31
-9
lines changed

include/openthread/platform/crypto.h

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,11 @@ extern "C" {
5858
*/
5959
typedef enum
6060
{
61-
OT_CRYPTO_KEY_TYPE_RAW, ///< Key Type: Raw Data.
62-
OT_CRYPTO_KEY_TYPE_AES, ///< Key Type: AES.
63-
OT_CRYPTO_KEY_TYPE_HMAC, ///< Key Type: HMAC.
64-
OT_CRYPTO_KEY_TYPE_ECDSA, ///< Key Type: ECDSA.
61+
OT_CRYPTO_KEY_TYPE_RAW, ///< Key Type: Raw Data.
62+
OT_CRYPTO_KEY_TYPE_AES, ///< Key Type: AES.
63+
OT_CRYPTO_KEY_TYPE_HMAC, ///< Key Type: HMAC.
64+
OT_CRYPTO_KEY_TYPE_ECDSA, ///< Key Type: ECDSA.
65+
OT_CRYPTO_KEY_TYPE_DERIVE, ///< Key Type: Derive.
6566
} otCryptoKeyType;
6667

6768
/**
@@ -73,6 +74,7 @@ typedef enum
7374
OT_CRYPTO_KEY_ALG_AES_ECB, ///< Key Algorithm: AES ECB.
7475
OT_CRYPTO_KEY_ALG_HMAC_SHA_256, ///< Key Algorithm: HMAC SHA-256.
7576
OT_CRYPTO_KEY_ALG_ECDSA, ///< Key Algorithm: ECDSA.
77+
OT_CRYPTO_KEY_ALG_HKDF_SHA256, ///< Key Algorithm: HKDF SHA-256.
7678
} otCryptoKeyAlgorithm;
7779

7880
/**
@@ -86,6 +88,8 @@ enum
8688
OT_CRYPTO_KEY_USAGE_DECRYPT = 1 << 2, ///< Key Usage: AES ECB.
8789
OT_CRYPTO_KEY_USAGE_SIGN_HASH = 1 << 3, ///< Key Usage: Sign Hash.
8890
OT_CRYPTO_KEY_USAGE_VERIFY_HASH = 1 << 4, ///< Key Usage: Verify Hash.
91+
OT_CRYPTO_KEY_USAGE_DERIVE = 1 << 5, ///< Key Usage: Derive.
92+
8993
};
9094

9195
/**

src/core/crypto/storage.hpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,11 @@ namespace Storage {
5757
*/
5858
enum KeyType : uint8_t
5959
{
60-
kKeyTypeRaw = OT_CRYPTO_KEY_TYPE_RAW, ///< Key Type: Raw Data.
61-
kKeyTypeAes = OT_CRYPTO_KEY_TYPE_AES, ///< Key Type: AES.
62-
kKeyTypeHmac = OT_CRYPTO_KEY_TYPE_HMAC, ///< Key Type: HMAC.
63-
kKeyTypeEcdsa = OT_CRYPTO_KEY_TYPE_ECDSA, ///< Key Type: ECDSA.
60+
kKeyTypeRaw = OT_CRYPTO_KEY_TYPE_RAW, ///< Key Type: Raw Data.
61+
kKeyTypeAes = OT_CRYPTO_KEY_TYPE_AES, ///< Key Type: AES.
62+
kKeyTypeHmac = OT_CRYPTO_KEY_TYPE_HMAC, ///< Key Type: HMAC.
63+
kKeyTypeEcdsa = OT_CRYPTO_KEY_TYPE_ECDSA, ///< Key Type: ECDSA.
64+
kKeyTypeDerive = OT_CRYPTO_KEY_TYPE_DERIVE, ///< Key Type: Derive.
6465
};
6566

6667
/**
@@ -72,6 +73,7 @@ enum KeyAlgorithm : uint8_t
7273
kKeyAlgorithmAesEcb = OT_CRYPTO_KEY_ALG_AES_ECB, ///< Key Algorithm: AES ECB.
7374
kKeyAlgorithmHmacSha256 = OT_CRYPTO_KEY_ALG_HMAC_SHA_256, ///< Key Algorithm: HMAC SHA-256.
7475
kKeyAlgorithmEcdsa = OT_CRYPTO_KEY_ALG_ECDSA, ///< Key Algorithm: ECDSA.
76+
kKeyAlgorithmHkdfSha256 = OT_CRYPTO_KEY_ALG_HKDF_SHA256, ///< Key Algorithm: HKDF SHA-256.
7577
};
7678

7779
constexpr uint8_t kUsageNone = OT_CRYPTO_KEY_USAGE_NONE; ///< Key Usage: Key Usage is empty.
@@ -80,6 +82,7 @@ constexpr uint8_t kUsageEncrypt = OT_CRYPTO_KEY_USAGE_ENCRYPT; ///< Key U
8082
constexpr uint8_t kUsageDecrypt = OT_CRYPTO_KEY_USAGE_DECRYPT; ///< Key Usage: AES ECB.
8183
constexpr uint8_t kUsageSignHash = OT_CRYPTO_KEY_USAGE_SIGN_HASH; ///< Key Usage: Sign Hash.
8284
constexpr uint8_t kUsageVerifyHash = OT_CRYPTO_KEY_USAGE_VERIFY_HASH; ///< Key Usage: Verify Hash.
85+
constexpr uint8_t kUsageDerive = OT_CRYPTO_KEY_USAGE_DERIVE; ///< Key Usage: Derive.
8386

8487
/**
8588
* Defines the key storage types.

src/core/thread/key_manager.cpp

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,18 @@ void KeyManager::ComputeTrelKey(uint32_t aKeySequence, Mac::Key &aKey) const
313313
Crypto::Key cryptoKey;
314314

315315
#if OPENTHREAD_CONFIG_PLATFORM_KEY_REFERENCES_ENABLE
316-
cryptoKey.SetAsKeyRef(mNetworkKeyRef);
316+
Crypto::Storage::KeyRef keyRef;
317+
NetworkKey networkKey;
318+
319+
GetNetworkKey(networkKey);
320+
321+
// Create temporary key to perform derive operation. This might be improved by using key copy operation,
322+
// however NetworkKey is exported for the other cases.
323+
SuccessOrAssert(Crypto::Storage::ImportKey(keyRef, Crypto::Storage::kKeyTypeDerive,
324+
Crypto::Storage::kKeyAlgorithmHkdfSha256, Crypto::Storage::kUsageDerive,
325+
Crypto::Storage::kTypeVolatile, networkKey.m8, NetworkKey::kSize));
326+
327+
cryptoKey.SetAsKeyRef(keyRef);
317328
#else
318329
cryptoKey.Set(mNetworkKey.m8, NetworkKey::kSize);
319330
#endif
@@ -323,6 +334,10 @@ void KeyManager::ComputeTrelKey(uint32_t aKeySequence, Mac::Key &aKey) const
323334

324335
hkdf.Extract(salt, sizeof(salt), cryptoKey);
325336
hkdf.Expand(kTrelInfoString, sizeof(kTrelInfoString), aKey.m8, Mac::Key::kSize);
337+
338+
#if OPENTHREAD_CONFIG_PLATFORM_KEY_REFERENCES_ENABLE
339+
Crypto::Storage::DestroyKey(keyRef);
340+
#endif
326341
}
327342
#endif
328343

0 commit comments

Comments
 (0)