nl::Weave::Platform::Security

這個命名空間包含 Weave 中 Weave Security Monitor 記憶體管理工具的所有介面。

摘要

根據特定環境的需求/限制,使用 Weave 的平台應實作此命名空間中的函式。

列舉

BlockSetParamFields{
  kBlockSetSizeMask = 0x07,
  kBlockSetSizeShift = 0,
  kBlockSetSizeValueShift = 7,
  kBlockSetCountMask = 0x18,
  kBlockSetCountShift = 3,
  kBlockSetBufferIndexMask = 0x60,
  kBlockSetBufferIndexShift = 5,
  kBlockSetIsLongTermMask = 0x80,
  kBlockSetIsLongTermShift = 7
}
列舉
封鎖一組參數欄位的位置 (採用 8 位元編碼格式)。
BlockSetParams{
  kNumberOfNetworkBuffers = 2,
  kNumberOfBlockSets = 4,
  kNetworkBuffer0BlockAllocationMask = 0x07,
  kNetworkBuffer1BlockAllocationMask = 0x18,
  kBlockSet1Size = 1,
  kBlockSet1Count = 1,
  kBlockSet1BufferIndex = 0,
  kBlockSet1isLongTerm = 1,
  kBlockSet2Size = 4,
  kBlockSet2Count = 1,
  kBlockSet2BufferIndex = 0,
  kBlockSet2isLongTerm = 1,
  kBlockSet3Size = 4,
  kBlockSet3Count = 1,
  kBlockSet3BufferIndex = 0,
  kBlockSet3isLongTerm = 0,
  kBlockSet4Size = 5,
  kBlockSet4Count = 2,
  kBlockSet4BufferIndex = 1,
  kBlockSet4isLongTerm = 0,
  kTotalMemorySize = (kBlockSet1Size * kBlockSet1Count + kBlockSet2Size * kBlockSet2Count + kBlockSet3Size * kBlockSet3Count + kBlockSet4Size * kBlockSet4Count) << kBlockSetSizeValueShift,
  kMaxBlockSize = 600,
  kMinBufferSize = 1240
}
列舉
定義區塊集參數。

Typedefs

BlockMark_t typedef
uint8_t
這個類型是用於標示目前已分配/未分配的區塊。
BlockSetParams_t typedef
uint8_t
這種類型是用來編碼區塊集資訊。

Variables

sBlockSetParams = { ((kBlockSet1Size << kBlockSetSizeShift) & kBlockSetSizeMask) | ((kBlockSet1Count << kBlockSetCountShift) & kBlockSetCountMask) | ((kBlockSet1BufferIndex << kBlockSetBufferIndexShift) & kBlockSetBufferIndexMask) | ((kBlockSet1isLongTerm << kBlockSetIsLongTermShift) & kBlockSetIsLongTermMask), ((kBlockSet2Size << kBlockSetSizeShift) & kBlockSetSizeMask) | ((kBlockSet2Count << kBlockSetCountShift) & kBlockSetCountMask) | ((kBlockSet2BufferIndex << kBlockSetBufferIndexShift) & kBlockSetBufferIndexMask) | ((kBlockSet2isLongTerm << kBlockSetIsLongTermShift) & kBlockSetIsLongTermMask), ((kBlockSet3Size << kBlockSetSizeShift) & kBlockSetSizeMask) | ((kBlockSet3Count << kBlockSetCountShift) & kBlockSetCountMask) | ((kBlockSet3BufferIndex << kBlockSetBufferIndexShift) & kBlockSetBufferIndexMask) | ((kBlockSet3isLongTerm << kBlockSetIsLongTermShift) & kBlockSetIsLongTermMask), ((kBlockSet4Size << kBlockSetSizeShift) & kBlockSetSizeMask) | ((kBlockSet4Count << kBlockSetCountShift) & kBlockSetCountMask) | ((kBlockSet4BufferIndex << kBlockSetBufferIndexShift) & kBlockSetBufferIndexMask) | ((kBlockSet4isLongTerm << kBlockSetIsLongTermShift) & kBlockSetIsLongTermMask), }[kNumberOfBlockSets]
編碼區塊會設定參數。
sBufferAllocationMask = { kNetworkBuffer0BlockAllocationMask, kNetworkBuffer1BlockAllocationMask, }[kNumberOfNetworkBuffers]
const BlockMark_t
一組緩衝區區塊遮罩。
sMemBlocksAllocated = 0
指出已分配/未分配的區塊。
sMemBufs = { NULL }[kNumberOfNetworkBuffers]
void *
初始化為 NULL 的記憶體緩衝區指標。
sNetworkBuffersUsed = true
bool
布林值,指出 Simple Allocator 使用網路緩衝區時是不是 (true)。

