// SPDX-License-Identifier: MIT #include #include #include #include #include #define OQS_STORE_DIR "tmp" #define OQS_STORE_PREFIX "/oqs-temp-file-" #define MAXPATHLEN 128 #if (defined(_WIN32) || defined(__WIN32__)) #include #endif static OQS_STATUS oqs_fstore_init(void) { #ifndef _WIN32 return mkdir(OQS_STORE_DIR, 0755); #else if (CreateDirectory(OQS_STORE_DIR, NULL)) { return OQS_SUCCESS; } else { return OQS_ERROR; } #endif } static OQS_STATUS oqs_fstore(const char *fname, const char *mname, uint8_t *data, size_t len) { char fpath[MAXPATHLEN]; strcpy(fpath, OQS_STORE_DIR); strcat(fpath, OQS_STORE_PREFIX); strcat(fpath, mname); strcat(fpath, fname); FILE *fp = fopen(fpath, "wb"); if (!fp) { fprintf(stderr, "Couldn't open %s for writing.\n", fpath); return OQS_ERROR; } fwrite(data, len, 1, fp); fclose(fp); return OQS_SUCCESS; } static OQS_STATUS oqs_fload(const char *fname, const char *mname, uint8_t *data, size_t len, size_t *rcvd) { size_t len_read = 0, r = 0; uint8_t *dr = NULL; char fpath[MAXPATHLEN]; strcpy(fpath, OQS_STORE_DIR); strcat(fpath, OQS_STORE_PREFIX); strcat(fpath, mname); strcat(fpath, fname); FILE *fp = fopen(fpath, "rb"); if (!fp) { fprintf(stderr, "Couldn't open %s for reading.\n", fpath); return OQS_ERROR; } do { // assume some OSs don't deliver all data in one go... dr = (uint8_t *)(data + len_read); r = fread(dr, 1, len - len_read, fp); len_read += r; } while (r > 0); *rcvd = len_read; if (len_read <= 0) { fprintf(stderr, "Error reading data (operations called in proper sequence?). Expecting %zu. Exiting.\n", len); return OQS_ERROR; } fclose(fp); return OQS_SUCCESS; }