|
ProtoCore v0.0.1
Deterministic, zero-heap network stack for embedded targets
|
2048-bit Montgomery modular exponentiation for DH-group14. More...
#include "crypto/asymmetric/bignum.h"#include "crypto/crypto_opt.h"#include "server/mmgr/secure.h"#include <string.h>Go to the source code of this file.
Functions | |
| int | bn_cmp_raw (const uint32_t *a, const uint32_t *b, int n) |
| Compute out = base^exp mod group14_p. | |
| void | bn_from_bytes (pc_bignum *out, const uint8_t *bytes, size_t len) |
Read a big-endian byte array of len bytes into a pc_bignum. | |
| void | bn_to_bytes (uint8_t bytes[256], const pc_bignum *in) |
| Write a pc_bignum as a 256-byte big-endian array. | |
| int | bn_cmp (const pc_bignum *a, const pc_bignum *b) |
| Compare two pc_bignum values. | |
| int | bn_is_zero (const pc_bignum *a) |
Return non-zero if a is zero (all limbs zero). | |
| int | bn_dh_validate (const pc_bignum *v) |
| Validate a received DH public value. | |
Variables | |
| PC_CRYPTO_HOT const pc_bignum | group14_p |
| The RFC 3526 MODP group-14 prime (2048-bit). | |
| const pc_bignum | group14_g |
| Generator for group-14: g = 2. | |
2048-bit Montgomery modular exponentiation for DH-group14.
─── Montgomery parameter for group-14 ─────────────────────────────────── The group-14 prime p ends in ...FFFFFFFF FFFFFFFF (little-endian d[0]=d[1]= 0xFFFFFFFF). The Montgomery parameter:
p_inv = (-(p mod 2^32))^(-1) mod 2^32
p mod 2^32 = 0xFFFFFFFF -(0xFFFFFFFF) mod 2^32 = 0x00000001 0x00000001^(-1) mod 2^32 = 1
So p_inv = 1 for the group-14 prime. In the SOS reduction pass: m_i = t[i] * p_inv mod 2^32 = t[i].
─── R² mod p ──────────────────────────────────────────────────────────── R = 2^2048. R² mod p = 2^4096 mod p. It is computed once at startup by bn_init() via 4096 doublings mod p, and stored in the static s_g14.r2 constant. ─────────────────────────────────────────────────────────────────────────
Definition in file bignum.cpp.
| int bn_cmp_raw | ( | const uint32_t * | a, |
| const uint32_t * | b, | ||
| int | n | ||
| ) |
Compute out = base^exp mod group14_p.
Uses Montgomery modular exponentiation with left-to-right binary scan. Borrows one working set for all temporaries; it is wiped when released.
On Arduino the computation is delegated to mbedtls_mpi_exp_mod() which uses hardware multiplication and blinding.
| out | Result (base^exp mod p, 2048-bit). |
| base | Base value; must satisfy 1 < base < p-1. |
| exp | Exponent (e.g. the 2048-bit private DH scalar y). |
Compare two n-limb magnitudes: -1, 0 or 1. Shared with the backends.
Definition at line 64 of file bignum.cpp.
Referenced by bn_cmp().
| void bn_from_bytes | ( | pc_bignum * | out, |
| const uint8_t * | bytes, | ||
| size_t | len | ||
| ) |
Read a big-endian byte array of len bytes into a pc_bignum.
If len < 256 the most-significant limbs are zeroed. If len > 256 only the least-significant 256 bytes are read.
| out | Destination bignum. |
| bytes | Big-endian source bytes. |
| len | Number of source bytes (typically 256 for 2048-bit). |
Definition at line 84 of file bignum.cpp.
References pc_bignum::d.
Referenced by ssh_kexdh_handle().
| void bn_to_bytes | ( | uint8_t | bytes[256], |
| const pc_bignum * | in | ||
| ) |
Write a pc_bignum as a 256-byte big-endian array.
| bytes | Destination buffer (exactly 256 bytes). |
| in | Source bignum. |
Definition at line 96 of file bignum.cpp.
References pc_bignum::d, and PC_BN_LIMBS.
Referenced by ssh_kexdh_handle().
Compare two pc_bignum values.
Definition at line 108 of file bignum.cpp.
References bn_cmp_raw(), pc_bignum::d, and PC_BN_LIMBS.
Referenced by bn_dh_validate().
| int bn_is_zero | ( | const pc_bignum * | a | ) |
Return non-zero if a is zero (all limbs zero).
Definition at line 113 of file bignum.cpp.
References pc_bignum::d, and PC_BN_LIMBS.
| int bn_dh_validate | ( | const pc_bignum * | v | ) |
Validate a received DH public value.
RFC 4253 §8: the received value e (or f) must satisfy 1 < e < p-1. Returns 0 if the value is valid, -1 otherwise.
| v | Received public DH value. |
Definition at line 125 of file bignum.cpp.
References bn_cmp(), pc_bignum::d, group14_p, and PC_BN_LIMBS.
Referenced by ssh_kexdh_handle().
| PC_CRYPTO_HOT const pc_bignum group14_p |
The RFC 3526 MODP group-14 prime (2048-bit).
Definition at line 42 of file bignum.cpp.
Referenced by bn_dh_validate().
| const pc_bignum group14_g |
Generator for group-14: g = 2.
Definition at line 54 of file bignum.cpp.
Referenced by ssh_dh_generate().