コンテンツにスキップ

乱数生成

Functions

Name
int wc_InitNetRandom(const char * configFile, wnr_hmac_key hmac_cb, int timeout)
グローバルWhitewood netRandomコンテキストを初期化します
int wc_FreeNetRandom(void )
グローバルWhitewood netRandomコンテキストを解放します。
int wc_InitRng(WC_RNG * )
rng用のシード(OSから)と鍵暗号を取得します。rng_>drbg(決定論的乱数ビット生成器)が割り当てられます(wc_FreeRngで割り当て解除する必要があります)。これはブロッキング操作です。
int wc_RNG_GenerateBlock(WC_RNG * rng, byte * b, word32 sz)
疑似乱数データのszバイトをoutputにコピーします。必要に応じてrngを再シードします(ブロッキング)。
WC_RNG * wc_rng_new(byte * nonce, word32 nonceSz, void * heap)
新しいWC_RNG構造体を作成します。
int wc_FreeRng(WC_RNG * )
drgbを安全に解放するために、RNGが不要になったときに呼び出す必要があります。rng-drbgをゼロ化しXFREEします。
WC_RNG * wc_rng_free(WC_RNG * rng)
rngを安全に解放するために、RNGが不要になったときに呼び出す必要があります。
int wc_RNG_HealthTest(int reseed, const byte * seedA, word32 seedASz, const byte * seedB, word32 seedBSz, byte * output, word32 outputSz)
drbgの機能を作成してテストします。

Functions Documentation

function wc_InitNetRandom

int wc_InitNetRandom(
    const char * configFile,
    wnr_hmac_key hmac_cb,
    int timeout
)

グローバルWhitewood netRandomコンテキストを初期化します

Parameters:

  • configFile 設定ファイルへのパス
  • hmac_cb HMACコールバックを作成するためのオプション。
  • timeout タイムアウト期間。

See: wc_FreeNetRandom

Return:

  • 0 成功
  • BAD_FUNC_ARG configFileがnullまたはtimeoutが負の値の場合。
  • RNG_FAILURE_E rngの初期化に失敗しました。

Example

char* config = "path/to/config/example.conf";
int time = // 十分なタイムアウト値;

if (wc_InitNetRandom(config, NULL, time) != 0)
{
    // エラーが発生しました
}

function wc_FreeNetRandom

int wc_FreeNetRandom(
    void 
)

グローバルWhitewood netRandomコンテキストを解放します。

Parameters:

  • none 戻り値なし。

See: wc_InitNetRandom

Return:

  • 0 成功
  • BAD_MUTEX_E wnr_mutexのミューテックスロックエラー

Example

int ret = wc_FreeNetRandom();
if(ret != 0)
{
    // エラーを処理
}

function wc_InitRng

int wc_InitRng(
    WC_RNG * 
)

rng用のシード(OSから)と鍵暗号を取得します。rng->drbg(決定論的乱数ビット生成器)が割り当てられます(wc_FreeRngで割り当て解除する必要があります)。これはブロッキング操作です。

Parameters:

  • rng シードと鍵暗号で使用するために初期化される乱数生成器

See:

Return:

  • 0 成功時。
  • MEMORY_E XMALLOCが失敗しました
  • WINCRYPT_E wc_GenerateSeed: コンテキストの取得に失敗しました
  • CRYPTGEN_E wc_GenerateSeed: ランダムの取得に失敗しました
  • BAD_FUNC_ARG wc_RNG_GenerateBlock入力がnullまたはszがMAX_REQUEST_LENを超えています
  • DRBG_CONT_FIPS_E wc_RNG_GenerateBlock: Hash_genがDRBG_CONT_FAILUREを返しました
  • RNG_FAILURE_E wc_RNG_GenerateBlock: デフォルトエラー。rngのステータスが元々okでないか、DRBG_FAILEDに設定されています

Example

RNG  rng;
int ret;

#ifdef HAVE_CAVIUM
ret = wc_InitRngCavium(&rng, CAVIUM_DEV_ID);
if (ret != 0){
    printf("RNG Nitrox init for device: %d failed", CAVIUM_DEV_ID);
    return -1;
}
#endif
ret = wc_InitRng(&rng);
if (ret != 0){
    printf("RNG init failed");
    return -1;
}

function wc_RNG_GenerateBlock

int wc_RNG_GenerateBlock(
    WC_RNG * rng,
    byte * b,
    word32 sz
)

疑似乱数データのszバイトをoutputにコピーします。必要に応じてrngを再シードします(ブロッキング)。

Parameters:

  • rng wc_InitRngで初期化された乱数生成器
  • output ブロックがコピーされるバッファ
  • sz 出力のサイズ(バイト単位)

See:

Return:

  • 0 成功時
  • BAD_FUNC_ARG 入力がnullまたはszがMAX_REQUEST_LENを超えています
  • DRBG_CONT_FIPS_E Hash_genがDRBG_CONT_FAILUREを返しました
  • RNG_FAILURE_E デフォルトエラー。rngのステータスが元々okでないか、DRBG_FAILEDに設定されています

Example

RNG  rng;
int  sz = 32;
byte block[sz];

