xref: /dflybsd-src/crypto/openssh/sk-api.h (revision 0cbfa66cdb87e23928a110d9b02839f403e32c11)
1*0cbfa66cSDaniel Fojt /* $OpenBSD: sk-api.h,v 1.9 2020/04/28 04:02:29 djm Exp $ */
2*0cbfa66cSDaniel Fojt /*
3*0cbfa66cSDaniel Fojt  * Copyright (c) 2019 Google LLC
4*0cbfa66cSDaniel Fojt  *
5*0cbfa66cSDaniel Fojt  * Permission to use, copy, modify, and distribute this software for any
6*0cbfa66cSDaniel Fojt  * purpose with or without fee is hereby granted, provided that the above
7*0cbfa66cSDaniel Fojt  * copyright notice and this permission notice appear in all copies.
8*0cbfa66cSDaniel Fojt  *
9*0cbfa66cSDaniel Fojt  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10*0cbfa66cSDaniel Fojt  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11*0cbfa66cSDaniel Fojt  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12*0cbfa66cSDaniel Fojt  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13*0cbfa66cSDaniel Fojt  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14*0cbfa66cSDaniel Fojt  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15*0cbfa66cSDaniel Fojt  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16*0cbfa66cSDaniel Fojt  */
17*0cbfa66cSDaniel Fojt 
18*0cbfa66cSDaniel Fojt #ifndef _SK_API_H
19*0cbfa66cSDaniel Fojt #define _SK_API_H 1
20*0cbfa66cSDaniel Fojt 
21*0cbfa66cSDaniel Fojt #include <stddef.h>
22*0cbfa66cSDaniel Fojt #ifdef HAVE_STDINT_H
23*0cbfa66cSDaniel Fojt #include <stdint.h>
24*0cbfa66cSDaniel Fojt #endif
25*0cbfa66cSDaniel Fojt 
26*0cbfa66cSDaniel Fojt /* Flags */
27*0cbfa66cSDaniel Fojt #define SSH_SK_USER_PRESENCE_REQD	0x01
28*0cbfa66cSDaniel Fojt #define SSH_SK_USER_VERIFICATION_REQD	0x04
29*0cbfa66cSDaniel Fojt #define SSH_SK_RESIDENT_KEY		0x20
30*0cbfa66cSDaniel Fojt 
31*0cbfa66cSDaniel Fojt /* Algs */
32*0cbfa66cSDaniel Fojt #define SSH_SK_ECDSA			0x00
33*0cbfa66cSDaniel Fojt #define SSH_SK_ED25519			0x01
34*0cbfa66cSDaniel Fojt 
35*0cbfa66cSDaniel Fojt /* Error codes */
36*0cbfa66cSDaniel Fojt #define SSH_SK_ERR_GENERAL		-1
37*0cbfa66cSDaniel Fojt #define SSH_SK_ERR_UNSUPPORTED		-2
38*0cbfa66cSDaniel Fojt #define SSH_SK_ERR_PIN_REQUIRED		-3
39*0cbfa66cSDaniel Fojt #define SSH_SK_ERR_DEVICE_NOT_FOUND	-4
40*0cbfa66cSDaniel Fojt 
41*0cbfa66cSDaniel Fojt struct sk_enroll_response {
42*0cbfa66cSDaniel Fojt 	uint8_t *public_key;
43*0cbfa66cSDaniel Fojt 	size_t public_key_len;
44*0cbfa66cSDaniel Fojt 	uint8_t *key_handle;
45*0cbfa66cSDaniel Fojt 	size_t key_handle_len;
46*0cbfa66cSDaniel Fojt 	uint8_t *signature;
47*0cbfa66cSDaniel Fojt 	size_t signature_len;
48*0cbfa66cSDaniel Fojt 	uint8_t *attestation_cert;
49*0cbfa66cSDaniel Fojt 	size_t attestation_cert_len;
50*0cbfa66cSDaniel Fojt };
51*0cbfa66cSDaniel Fojt 
52*0cbfa66cSDaniel Fojt struct sk_sign_response {
53*0cbfa66cSDaniel Fojt 	uint8_t flags;
54*0cbfa66cSDaniel Fojt 	uint32_t counter;
55*0cbfa66cSDaniel Fojt 	uint8_t *sig_r;
56*0cbfa66cSDaniel Fojt 	size_t sig_r_len;
57*0cbfa66cSDaniel Fojt 	uint8_t *sig_s;
58*0cbfa66cSDaniel Fojt 	size_t sig_s_len;
59*0cbfa66cSDaniel Fojt };
60*0cbfa66cSDaniel Fojt 
61*0cbfa66cSDaniel Fojt struct sk_resident_key {
62*0cbfa66cSDaniel Fojt 	uint32_t alg;
63*0cbfa66cSDaniel Fojt 	size_t slot;
64*0cbfa66cSDaniel Fojt 	char *application;
65*0cbfa66cSDaniel Fojt 	struct sk_enroll_response key;
66*0cbfa66cSDaniel Fojt };
67*0cbfa66cSDaniel Fojt 
68*0cbfa66cSDaniel Fojt struct sk_option {
69*0cbfa66cSDaniel Fojt 	char *name;
70*0cbfa66cSDaniel Fojt 	char *value;
71*0cbfa66cSDaniel Fojt 	uint8_t required;
72*0cbfa66cSDaniel Fojt };
73*0cbfa66cSDaniel Fojt 
74*0cbfa66cSDaniel Fojt #define SSH_SK_VERSION_MAJOR		0x00050000 /* current API version */
75*0cbfa66cSDaniel Fojt #define SSH_SK_VERSION_MAJOR_MASK	0xffff0000
76*0cbfa66cSDaniel Fojt 
77*0cbfa66cSDaniel Fojt /* Return the version of the middleware API */
78*0cbfa66cSDaniel Fojt uint32_t sk_api_version(void);
79*0cbfa66cSDaniel Fojt 
80*0cbfa66cSDaniel Fojt /* Enroll a U2F key (private key generation) */
81*0cbfa66cSDaniel Fojt int sk_enroll(uint32_t alg, const uint8_t *challenge, size_t challenge_len,
82*0cbfa66cSDaniel Fojt     const char *application, uint8_t flags, const char *pin,
83*0cbfa66cSDaniel Fojt     struct sk_option **options, struct sk_enroll_response **enroll_response);
84*0cbfa66cSDaniel Fojt 
85*0cbfa66cSDaniel Fojt /* Sign a challenge */
86*0cbfa66cSDaniel Fojt int sk_sign(uint32_t alg, const uint8_t *message, size_t message_len,
87*0cbfa66cSDaniel Fojt     const char *application, const uint8_t *key_handle, size_t key_handle_len,
88*0cbfa66cSDaniel Fojt     uint8_t flags, const char *pin, struct sk_option **options,
89*0cbfa66cSDaniel Fojt     struct sk_sign_response **sign_response);
90*0cbfa66cSDaniel Fojt 
91*0cbfa66cSDaniel Fojt /* Enumerate all resident keys */
92*0cbfa66cSDaniel Fojt int sk_load_resident_keys(const char *pin, struct sk_option **options,
93*0cbfa66cSDaniel Fojt     struct sk_resident_key ***rks, size_t *nrks);
94*0cbfa66cSDaniel Fojt 
95*0cbfa66cSDaniel Fojt #endif /* _SK_API_H */
96