blob: 3bd563f97ba481ce1adbe9d4076c187c3a5e78b7 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
library zx;
const CPRNG_DRAW_MAX_LEN usize64 = 256;
const CPRNG_ADD_ENTROPY_MAX_LEN usize64 = 256;
@transport("Syscall")
closed protocol Cprng {
@internal
strict DrawOnce() -> (struct {
@voidptr
buffer vector<byte>:CPRNG_DRAW_MAX_LEN;
}) error Status;
/// ## Summary
///
/// Draw from the kernel's CPRNG.
///
/// ## Declaration
///
/// ```c
/// #include <zircon/syscalls.h>
///
/// void zx_cprng_draw(void* buffer, size_t buffer_size);
/// ```
///
/// ## Description
///
/// `zx_cprng_draw()` draws random bytes from the kernel CPRNG. This data should
/// be suitable for cryptographic applications.
///
/// Clients that require a large volume of randomness should consider using these
/// bytes to seed a user-space random number generator for better performance.
/// "Large" here would mean a large multiple of `ZX_CPRNG_DRAW_MAX_LEN`, which is
/// currently 256. As always, test the actual latency of your call site before
/// optimizing.
///
/// ## Rights
///
/// None.
///
/// ## Notes
///
/// `zx_cprng_draw()` terminates the calling process if `buffer` is not a valid
/// userspace pointer.
///
/// There are no other error conditions. If its arguments are valid,
/// `zx_cprng_draw()` will succeed.
///
/// ## See also
///
/// - [`zx_cprng_add_entropy()`]
///
/// [`zx_cprng_add_entropy()`]: cprng_add_entropy.md
@vdsocall
strict Draw() -> (struct {
@voidptr
buffer vector<byte>:CPRNG_DRAW_MAX_LEN;
});
/// ## Summary
///
/// Add entropy to the kernel CPRNG.
///
/// ## Declaration
///
/// ```c
/// #include <zircon/syscalls.h>
///
/// zx_status_t zx_cprng_add_entropy(const void* buffer, size_t buffer_size);
/// ```
///
/// ## Description
///
/// `zx_cprng_add_entropy()` mixes the given entropy into the kernel CPRNG.
/// a privileged operation. It will accept at most `ZX_CPRNG_ADD_ENTROPY_MAX_LEN`
/// bytes of entropy at a time.
///
/// ## Rights
///
/// None.
///
/// ## Return value
///
/// `zx_cprng_add_entropy()` returns `ZX_OK` on success.
///
/// ## Errors
///
/// `ZX_ERR_INVALID_ARGS` *buffer_size* is too large, or *buffer* is not a valid
/// userspace pointer.
///
/// ## BUGS
///
/// This syscall should be very privileged.
///
/// ## See also
///
/// - [`zx_cprng_draw()`]
///
/// [`zx_cprng_draw()`]: cprng_draw.md
strict AddEntropy(struct {
@voidptr
buffer vector<byte>:CPRNG_ADD_ENTROPY_MAX_LEN;
}) -> () error Status;
};