函式

DecodeBlockSetParams(BlockSetParams_t blockSetParams, uint16_t & blockSize, uint8_t & blockCount, uint8_t & blockBufferIndex, bool & blockIsLongTerm)
void
GetSecureRandomData(uint8_t *buf, uint16_t len)
Weave 層會呼叫此函式以產生隨機資料。
InitSecureRandomDataSource(nl::Weave::Crypto::EntropyFunct entropyFunct, uint16_t entropyLen, const uint8_t *personalizationData, uint16_t perDataLen)
Weave 層會呼叫此函式,初始化隨機資料來源。
MemoryAlloc(size_t size)
void *
Weave 層會呼叫此函式,分配記憶體區塊「size」位元組。
MemoryAlloc(size_t size, bool isLongTermAlloc)
void *
Weave 層會呼叫此函式,分配記憶體區塊「size」位元組。
MemoryFree(void *p)
void
Weave 層會呼叫此函式,以釋放 MemeoryAlloc() 函式分配的記憶體區塊。
MemoryInit(void *buf, size_t bufSize)
Weave 層會呼叫這個函式,以初始化 Weave 安全管理工具記憶體配置器的適當功能所需的記憶體和資源。
MemoryShutdown(void)
void
Weave 層會呼叫此函式,以釋出 MemoryInit() 函式分配的所有資源。
OnTimeConsumingCryptoDone(void)
void
耗時的加密作業剛好完成時,會呼叫此函式來通知應用程式。
OnTimeConsumingCryptoStart(void)
void
如果有即將啟動的加密編譯作業即將開始,呼叫此函式以通知應用程式。

類別

nl::Weave::Platform::Security::AES128BlockCipher
nl::Weave::Platform::Security::AES128BlockCipherDec
nl::Weave::Platform::Security::AES128BlockCipherEnc
nl::Weave::Platform::Security::AES256BlockCipher
nl::Weave::Platform::Security::AES256BlockCipherDec
nl::Weave::Platform::Security::AES256BlockCipherEnc
nl::Weave::Platform::Security::SHA1
nl::Weave::Platform::Security::SHA256

列舉

BlockSetParamFields

 BlockSetParamFields

封鎖一組參數欄位的位置 (採用 8 位元編碼格式)。

屬性
kBlockSetBufferIndexMask

緩衝區索引欄位遮罩。

kBlockSetBufferIndexShift

緩衝區索引欄位轉換。

kBlockSetCountMask

計數欄位遮罩。

kBlockSetCountShift

計數欄位位移。

kBlockSetIsLongTermMask

類型欄位遮罩。

kBlockSetIsLongTermShift

輸入欄位位移。

kBlockSetSizeMask

大小欄位遮罩。

kBlockSetSizeShift

大小欄位偏移。

kBlockSetSizeValueShift

大小欄位解碼位移 (乘以 128)。

BlockSetParams

 BlockSetParams

定義區塊集參數。

屬性
kBlockSet1BufferIndex

將 #1 緩衝區索引設為 0。

kBlockSet1Count

將區塊計數設為 1。

kBlockSet1Size

將 #1 大小設定為 128 個位元組。

kBlockSet1isLongTerm

設定 #1 類型為長期類型。

kBlockSet2BufferIndex

將 #2 緩衝區索引設為 0。

kBlockSet2Count

將區塊計數設為 1。

kBlockSet2Size

