/** * @file simple_use_case_setoptions_c.c * * @brief Sample code to demonstrate the Quantum Origin SDK C API. Configured is done programmatically using various setopt() calls. * System: Quantum Origin SDK * Component: Quantum Origin SDK Documentation * * Please contact Quantinuum for production license(s). * * @author Quantinuum CSE */ // clang-format off #include #include #include #include #include #include #include #include #include "simple_use_case_setoptions_license.h" #define BUFFER_SIZE 400U // Forward declaration to ensure that the interface function is correctly defined. static tQOSDK_LOGGER_CALLBACK_FN my_qo_logger_callback; //-------------------------------------------------------------- // Logger callback //-------------------------------------------------------------- static void my_qo_logger_callback(const tQOSDK_LOGLEVEL logLevel, const char *szMsg, size_t msgLen) { // Store or present the inbound message somewhere. switch(logLevel) { case QOSDK_LOGLEVEL_NONE : break; case QOSDK_LOGLEVEL_CRITICAL : fprintf(stderr, "[QuantumOrigin] CRITICAL: %.*s\n", (int)msgLen, szMsg); break; case QOSDK_LOGLEVEL_ERROR : fprintf(stderr, "[QuantumOrigin] ERROR: %.*s\n", (int)msgLen, szMsg); break; case QOSDK_LOGLEVEL_WARNING : fprintf(stderr, "[QuantumOrigin] WARNING: %.*s\n", (int)msgLen, szMsg); break; case QOSDK_LOGLEVEL_INFO : fprintf(stderr, "[QuantumOrigin] INFO: %.*s\n", (int)msgLen, szMsg); break; case QOSDK_LOGLEVEL_DEBUG : fprintf(stderr, "[QuantumOrigin] DEBUG: %.*s\n", (int)msgLen, szMsg); break; default: case QOSDK_LOGLEVEL_TRACE : fprintf(stderr, "[QuantumOrigin] TRACE: %.*s\n", (int)msgLen, szMsg); break; } } //-------------------------------------------------------------- // Simple hex dump //-------------------------------------------------------------- static void hex_dump(const char *szTitle, const uint8_t *pData, size_t cbData) { printf("%s [%lu bytes]: ", szTitle ? szTitle : "HEXDUMP: ", (unsigned long)cbData); if (pData && cbData) { for (int ii = 0; ii < cbData; ii++) { printf("%2.2X ", pData[ii]); } } printf("\n"); } //-------------------------------------------------------------- // Main //-------------------------------------------------------------- int main(int argc, char **argv) { tQOSDK_CTX * pQuantumOrigin = NULL; uint32_t bytesRequested = 0xFFFFFFFF; size_t bytesSupplied = 0; unsigned char resultBuffer[BUFFER_SIZE]; int erc = ERC_QOSDK_OK; tQOSDK_CONFIG *pQuantumOriginConfig = NULL; // Parse parameters for (int jj = 1; jj < argc; jj++) { if (strcmp(argv[jj], "--help") == 0) { printf("USAGE: simple_use_case_setoptions_c [] // (Default = 32 bytes)\n"); return EXIT_SUCCESS; } if (bytesRequested == 0xFFFFFFFF) { if (argv[jj][0] == '-') { fprintf(stderr, "ERROR: Number of bytes requested cannot be negative\n"); return EXIT_FAILURE; } bytesRequested = (uint32_t)atol(argv[jj]); if (bytesRequested > BUFFER_SIZE) { fprintf(stderr, "ERROR: Number of bytes requested must be <= %u\n", BUFFER_SIZE); return EXIT_FAILURE; } continue; } } if (bytesRequested == 0xFFFFFFFF) { bytesRequested = 32; } // Initialise Quantum Origin Logging erc = qosdk_initialise_logging(QOSDK_LOGMODE_STDERR, QOSDK_LOGLEVEL_WARNING, NULL); if (erc) { const char *szQuantumOriginError = qosdk_get_error_description(); fprintf(stderr, "ERROR: Failed to initialize logging (QuantumOriginError=%d: \"%s\")\n", erc, szQuantumOriginError?szQuantumOriginError:"Unspecified"); return EXIT_FAILURE; } // Register a Quantum Origin Logging callback erc = qosdk_set_logging_callback(my_qo_logger_callback); if (erc) { const char *szQuantumOriginError = qosdk_get_error_description(); fprintf(stderr, "ERROR: Failed to set logging callback (QuantumOriginError=%d: \"%s\")\n", erc, szQuantumOriginError?szQuantumOriginError:"Unspecified"); return EXIT_FAILURE; } // Initialise Quantum Origin pQuantumOriginConfig = qosdk_setopt_init(); if (!pQuantumOriginConfig) { erc = ERC_QOSDK_UNSPECIFIED_ERROR; goto cleanup_and_exit; } erc = qosdk_setopt_int (pQuantumOriginConfig, QOSDK_OPT_LOGGING_MODE , QOSDK_LOGMODE_STDERR ); if (erc) { goto cleanup_and_exit; } // e.g. [STDOUT, STDERR, SYSLOG, DAILYFILE, FILE, INHERIT] erc = qosdk_setopt_int (pQuantumOriginConfig, QOSDK_OPT_LOGGING_LEVEL , QOSDK_LOGLEVEL_ERR ); if (erc) { goto cleanup_and_exit; } // e.g. [NONE, CRITICAL, ERROR, WARNING, INFO, DEBUG, TRACE] erc = qosdk_setopt_int (pQuantumOriginConfig, QOSDK_OPT_CACHE_TYPE , QOSDK_CACHETYPE_CACHING ); if (erc) { goto cleanup_and_exit; } // e.g. [CACHING, SYNCCACHING, MULTITHREAD, NONE] erc = qosdk_setopt_int (pQuantumOriginConfig, QOSDK_OPT_CACHE_SIZE , 10240 ); if (erc) { goto cleanup_and_exit; } // e.g. [1048576] erc = qosdk_setopt_int (pQuantumOriginConfig, QOSDK_OPT_CACHE_PREFILL , 10240 ); if (erc) { goto cleanup_and_exit; } // e.g. [128] erc = qosdk_setopt_int (pQuantumOriginConfig, QOSDK_OPT_CACHE_REFILL_AT , 2048 ); if (erc) { goto cleanup_and_exit; } // e.g. [1024] erc = qosdk_setopt_int (pQuantumOriginConfig, QOSDK_OPT_WSR_TYPE , QOSDK_WSRTYPE_RDSEED ); if (erc) { goto cleanup_and_exit; } // e.g. [QO_JITTER, RDSEED, FILE, JITTER, CALLBACK_FUNCTION] erc = qosdk_setopt_bytes(pQuantumOriginConfig, QOSDK_OPT_LICENSE_DATA , (uint8_t *)licenseContent, sizeof(licenseContent) ); if (erc) { goto cleanup_and_exit; } erc = qosdk_setopt_int (pQuantumOriginConfig, QOSDK_OPT_OPERATION_MODE , QOSDK_OPMODE_NORMAL ); if (erc) { goto cleanup_and_exit; } pQuantumOrigin = qosdk_init_from_config_struct(pQuantumOriginConfig); if (pQuantumOrigin == NULL) { erc = qosdk_get_error_code(); const char *szQuantumOriginError = qosdk_get_error_description(); fprintf(stderr, "ERROR: Failed to initialize Quantum Origin with qosdk_init_from_config_struct() (QuantumOriginErrorMsg=%s)\n", szQuantumOriginError?szQuantumOriginError:"Unspecified"); goto cleanup_and_exit; } // The pQuantumOriginConfig structure is no longer needed, and can be destroyed. qosdk_setopt_cleanup(pQuantumOriginConfig); pQuantumOriginConfig = NULL; // Exercise the logging callback qosdk_log_message(QOSDK_LOGLEVEL_WARNING, "This is a test warning message"); // Get randomness bytesSupplied = 0; erc = qosdk_get_randomness(pQuantumOrigin, resultBuffer, bytesRequested, &bytesSupplied); if (erc) { const char *szQuantumOriginError = qosdk_get_error_description(); fprintf(stderr, "ERROR: Failed to get randomness. (QuantumOriginError=%d: \"%s\")\n", erc, szQuantumOriginError?szQuantumOriginError:"Unspecified"); goto cleanup_and_exit; } // Print results hex_dump("RESULT", resultBuffer, bytesSupplied); erc = ERC_QOSDK_OK; cleanup_and_exit: // Cleanup and exit if (pQuantumOriginConfig) { qosdk_setopt_cleanup(pQuantumOriginConfig); pQuantumOriginConfig = NULL; } if (pQuantumOrigin) { qosdk_destroy(pQuantumOrigin); pQuantumOrigin = NULL; } qosdk_clear_logging_callback(); if (erc != ERC_QOSDK_OK) { fprintf(stderr, "ERROR: simple_use_case_setoptions_c failed with errCode=%d\n", erc); return EXIT_FAILURE; } return EXIT_SUCCESS; }