Passa al contenuto principale

Appendix A. KDF Example (OpenSSL)

Questa sezione conserva il testo RFC su UDPSTP, includendo One-Way IP Capacity metrics, Control and Data phases, Load and Status Feedback PDUs, KDF/HMAC authentication, optional checksum handling, IANA registries e security considerations.

Testo RFC originale​

Appendix A.  KDF Example (OpenSSL)

   <CODE BEGINS>
   //
   // Output individual authentication keys of length SHA256_KEY_LEN
   // from derived key material.
   //
   // Return Values: 0 = Failure, 1 = Success
   //
   int kdf_hmac_sha256(char *Kin, uint32_t authUnixTime,
     unsigned char *cAuthKey,   // Client key
     unsigned char *sAuthKey) { // Server key

     int var, keylen = SHA256_KEY_LEN * 2;
     char context[16];
     unsigned char *keyptr, keybuf[keylen];
     EVP_KDF *kdf = NULL;
     EVP_KDF_CTX *kctx = NULL;
     OSSL_PARAM params[16], *p = params;

     //
     // Fetch KDF algorithm and create context
     //
     if ((kdf = EVP_KDF_fetch(NULL, "KBKDF", NULL)) == NULL) {
       return 0;
     }
     if ((kctx = EVP_KDF_CTX_new(kdf)) == NULL) {
       EVP_KDF_free(kdf);
       return 0;
     }

     //
     // Set parameters for KBKDF
     // ---------------------------------------------------------
     *p++ = OSSL_PARAM_construct_utf8_string(
       OSSL_KDF_PARAM_MODE, "COUNTER", 0);
     *p++ = OSSL_PARAM_construct_utf8_string(
       OSSL_KDF_PARAM_MAC, "HMAC", 0);
     *p++ = OSSL_PARAM_construct_utf8_string(
       OSSL_KDF_PARAM_DIGEST, "SHA256", 0);
     *p++ = OSSL_PARAM_construct_octet_string(
       OSSL_KDF_PARAM_KEY, Kin, strlen(Kin));
     *p++ = OSSL_PARAM_construct_octet_string(
       OSSL_KDF_PARAM_SALT, "UDPSTP", 6);
     var = snprintf(context, sizeof(context), "%u", authUnixTime);
     *p++ = OSSL_PARAM_construct_octet_string(
       OSSL_KDF_PARAM_INFO, context, var);
     //
     // Confirm the following are enabled
     //
     var = 1;
     *p++ = OSSL_PARAM_construct_int(OSSL_KDF_PARAM_KBKDF_USE_L, &var);
     *p++ = OSSL_PARAM_construct_int(
       OSSL_KDF_PARAM_KBKDF_USE_SEPARATOR, &var);
     //
     // Set counter length in bits (available as of OpenSSL 3.1)
     //
     var = 32; // Length of 32 is backward compatible with OpenSSL 3.0
     *p++ = OSSL_PARAM_construct_int(OSSL_KDF_PARAM_KBKDF_R, &var);
     *p++ = OSSL_PARAM_construct_end();
     // ---------------------------------------------------------

     //
     // Derive key material
     //
     if (EVP_KDF_derive(kctx, keybuf, keylen, params) < 1) {
       EVP_KDF_CTX_free(kctx);
       EVP_KDF_free(kdf);
       return 0;
     }

     //
     // Output individual keys
     //
     keyptr = keybuf;
     memcpy(cAuthKey, keyptr, SHA256_KEY_LEN);
     keyptr += SHA256_KEY_LEN;
     memcpy(sAuthKey, keyptr, SHA256_KEY_LEN);

     //
     // Cleanup
     //
     EVP_KDF_CTX_free(kctx);
     EVP_KDF_free(kdf);
     return 1;
   }
   <CODE ENDS>

                    Figure 12: KDF Example Code Snippet