File: torture_sk.h

package info (click to toggle)
libssh 0.12.0-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 7,804 kB
  • sloc: ansic: 124,224; cpp: 421; xml: 226; sh: 206; makefile: 26; python: 9
file content (167 lines) | stat: -rw-r--r-- 5,977 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
/*
 * torture_sk.h - torture library for testing security keys
 *
 * This file is part of the SSH Library
 *
 * Copyright (c) 2025 Praneeth Sarode <praneethsarode@gmail.com>
 *
 * The SSH Library is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation; either version 2.1 of the License, or (at your
 * option) any later version.
 *
 * The SSH Library is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
 * License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with the SSH Library; see the file COPYING.  If not, write to
 * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
 * MA 02111-1307, USA.
 */

#ifndef _TORTURE_SK_H
#define _TORTURE_SK_H

#include "config.h"

#define LIBSSH_STATIC

#include "libssh/callbacks.h"
#include "libssh/pki.h"
#include "torture.h"
#include "torture_pki.h"

/**
 * @brief Validate a security key (ssh_key) structure
 *
 * Checks that the provided key is not NULL, matches the expected key type,
 * and other internal fields.
 *
 * @param[in] key           The key to validate
 * @param[in] expected_type The expected key type (e.g., SSH_KEYTYPE_SK_ECDSA)
 * @param[in] private       true if key should be private, false for public
 */
void assert_sk_key_valid(ssh_key key,
                         enum ssh_keytypes_e expected_type,
                         bool private);

/**
 * @brief Validate a security key signature structure
 *
 * Checks that the signature is not NULL, matches the expected key type, and
 * other internal fields. Also verifies that the signature was produced by the
 * given signing key.
 *
 * @param[in] signature     The signature to validate
 * @param[in] expected_type The expected key type (e.g., SSH_KEYTYPE_SK_ECDSA)
 * @param[in] signing_key   The key that should have produced the signature
 * @param[in] data          The signed data buffer
 * @param[in] data_len      Length of the signed data
 */
void assert_sk_signature_valid(ssh_signature signature,
                               enum ssh_keytypes_e expected_type,
                               ssh_key signing_key,
                               const uint8_t *data,
                               size_t data_len);

/**
 * @brief Create and initialize a PKI context configured for security key
 * operations.
 *
 * Parameters:
 * @param[in] application    Application string
 * @param[in] flags          SK flags
 * @param[in] challenge_data Optional challenge bytes (may be NULL)
 * @param[in] challenge_len  Length of challenge_data
 * @param[in] pin_callback   Callback used to obtain the PIN (may be NULL)
 * @param[in] device_path    Optional device path (may be NULL)
 * @param[in] user_id        Optional user_id string (may be NULL)
 * @param[in] sk_callbacks   Pointer to SK callbacks (may be NULL)
 *
 * @return A configured ssh_pki_ctx on success, or NULL on allocation failure.
 */
ssh_pki_ctx
torture_create_sk_pki_ctx(const char *application,
                          uint8_t flags,
                          const void *challenge_data,
                          size_t challenge_len,
                          ssh_auth_callback pin_callback,
                          const char *device_path,
                          const char *user_id,
                          const struct ssh_sk_callbacks_struct *sk_callbacks);

/**
 * @brief Validate a security key enrollment response structure
 *
 * Validates that an sk_enroll_response contains valid data from a FIDO2
 * enrollment operation, including public key, key handle, signature,
 * attestation certificate, and authenticator data.
 *
 * @param[in] response The enrollment response to validate
 * @param[in] flags    The expected flags that should match the response flags
 */
void assert_sk_enroll_response(struct sk_enroll_response *response, int flags);

/**
 * @brief Validate a security key sign response structure
 *
 * Validates that an sk_sign_response contains valid signature data from
 * a FIDO2 sign operation.
 *
 * @param[in] response The sign response to validate
 * @param[in] key_type The key type (e.g., SSH_SK_ECDSA, SSH_SK_ED25519)
 */
void assert_sk_sign_response(struct sk_sign_response *response,
                             enum ssh_keytypes_e key_type);

/**
 * @brief Validate a security key resident key structure
 *
 * Validates that an sk_resident_key contains valid data including application
 * identifier, user ID, public key, and key handle.
 *
 * @param[in] resident_key The resident key to validate
 */
void assert_sk_resident_key(struct sk_resident_key *resident_key);

/**
 * @brief Get security key PIN from environment variable
 *
 * Reads the TORTURE_SK_PIN environment variable and returns its value.
 *
 * @return Pointer to PIN string if set and non-empty, NULL otherwise
 */
const char *torture_get_sk_pin(void);

/**
 * @brief Get dummy security key callbacks for testing
 *
 * Returns dummy security key callbacks from openssh's sk-dummy
 * if available, or NULL if not.
 *
 * @return Pointer to ssh_sk_callbacks_struct or NULL if unavailable.
 *
 */
const struct ssh_sk_callbacks_struct *torture_get_sk_dummy_callbacks(void);

/**
 * @brief Get security key callbacks for testing
 *
 * Returns the default sk callbacks if TORTURE_SK_USBHID is set,
 * otherwise returns dummy callbacks from openssh sk-dummy, or NULL if
 * unavailable.
 *
 * @return Pointer to ssh_sk_callbacks_struct or NULL if unavailable
 */
const struct ssh_sk_callbacks_struct *torture_get_sk_callbacks(void);

/**
 * @brief Check if using sk-dummy callbacks for testing
 *
 * @return true if using sk-dummy callbacks, false otherwise
 */
bool torture_sk_is_using_sk_dummy(void);

#endif /* _TORTURE_SK_H */