int ret = wc_InitRng(&rng);
if (ret != 0) {
    return -1; //rngの初期化失敗!
}

ret = wc_RNG_GenerateBlock(&rng, block, sz);
if (ret != 0) {
    return -1; //ブロック生成失敗!
}

function wc_rng_new

WC_RNG * wc_rng_new(
    byte * nonce,
    word32 nonceSz,
    void * heap
)

新しいWC_RNG構造体を作成します。

Parameters:

  • heap ヒープ識別子へのポインタ
  • nonce nonceを含むバッファへのポインタ
  • nonceSz nonceの長さ
  • rng wc_InitRngで初期化された乱数生成器
  • b ブロックがコピーされる1バイトのバッファ

See:

Return:

  • WC_RNG 成功時の構造体
  • NULL エラー時
  • 0 成功時
  • BAD_FUNC_ARG 入力がnullまたはszがMAX_REQUEST_LENを超えています
  • DRBG_CONT_FIPS_E Hash_genがDRBG_CONT_FAILUREを返しました
  • RNG_FAILURE_E デフォルトエラー。rngのステータスが元々okでないか、DRBG_FAILEDに設定されています

Example

RNG  rng;
byte nonce[] = { nonceを初期化 };
word32 nonceSz = sizeof(nonce);

wc_rng_new(&nonce, nonceSz, &heap);

疑似乱数データの1バイトをbにコピーするためにwc_RNG_GenerateBlockを呼び出します。必要に応じてrngを再シードします。

Example

RNG  rng;
int  sz = 32;
byte b[1];

int ret = wc_InitRng(&rng);
if (ret != 0) {
    return -1; //rngの初期化失敗!
}

ret = wc_RNG_GenerateByte(&rng, b);
if (ret != 0) {
    return -1; //ブロック生成失敗!
}

function wc_FreeRng

int wc_FreeRng(
    WC_RNG * 
)

drgbを安全に解放するために、RNGが不要になったときに呼び出す必要があります。rng-drbgをゼロ化しXFREEします。

Parameters:

  • rng wc_InitRngで初期化された乱数生成器

See:

Return:

  • 0 成功時
  • BAD_FUNC_ARG rngまたはrng->drgbがnull
  • RNG_FAILURE_E drbgの割り当て解除に失敗しました

Example

RNG  rng;
int ret = wc_InitRng(&rng);
if (ret != 0) {
    return -1; //rngの初期化失敗!
}

int ret = wc_FreeRng(&rng);
if (ret != 0) {
    return -1; //rngの解放失敗!
}

function wc_rng_free

WC_RNG * wc_rng_free(
    WC_RNG * rng
)

rngを安全に解放するために、RNGが不要になったときに呼び出す必要があります。

Parameters:

  • rng wc_InitRngで初期化された乱数生成器

See:

Example

RNG  rng;
byte nonce[] = { nonceを初期化 };
word32 nonceSz = sizeof(nonce);

rng = wc_rng_new(&nonce, nonceSz, &heap);

// rngを使用

wc_rng_free(&rng);

function wc_RNG_HealthTest

int wc_RNG_HealthTest(
    int reseed,
    const byte * seedA,
    word32 seedASz,
    const byte * seedB,
    word32 seedBSz,
    byte * output,
    word32 outputSz
)

drbgの機能を作成してテストします。

Parameters:

  • int reseed: 設定されている場合、再シード機能をテストします
  • seedA drgbをインスタンス化するシード
  • seedASz seedAのサイズ(バイト単位)
  • seedB reseedが設定されている場合、drbgはseedBで再シードされます
  • seedBSz seedBのサイズ(バイト単位)
  • output seedrandomが設定されている場合はseedBでシードされたランダムデータに初期化され、それ以外の場合はseedAでシードされます
  • outputSz outputの長さ(バイト単位)

See:

Return:

  • 0 成功時
  • BAD_FUNC_ARG seedAとoutputはnullであってはなりません。reseedが設定されている場合、seedBはnullであってはなりません
  • -1 テスト失敗

Example

byte output[SHA256_DIGEST_SIZE * 4];
const byte test1EntropyB[] = ....; // reseed falseのテスト入力
const byte test1Output[] = ....;   // テストベクター: reseed falseの期待出力
ret = wc_RNG_HealthTest(0, test1Entropy, sizeof(test1Entropy), NULL, 0,
                    output, sizeof(output));
if (ret != 0)
    return -1;//再シードなしのヘルステスト失敗

if (XMEMCMP(test1Output, output, sizeof(output)) != 0)
    return -1; //テストベクターとの比較失敗: 予期しない出力

const byte test2EntropyB[] = ....; // reseedのテスト入力
const byte test2Output[] = ....;   // テストベクターreseedの期待出力
ret = wc_RNG_HealthTest(1, test2EntropyA, sizeof(test2EntropyA),
                    test2EntropyB, sizeof(test2EntropyB),
                    output, sizeof(output));

if (XMEMCMP(test2Output, output, sizeof(output)) != 0)
    return -1; //テストベクターとの比較失敗

Updated on 2025-12-12 at 03:08:16 +0000