9. DRBG Mechanism Functions
四个关键函数Instantiate、Reseed、Generate、Uninstantiate中的前三个都需再进一步调用第10章提到的具体算法对应的相关函数。
9.0+ Get_entropy_input
函数:(status, entropy_input) = Get_entropy_input (min_entropy, min_length, max_length, prediction_resistance_request),
功能:获取entropy input(详情参见SP 800-90C)
输入参数:
- min_entropy:返回数据entropy_input的熵的最小比特。
- min_length和max_length:返回数据entropy_input的长度需满足min_length<=entropy_input长度<=max_ length。。
- prediction_resistance_request:请求的entropy_input是否能抵抗预测攻击(即函数内是否需要刷新entropy)
返回数据:
- status: 成功返回SUCCESS,失败返回错误信息。
- entropy_input:熵数据(其它函数用)。
执行步骤:
详情参见SP 800-90C。
9.1 DRBG Instantiate
函数:(status, state_handle ) = Instantiate_function (requested_instantiation_security_strength, prediction_resistance_flag, personalization_string):
功能:DRBG实例化(但不输出随机比特)
输入参数:
- requested_instantiation_security_strength:请求的安全强度(参考8.4节),不能大于算法支持的最大安全强度。算法安全强度可在算法参数信息表中查到。
- prediction_resistance_flag:让实例化的DRBG是否能抵抗预测攻击(仅当采用算法具有抵抗预测攻击能力时此标识设置为1才有效,算法是否具有抵抗预测攻击能力需查看算法的Administrative information中的prediction_resistance_flag是否设置为1)。
- personalization_string:可选参数,提供个性化信息。允许的最大长度max_personalization_string_length可在算法参数信息表中查到。
内部产生参数:
- entropy_input:调用函数Get_entropy_input获取,该函数详情参见第9章和SP 800-90C。
- nonce:临时数据,参见8.6.7节。可调用函数Get_entropy_input获取。
返回数据:
- status: 成功返回SUCCESS,失败返回错误信息。
- state_handle: 实例化后的内部状态,供后续功能函数使用。
执行步骤:
步骤1:若requested_instantiation_security_strength > 支持的最大安全强度,则返回(ERROR_FLAG, Invalid).
步骤2:若prediction_resistance_flag 设置为1, 但算法不支持prediction resistance(算法的Administrative information中的prediction_resistance_flag不是1),则返回(ERROR_FLAG, Invalid).
步骤3:若personalization_string的长度 > max_personalization_string(允许的最大长度),则返回(ERROR_FLAG, Invalid).
步骤4:将安全强度security_strength设置为{112, 128, 192, 256}中大于或者等于requested_instantiation_security_strength的最小值。即
步骤5:无(仅用于和以前版本的步骤编号对应)
步骤6:获取entropy input,(status, entropy_input) = Get_entropy_input (security_strength, min_length, max_length, prediction_resistance_request). 这里的status只表示Get_entropy_input的返回状态信息。
步骤7:若status ≠ SUCCESS, 返回 (status, Invalid).
步骤8:获取nonce.
步骤9:调用具体的实例化算法(具体的实例化算法参见第10章)
initial_working_state = Instantiate_algorithm (entropy_input, nonce, personalization_string, security_strength).
步骤10:新建一个state_handle,如果创建失败则返(ERROR_FLAG, Invalid).
步骤11:把initial_working_state以及其他信息(如administrative information的security_strength和prediction_resistance_flag等)设置到state_handle。
步骤12:返回 (SUCCESS, state_handle).
9.2 DRBG Reseed
函数:status = Reseed_function (state_handle, prediction_resistance_request, additional_input)
功能:DRBG重置种子
输入参数:
- state_handle:DRBG实例的句柄。
- prediction_resistance_request: 仅当实例化的prediction_resistance_flag置为1时,这里的prediction_resistance_request置为1才有效,否则报错
- additional_input: 可选输入参数。最大长度max_additional_input_length可在算法参数信息表中查到。
内部产生参数:
- entropy_input:熵信息。
返回数据:
- status: 成功执行信息。、
执行步骤:
步骤1:使用state_handle获取当前内部状态。如果state_handle对应的内部状态异常,则返回ERROR_FLAG。
步骤2:若prediction_resistance_request设置为1,但prediction_resistance_flag为0,则返回ERROR_FLAG。
步骤3:若additional_input的长度 > max_additional_input_length, 返回ERROR_FLAG。
步骤4:获取entropy input。
(status, entropy_input) = Get_entropy_input (security_strength, min_length, max_length, prediction_resistance_request)
步骤5:若 status ≠ SUCCESS,返回status。
步骤6:使用reseed算法获取新的工作状态。
new_work_state=Reseed_algorithm(work_state,entropy_input,additional_input)
步骤7:用新的工作状态更新实例句柄state_handle中的工作状态。
步骤8:返回SUCCESS。
9.3 DRBG Generate
函数:(status, pseudorandom_bits) = Generate_function (state_handle, requested_number_of_bits, requested_security_strength, prediction_resistance_request, additional_input)
功能:生成随机比特(需在Instantiation或者Reseeding之后)
输入参数:
- state_handle:DRBG实例的句柄。
- requested_number_of_bits:请求的随机比特长度,不能大于单次请求的最大长度max_number_of_bits_per_request,该值可在算法参数表中查到。
- requested_security_strength:请求的安全强度,不能大于内部状态内记录的安全强度(详情见Instantiating的步骤4)。
- prediction_resistance_request: 是否抵抗预测攻击。
- additional_input: 可选输入参数。最大长度max_additional_input_length可在算法参数信息表中查到。
内部产生参数:无
返回数据:
- status: 成功返回SUCCESS,失败返回错误信息。
- pseudorandom_bits: 随机比特或者空串(异常时)。
执行步骤:
步骤1:使用state_handle获取当前内部状态。如果state_handle对应的内部状态异常,则返回(ERROR_FLAG, NULL)。
步骤2:若requested_number_of_bits > max_number_of_bits_per_request,则返回(ERROR_FLAG, NULL)。
步骤3:若requested_security_strength > 内部状态的security_strength,则返回(ERROR_FLAG, NULL)。
步骤4:若additional_input的长度 > max_additional_input_length,则返回(ERROR_FLAG, NULL)。
步骤5:若prediction_resistance_request置为1,但prediction_resistance_flag不是1,则返回(ERROR_FLAG, NULL)。
步骤6:将局部变量reseed_required_flag置零。
步骤7:若reseed_required_flag为1或prediction_resistance_request为1,执行如下步骤:
-
- 7.1 status = Reseed_function (state_handle, prediction_resistance_request, additional_input)。
- 7.2 若 status ≠ SUCCESS,则返回(ERROR_FLAG, NULL)。
- 7.3 使用state_handle获取新的内部状态。
- 7.4 将additional_input设置为空串。
- 7.5将reseed_required_flag置零。
步骤8:(status, pseudorandom_bits, new_working_state) = Generate_algorithm (working_state, requested_number_of_bits, additional_input).
注意:Generate_algorithm函数会刷新工作状态,所以返回new_working_state。
步骤9:若status值标示需先进行reseed再生成随机比特,则执行如下步骤:
-
- 9.1将reseed_required_flag置1。
- 9.2 若prediction_resistance_flag为1,将prediction_resistance_request值1.
- 9.3跳转到步骤7。
步骤10:用新的状态替换state_handle 中的状态。
步骤11:返回(SUCCESS, pseudorandom_bits).
整体流程较为简单,故略去流程图。
说明:在调用Generate_algorithm之前可能需要先执行一次Reseed_function。
- 情况a:输入参数prediction_resistance_request为1,需抵抗预测攻击而改变状态。
- 或情况b:reseed_required_flag为1,这是Generate_algorithm函数内判断需要Reseed。
9.4 DRBG Uninstantiate
函数:Uninstantiate_function (state_handle)
功能:DRBG反初始化
输入参数:
- state_handle:DRBG实例的句柄。
返回数据:
- status: 成功返回SUCCESS,失败返回错误信息。
执行步骤:
步骤1:若state_handle 表示的状态无效,返回ERROR_FLAG)。
步骤2:擦除内部状态信息。
步骤3:返回SUCCESS。