iPXE
Functions
random_nz.c File Reference

Random non-zero bytes. More...

#include <stddef.h>
#include <stdint.h>
#include <ipxe/rbg.h>
#include <ipxe/random_nz.h>

Go to the source code of this file.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
int get_random_nz (void *data, size_t len)
 Get random non-zero bytes.

Detailed Description

Random non-zero bytes.

The RSA algorithm requires the generation of random non-zero bytes, i.e. bytes in the range [0x01,0xff].

This algorithm is designed to comply with ANS X9.82 Part 1-2006 Section 9.2.1. This standard is not freely available, but most of the text appears to be shared with NIST SP 800-90, which can be downloaded from

http://csrc.nist.gov/publications/nistpubs/800-90/SP800-90revised_March2007.pdf

Where possible, references are given to both documents. In the case of any disagreement, ANS X9.82 takes priority over NIST SP 800-90. (In particular, note that some algorithms that are Approved by NIST SP 800-90 are not Approved by ANS X9.82.)

Definition in file random_nz.c.


Function Documentation

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )
int get_random_nz ( void *  data,
size_t  len 
)

Get random non-zero bytes.

Parameters:
dataOutput buffer
lenLength of output buffer
Return values:
rcReturn status code

This algorithm is designed to be isomorphic to the Simple Discard Method described in ANS X9.82 Part 1-2006 Section 9.2.1 (NIST SP 800-90 Section B.5.1.1).

Definition at line 62 of file random_nz.c.

References bytes, data, NULL, rbg_generate(), and rc.

Referenced by rsa_encrypt().

                                             {
        uint8_t *bytes = data;
        int rc;

        while ( len ) {

                /* Generate random byte */
                if ( ( rc = rbg_generate ( NULL, 0, 0, bytes, 1 ) ) != 0 )
                        return rc;

                /* Move to next byte if this byte is acceptable */
                if ( *bytes != 0 ) {
                        bytes++;
                        len--;
                }
        }

        return 0;
}