24#ifndef LIBMBEDCRYPTO_H_
25#define LIBMBEDCRYPTO_H_
29#ifdef HAVE_LIBMBEDCRYPTO
30#include <mbedtls/md.h>
31#include <mbedtls/bignum.h>
32#include <mbedtls/pk.h>
33#include <mbedtls/cipher.h>
34#include <mbedtls/entropy.h>
35#include <mbedtls/ctr_drbg.h>
36#include <mbedtls/platform.h>
38#include "libssh/libssh.h"
40typedef mbedtls_md_context_t *SHACTX;
41typedef mbedtls_md_context_t *SHA256CTX;
42typedef mbedtls_md_context_t *SHA384CTX;
43typedef mbedtls_md_context_t *SHA512CTX;
44typedef mbedtls_md_context_t *MD5CTX;
45typedef mbedtls_md_context_t *HMACCTX;
47#define SHA_DIGEST_LENGTH 20
48#define SHA_DIGEST_LEN SHA_DIGEST_LENGTH
49#define MD5_DIGEST_LEN 16
50#define SHA256_DIGEST_LENGTH 32
51#define SHA256_DIGEST_LEN SHA256_DIGEST_LENGTH
52#define SHA384_DIGEST_LENGTH 48
53#define SHA384_DIGEST_LEN SHA384_DIGEST_LENGTH
54#define SHA512_DIGEST_LENGTH 64
55#define SHA512_DIGEST_LEN SHA512_DIGEST_LENGTH
57#ifndef EVP_MAX_MD_SIZE
58#define EVP_MAX_MD_SIZE 64
61#define EVP_DIGEST_LEN EVP_MAX_MD_SIZE
63#define ssh_crypto_free(x) mbedtls_free(x)
65typedef mbedtls_mpi *bignum;
66typedef const mbedtls_mpi *const_bignum;
67typedef void* bignum_CTX;
70#define NID_mbedtls_nistp256 0
71#define NID_mbedtls_nistp384 1
72#define NID_mbedtls_nistp521 2
74struct mbedtls_ecdsa_sig {
83bignum ssh_mbedcry_bn_new(
void);
84void ssh_mbedcry_bn_free(bignum num);
85char *ssh_mbedcry_bn2num(const_bignum num,
int radix);
86int ssh_mbedcry_rand(bignum rnd,
int bits,
int top,
int bottom);
87int ssh_mbedcry_is_bit_set(bignum num,
size_t pos);
88int ssh_mbedcry_rand_range(bignum dest, bignum max);
89int ssh_mbedcry_hex2bn(bignum *dest,
char *data);
91#define bignum_new() ssh_mbedcry_bn_new()
92#define bignum_safe_free(num) do { \
93 if ((num) != NULL) { \
94 ssh_mbedcry_bn_free(num); \
98#define bignum_ctx_new() NULL
99#define bignum_ctx_free(num) do {(num) = NULL;} while(0)
100#define bignum_ctx_invalid(ctx) (ctx == NULL?0:1)
101#define bignum_set_word(bn, n) (mbedtls_mpi_lset(bn, n)==0?1:0)
103#define bignum_bin2bn(data, datalen, bn) do { \
104 *(bn) = bignum_new(); \
105 if (*(bn) != NULL) { \
106 mbedtls_mpi_read_binary(*(bn), data, datalen); \
109#define bignum_bn2dec(num) ssh_mbedcry_bn2num(num, 10)
110#define bignum_dec2bn(data, bn) mbedtls_mpi_read_string(bn, 10, data)
111#define bignum_bn2hex(num, dest) (*dest)=(unsigned char *)ssh_mbedcry_bn2num(num, 16)
112#define bignum_hex2bn(data, dest) ssh_mbedcry_hex2bn(dest, data)
113#define bignum_rand(rnd, bits) ssh_mbedcry_rand((rnd), (bits), 0, 1)
114#define bignum_rand_range(rnd, max) ssh_mbedcry_rand_range(rnd, max)
115#define bignum_mod_exp(dest, generator, exp, modulo, ctx) \
116 (mbedtls_mpi_exp_mod(dest, generator, exp, modulo, NULL)==0?1:0)
117#define bignum_add(dest, a, b) mbedtls_mpi_add_mpi(dest, a, b)
118#define bignum_sub(dest, a, b) mbedtls_mpi_sub_mpi(dest, a, b)
119#define bignum_mod(dest, a, b, ctx) \
120 (mbedtls_mpi_mod_mpi(dest, a, b) == 0 ? 1 : 0)
121#define bignum_num_bytes(num) mbedtls_mpi_size(num)
122#define bignum_num_bits(num) mbedtls_mpi_bitlen(num)
123#define bignum_is_bit_set(num, bit) ssh_mbedcry_is_bit_set(num, bit)
124#define bignum_bn2bin(num, len, ptr) mbedtls_mpi_write_binary(num, ptr, \
125 mbedtls_mpi_size(num))
126#define bignum_cmp(num1, num2) mbedtls_mpi_cmp_mpi(num1, num2)
127#define bignum_rshift1(dest, src) mbedtls_mpi_copy(dest, src), mbedtls_mpi_shift_r(dest, 1)
128#define bignum_dup(orig, dest) do { \
129 if (*(dest) == NULL) { \
130 *(dest) = bignum_new(); \
132 if (*(dest) != NULL) { \
133 mbedtls_mpi_copy(*(dest), orig); \
137mbedtls_ctr_drbg_context *ssh_get_mbedtls_ctr_drbg_context(
void);
139int ssh_mbedtls_random(
void *where,
int len,
int strong);
141ssh_string make_ecpoint_string(
const mbedtls_ecp_group *g,
const
142 mbedtls_ecp_point *p);
144#define ssh_fips_mode() false