設定 #2 的大小為 512 個位元組。

kBlockSet2isLongTerm

設定 #2 類型為長期類型。

kBlockSet3BufferIndex

將 #3 緩衝區索引設為 0。

kBlockSet3Count

將 #3 的區塊計數設為 1。

kBlockSet3Size

設定 #3 的大小為 512 個位元組。

kBlockSet3isLongTerm

設定 #3 類型為短期。

kBlockSet4BufferIndex

將 #4 緩衝區索引設為 1。

kBlockSet4Count

將區塊計數設為 2。

kBlockSet4Size

設定 #4 的大小為 640 個位元組。

kBlockSet4isLongTerm

設定 #4 類型為短期。

kMaxBlockSize

簡易分配器支援的區塊大小上限。

kMinBufferSize

支援 Simple Allocator 用途所需的網路緩衝區空間下限。

這個參數衍生自網路緩衝區 #1 中分配的兩個記憶體區塊 (640 + 600)。

kNetworkBuffer0BlockAllocationMask

這個遮罩會識別從網路緩衝區 #0 分配的所有記憶體區塊。

kNetworkBuffer1BlockAllocationMask

這個遮罩會識別從網路緩衝區 #1 分配的所有記憶體區塊。

kNumberOfBlockSets

簡易分配器使用的區塊集數量。

kNumberOfNetworkBuffers

Simple Allocator 使用的網路緩衝區數量。

kTotalMemorySize

簡易配置器使用的記憶體總量。

Typedefs

BlockMark_t

uint8_t BlockMark_t

這個類型是用於標示目前已分配/未分配的區塊。

uint8_t - 最多支援 8 個記憶體區塊 uint16_t,最多支援 16 個記憶體區塊 uint32_t - 總共支援最多 32 個記憶體區塊

BlockSetParams_t

uint8_t BlockSetParams_t

這種類型是用來編碼區塊集資訊。

區塊集是一組具有相同屬性 (大小、類型,以及屬於相同緩衝區) 的記憶體區塊。下圖說明以 8 位元格式編碼的區塊集資訊:

是否長期 區塊索引 模塊數量 區塊大小
[7]。 [6:5] [4:3] [2:0]
[2:0] - 資料集中的記憶體區塊大小。大小值以 128 位元組的精細程度編碼。
[2:0] 解碼中
000 號 0 個位元組
001 128 個位元組
010 256 個位元組
... -
111 號 896 個位元組
[4:3] - 組合中的建塊數量。
[4:3] 解碼中
00 號 4 個積木
01 1 個模塊
10 2 塊積木
11 3 塊積木
[6:5] - 記憶體區塊所在的網路緩衝區索引。請注意,使用專屬緩衝區時,系統會從專用緩衝區分配所有記憶體區塊,並忽略這個索引參數。
[6:5] 解碼中
00 號 網路緩衝區 #0
... -
11 網路緩衝區 #3
[7] - 指定區塊是否適用於長期/短期儲存空間。
[7]。 解碼中
0 號 短期記憶體區塊
1 長期記憶體區塊

Variables

sBlockSetParams

const BlockSetParams_t sBlockSetParams[kNumberOfBlockSets] = {
    
    ((kBlockSet1Size << kBlockSetSizeShift) & kBlockSetSizeMask) | 
    ((kBlockSet1Count << kBlockSetCountShift) & kBlockSetCountMask) | 
    ((kBlockSet1BufferIndex << kBlockSetBufferIndexShift) & kBlockSetBufferIndexMask) | 
    ((kBlockSet1isLongTerm << kBlockSetIsLongTermShift) & kBlockSetIsLongTermMask),
    
    ((kBlockSet2Size << kBlockSetSizeShift) & kBlockSetSizeMask) | 
    ((kBlockSet2Count << kBlockSetCountShift) & kBlockSetCountMask) | 
    ((kBlockSet2BufferIndex << kBlockSetBufferIndexShift) & kBlockSetBufferIndexMask) | 
    ((kBlockSet2isLongTerm << kBlockSetIsLongTermShift) & kBlockSetIsLongTermMask),
    
    ((kBlockSet3Size << kBlockSetSizeShift) & kBlockSetSizeMask) | 
    ((kBlockSet3Count << kBlockSetCountShift) & kBlockSetCountMask) | 
    ((kBlockSet3BufferIndex << kBlockSetBufferIndexShift) & kBlockSetBufferIndexMask) | 
    ((kBlockSet3isLongTerm << kBlockSetIsLongTermShift) & kBlockSetIsLongTermMask),
    
    ((kBlockSet4Size << kBlockSetSizeShift) & kBlockSetSizeMask) | 
    ((kBlockSet4Count << kBlockSetCountShift) & kBlockSetCountMask) | 
    ((kBlockSet4BufferIndex << kBlockSetBufferIndexShift) & kBlockSetBufferIndexMask) | 
    ((kBlockSet4isLongTerm << kBlockSetIsLongTermShift) & kBlockSetIsLongTermMask),







}

