nl::Weave::Platform::Security

此命名空间包含 Weave Security Monitor 内存管理器的所有 Weave 接口。

摘要

此命名空间中的函数将由使用 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
一个布尔值,用于指明 Simple Allocator 使用的网络缓冲区是 (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 Manager 内存分配器正常运行所需的内存和资源。
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

简单分配器使用的块集的数量。

kNumberOfNetworkBuffers

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

kTotalMemorySize

简单分配器使用的总内存。

类型定义符

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 长期内存块

变量

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)。

如果为 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 Manager 内存分配器正常运行所需的内存和资源。

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

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

MemoryShutdown

void MemoryShutdown(
  void
)

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

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

OnTimeConsumingCryptoDone

void OnTimeConsumingCryptoDone(
  void
)

可调用此函数,以在耗时的加密操作完成时通知应用。

OnTimeConsumingCryptoStart

void OnTimeConsumingCryptoStart(
  void
)

可调用此函数,以在耗时的加密操作即将开始时通知应用。