nl::Weave::平台::安全性

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

类型定义符

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 层会调用此函数以分配大小为“qu”的字节。
MemoryAlloc(size_t size, bool isLongTermAlloc)
void *
Weave 层会调用此函数以分配大小为“qu”的字节。
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)。

BlockSet 参数

 BlockSetParams

定义块集参数。

属性
kBlockSet1BufferIndex

将 #1 缓冲区索引设置为 0。

kBlockSet1Count

第 1 个块的计数为 1。

kBlockSet1Size

第 1 个字节的大小为 128 个字节。

kBlockSet1isLongTerm

第一种类型是长期的。

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

支持简单分配器用例所需的最低网络缓冲区大小。

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

kNetworkBuffer0BlockAllocationMask

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

kNetworkBuffer1BlockAllocationMask

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

kNumberOfBlockSets

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

kNumberOfNetworkBuffers

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

kTotalMemorySize

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

类型定义符

块标记_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 个字节
100 256 个字节
-
111 位 896 字节
[4:3] - 数据块中的块数。
[4:3] 解码
1 日 4 个文本块
1 日 1 个文本块
10 2 个文本块
11 个 3 个文本块
[6:5] - 内存块所在的网络缓冲区索引。请注意,使用专用缓冲区时,所有内存块均分配自专用缓冲区,并且此索引参数将被忽略。
[6:5] 解码
1 日 网络缓冲区 #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[] 指针将被忽略。

已使用的 sNetworkBuffers

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
成功时。

内存分配

void * MemoryAlloc(
  size_t size
)

Weave 层会调用此函数以分配大小为“qu”的字节。

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

详细信息
参数
[in] size
指定请求的内存大小(以字节为单位)。
返回值
Pointer
内存块。
NULL-pointer

内存分配

void * MemoryAlloc(
  size_t size,
  bool isLongTermAlloc
)

Weave 层会调用此函数以分配大小为“qu”的字节。

详细信息
参数
[in] size
指定请求的内存大小(以字节为单位)。
[in] isLongTermAlloc
一个布尔值,指示是否 (true) 或 (false) 请求的内存块用于长期使用。长期分配是指在安全会话/握手完成之前一直保持分配状态的内存。长期分配的示例包括为 CASE/PASE 对象及其上下文数据分配的块。短期分配是执行特定操作所需的内存,可以在之后立即释放。此输入可帮助优化内存受限系统中的内存利用率。使用此参数是任意的,具体取决于函数实现者。例如,当使用 C 标准库 malloc() 时,此参数将被忽略。
返回值
Pointer
内存块。
NULL-pointer

无内存

void MemoryFree(
  void *p
)

Weave 层会调用此函数来释放 MemeoryAlloc() 函数分配的内存块。

详细信息
参数
[in] p
指向应释放的内存块的指针。

内存输入

WEAVE_ERROR MemoryInit(
  void *buf,
  size_t bufSize
)

Weave 层会调用此函数,以初始化 Weave 安全管理器内存分配器正常运行所需的内存和资源。

此函数因平台而异,在某些情况下可能为空。例如,如果使用 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
由平台专用内存初始化函数生成的错误。

内存关闭

void MemoryShutdown(
  void
)

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

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

OnTimeConsumingCryptoDone

void OnTimeConsumingCryptoDone(
  void
)

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

OnTimeConsumingCryptoStart

void OnTimeConsumingCryptoStart(
  void
)

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