編碼區塊會設定參數。

sBufferAllocationMask

const BlockMark_t sBufferAllocationMask[kNumberOfNetworkBuffers] = {
                                                   kNetworkBuffer0BlockAllocationMask,
                                                   kNetworkBuffer1BlockAllocationMask,




                                                                                       }

一組緩衝區區塊遮罩。

識別緩衝區中的所有區塊是否未分配,然後才能恢復緩衝區。

sMemBlocksAllocated

BlockMark_t sMemBlocksAllocated = 0

指出已分配/未分配的區塊。

初始化為 0,代表所有記憶體區塊和未分配。

sMemBufs

void * sMemBufs[kNumberOfNetworkBuffers] = { NULL }

初始化為 NULL 的記憶體緩衝區指標。

使用網路緩衝區時,使用 sMemBufs[] 指向 PacketBuffer 物件。使用專用緩衝區時,sMemBufs[0] 會指向該緩衝區,並忽略其他 sMemBufs[] 指標。

sNetworkBuffersUsed

bool sNetworkBuffersUsed = true

布林值,指出 Simple Allocator 使用網路緩衝區時是不是 (true)。

設為 false 時,系統會使用 MemoryInit() 函式提供的專屬緩衝區。

函式

DecodeBlockSetParams

void DecodeBlockSetParams(
  BlockSetParams_t blockSetParams,
  uint16_t & blockSize,
  uint8_t & blockCount,
  uint8_t & blockBufferIndex,
  bool & blockIsLongTerm
)

GetSecureRandomData

WEAVE_ERROR GetSecureRandomData(
  uint8_t *buf,
  uint16_t len
)

Weave 層會呼叫此函式以產生隨機資料。

詳細說明
參數
[in] buf
記憶體緩衝區的指標,該緩衝區應儲存要求的隨機資料。
[in] len
指定要求的隨機資料大小 (以位元組為單位)。
傳回值
WEAVE_ERROR_DRBG_ENTROPY_SOURCE_FAILED
如果熵來源無法產生隨機資料產生器要求的熵,
WEAVE_ERROR_RANDOM_DATA_UNAVAILABLE
如果隨機資料來源無法產生隨機資料,
WEAVE_ERROR_INCORRECT_STATE
如果發現隨機資料來源有誤,
WEAVE_NO_ERROR
成功時。

InitSecureRandomDataSource

WEAVE_ERROR InitSecureRandomDataSource(
  nl::Weave::Crypto::EntropyFunct entropyFunct,
  uint16_t entropyLen,
  const uint8_t *personalizationData,
  uint16_t perDataLen
)

Weave 層會呼叫此函式,初始化隨機資料來源。

這個函式僅適用於特定平台,因此在不需要隨機資料來源初始化時,該函式可能會空白。

詳細說明
參數
[in] entropyFunct
指向隨機資料產生器產生熵的函式指標。如果演算法不需要這方面的輸入資料,輸入的值可以是 NULL,在這種情況下,系統會使用隨機資料產生器的 OpenSSL 版本。
[in] entropyLen
指定在使用熵函式時應產生的熵大小。
[in] personalizationData
指向儲存個人化資料輸入內容的記憶體緩衝區指標。這項資料應以裝置明確為準,且有助於改善隨機資料的統計屬性。
[in] perDataLen
指定個人化資料大小 (以位元組為單位)。
傳回值
WEAVE_ERROR_INVALID_ARGUMENT
如果傳遞無效的引數給此函式,
WEAVE_NO_ERROR
成功時。

