1 /* $OpenBSD: common.c,v 1.5 2021/12/14 21:25:27 deraadt Exp $ */ 2 /* 3 * Helpers for key API tests 4 * 5 * Placed in the public domain 6 */ 7 8 #include "includes.h" 9 10 #include <sys/types.h> 11 #include <sys/stat.h> 12 #include <fcntl.h> 13 #include <stdio.h> 14 #ifdef HAVE_STDINT_H 15 #include <stdint.h> 16 #endif 17 #include <stdlib.h> 18 #include <string.h> 19 #include <unistd.h> 20 21 #ifdef WITH_OPENSSL 22 #include <openssl/bn.h> 23 #include <openssl/rsa.h> 24 #include <openssl/dsa.h> 25 #include <openssl/objects.h> 26 #ifdef OPENSSL_HAS_NISTP256 27 # include <openssl/ec.h> 28 #endif /* OPENSSL_HAS_NISTP256 */ 29 #endif /* WITH_OPENSSL */ 30 31 #include "openbsd-compat/openssl-compat.h" 32 33 #include "../test_helper/test_helper.h" 34 35 #include "ssherr.h" 36 #include "authfile.h" 37 #include "sshkey.h" 38 #include "sshbuf.h" 39 40 #include "common.h" 41 42 struct sshbuf * 43 load_file(const char *name) 44 { 45 struct sshbuf *ret = NULL; 46 47 ASSERT_INT_EQ(sshbuf_load_file(test_data_file(name), &ret), 0); 48 ASSERT_PTR_NE(ret, NULL); 49 return ret; 50 } 51 52 struct sshbuf * 53 load_text_file(const char *name) 54 { 55 struct sshbuf *ret = load_file(name); 56 const u_char *p; 57 58 /* Trim whitespace at EOL */ 59 for (p = sshbuf_ptr(ret); sshbuf_len(ret) > 0;) { 60 if (p[sshbuf_len(ret) - 1] == '\r' || 61 p[sshbuf_len(ret) - 1] == '\t' || 62 p[sshbuf_len(ret) - 1] == ' ' || 63 p[sshbuf_len(ret) - 1] == '\n') 64 ASSERT_INT_EQ(sshbuf_consume_end(ret, 1), 0); 65 else 66 break; 67 } 68 /* \0 terminate */ 69 ASSERT_INT_EQ(sshbuf_put_u8(ret, 0), 0); 70 return ret; 71 } 72 73 #ifdef WITH_OPENSSL 74 BIGNUM * 75 load_bignum(const char *name) 76 { 77 BIGNUM *ret = NULL; 78 struct sshbuf *buf; 79 80 buf = load_text_file(name); 81 ASSERT_INT_NE(BN_hex2bn(&ret, (const char *)sshbuf_ptr(buf)), 0); 82 sshbuf_free(buf); 83 return ret; 84 } 85 86 const BIGNUM * 87 rsa_n(struct sshkey *k) 88 { 89 const BIGNUM *n = NULL; 90 91 ASSERT_PTR_NE(k, NULL); 92 ASSERT_PTR_NE(k->rsa, NULL); 93 RSA_get0_key(k->rsa, &n, NULL, NULL); 94 return n; 95 } 96 97 const BIGNUM * 98 rsa_e(struct sshkey *k) 99 { 100 const BIGNUM *e = NULL; 101 102 ASSERT_PTR_NE(k, NULL); 103 ASSERT_PTR_NE(k->rsa, NULL); 104 RSA_get0_key(k->rsa, NULL, &e, NULL); 105 return e; 106 } 107 108 const BIGNUM * 109 rsa_p(struct sshkey *k) 110 { 111 const BIGNUM *p = NULL; 112 113 ASSERT_PTR_NE(k, NULL); 114 ASSERT_PTR_NE(k->rsa, NULL); 115 RSA_get0_factors(k->rsa, &p, NULL); 116 return p; 117 } 118 119 const BIGNUM * 120 rsa_q(struct sshkey *k) 121 { 122 const BIGNUM *q = NULL; 123 124 ASSERT_PTR_NE(k, NULL); 125 ASSERT_PTR_NE(k->rsa, NULL); 126 RSA_get0_factors(k->rsa, NULL, &q); 127 return q; 128 } 129 130 const BIGNUM * 131 dsa_g(struct sshkey *k) 132 { 133 const BIGNUM *g = NULL; 134 135 ASSERT_PTR_NE(k, NULL); 136 ASSERT_PTR_NE(k->dsa, NULL); 137 DSA_get0_pqg(k->dsa, NULL, NULL, &g); 138 return g; 139 } 140 141 const BIGNUM * 142 dsa_pub_key(struct sshkey *k) 143 { 144 const BIGNUM *pub_key = NULL; 145 146 ASSERT_PTR_NE(k, NULL); 147 ASSERT_PTR_NE(k->dsa, NULL); 148 DSA_get0_key(k->dsa, &pub_key, NULL); 149 return pub_key; 150 } 151 152 const BIGNUM * 153 dsa_priv_key(struct sshkey *k) 154 { 155 const BIGNUM *priv_key = NULL; 156 157 ASSERT_PTR_NE(k, NULL); 158 ASSERT_PTR_NE(k->dsa, NULL); 159 DSA_get0_key(k->dsa, NULL, &priv_key); 160 return priv_key; 161 } 162 #endif /* WITH_OPENSSL */ 163 164