mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-01-09 17:38:00 +00:00
39 lines
1.1 KiB
C
39 lines
1.1 KiB
C
|
#include "ssh.h"
|
||
|
#include "aesgcm.h"
|
||
|
|
||
|
static ssh2_mac *aesgcm_mac_selector_new(const ssh2_macalg *alg,
|
||
|
ssh_cipher *cipher)
|
||
|
{
|
||
|
static const ssh2_macalg *const real_algs[] = {
|
||
|
#if HAVE_CLMUL
|
||
|
&ssh2_aesgcm_mac_clmul,
|
||
|
#endif
|
||
|
#if HAVE_NEON_PMULL
|
||
|
&ssh2_aesgcm_mac_neon,
|
||
|
#endif
|
||
|
&ssh2_aesgcm_mac_sw,
|
||
|
NULL,
|
||
|
};
|
||
|
|
||
|
for (size_t i = 0; real_algs[i]; i++) {
|
||
|
const ssh2_macalg *alg = real_algs[i];
|
||
|
const struct aesgcm_extra *alg_extra =
|
||
|
(const struct aesgcm_extra *)alg->extra;
|
||
|
if (check_aesgcm_availability(alg_extra))
|
||
|
return ssh2_mac_new(alg, cipher);
|
||
|
}
|
||
|
|
||
|
/* We should never reach the NULL at the end of the list, because
|
||
|
* the last non-NULL entry should be software-only GCM, which is
|
||
|
* always available. */
|
||
|
unreachable("aesgcm_select ran off the end of its list");
|
||
|
}
|
||
|
|
||
|
const ssh2_macalg ssh2_aesgcm_mac = {
|
||
|
.new = aesgcm_mac_selector_new,
|
||
|
.name = "",
|
||
|
.etm_name = "", /* Not selectable independently */
|
||
|
.len = 16,
|
||
|
.keylen = 0,
|
||
|
};
|