libc/nls: Sync with FreeBSD.
[dragonfly.git] / crypto / openssh / key.c
blob6e338c495bbbb00aaf9ad2d51428ce0d3650fb0a
1 /* $OpenBSD: key.c,v 1.131 2017/05/30 14:16:41 markus Exp $ */
2 /*
3 * placed in the public domain
4 */
6 #include "includes.h"
8 #include <sys/types.h>
9 #include <errno.h>
10 #include <stdarg.h>
11 #include <stdio.h>
12 #include <limits.h>
14 #define SSH_KEY_NO_DEFINE
15 #include "key.h"
17 #include "compat.h"
18 #include "sshkey.h"
19 #include "ssherr.h"
20 #include "log.h"
21 #include "authfile.h"
23 static void
24 fatal_on_fatal_errors(int r, const char *func, int extra_fatal)
26 if (r == SSH_ERR_INTERNAL_ERROR ||
27 r == SSH_ERR_ALLOC_FAIL ||
28 (extra_fatal != 0 && r == extra_fatal))
29 fatal("%s: %s", func, ssh_err(r));
32 Key *
33 key_from_blob(const u_char *blob, u_int blen)
35 int r;
36 Key *ret = NULL;
38 if ((r = sshkey_from_blob(blob, blen, &ret)) != 0) {
39 fatal_on_fatal_errors(r, __func__, 0);
40 error("%s: %s", __func__, ssh_err(r));
41 return NULL;
43 return ret;
46 int
47 key_to_blob(const Key *key, u_char **blobp, u_int *lenp)
49 u_char *blob;
50 size_t blen;
51 int r;
53 if (blobp != NULL)
54 *blobp = NULL;
55 if (lenp != NULL)
56 *lenp = 0;
57 if ((r = sshkey_to_blob(key, &blob, &blen)) != 0) {
58 fatal_on_fatal_errors(r, __func__, 0);
59 error("%s: %s", __func__, ssh_err(r));
60 return 0;
62 if (blen > INT_MAX)
63 fatal("%s: giant len %zu", __func__, blen);
64 if (blobp != NULL)
65 *blobp = blob;
66 if (lenp != NULL)
67 *lenp = blen;
68 return blen;
71 int
72 key_sign(const Key *key, u_char **sigp, u_int *lenp,
73 const u_char *data, u_int datalen, const char *alg)
75 int r;
76 u_char *sig;
77 size_t siglen;
79 if (sigp != NULL)
80 *sigp = NULL;
81 if (lenp != NULL)
82 *lenp = 0;
83 if ((r = sshkey_sign(key, &sig, &siglen,
84 data, datalen, alg, datafellows)) != 0) {
85 fatal_on_fatal_errors(r, __func__, 0);
86 error("%s: %s", __func__, ssh_err(r));
87 return -1;
89 if (siglen > INT_MAX)
90 fatal("%s: giant len %zu", __func__, siglen);
91 if (sigp != NULL)
92 *sigp = sig;
93 if (lenp != NULL)
94 *lenp = siglen;
95 return 0;
98 int
99 key_verify(const Key *key, const u_char *signature, u_int signaturelen,
100 const u_char *data, u_int datalen)
102 int r;
104 if ((r = sshkey_verify(key, signature, signaturelen,
105 data, datalen, datafellows)) != 0) {
106 fatal_on_fatal_errors(r, __func__, 0);
107 error("%s: %s", __func__, ssh_err(r));
108 return r == SSH_ERR_SIGNATURE_INVALID ? 0 : -1;
110 return 1;
113 Key *
114 key_demote(const Key *k)
116 int r;
117 Key *ret = NULL;
119 if ((r = sshkey_demote(k, &ret)) != 0)
120 fatal("%s: %s", __func__, ssh_err(r));
121 return ret;
125 key_drop_cert(Key *k)
127 int r;
129 if ((r = sshkey_drop_cert(k)) != 0) {
130 fatal_on_fatal_errors(r, __func__, 0);
131 error("%s: %s", __func__, ssh_err(r));
132 return -1;
134 return 0;
138 key_cert_check_authority(const Key *k, int want_host, int require_principal,
139 const char *name, const char **reason)
141 int r;
143 if ((r = sshkey_cert_check_authority(k, want_host, require_principal,
144 name, reason)) != 0) {
145 fatal_on_fatal_errors(r, __func__, 0);
146 error("%s: %s", __func__, ssh_err(r));
147 return -1;
149 return 0;
152 /* authfile.c */
154 Key *
155 key_load_cert(const char *filename)
157 int r;
158 Key *ret = NULL;
160 if ((r = sshkey_load_cert(filename, &ret)) != 0) {
161 fatal_on_fatal_errors(r, __func__, SSH_ERR_LIBCRYPTO_ERROR);
162 /* Old authfile.c ignored all file errors. */
163 if (r == SSH_ERR_SYSTEM_ERROR)
164 debug("%s: %s", __func__, ssh_err(r));
165 else
166 error("%s: %s", __func__, ssh_err(r));
167 return NULL;
169 return ret;
173 Key *
174 key_load_public(const char *filename, char **commentp)
176 int r;
177 Key *ret = NULL;
179 if ((r = sshkey_load_public(filename, &ret, commentp)) != 0) {
180 fatal_on_fatal_errors(r, __func__, SSH_ERR_LIBCRYPTO_ERROR);
181 /* Old authfile.c ignored all file errors. */
182 if (r == SSH_ERR_SYSTEM_ERROR)
183 debug("%s: %s", __func__, ssh_err(r));
184 else
185 error("%s: %s", __func__, ssh_err(r));
186 return NULL;
188 return ret;
191 Key *
192 key_load_private(const char *path, const char *passphrase,
193 char **commentp)
195 int r;
196 Key *ret = NULL;
198 if ((r = sshkey_load_private(path, passphrase, &ret, commentp)) != 0) {
199 fatal_on_fatal_errors(r, __func__, SSH_ERR_LIBCRYPTO_ERROR);
200 /* Old authfile.c ignored all file errors. */
201 if (r == SSH_ERR_SYSTEM_ERROR ||
202 r == SSH_ERR_KEY_WRONG_PASSPHRASE)
203 debug("%s: %s", __func__, ssh_err(r));
204 else
205 error("%s: %s", __func__, ssh_err(r));
206 return NULL;
208 return ret;
211 Key *
212 key_load_private_cert(int type, const char *filename, const char *passphrase,
213 int *perm_ok)
215 int r;
216 Key *ret = NULL;
218 if ((r = sshkey_load_private_cert(type, filename, passphrase,
219 &ret, perm_ok)) != 0) {
220 fatal_on_fatal_errors(r, __func__, SSH_ERR_LIBCRYPTO_ERROR);
221 /* Old authfile.c ignored all file errors. */
222 if (r == SSH_ERR_SYSTEM_ERROR ||
223 r == SSH_ERR_KEY_WRONG_PASSPHRASE)
224 debug("%s: %s", __func__, ssh_err(r));
225 else
226 error("%s: %s", __func__, ssh_err(r));
227 return NULL;
229 return ret;
232 Key *
233 key_load_private_type(int type, const char *filename, const char *passphrase,
234 char **commentp, int *perm_ok)
236 int r;
237 Key *ret = NULL;
239 if ((r = sshkey_load_private_type(type, filename, passphrase,
240 &ret, commentp, perm_ok)) != 0) {
241 fatal_on_fatal_errors(r, __func__, SSH_ERR_LIBCRYPTO_ERROR);
242 /* Old authfile.c ignored all file errors. */
243 if (r == SSH_ERR_SYSTEM_ERROR ||
244 (r == SSH_ERR_KEY_WRONG_PASSPHRASE))
245 debug("%s: %s", __func__, ssh_err(r));
246 else
247 error("%s: %s", __func__, ssh_err(r));
248 return NULL;
250 return ret;