xref: /dflybsd-src/crypto/openssh/sk-api.h (revision 95577b5e0147377b730485d25b052a4472277761)
1*ee116499SAntonio Huete Jimenez /* $OpenBSD: sk-api.h,v 1.15 2022/07/20 03:29:14 djm Exp $ */
20cbfa66cSDaniel Fojt /*
30cbfa66cSDaniel Fojt  * Copyright (c) 2019 Google LLC
40cbfa66cSDaniel Fojt  *
50cbfa66cSDaniel Fojt  * Permission to use, copy, modify, and distribute this software for any
60cbfa66cSDaniel Fojt  * purpose with or without fee is hereby granted, provided that the above
70cbfa66cSDaniel Fojt  * copyright notice and this permission notice appear in all copies.
80cbfa66cSDaniel Fojt  *
90cbfa66cSDaniel Fojt  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
100cbfa66cSDaniel Fojt  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
110cbfa66cSDaniel Fojt  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
120cbfa66cSDaniel Fojt  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
130cbfa66cSDaniel Fojt  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
140cbfa66cSDaniel Fojt  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
150cbfa66cSDaniel Fojt  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
160cbfa66cSDaniel Fojt  */
170cbfa66cSDaniel Fojt 
180cbfa66cSDaniel Fojt #ifndef _SK_API_H
190cbfa66cSDaniel Fojt #define _SK_API_H 1
200cbfa66cSDaniel Fojt 
210cbfa66cSDaniel Fojt #include <stddef.h>
220cbfa66cSDaniel Fojt #ifdef HAVE_STDINT_H
230cbfa66cSDaniel Fojt #include <stdint.h>
240cbfa66cSDaniel Fojt #endif
250cbfa66cSDaniel Fojt 
260cbfa66cSDaniel Fojt /* Flags */
270cbfa66cSDaniel Fojt #define SSH_SK_USER_PRESENCE_REQD	0x01
280cbfa66cSDaniel Fojt #define SSH_SK_USER_VERIFICATION_REQD	0x04
29*ee116499SAntonio Huete Jimenez #define SSH_SK_FORCE_OPERATION		0x10
300cbfa66cSDaniel Fojt #define SSH_SK_RESIDENT_KEY		0x20
310cbfa66cSDaniel Fojt 
320cbfa66cSDaniel Fojt /* Algs */
330cbfa66cSDaniel Fojt #define SSH_SK_ECDSA			0x00
340cbfa66cSDaniel Fojt #define SSH_SK_ED25519			0x01
350cbfa66cSDaniel Fojt 
360cbfa66cSDaniel Fojt /* Error codes */
370cbfa66cSDaniel Fojt #define SSH_SK_ERR_GENERAL		-1
380cbfa66cSDaniel Fojt #define SSH_SK_ERR_UNSUPPORTED		-2
390cbfa66cSDaniel Fojt #define SSH_SK_ERR_PIN_REQUIRED		-3
400cbfa66cSDaniel Fojt #define SSH_SK_ERR_DEVICE_NOT_FOUND	-4
41*ee116499SAntonio Huete Jimenez #define SSH_SK_ERR_CREDENTIAL_EXISTS	-5
420cbfa66cSDaniel Fojt 
430cbfa66cSDaniel Fojt struct sk_enroll_response {
44*ee116499SAntonio Huete Jimenez 	uint8_t flags;
450cbfa66cSDaniel Fojt 	uint8_t *public_key;
460cbfa66cSDaniel Fojt 	size_t public_key_len;
470cbfa66cSDaniel Fojt 	uint8_t *key_handle;
480cbfa66cSDaniel Fojt 	size_t key_handle_len;
490cbfa66cSDaniel Fojt 	uint8_t *signature;
500cbfa66cSDaniel Fojt 	size_t signature_len;
510cbfa66cSDaniel Fojt 	uint8_t *attestation_cert;
520cbfa66cSDaniel Fojt 	size_t attestation_cert_len;
5350a69bb5SSascha Wildner 	uint8_t *authdata;
5450a69bb5SSascha Wildner 	size_t authdata_len;
550cbfa66cSDaniel Fojt };
560cbfa66cSDaniel Fojt 
570cbfa66cSDaniel Fojt struct sk_sign_response {
580cbfa66cSDaniel Fojt 	uint8_t flags;
590cbfa66cSDaniel Fojt 	uint32_t counter;
600cbfa66cSDaniel Fojt 	uint8_t *sig_r;
610cbfa66cSDaniel Fojt 	size_t sig_r_len;
620cbfa66cSDaniel Fojt 	uint8_t *sig_s;
630cbfa66cSDaniel Fojt 	size_t sig_s_len;
640cbfa66cSDaniel Fojt };
650cbfa66cSDaniel Fojt 
660cbfa66cSDaniel Fojt struct sk_resident_key {
670cbfa66cSDaniel Fojt 	uint32_t alg;
680cbfa66cSDaniel Fojt 	size_t slot;
690cbfa66cSDaniel Fojt 	char *application;
700cbfa66cSDaniel Fojt 	struct sk_enroll_response key;
7150a69bb5SSascha Wildner 	uint8_t flags;
72*ee116499SAntonio Huete Jimenez 	uint8_t *user_id;
73*ee116499SAntonio Huete Jimenez 	size_t user_id_len;
740cbfa66cSDaniel Fojt };
750cbfa66cSDaniel Fojt 
760cbfa66cSDaniel Fojt struct sk_option {
770cbfa66cSDaniel Fojt 	char *name;
780cbfa66cSDaniel Fojt 	char *value;
790cbfa66cSDaniel Fojt 	uint8_t required;
800cbfa66cSDaniel Fojt };
810cbfa66cSDaniel Fojt 
82*ee116499SAntonio Huete Jimenez #define SSH_SK_VERSION_MAJOR		0x000a0000 /* current API version */
830cbfa66cSDaniel Fojt #define SSH_SK_VERSION_MAJOR_MASK	0xffff0000
840cbfa66cSDaniel Fojt 
850cbfa66cSDaniel Fojt /* Return the version of the middleware API */
860cbfa66cSDaniel Fojt uint32_t sk_api_version(void);
870cbfa66cSDaniel Fojt 
880cbfa66cSDaniel Fojt /* Enroll a U2F key (private key generation) */
890cbfa66cSDaniel Fojt int sk_enroll(uint32_t alg, const uint8_t *challenge, size_t challenge_len,
900cbfa66cSDaniel Fojt     const char *application, uint8_t flags, const char *pin,
910cbfa66cSDaniel Fojt     struct sk_option **options, struct sk_enroll_response **enroll_response);
920cbfa66cSDaniel Fojt 
930cbfa66cSDaniel Fojt /* Sign a challenge */
9450a69bb5SSascha Wildner int sk_sign(uint32_t alg, const uint8_t *data, size_t data_len,
950cbfa66cSDaniel Fojt     const char *application, const uint8_t *key_handle, size_t key_handle_len,
960cbfa66cSDaniel Fojt     uint8_t flags, const char *pin, struct sk_option **options,
970cbfa66cSDaniel Fojt     struct sk_sign_response **sign_response);
980cbfa66cSDaniel Fojt 
990cbfa66cSDaniel Fojt /* Enumerate all resident keys */
1000cbfa66cSDaniel Fojt int sk_load_resident_keys(const char *pin, struct sk_option **options,
1010cbfa66cSDaniel Fojt     struct sk_resident_key ***rks, size_t *nrks);
1020cbfa66cSDaniel Fojt 
1030cbfa66cSDaniel Fojt #endif /* _SK_API_H */
104