nl::Weave::Platform::Security

此命名空间包含 Weave for 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
}
枚举
定义块集参数。

类型定义符

BlockMark_t typedef
uint8_t
用于标记当前已分配/未分配块的类型。
BlockSetParams_t typedef
uint8_t
该类型用于对块集信息进行编码。

变量

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
指示简单分配器是否使用 (true) 或 (false) 网络缓冲区的布尔值。

函数

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 层调用,以分配“大小”字节的内存块。
MemoryAlloc(size_t size, bool isLongTermAlloc)
void *
此函数由 Weave 层调用,以分配“大小”字节的内存块。
MemoryFree(void *p)
void
Weave 层调用此函数以释放 MemeoryAlloc() 函数分配的内存块。
MemoryInit(void *buf, size_t bufSize)
Weave 层会调用此函数,以初始化 Weave Security 管理器内存分配器正常运行所需的内存和资源。
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 的块数为 1。

kBlockSet1Size

集 #1 的大小为 128 字节。

kBlockSet1isLongTerm

集合 1 的类型是长期的。

kBlockSet2BufferIndex

设置 #2 缓冲区索引为 0。

kBlockSet2Count

集 #2 的块数为 1。

kBlockSet2Size

集 #2 的大小为 512 字节。

kBlockSet2isLongTerm

第 2 个组的类型是长期。

kBlockSet3BufferIndex

设置 #3 缓冲区索引为 0。

kBlockSet3Count

集 #3 块数为 1。

kBlockSet3Size

集 #3 的大小为 512 字节。

kBlockSet3isLongTerm

集 #3 的类型是短期的。

kBlockSet4BufferIndex

设置 #4 缓冲区索引为 1。

kBlockSet4Count

集 #4 块数为 2。

kBlockSet4Size

集 #4 的大小为 640 字节。

kBlockSet4isLongTerm

第 4 组类型是短期的。

kMaxBlockSize

简单分配器支持的块大小上限。

kMinBufferSize

支持 Simple Allocator 用例所需的最小网络缓冲区空间。

此参数派生自网络缓冲区 1 中分配的两个内存块 (640 + 600) 的大小。

kNetworkBuffer0BlockAllocationMask

此掩码标识从网络缓冲区 #0 分配的所有内存块。

kNetworkBuffer1BlockAllocationMask

此掩码标识从网络缓冲区 #1 分配的所有内存块。

kNumberOfBlockSets

Simple Allocator 使用的块集数。

kNumberOfNetworkBuffers

简易分配器使用的网络缓冲区数。

kTotalMemorySize

Simple Allocator 使用的总内存。

类型定义符

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 个字节
土耳其里拉 128 个字节
土耳其里拉 256 个字节
-
111 896 个字节
[4:3] - 集内的块数。
[4:3] 解码
土耳其里拉 4 个方块
1 日 1 个块
10 2 个方块
11 日 3 个方块
[6:5] - 内存块所在的网络缓冲区索引。请注意,使用专用缓冲区时,系统会从专用缓冲区分配所有内存块,并忽略此索引参数。
[6:5] 解码
土耳其里拉 网络缓冲区 #0
-
11 日 网络缓冲区 #3
[7] - 指定块是否用于长期/短期存储。
[7] 解码
数字 0 短期内存块
1 长期内存块

变量

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

指示简单分配器是否使用 (true) 或 (false) 网络缓冲区的布尔值。

如果为 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 层调用,以分配“大小”字节的内存块。

此函数相当于 MemoryAlloc(size, false)。

具体说明
参数
[in] size
指定请求的内存大小(以字节为单位)。
返回值
Pointer
存储到内存块中以便请求成功
NULL-pointer
如果内存分配失败。

MemoryAlloc

void * MemoryAlloc(
  size_t size,
  bool isLongTermAlloc
)

此函数由 Weave 层调用,以分配“大小”字节的内存块。

具体说明
参数
[in] size
指定请求的内存大小(以字节为单位)。
[in] isLongTermAlloc
指示 (true) 或 (false) 所请求内存块是否为长期使用的布尔值。长期分配是指在安全会话/握手完成之前应保持分配的内存。长期分配的示例包括为 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 Security 管理器内存分配器正常运行所需的内存和资源。

此函数特定于平台,在某些情况下可能为空。例如,当使用 C 标准库 malloc() 和 free() 函数分配内存时,此函数不会执行任何操作。

具体说明
参数
[in] buf
指向专用内存缓冲区的指针,应用作 Weave Security 管理器内存分配的内存池。此输入是可选的(默认为 NULL),如果未使用专用内存缓冲区,则不应使用该输入。
[in] bufSize
专用内存缓冲区的大小。该输入是可选的(默认为 0),如果未使用专用内存缓冲区,则不应使用该输入。使用专用内存缓冲区时,如果缓冲区空间不足以支持 Weave Security 管理器用例,该函数会检查并生成错误。
返回值
WEAVE_ERROR_BUFFER_TOO_SMALL
如果专用输入缓冲区空间不足以支持 Weave Security 管理器用例。
WEAVE_NO_ERROR
成功时。
other
由平台专用内存初始化函数生成的错误。

MemoryShutdown

void MemoryShutdown(
  void
)

Weave 层会调用此函数,以释放 MemoryInit() 函数分配的所有资源。

如果不需要释放资源,此函数可以为空调用。例如,使用 C 标准库 malloc() 和 free() 函数分配内存时就会出现这种情况。

OnTimeConsumingCryptoDone

void OnTimeConsumingCryptoDone(
  void
)

当一个耗时的加密操作刚刚完成时,系统会调用此函数来通知应用。

OnTimeConsumingCryptoStart

void OnTimeConsumingCryptoStart(
  void
)

当一项耗时的加密操作即将开始时,系统会调用此函数来通知应用。