recovery_menu/ios_mcp/source/mini-gmp.h
GerbilSoft 36222846d9
New "Submit System Data" function (#25)
* SubmitSystemData.c: Initial "Submit System Data" function.

This will allow users to submit anonymized system information, including
a masked-off serial number and MLC manufacturer, so we can try to figure
out which serial numbers correspond to which MLC manufacturer, among
other things.

This screen has been implemented using a separate .c file instead of
adding it somewhere in menu.c. I'll split other screens into separate
.c files later.

imports.ld: Added IOSC_GenerateHash() from Gary.

TODO: gethostbyname() for DNS lookup.

* SubmitSystemData.c: Use an array of strings for the description.

Code size difference:

   text    data     bss     dec     hex filename
  27208       0    9696   36904    9028 ios_mcp.elf [before]
  26992       0    9696   36688    8f50 ios_mcp.elf [after]
   -216       0       0    -216     -d8 Difference

* SubmitSystemData.c: Add some more stuff to the hash.

* SubmitSystemData.c: Submit the system data to wiiu.gerbilsoft.com.

Using http instead of https due to the complexity of using https within
the recovery_menu environment, and Wii U doesn't support TLS 1.2 natively.

TODO:
- Implement gethostbyname().
- Check the HTTP response code.

* StartWupserver.c: Split option_StartWupserver() out of menu.c.

* menu.c: Split netconf init from StartWupserver and SubmitSystemData into initNetconf().

Takes an 'index' (Y position) parameter and returns a new Y position,
or 0 if an error occurred.

Removed the "+ 4" from the Wupserver version. Added "+ 4" to the
other messages in Wupserver.

* SystemInformation.c: Split out option_SystemInformation() into a separate file.

* DebugSystemRegion.c: Split out option_DebugSystemRegion() into a separate file.

* Makefile: Add -Werror=implicit-function-declaration.

An implicit function declaration almost always means a header is missing,
and will likely result in a link error later on.

* menu.c: Add a GitHub repository link to the bottom of the main menu.

Well, it's a link in that it's blue and underlined, but you can't exactly
click it here...

* SubmitSystemData.c: Set ddr3Size and ddr3Speed.

* SubmitSystemData.c: Look up the domain name instead of using a hard-coded IP address.

netdb.c: gethostbyname() implementation by @GaryOderNichts.

* SubmitSystemData.c: Parse the HTTP response to show actual successes or failures.

Only the response code is parsed and the response message is shown.

TODO: Show the actual message from the server.

* gfx.h: Add a new attribute GfxPrintFlag_Underline.

This prints an underscore character on top of every character that's
printed, resulting in an underline effect.

Removed the manual underlining code elsewhere.

Code size difference:

   text    data     bss     dec     hex filename
  29068       0   10400   39468    9a2c ios_mcp.elf [before]
  28996       0   10400   39396    99e4 ios_mcp.elf [after]
    -72       0       0     -72     -48 Difference

* SystemInformation.c: Display the BSP revision.

This uses bspGetHardwareVersion(). [imports.ld value provided by Gary]

The BSP version is roughly equivalent to the Console Type value found
on Wii and GameCube, though libogc doesn't set it properly...

Most retail systems will be 0x25100028. (A5X Cafe)

Rearranged System Information to use three columns for the main data.
MLC information is still shown below the main data.

* SubmitSystemData: Add the BSP revision to the submitted data.

* Use gfx_print() instead of gfx_printf() when formatting isn't needed.

* PairDRC.c: Split "Pair DRC" into a separate file.

* SubmitSystemData.c: Get the HTTP message body and print it on screen.

Only the HTTP response code and message body will be displayed in either
green or red. The message printed afterwards will be white.

NOTE: We need to use a fairly large buffer for the HTTP response because
Cloudflare adds a ton of headers. For example, an HTTP/1.1 200 OK response
with the following message:

"System ID is #1. This system was already submitted."

has a 648-byte HTTP response, mostly due to Cloudflare's "Report-To"
header.

To be on the safe side, we'll allow use of the entire buffer allocated
for OTP, SEEPROM, and the POST data struct, since none of those are
needed after sending the HTTP request header. (2,048 bytes)

* gfx_print(): Add support for newlines. ('\n')

If a newline is encountered in a string, the x position will be reset to
the original x position specified by the caller, and the y position will
be advanced by one line. The final y position is returned by the function.

This allows us to consolidate many individual calls to gfx_print() and/or
gfx_printf() into a single call.

Code size differences:

   text    data     bss     dec     hex filename
  29332       0   10400   39732    9b34 ios_mcp.elf [before]
  29364       0   10400   39764    9b54 ios_mcp.elf [add '\n' to gfx_print]
  29220       0   10400   39620    9ac4 ios_mcp.elf [update SubmitSystemData.c]
   -112       0       0    -112     -70 Difference

Simply updating SubmitSystemData.c to take advantage of the newline
support wiped out the code size increase from adding it.

NOTE: The newline support currently only supports adding a single line,
not CHAR_SIZE_DRC_Y + 4. +4 is commonly used for menus, which can't take
advantage of the newline support anyway.

* SystemInformation.c: Make use of newlines for part of the MLC information display.

New flag GfxPrintFlag_NewlinePlus4 that adds CHAR_SIZE_DRC_Y + 4 for
newlines instead of just CHAR_SIZE_DRC_Y.

Code size difference:

   text    data     bss     dec     hex filename
  29220       0   10400   39620    9ac4 ios_mcp.elf [before]
  29148       0   10400   39548    9a7c ios_mcp.elf [after]
    -72       0       0     -72     -48 Difference

* DebugSystemRegion.c: Some minor optimizations.

Code size difference:

   text    data     bss     dec     hex filename
  29148       0   10400   39548    9a7c ios_mcp.elf [before]
  29124       0   10400   39524    9a64 ios_mcp.elf [after]
    -24       0       0     -24     -18 Difference

* SubmitSystemData.c: Make dataBuffer uint8_t*; use it instead of otp for the recv buffer.

This reduces confusion, even though otp and dataBuffer are technically
the same buffer.

Fix a one-byte overflow when ensuring dataBuffer is NULL-terminated.

* initNetconf(): Use a pointer for index and return an actual error code.

* Makefile: Add -Werror=int-conversion.

* SubmitSystemData.c: Submit ddr3Vendor and MLC CID.

Using empty space in the POST data structure instead of shuffling it
around to preserve compatibility (for now).

* SystemInformation.c: Display BSP revision name and DDR3 information.

* SystemInformation.c: Fix text alignment of Column 2's data.

* SubmitSystemData.c: Verify the send() return values.

* SubmitSystemData.c: Use RSA+AES encryption when submitting data.

Since we can't use https, use the next best thing.

NOTE: mini-gmp puts us very close to the 40K .text limit:

   text    data     bss     dec     hex filename
  39612       0   10400   50012    c35c ios_mcp.elf

TODO: Investigate using Thumb mode later.

* imports.h: Clarify that these IOSC_GenerateHash() flags are for SHA-256.

Also add SHA-1 flags.

* SubmitSystemData.c: Send MS, CA, NG, and NG key IDs, and device certificate.

Device certificate is recommended in order to really verify the system
information is authentic. It will be checked against MS, CA, NG, and
NG key IDs.

Rearrange the POST data struct to work better.

Remove MLC name1, since the device name is part of the CID.

NOTE: This requires a server-side change.

* SubmitSystemData.c: Make the submitted info screen match WiiUIdent.

* SubmitSystemData.c: Handle newlines in the server's response message.
2023-04-01 18:45:14 +02:00

311 lines
12 KiB
C

/* mini-gmp, a minimalistic implementation of a GNU GMP subset.
Copyright 2011-2015, 2017, 2019-2021 Free Software Foundation, Inc.
This file is part of the GNU MP Library.
The GNU MP Library is free software; you can redistribute it and/or modify
it under the terms of either:
* the GNU Lesser General Public License as published by the Free
Software Foundation; either version 3 of the License, or (at your
option) any later version.
or
* the GNU General Public License as published by the Free Software
Foundation; either version 2 of the License, or (at your option) any
later version.
or both in parallel, as here.
The GNU MP Library is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received copies of the GNU General Public License and the
GNU Lesser General Public License along with the GNU MP Library. If not,
see https://www.gnu.org/licenses/. */
/* About mini-gmp: This is a minimal implementation of a subset of the
GMP interface. It is intended for inclusion into applications which
have modest bignums needs, as a fallback when the real GMP library
is not installed.
This file defines the public interface. */
#ifndef __MINI_GMP_H__
#define __MINI_GMP_H__
/* For size_t */
#include <stddef.h>
#if defined (__cplusplus)
extern "C" {
#endif
void mp_set_memory_functions (void *(*) (size_t),
void *(*) (void *, size_t, size_t),
void (*) (void *, size_t));
void mp_get_memory_functions (void *(**) (size_t),
void *(**) (void *, size_t, size_t),
void (**) (void *, size_t));
#ifndef MINI_GMP_LIMB_TYPE
#define MINI_GMP_LIMB_TYPE long
#endif
typedef unsigned MINI_GMP_LIMB_TYPE mp_limb_t;
typedef long mp_size_t;
typedef unsigned long mp_bitcnt_t;
typedef mp_limb_t *mp_ptr;
typedef const mp_limb_t *mp_srcptr;
typedef struct
{
int _mp_alloc; /* Number of *limbs* allocated and pointed
to by the _mp_d field. */
int _mp_size; /* abs(_mp_size) is the number of limbs the
last field points to. If _mp_size is
negative this is a negative number. */
mp_limb_t *_mp_d; /* Pointer to the limbs. */
} __mpz_struct;
typedef __mpz_struct mpz_t[1];
typedef __mpz_struct *mpz_ptr;
typedef const __mpz_struct *mpz_srcptr;
extern const int mp_bits_per_limb;
void mpn_copyi (mp_ptr, mp_srcptr, mp_size_t);
void mpn_copyd (mp_ptr, mp_srcptr, mp_size_t);
void mpn_zero (mp_ptr, mp_size_t);
int mpn_cmp (mp_srcptr, mp_srcptr, mp_size_t);
int mpn_zero_p (mp_srcptr, mp_size_t);
mp_limb_t mpn_add_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t);
mp_limb_t mpn_add_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
mp_limb_t mpn_add (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t);
mp_limb_t mpn_sub_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t);
mp_limb_t mpn_sub_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
mp_limb_t mpn_sub (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t);
mp_limb_t mpn_mul_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t);
mp_limb_t mpn_addmul_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t);
mp_limb_t mpn_submul_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t);
mp_limb_t mpn_mul (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t);
void mpn_mul_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
void mpn_sqr (mp_ptr, mp_srcptr, mp_size_t);
int mpn_perfect_square_p (mp_srcptr, mp_size_t);
mp_size_t mpn_sqrtrem (mp_ptr, mp_ptr, mp_srcptr, mp_size_t);
mp_limb_t mpn_lshift (mp_ptr, mp_srcptr, mp_size_t, unsigned int);
mp_limb_t mpn_rshift (mp_ptr, mp_srcptr, mp_size_t, unsigned int);
mp_bitcnt_t mpn_scan0 (mp_srcptr, mp_bitcnt_t);
mp_bitcnt_t mpn_scan1 (mp_srcptr, mp_bitcnt_t);
void mpn_com (mp_ptr, mp_srcptr, mp_size_t);
mp_limb_t mpn_neg (mp_ptr, mp_srcptr, mp_size_t);
mp_bitcnt_t mpn_popcount (mp_srcptr, mp_size_t);
mp_limb_t mpn_invert_3by2 (mp_limb_t, mp_limb_t);
#define mpn_invert_limb(x) mpn_invert_3by2 ((x), 0)
size_t mpn_get_str (unsigned char *, int, mp_ptr, mp_size_t);
mp_size_t mpn_set_str (mp_ptr, const unsigned char *, size_t, int);
void mpz_init (mpz_t);
void mpz_init2 (mpz_t, mp_bitcnt_t);
void mpz_clear (mpz_t);
#define mpz_odd_p(z) (((z)->_mp_size != 0) & (int) (z)->_mp_d[0])
#define mpz_even_p(z) (! mpz_odd_p (z))
int mpz_sgn (const mpz_t);
int mpz_cmp_si (const mpz_t, long);
int mpz_cmp_ui (const mpz_t, unsigned long);
int mpz_cmp (const mpz_t, const mpz_t);
int mpz_cmpabs_ui (const mpz_t, unsigned long);
int mpz_cmpabs (const mpz_t, const mpz_t);
int mpz_cmp_d (const mpz_t, double);
int mpz_cmpabs_d (const mpz_t, double);
void mpz_abs (mpz_t, const mpz_t);
void mpz_neg (mpz_t, const mpz_t);
void mpz_swap (mpz_t, mpz_t);
void mpz_add_ui (mpz_t, const mpz_t, unsigned long);
void mpz_add (mpz_t, const mpz_t, const mpz_t);
void mpz_sub_ui (mpz_t, const mpz_t, unsigned long);
void mpz_ui_sub (mpz_t, unsigned long, const mpz_t);
void mpz_sub (mpz_t, const mpz_t, const mpz_t);
void mpz_mul_si (mpz_t, const mpz_t, long int);
void mpz_mul_ui (mpz_t, const mpz_t, unsigned long int);
void mpz_mul (mpz_t, const mpz_t, const mpz_t);
void mpz_mul_2exp (mpz_t, const mpz_t, mp_bitcnt_t);
void mpz_addmul_ui (mpz_t, const mpz_t, unsigned long int);
void mpz_addmul (mpz_t, const mpz_t, const mpz_t);
void mpz_submul_ui (mpz_t, const mpz_t, unsigned long int);
void mpz_submul (mpz_t, const mpz_t, const mpz_t);
void mpz_cdiv_qr (mpz_t, mpz_t, const mpz_t, const mpz_t);
void mpz_fdiv_qr (mpz_t, mpz_t, const mpz_t, const mpz_t);
void mpz_tdiv_qr (mpz_t, mpz_t, const mpz_t, const mpz_t);
void mpz_cdiv_q (mpz_t, const mpz_t, const mpz_t);
void mpz_fdiv_q (mpz_t, const mpz_t, const mpz_t);
void mpz_tdiv_q (mpz_t, const mpz_t, const mpz_t);
void mpz_cdiv_r (mpz_t, const mpz_t, const mpz_t);
void mpz_fdiv_r (mpz_t, const mpz_t, const mpz_t);
void mpz_tdiv_r (mpz_t, const mpz_t, const mpz_t);
void mpz_cdiv_q_2exp (mpz_t, const mpz_t, mp_bitcnt_t);
void mpz_fdiv_q_2exp (mpz_t, const mpz_t, mp_bitcnt_t);
void mpz_tdiv_q_2exp (mpz_t, const mpz_t, mp_bitcnt_t);
void mpz_cdiv_r_2exp (mpz_t, const mpz_t, mp_bitcnt_t);
void mpz_fdiv_r_2exp (mpz_t, const mpz_t, mp_bitcnt_t);
void mpz_tdiv_r_2exp (mpz_t, const mpz_t, mp_bitcnt_t);
void mpz_mod (mpz_t, const mpz_t, const mpz_t);
void mpz_divexact (mpz_t, const mpz_t, const mpz_t);
int mpz_divisible_p (const mpz_t, const mpz_t);
int mpz_congruent_p (const mpz_t, const mpz_t, const mpz_t);
unsigned long mpz_cdiv_qr_ui (mpz_t, mpz_t, const mpz_t, unsigned long);
unsigned long mpz_fdiv_qr_ui (mpz_t, mpz_t, const mpz_t, unsigned long);
unsigned long mpz_tdiv_qr_ui (mpz_t, mpz_t, const mpz_t, unsigned long);
unsigned long mpz_cdiv_q_ui (mpz_t, const mpz_t, unsigned long);
unsigned long mpz_fdiv_q_ui (mpz_t, const mpz_t, unsigned long);
unsigned long mpz_tdiv_q_ui (mpz_t, const mpz_t, unsigned long);
unsigned long mpz_cdiv_r_ui (mpz_t, const mpz_t, unsigned long);
unsigned long mpz_fdiv_r_ui (mpz_t, const mpz_t, unsigned long);
unsigned long mpz_tdiv_r_ui (mpz_t, const mpz_t, unsigned long);
unsigned long mpz_cdiv_ui (const mpz_t, unsigned long);
unsigned long mpz_fdiv_ui (const mpz_t, unsigned long);
unsigned long mpz_tdiv_ui (const mpz_t, unsigned long);
unsigned long mpz_mod_ui (mpz_t, const mpz_t, unsigned long);
void mpz_divexact_ui (mpz_t, const mpz_t, unsigned long);
int mpz_divisible_ui_p (const mpz_t, unsigned long);
unsigned long mpz_gcd_ui (mpz_t, const mpz_t, unsigned long);
void mpz_gcd (mpz_t, const mpz_t, const mpz_t);
void mpz_gcdext (mpz_t, mpz_t, mpz_t, const mpz_t, const mpz_t);
void mpz_lcm_ui (mpz_t, const mpz_t, unsigned long);
void mpz_lcm (mpz_t, const mpz_t, const mpz_t);
int mpz_invert (mpz_t, const mpz_t, const mpz_t);
void mpz_sqrtrem (mpz_t, mpz_t, const mpz_t);
void mpz_sqrt (mpz_t, const mpz_t);
int mpz_perfect_square_p (const mpz_t);
void mpz_pow_ui (mpz_t, const mpz_t, unsigned long);
void mpz_ui_pow_ui (mpz_t, unsigned long, unsigned long);
void mpz_powm (mpz_t, const mpz_t, const mpz_t, const mpz_t);
void mpz_powm_ui (mpz_t, const mpz_t, unsigned long, const mpz_t);
void mpz_rootrem (mpz_t, mpz_t, const mpz_t, unsigned long);
int mpz_root (mpz_t, const mpz_t, unsigned long);
void mpz_fac_ui (mpz_t, unsigned long);
void mpz_2fac_ui (mpz_t, unsigned long);
void mpz_mfac_uiui (mpz_t, unsigned long, unsigned long);
void mpz_bin_uiui (mpz_t, unsigned long, unsigned long);
int mpz_probab_prime_p (const mpz_t, int);
int mpz_tstbit (const mpz_t, mp_bitcnt_t);
void mpz_setbit (mpz_t, mp_bitcnt_t);
void mpz_clrbit (mpz_t, mp_bitcnt_t);
void mpz_combit (mpz_t, mp_bitcnt_t);
void mpz_com (mpz_t, const mpz_t);
void mpz_and (mpz_t, const mpz_t, const mpz_t);
void mpz_ior (mpz_t, const mpz_t, const mpz_t);
void mpz_xor (mpz_t, const mpz_t, const mpz_t);
mp_bitcnt_t mpz_popcount (const mpz_t);
mp_bitcnt_t mpz_hamdist (const mpz_t, const mpz_t);
mp_bitcnt_t mpz_scan0 (const mpz_t, mp_bitcnt_t);
mp_bitcnt_t mpz_scan1 (const mpz_t, mp_bitcnt_t);
int mpz_fits_slong_p (const mpz_t);
int mpz_fits_ulong_p (const mpz_t);
int mpz_fits_sint_p (const mpz_t);
int mpz_fits_uint_p (const mpz_t);
int mpz_fits_sshort_p (const mpz_t);
int mpz_fits_ushort_p (const mpz_t);
long int mpz_get_si (const mpz_t);
unsigned long int mpz_get_ui (const mpz_t);
double mpz_get_d (const mpz_t);
size_t mpz_size (const mpz_t);
mp_limb_t mpz_getlimbn (const mpz_t, mp_size_t);
void mpz_realloc2 (mpz_t, mp_bitcnt_t);
mp_srcptr mpz_limbs_read (mpz_srcptr);
mp_ptr mpz_limbs_modify (mpz_t, mp_size_t);
mp_ptr mpz_limbs_write (mpz_t, mp_size_t);
void mpz_limbs_finish (mpz_t, mp_size_t);
mpz_srcptr mpz_roinit_n (mpz_t, mp_srcptr, mp_size_t);
#define MPZ_ROINIT_N(xp, xs) {{0, (xs),(xp) }}
void mpz_set_si (mpz_t, signed long int);
void mpz_set_ui (mpz_t, unsigned long int);
void mpz_set (mpz_t, const mpz_t);
void mpz_set_d (mpz_t, double);
void mpz_init_set_si (mpz_t, signed long int);
void mpz_init_set_ui (mpz_t, unsigned long int);
void mpz_init_set (mpz_t, const mpz_t);
void mpz_init_set_d (mpz_t, double);
size_t mpz_sizeinbase (const mpz_t, int);
char *mpz_get_str (char *, int, const mpz_t);
int mpz_set_str (mpz_t, const char *, int);
int mpz_init_set_str (mpz_t, const char *, int);
/* This long list taken from gmp.h. */
/* For reference, "defined(EOF)" cannot be used here. In g++ 2.95.4,
<iostream> defines EOF but not FILE. */
#if defined (FILE) \
|| defined (H_STDIO) \
|| defined (_H_STDIO) /* AIX */ \
|| defined (_STDIO_H) /* glibc, Sun, SCO */ \
|| defined (_STDIO_H_) /* BSD, OSF */ \
|| defined (__STDIO_H) /* Borland */ \
|| defined (__STDIO_H__) /* IRIX */ \
|| defined (_STDIO_INCLUDED) /* HPUX */ \
|| defined (__dj_include_stdio_h_) /* DJGPP */ \
|| defined (_FILE_DEFINED) /* Microsoft */ \
|| defined (__STDIO__) /* Apple MPW MrC */ \
|| defined (_MSL_STDIO_H) /* Metrowerks */ \
|| defined (_STDIO_H_INCLUDED) /* QNX4 */ \
|| defined (_ISO_STDIO_ISO_H) /* Sun C++ */ \
|| defined (__STDIO_LOADED) /* VMS */ \
|| defined (_STDIO) /* HPE NonStop */ \
|| defined (__DEFINED_FILE) /* musl */
size_t mpz_out_str (FILE *, int, const mpz_t);
#endif
void mpz_import (mpz_t, size_t, int, size_t, int, size_t, const void *);
void *mpz_export (void *, size_t *, int, size_t, int, size_t, const mpz_t);
#if defined (__cplusplus)
}
#endif
#endif /* __MINI_GMP_H__ */