Search code examples
c++opensslcryptographycrypto++nonce

Generate nonce c++


I am wondering if there is a way to generate a Cryptographic Nonce using OpenSSL or Crypto++ libraries. Is there anything more to it than just generating a set of random bytes using autoseeded pools?


Solution

  • I am wondering if there is a way to generate a cryptographic nonce using OpenSSL or Crypto++ libraries.

    Crypto++:

    SecByteBlock nonce(16);
    AutoSeededRandomPool prng;
    
    prng.GenerateBlock(nonce, nonce.size());
    

    OpenSSL:

    unsigned char nonce[16];
    int rc = RAND_bytes(nonce, sizeof(nonce));
    unsigned long err = ERR_get_error();
    
    if(rc != 1) {
        /* RAND_bytes failed */
        /* `err` is valid    */
    }
    
    /* OK to proceed */
    

    Is there anything more to it than just generating a set of random bytes using autoseeded pools?

    A nonce is basically an IV. Its usually considered a public parameter, like an IV or a Salt.

    A nonce must be unique within a security context. You may need a nonce to be unpredictable, too.

    Uniqueness and unpredictability are two different properties. For example, a counter starting at 0000000000000000 is unique, but its also predictable.

    When you need both uniqueness and unpredictability, you can partition the nonce into a random value and a counter. The random value will take up 8 bytes of a 16 byte nonce; while the counter will take up the remaining 8 bytes of a 16 byte nonce. Then you use an increment function to basically perform i++ each time you need a value.

    You don't need an 8-8 split. 12-4 works, as does 4-12. It depends on the application and the number of nonces required before rekeying. Rekeying is usually driven by plain text byte counts.

    16-0 also works. In this case, you're using random values, avoiding the counter, and avoiding the increment function. (The increment function is basically a cascading add).

    NIST SP800-38C and SP800-38D offer a couple of methods for creating nonces because CCM and GCM uses them.

    Also see What are the requirements of a nonce? on the Crypto Stack Exchange.