mirror of
https://github.com/kovidgoyal/kitty
synced 2026-07-27 18:51:41 +02:00
Code to get random bytes in C, cross-platform
This commit is contained in:
35
kitty/cross-platform-random.h
Normal file
35
kitty/cross-platform-random.h
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 Kovid Goyal <kovid at kovidgoyal.net>
|
||||||
|
*
|
||||||
|
* Distributed under terms of the GPL3 license.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#if __linux__
|
||||||
|
#include <sys/random.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
static inline bool
|
||||||
|
secure_random_bytes(void *buf, size_t nbytes) {
|
||||||
|
unsigned char* p = buf;
|
||||||
|
ssize_t left = nbytes;
|
||||||
|
while(1) {
|
||||||
|
ssize_t n = getrandom(p, left, 0);
|
||||||
|
if (n >= left) return true;
|
||||||
|
if (n < 0) {
|
||||||
|
if (errno != EINTR) return false; // should never happen but if it does, we fail without any feedback
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
left -= n; p += n;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static inline bool
|
||||||
|
secure_random_bytes(void *buf, size_t nbytes) {
|
||||||
|
arc4random_buf(buf, nbytes);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
@@ -10,6 +10,7 @@
|
|||||||
#include "disk-cache.h"
|
#include "disk-cache.h"
|
||||||
#include "uthash.h"
|
#include "uthash.h"
|
||||||
#include "loop-utils.h"
|
#include "loop-utils.h"
|
||||||
|
#include "cross-platform-random.h"
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
@@ -186,6 +187,7 @@ add_to_disk_cache(PyObject *self_, const void *key, size_t key_sz, const uint8_t
|
|||||||
if (s == NULL) {
|
if (s == NULL) {
|
||||||
s = calloc(1, sizeof(CacheEntry));
|
s = calloc(1, sizeof(CacheEntry));
|
||||||
if (!s) { PyErr_NoMemory(); goto end; }
|
if (!s) { PyErr_NoMemory(); goto end; }
|
||||||
|
if (!secure_random_bytes(s->encryption_key, sizeof(s->encryption_key))) { free(s); PyErr_SetFromErrno(PyExc_OSError); goto end; }
|
||||||
s->hash_key = malloc(key_sz);
|
s->hash_key = malloc(key_sz);
|
||||||
if (!s->hash_key) { free(s); PyErr_NoMemory(); goto end; }
|
if (!s->hash_key) { free(s); PyErr_NoMemory(); goto end; }
|
||||||
s->hash_keylen = key_sz;
|
s->hash_keylen = key_sz;
|
||||||
|
|||||||
Reference in New Issue
Block a user