xref: /openbsd/lib/libfido2/src/fido/credman.h (revision c4a807ed)
1d75efeb7Sdjm /*
2*c4a807edSdjm  * Copyright (c) 2019-2021 Yubico AB. All rights reserved.
3d75efeb7Sdjm  * Use of this source code is governed by a BSD-style
4d75efeb7Sdjm  * license that can be found in the LICENSE file.
5d75efeb7Sdjm  */
6d75efeb7Sdjm 
7d75efeb7Sdjm #ifndef _FIDO_CREDMAN_H
8d75efeb7Sdjm #define _FIDO_CREDMAN_H
9d75efeb7Sdjm 
10d75efeb7Sdjm #include <stdint.h>
11d75efeb7Sdjm #include <stdlib.h>
12d75efeb7Sdjm 
1332a20e26Sdjm #ifdef _FIDO_INTERNAL
1432a20e26Sdjm #include "blob.h"
15d75efeb7Sdjm #include "fido/err.h"
16d75efeb7Sdjm #include "fido/param.h"
1732a20e26Sdjm #include "fido/types.h"
1832a20e26Sdjm #else
1932a20e26Sdjm #include <fido.h>
2032a20e26Sdjm #include <fido/err.h>
2132a20e26Sdjm #include <fido/param.h>
2232a20e26Sdjm #endif
23d75efeb7Sdjm 
24739189a3Sdjm #ifdef __cplusplus
25739189a3Sdjm extern "C" {
26739189a3Sdjm #endif /* __cplusplus */
27739189a3Sdjm 
28d75efeb7Sdjm #ifdef _FIDO_INTERNAL
29d75efeb7Sdjm struct fido_credman_metadata {
30d75efeb7Sdjm 	uint64_t rk_existing;
31d75efeb7Sdjm 	uint64_t rk_remaining;
32d75efeb7Sdjm };
33d75efeb7Sdjm 
34d75efeb7Sdjm struct fido_credman_single_rp {
35d75efeb7Sdjm 	fido_rp_t rp_entity;
36d75efeb7Sdjm 	fido_blob_t rp_id_hash;
37d75efeb7Sdjm };
38d75efeb7Sdjm 
39d75efeb7Sdjm struct fido_credman_rp {
40d75efeb7Sdjm 	struct fido_credman_single_rp *ptr;
41d75efeb7Sdjm 	size_t n_alloc; /* number of allocated entries */
42d75efeb7Sdjm 	size_t n_rx;    /* number of populated entries */
43d75efeb7Sdjm };
44d75efeb7Sdjm 
45d75efeb7Sdjm struct fido_credman_rk {
46d75efeb7Sdjm 	fido_cred_t *ptr;
47d75efeb7Sdjm 	size_t n_alloc; /* number of allocated entries */
48d75efeb7Sdjm 	size_t n_rx;    /* number of populated entries */
49d75efeb7Sdjm };
50d75efeb7Sdjm #endif
51d75efeb7Sdjm 
52d75efeb7Sdjm typedef struct fido_credman_metadata fido_credman_metadata_t;
53d75efeb7Sdjm typedef struct fido_credman_rk fido_credman_rk_t;
54d75efeb7Sdjm typedef struct fido_credman_rp fido_credman_rp_t;
55d75efeb7Sdjm 
56d75efeb7Sdjm const char *fido_credman_rp_id(const fido_credman_rp_t *, size_t);
57d75efeb7Sdjm const char *fido_credman_rp_name(const fido_credman_rp_t *, size_t);
58d75efeb7Sdjm 
59d75efeb7Sdjm const fido_cred_t *fido_credman_rk(const fido_credman_rk_t *, size_t);
60d75efeb7Sdjm const unsigned char *fido_credman_rp_id_hash_ptr(const fido_credman_rp_t *,
61d75efeb7Sdjm     size_t);
62d75efeb7Sdjm 
63d75efeb7Sdjm fido_credman_metadata_t *fido_credman_metadata_new(void);
64d75efeb7Sdjm fido_credman_rk_t *fido_credman_rk_new(void);
65d75efeb7Sdjm fido_credman_rp_t *fido_credman_rp_new(void);
66d75efeb7Sdjm 
67d75efeb7Sdjm int fido_credman_del_dev_rk(fido_dev_t *, const unsigned char *, size_t,
68d75efeb7Sdjm     const char *);
69d75efeb7Sdjm int fido_credman_get_dev_metadata(fido_dev_t *, fido_credman_metadata_t *,
70d75efeb7Sdjm     const char *);
71d75efeb7Sdjm int fido_credman_get_dev_rk(fido_dev_t *, const char *, fido_credman_rk_t *,
72d75efeb7Sdjm     const char *);
73d75efeb7Sdjm int fido_credman_get_dev_rp(fido_dev_t *, fido_credman_rp_t *, const char *);
74*c4a807edSdjm int fido_credman_set_dev_rk(fido_dev_t *, fido_cred_t *, const char *);
75d75efeb7Sdjm 
76d75efeb7Sdjm size_t fido_credman_rk_count(const fido_credman_rk_t *);
77d75efeb7Sdjm size_t fido_credman_rp_count(const fido_credman_rp_t *);
78d75efeb7Sdjm size_t fido_credman_rp_id_hash_len(const fido_credman_rp_t *, size_t);
79d75efeb7Sdjm 
80d75efeb7Sdjm uint64_t fido_credman_rk_existing(const fido_credman_metadata_t *);
81d75efeb7Sdjm uint64_t fido_credman_rk_remaining(const fido_credman_metadata_t *);
82d75efeb7Sdjm 
83d75efeb7Sdjm void fido_credman_metadata_free(fido_credman_metadata_t **);
84d75efeb7Sdjm void fido_credman_rk_free(fido_credman_rk_t **);
85d75efeb7Sdjm void fido_credman_rp_free(fido_credman_rp_t **);
86d75efeb7Sdjm 
87739189a3Sdjm #ifdef __cplusplus
88739189a3Sdjm } /* extern "C" */
89739189a3Sdjm #endif /* __cplusplus */
90739189a3Sdjm 
91d75efeb7Sdjm #endif /* !_FIDO_CREDMAN_H */
92