MemoryAlloc

void * MemoryAlloc(
  size_t size
)

Weave 層會呼叫此函式,分配記憶體區塊「size」位元組。

這個函式相當於 MemoryAlloc(size, false)。

詳細說明
參數
[in] size
指定要求的記憶體大小 (以位元組為單位)。
傳回值
Pointer
傳送至記憶體區塊中的記憶體區塊
NULL-pointer
萬一記憶體配置失敗

MemoryAlloc

void * MemoryAlloc(
  size_t size,
  bool isLongTermAlloc
)

Weave 層會呼叫此函式,分配記憶體區塊「size」位元組。

詳細說明
參數
[in] size
指定要求的記憶體大小 (以位元組為單位)。
[in] isLongTermAlloc
布林值,指出 (true) 要求的記憶體區塊是否為長期使用。長期配置是指在安全工作階段/握手完成前,應保留的記憶體。長期配置的範例包括為 CASE/PASE 物件配置的區塊,以及相關情境資料。短期分配是指執行特定作業所需的記憶體,之後可以立即釋放。這項輸入有助於最佳化記憶體受限系統中的記憶體使用率。這個參數是任意使用,且需視函式實作器而定。舉例來說,使用 C 標準資料庫 malloc() 時,系統會忽略此參數。
傳回值
Pointer
傳送至記憶體區塊中的記憶體區塊
NULL-pointer
萬一記憶體配置失敗

MemoryFree

void MemoryFree(
  void *p
)

Weave 層會呼叫此函式,以釋放 MemeoryAlloc() 函式分配的記憶體區塊。

詳細說明
參數
[in] p
應釋放記憶體區塊的指標。

MemoryInit

WEAVE_ERROR MemoryInit(
  void *buf,
  size_t bufSize
)

Weave 層會呼叫這個函式,以初始化 Weave 安全管理工具記憶體配置器的適當功能所需的記憶體和資源。

這項功能僅適用於特定平台,在某些情況下可能會留空。舉例來說,使用 C 標準程式庫 Malloc() 和 free() 函式時,這個函式不會執行任何操作。

詳細說明
參數
[in] buf
指向專屬記憶體緩衝區的指標,這個緩衝區應做為 Weave Security 管理員記憶體配置的記憶體集區。此為選用輸入內容 (預設為 NULL),如果未使用專屬記憶體緩衝區,則不應使用。
[in] bufSize
專屬記憶體緩衝區的大小。此為選用內容 (預設值為 0),如果未使用專用記憶體緩衝區,則不建議使用。使用專屬記憶體緩衝區時,函式會檢查並產生錯誤,如果緩衝區空間不足以支援 Weave 安全性管理工具用途,就會產生錯誤。
傳回值
WEAVE_ERROR_BUFFER_TOO_SMALL
如果專屬的輸入緩衝區空間不足以支援 Weave 安全性管理員用途,
WEAVE_NO_ERROR
成功時。
other
平台專屬記憶體初始化函式產生的錯誤。

MemoryShutdown

void MemoryShutdown(
  void
)

Weave 層會呼叫此函式,以釋出 MemoryInit() 函式分配的所有資源。

如果不需要釋出資源,這個函式可以是空白呼叫。舉例來說,使用 C 標準程式庫 malloc() 和 free() 函式進行記憶體配置時,就會發生這種情況。

OnTimeConsumingCryptoDone

void OnTimeConsumingCryptoDone(
  void
)

耗時的加密作業剛好完成時,會呼叫此函式來通知應用程式。

OnTimeConsumingCryptoStart

void OnTimeConsumingCryptoStart(
  void
)

如果有即將啟動的加密編譯作業即將開始,呼叫此函式以通知應用程式。