mirror of
				https://github.com/yuzu-emu/mbedtls.git
				synced 2025-11-04 15:05:06 +00:00 
			
		
		
		
	Merge branch 'AndrzejKurek-opaque-keys-interfaces' into opaque-keys-interfaces
This commit is contained in:
		
						commit
						ac3f243b9b
					
				| 
						 | 
				
			
			@ -126,8 +126,8 @@ if(ENABLE_PROGRAMS)
 | 
			
		|||
endif()
 | 
			
		||||
 | 
			
		||||
ADD_CUSTOM_TARGET(apidoc
 | 
			
		||||
    COMMAND doxygen doxygen/mbedtls.doxyfile
 | 
			
		||||
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
 | 
			
		||||
    COMMAND doxygen mbedtls.doxyfile
 | 
			
		||||
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/doxygen)
 | 
			
		||||
 | 
			
		||||
if(ENABLE_TESTING)
 | 
			
		||||
    enable_testing()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										127
									
								
								ChangeLog
									
									
									
									
									
								
							
							
						
						
									
										127
									
								
								ChangeLog
									
									
									
									
									
								
							| 
						 | 
				
			
			@ -1,16 +1,51 @@
 | 
			
		|||
mbed TLS ChangeLog (Sorted per branch, date)
 | 
			
		||||
 | 
			
		||||
= mbed TLS x.x.x branch released xxxx-xx-xx
 | 
			
		||||
= mbed TLS 2.7.0 branch released 2018-02-03
 | 
			
		||||
 | 
			
		||||
Security
 | 
			
		||||
   * Fix a potential heap buffer overflow in mbedtls_ssl_write. When the (by
 | 
			
		||||
   * Fix a heap corruption issue in the implementation of the truncated HMAC
 | 
			
		||||
     extension. When the truncated HMAC extension is enabled and CBC is used,
 | 
			
		||||
     sending a malicious application packet could be used to selectively corrupt
 | 
			
		||||
     6 bytes on the peer's heap, which could potentially lead to crash or remote
 | 
			
		||||
     code execution. The issue could be triggered remotely from either side in
 | 
			
		||||
     both TLS and DTLS. CVE-2018-0488
 | 
			
		||||
   * Fix a buffer overflow in RSA-PSS verification when the hash was too large
 | 
			
		||||
     for the key size, which could potentially lead to crash or remote code
 | 
			
		||||
     execution. Found by Seth Terashima, Qualcomm Product Security Initiative,
 | 
			
		||||
     Qualcomm Technologies Inc. CVE-2018-0487
 | 
			
		||||
   * Fix buffer overflow in RSA-PSS verification when the unmasked data is all
 | 
			
		||||
     zeros.
 | 
			
		||||
   * Fix an unsafe bounds check in ssl_parse_client_psk_identity() when adding
 | 
			
		||||
     64 KiB to the address of the SSL buffer and causing a wrap around.
 | 
			
		||||
   * Fix a potential heap buffer overflow in mbedtls_ssl_write(). When the (by
 | 
			
		||||
     default enabled) maximum fragment length extension is disabled in the
 | 
			
		||||
     config and the application data buffer passed to mbedtls_ssl_write
 | 
			
		||||
     is larger than the internal message buffer (16384 bytes by default), the
 | 
			
		||||
     latter overflows. The exploitability of this issue depends on whether the
 | 
			
		||||
     application layer can be forced into sending such large packets. The issue
 | 
			
		||||
     was independently reported by Tim Nordell via e-mail and by Florin Petriuc
 | 
			
		||||
     and sjorsdewit on GitHub. Fix proposed by Florin Petriuc in #1022. Fixes #707.
 | 
			
		||||
     and sjorsdewit on GitHub. Fix proposed by Florin Petriuc in #1022.
 | 
			
		||||
     Fixes #707.
 | 
			
		||||
   * Add a provision to prevent compiler optimizations breaking the time
 | 
			
		||||
     constancy of mbedtls_ssl_safer_memcmp().
 | 
			
		||||
   * Ensure that buffers are cleared after use if they contain sensitive data.
 | 
			
		||||
     Changes were introduced in multiple places in the library.
 | 
			
		||||
   * Set PEM buffer to zero before freeing it, to avoid decoded private keys
 | 
			
		||||
     being leaked to memory after release.
 | 
			
		||||
   * Fix dhm_check_range() failing to detect trivial subgroups and potentially
 | 
			
		||||
     leaking 1 bit of the private key. Reported by prashantkspatil.
 | 
			
		||||
   * Make mbedtls_mpi_read_binary() constant-time with respect to the input
 | 
			
		||||
     data. Previously, trailing zero bytes were detected and omitted for the
 | 
			
		||||
     sake of saving memory, but potentially leading to slight timing
 | 
			
		||||
     differences. Reported by Marco Macchetti, Kudelski Group.
 | 
			
		||||
   * Wipe stack buffer temporarily holding EC private exponent
 | 
			
		||||
     after keypair generation.
 | 
			
		||||
   * Fix a potential heap buffer over-read in ALPN extension parsing
 | 
			
		||||
     (server-side). Could result in application crash, but only if an ALPN
 | 
			
		||||
     name larger than 16 bytes had been configured on the server.
 | 
			
		||||
   * Change default choice of DHE parameters from untrustworthy RFC 5114
 | 
			
		||||
     to RFC 3526 containing parameters generated in a nothing-up-my-sleeve
 | 
			
		||||
     manner.
 | 
			
		||||
 | 
			
		||||
Features
 | 
			
		||||
   * Allow comments in test data files.
 | 
			
		||||
| 
						 | 
				
			
			@ -19,7 +54,7 @@ Features
 | 
			
		|||
   * New unit tests for timing. Improve the self-test to be more robust
 | 
			
		||||
     when run on a heavily-loaded machine.
 | 
			
		||||
   * Add alternative implementation support for CCM and CMAC (MBEDTLS_CCM_ALT,
 | 
			
		||||
     MBEDTLS_CMAC_ALT). Submitted by Steve Cooreman, Silicon Labs.
 | 
			
		||||
     MBEDTLS_CMAC_ALT). Submitted by Steven Cooreman, Silicon Labs.
 | 
			
		||||
   * Add support for alternative implementations of GCM, selected by the
 | 
			
		||||
     configuration flag MBEDTLS_GCM_ALT.
 | 
			
		||||
   * Add support for alternative implementations for ECDSA, controlled by new
 | 
			
		||||
| 
						 | 
				
			
			@ -28,29 +63,53 @@ Features
 | 
			
		|||
     The following functions from the ECDSA module can be replaced
 | 
			
		||||
     with alternative implementation:
 | 
			
		||||
     mbedtls_ecdsa_sign(), mbedtls_ecdsa_verify() and mbedtls_ecdsa_genkey().
 | 
			
		||||
   * Add support for alternative implementation for ECDH, controlled by new
 | 
			
		||||
     configuration flags MBEDTLS_ECDH_COMPUTE_SHARED_ALT and
 | 
			
		||||
   * Add support for alternative implementation of ECDH, controlled by the
 | 
			
		||||
     new configuration flags MBEDTLS_ECDH_COMPUTE_SHARED_ALT and
 | 
			
		||||
     MBEDTLS_ECDH_GEN_PUBLIC_ALT in config.h.
 | 
			
		||||
     The following functions from the ECDH module can be replaced
 | 
			
		||||
     with an alternative implementation:
 | 
			
		||||
     mbedtls_ecdh_gen_public() and mbedtls_ecdh_compute_shared().
 | 
			
		||||
 | 
			
		||||
New deprecations
 | 
			
		||||
   * Deprecate usage of RSA primitives with non-matching key-type
 | 
			
		||||
     (e.g., signing with a public key).
 | 
			
		||||
   * Direct manipulation of structure fields of RSA contexts is deprecated.
 | 
			
		||||
     Users are advised to use the extended RSA API instead.
 | 
			
		||||
   * Add support for alternative implementation of ECJPAKE, controlled by
 | 
			
		||||
     the new configuration flag MBEDTLS_ECJPAKE_ALT.
 | 
			
		||||
   * Add mechanism to provide alternative implementation of the DHM module.
 | 
			
		||||
 | 
			
		||||
API Changes
 | 
			
		||||
   * Extend RSA interface by multiple functions allowing structure-
 | 
			
		||||
     independent setup and export of RSA contexts. Most notably,
 | 
			
		||||
     mbedtls_rsa_import and mbedtls_rsa_complete are introduced for setting
 | 
			
		||||
     mbedtls_rsa_import() and mbedtls_rsa_complete() are introduced for setting
 | 
			
		||||
     up RSA contexts from partial key material and having them completed to the
 | 
			
		||||
     needs of the implementation automatically. This allows to setup private RSA
 | 
			
		||||
     contexts from keys consisting of N,D,E only, even if P,Q are needed for the
 | 
			
		||||
     purpose or CRT and/or blinding.
 | 
			
		||||
   * The configuration option MBEDTLS_RSA_ALT can be used to define alternative
 | 
			
		||||
     implementations of the RSA interface declared in rsa.h.
 | 
			
		||||
   * The following functions in the message digest modules (MD2, MD4, MD5,
 | 
			
		||||
     SHA1, SHA256, SHA512) have been deprecated and replaced as shown below.
 | 
			
		||||
     The new functions change the return type from void to int to allow
 | 
			
		||||
     returning error codes when using MBEDTLS_<MODULE>_ALT.
 | 
			
		||||
     mbedtls_<MODULE>_starts() -> mbedtls_<MODULE>_starts_ret()
 | 
			
		||||
     mbedtls_<MODULE>_update() -> mbedtls_<MODULE>_update_ret()
 | 
			
		||||
     mbedtls_<MODULE>_finish() -> mbedtls_<MODULE>_finish_ret()
 | 
			
		||||
     mbedtls_<MODULE>_process() -> mbedtls_internal_<MODULE>_process()
 | 
			
		||||
 | 
			
		||||
New deprecations
 | 
			
		||||
   * Deprecate usage of RSA primitives with non-matching key-type
 | 
			
		||||
     (e.g. signing with a public key).
 | 
			
		||||
   * Direct manipulation of structure fields of RSA contexts is deprecated.
 | 
			
		||||
     Users are advised to use the extended RSA API instead.
 | 
			
		||||
   * Deprecate usage of message digest functions that return void
 | 
			
		||||
     (mbedtls_<MODULE>_starts, mbedtls_<MODULE>_update,
 | 
			
		||||
     mbedtls_<MODULE>_finish and mbedtls_<MODULE>_process where <MODULE> is
 | 
			
		||||
     any of MD2, MD4, MD5, SHA1, SHA256, SHA512) in favor of functions
 | 
			
		||||
     that can return an error code.
 | 
			
		||||
   * Deprecate untrustworthy DHE parameters from RFC 5114. Superseded by
 | 
			
		||||
     parameters from RFC 3526 or the newly added parameters from RFC 7919.
 | 
			
		||||
   * Deprecate hex string DHE constants MBEDTLS_DHM_RFC3526_MODP_2048_P etc.
 | 
			
		||||
     Supserseded by binary encoded constants MBEDTLS_DHM_RFC3526_MODP_2048_P_BIN
 | 
			
		||||
     etc.
 | 
			
		||||
   * Deprecate mbedtls_ssl_conf_dh_param() for setting default DHE parameters
 | 
			
		||||
     from hex strings. Superseded by mbedtls_ssl_conf_dh_param_bin()
 | 
			
		||||
     accepting DHM parameters in binary form, matching the new constants.
 | 
			
		||||
 | 
			
		||||
Bugfix
 | 
			
		||||
   * Fix ssl_parse_record_header() to silently discard invalid DTLS records
 | 
			
		||||
| 
						 | 
				
			
			@ -64,6 +123,8 @@ Bugfix
 | 
			
		|||
   * Fix leap year calculation in x509_date_is_valid() to ensure that invalid
 | 
			
		||||
     dates on leap years with 100 and 400 intervals are handled correctly. Found
 | 
			
		||||
     by Nicholas Wilson. #694
 | 
			
		||||
   * Fix some invalid RSA-PSS signatures with keys of size 8N+1 that were
 | 
			
		||||
     accepted. Generating these signatures required the private key.
 | 
			
		||||
   * Fix out-of-memory problem when parsing 4096-bit PKCS8-encrypted RSA keys.
 | 
			
		||||
     Found independently by Florian in the mbed TLS forum and by Mishamax.
 | 
			
		||||
     #878, #1019.
 | 
			
		||||
| 
						 | 
				
			
			@ -83,27 +144,45 @@ Bugfix
 | 
			
		|||
   * Don't print X.509 version tag for v1 CRT's, and omit extensions for
 | 
			
		||||
     non-v3 CRT's.
 | 
			
		||||
   * Fix bugs in RSA test suite under MBEDTLS_NO_PLATFORM_ENTROPY. #1023 #1024
 | 
			
		||||
   * Fix net_would_block to avoid modification by errno through fcntl call.
 | 
			
		||||
   * Fix net_would_block() to avoid modification by errno through fcntl() call.
 | 
			
		||||
     Found by nkolban. Fixes #845.
 | 
			
		||||
   * Fix handling of handshake messages in mbedtls_ssl_read in case
 | 
			
		||||
   * Fix handling of handshake messages in mbedtls_ssl_read() in case
 | 
			
		||||
     MBEDTLS_SSL_RENEGOTIATION is disabled. Found by erja-gp.
 | 
			
		||||
   * Add a check for invalid private parameters in mbedtls_ecdsa_sign.
 | 
			
		||||
   * Add a check for invalid private parameters in mbedtls_ecdsa_sign().
 | 
			
		||||
     Reported by Yolan Romailler.
 | 
			
		||||
   * Fix word size check in in pk.c to not depend on MBEDTLS_HAVE_INT64.
 | 
			
		||||
   * Fix incorrect unit in benchmark output. #850
 | 
			
		||||
   * Add size-checks for record and handshake message content, securing
 | 
			
		||||
     fragile yet non-exploitable code-paths.
 | 
			
		||||
   * Fix crash when calling mbedtls_ssl_cache_free() twice. Found by
 | 
			
		||||
     MilenkoMitrovic, #1104
 | 
			
		||||
   * Fix mbedtls_timing_alarm(0) on Unix.
 | 
			
		||||
   * Fix use of uninitialized memory in mbedtls_timing_get_timer when reset=1.
 | 
			
		||||
   * Fix mbedtls_timing_alarm(0) on Unix and MinGW.
 | 
			
		||||
   * Fix use of uninitialized memory in mbedtls_timing_get_timer() when reset=1.
 | 
			
		||||
   * Fix possible memory leaks in mbedtls_gcm_self_test().
 | 
			
		||||
   * Added missing return code checks in mbedtls_aes_self_test().
 | 
			
		||||
   * Fix issues in RSA key generation program programs/x509/rsa_genkey and the
 | 
			
		||||
     RSA test suite where the failure of CTR DRBG initialization lead to
 | 
			
		||||
     freeing an RSA context and several MPI's without proper initialization
 | 
			
		||||
     beforehand.
 | 
			
		||||
   * Fix error message in programs/pkey/gen_key.c. Found and fixed by Chris Xue.
 | 
			
		||||
   * Fix programs/pkey/dh_server.c so that it actually works with dh_client.c.
 | 
			
		||||
     Found and fixed by Martijn de Milliano.
 | 
			
		||||
   * Fix an issue in the cipher decryption with the mode
 | 
			
		||||
     MBEDTLS_PADDING_ONE_AND_ZEROS that sometimes accepted invalid padding.
 | 
			
		||||
     Note, this padding mode is not used by the TLS protocol. Found and fixed by
 | 
			
		||||
     Micha Kraus.
 | 
			
		||||
   * Fix the entropy.c module to not call mbedtls_sha256_starts() or
 | 
			
		||||
     mbedtls_sha512_starts() in the mbedtls_entropy_init() function.
 | 
			
		||||
   * Fix the entropy.c module to ensure that mbedtls_sha256_init() or
 | 
			
		||||
     mbedtls_sha512_init() is called before operating on the relevant context
 | 
			
		||||
     structure. Do not assume that zeroizing a context is a correct way to
 | 
			
		||||
     reset it. Found independently by ccli8 on Github.
 | 
			
		||||
   * In mbedtls_entropy_free(), properly free the message digest context.
 | 
			
		||||
   * Fix status handshake status message in programs/ssl/dtls_client.c. Found
 | 
			
		||||
     and fixed by muddog.
 | 
			
		||||
 | 
			
		||||
Changes
 | 
			
		||||
   * Extend cert_write example program by options to set the CRT version
 | 
			
		||||
   * Extend cert_write example program by options to set the certificate version
 | 
			
		||||
     and the message digest. Further, allow enabling/disabling of authority
 | 
			
		||||
     identifier, subject identifier and basic constraints extensions.
 | 
			
		||||
   * Only check for necessary RSA structure fields in `mbedtls_rsa_private`. In
 | 
			
		||||
| 
						 | 
				
			
			@ -113,6 +192,16 @@ Changes
 | 
			
		|||
   * Only run AES-192 self-test if AES-192 is available. Fixes #963.
 | 
			
		||||
   * Tighten the RSA PKCS#1 v1.5 signature verification code and remove the
 | 
			
		||||
     undeclared dependency of the RSA module on the ASN.1 module.
 | 
			
		||||
   * Update all internal usage of deprecated message digest functions to the
 | 
			
		||||
     new ones with return codes. In particular, this modifies the
 | 
			
		||||
     mbedtls_md_info_t structure. Propagate errors from these functions
 | 
			
		||||
     everywhere except some locations in the ssl_tls.c module.
 | 
			
		||||
   * Improve CTR_DRBG error handling by propagating underlying AES errors.
 | 
			
		||||
   * Add MBEDTLS_ERR_XXX_HW_ACCEL_FAILED error codes for all cryptography
 | 
			
		||||
     modules where the software implementation can be replaced by a hardware
 | 
			
		||||
     implementation.
 | 
			
		||||
   * Add explicit warnings for the use of MD2, MD4, MD5, SHA-1, DES and ARC4
 | 
			
		||||
     throughout the library.
 | 
			
		||||
 | 
			
		||||
= mbed TLS 2.6.0 branch released 2017-08-10
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										2
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
									
									
									
									
								
							| 
						 | 
				
			
			@ -103,7 +103,7 @@ lcov:
 | 
			
		|||
 | 
			
		||||
apidoc:
 | 
			
		||||
	mkdir -p apidoc
 | 
			
		||||
	doxygen doxygen/mbedtls.doxyfile
 | 
			
		||||
	cd doxygen && doxygen mbedtls.doxyfile
 | 
			
		||||
 | 
			
		||||
apidoc_clean:
 | 
			
		||||
	rm -rf apidoc
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,9 @@
 | 
			
		|||
/*
 | 
			
		||||
 *  Minimal configuration for TLS 1.2 with PSK and AES-CCM ciphersuites
 | 
			
		||||
/**
 | 
			
		||||
 * \file config-ccm-psk-tls1_2.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief Minimal configuration for TLS 1.2 with PSK and AES-CCM ciphersuites
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,9 @@
 | 
			
		|||
/*
 | 
			
		||||
 *  Minimal configuration for TLS 1.1 (RFC 4346)
 | 
			
		||||
/**
 | 
			
		||||
 * \file config-mini-tls1_1.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief Minimal configuration for TLS 1.1 (RFC 4346)
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,9 @@
 | 
			
		|||
/**
 | 
			
		||||
 *  Minimal configuration of features that do not require an entropy source
 | 
			
		||||
 * \file config-no-entropy.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief Minimal configuration of features that do not require an entropy source
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2016, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,9 @@
 | 
			
		|||
/*
 | 
			
		||||
 *  Reduced configuration used by Picocoin.
 | 
			
		||||
/**
 | 
			
		||||
 * \file config-picocoin.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief Reduced configuration used by Picocoin.
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,9 @@
 | 
			
		|||
/*
 | 
			
		||||
 *  Minimal configuration for TLS NSA Suite B Profile (RFC 6460)
 | 
			
		||||
/**
 | 
			
		||||
 * \file config-suite-b.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief Minimal configuration for TLS NSA Suite B Profile (RFC 6460)
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,9 @@
 | 
			
		|||
/*
 | 
			
		||||
 *  Minimal configuration for using TLS as part of Thread
 | 
			
		||||
/**
 | 
			
		||||
 * \file config-thread.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief Minimal configuration for using TLS as part of Thread
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,9 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @file
 | 
			
		||||
 * Encryption/decryption module documentation file.
 | 
			
		||||
 * \file doc_encdec.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief Encryption/decryption module documentation file.
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,9 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @file
 | 
			
		||||
 * Hashing module documentation file.
 | 
			
		||||
 * \file doc_hashing.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief Hashing module documentation file.
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,9 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @file
 | 
			
		||||
 * Main page documentation file.
 | 
			
		||||
 * \file doc_mainpage.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief Main page documentation file.
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
| 
						 | 
				
			
			@ -21,7 +24,7 @@
 | 
			
		|||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @mainpage mbed TLS v2.6.0 source code documentation
 | 
			
		||||
 * @mainpage mbed TLS v2.7.0 source code documentation
 | 
			
		||||
 *
 | 
			
		||||
 * This documentation describes the internal structure of mbed TLS.  It was
 | 
			
		||||
 * automatically generated from specially formatted comment blocks in
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,9 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @file
 | 
			
		||||
 * Random number generator (RNG) module documentation file.
 | 
			
		||||
 * \file doc_rng.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief Random number generator (RNG) module documentation file.
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,9 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @file
 | 
			
		||||
 * SSL/TLS communication module documentation file.
 | 
			
		||||
 * \file doc_ssltls.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief SSL/TLS communication module documentation file.
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,9 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @file
 | 
			
		||||
 * TCP/IP communication module documentation file.
 | 
			
		||||
 * \file doc_tcpip.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief TCP/IP communication module documentation file.
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,9 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @file
 | 
			
		||||
 * X.509 module documentation file.
 | 
			
		||||
 * \file doc_x509.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief X.509 module documentation file.
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -28,7 +28,7 @@ DOXYFILE_ENCODING      = UTF-8
 | 
			
		|||
# identify the project. Note that if you do not use Doxywizard you need
 | 
			
		||||
# to put quotes around the project name if it contains spaces.
 | 
			
		||||
 | 
			
		||||
PROJECT_NAME           = "mbed TLS v2.6.0"
 | 
			
		||||
PROJECT_NAME           = "mbed TLS v2.7.0"
 | 
			
		||||
 | 
			
		||||
# The PROJECT_NUMBER tag can be used to enter a project or revision number.
 | 
			
		||||
# This could be handy for archiving the generated documentation or
 | 
			
		||||
| 
						 | 
				
			
			@ -54,7 +54,7 @@ PROJECT_LOGO           =
 | 
			
		|||
# If a relative path is entered, it will be relative to the location
 | 
			
		||||
# where doxygen was started. If left blank the current directory will be used.
 | 
			
		||||
 | 
			
		||||
OUTPUT_DIRECTORY       = apidoc/
 | 
			
		||||
OUTPUT_DIRECTORY       = ../apidoc/
 | 
			
		||||
 | 
			
		||||
# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
 | 
			
		||||
# 4096 sub-directories (in 2 levels) under the output directory of each output
 | 
			
		||||
| 
						 | 
				
			
			@ -165,7 +165,7 @@ SHORT_NAMES            = NO
 | 
			
		|||
# comments will behave just like regular Qt-style comments
 | 
			
		||||
# (thus requiring an explicit @brief command for a brief description.)
 | 
			
		||||
 | 
			
		||||
JAVADOC_AUTOBRIEF      = YES
 | 
			
		||||
JAVADOC_AUTOBRIEF      = NO
 | 
			
		||||
 | 
			
		||||
# If the QT_AUTOBRIEF tag is set to YES then Doxygen will
 | 
			
		||||
# interpret the first line (until the first dot) of a Qt-style
 | 
			
		||||
| 
						 | 
				
			
			@ -664,7 +664,7 @@ WARN_LOGFILE           =
 | 
			
		|||
# directories like "/usr/src/myproject". Separate the files or directories
 | 
			
		||||
# with spaces.
 | 
			
		||||
 | 
			
		||||
INPUT                  = .
 | 
			
		||||
INPUT                  = ..
 | 
			
		||||
 | 
			
		||||
# This tag can be used to specify the character encoding of the source files
 | 
			
		||||
# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
 | 
			
		||||
| 
						 | 
				
			
			@ -696,7 +696,7 @@ RECURSIVE              = YES
 | 
			
		|||
# Note that relative paths are relative to the directory from which doxygen is
 | 
			
		||||
# run.
 | 
			
		||||
 | 
			
		||||
EXCLUDE                = configs yotta/module
 | 
			
		||||
EXCLUDE                = ../configs ../yotta/module
 | 
			
		||||
 | 
			
		||||
# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
 | 
			
		||||
# directories that are symbolic links (a Unix file system feature) are excluded
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,9 +1,18 @@
 | 
			
		|||
/**
 | 
			
		||||
 * \file aes.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief AES block cipher
 | 
			
		||||
 * \brief   The Advanced Encryption Standard (AES) specifies a FIPS-approved
 | 
			
		||||
 *          cryptographic algorithm that can be used to protect electronic
 | 
			
		||||
 *          data.
 | 
			
		||||
 *
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *          The AES algorithm is a symmetric block cipher that can
 | 
			
		||||
 *          encrypt and decrypt information. For more information, see
 | 
			
		||||
 *          <em>FIPS Publication 197: Advanced Encryption Standard</em> and
 | 
			
		||||
 *          <em>ISO/IEC 18033-2:2006: Information technology -- Security
 | 
			
		||||
 *          techniques -- Encryption algorithms -- Part 2: Asymmetric
 | 
			
		||||
 *          ciphers</em>.
 | 
			
		||||
 */
 | 
			
		||||
/*  Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved.
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
 *  Licensed under the Apache License, Version 2.0 (the "License"); you may
 | 
			
		||||
| 
						 | 
				
			
			@ -18,8 +27,9 @@
 | 
			
		|||
 *  See the License for the specific language governing permissions and
 | 
			
		||||
 *  limitations under the License.
 | 
			
		||||
 *
 | 
			
		||||
 *  This file is part of mbed TLS (https://tls.mbed.org)
 | 
			
		||||
 *  This file is part of Mbed TLS (https://tls.mbed.org)
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef MBEDTLS_AES_H
 | 
			
		||||
#define MBEDTLS_AES_H
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -33,15 +43,16 @@
 | 
			
		|||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
/* padlock.c and aesni.c rely on these values! */
 | 
			
		||||
#define MBEDTLS_AES_ENCRYPT     1
 | 
			
		||||
#define MBEDTLS_AES_DECRYPT     0
 | 
			
		||||
#define MBEDTLS_AES_ENCRYPT     1 /**< AES encryption. */
 | 
			
		||||
#define MBEDTLS_AES_DECRYPT     0 /**< AES decryption. */
 | 
			
		||||
 | 
			
		||||
/* Error codes in range 0x0020-0x0022 */
 | 
			
		||||
#define MBEDTLS_ERR_AES_INVALID_KEY_LENGTH                -0x0020  /**< Invalid key length. */
 | 
			
		||||
#define MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH              -0x0022  /**< Invalid data input length. */
 | 
			
		||||
 | 
			
		||||
/* Error codes in range 0x0023-0x0023 */
 | 
			
		||||
#define MBEDTLS_ERR_AES_FEATURE_UNAVAILABLE               -0x0023  /**< Feature not available, e.g. unsupported AES key size. */
 | 
			
		||||
/* Error codes in range 0x0023-0x0025 */
 | 
			
		||||
#define MBEDTLS_ERR_AES_FEATURE_UNAVAILABLE               -0x0023  /**< Feature not available. For example, an unsupported AES key size. */
 | 
			
		||||
#define MBEDTLS_ERR_AES_HW_ACCEL_FAILED                   -0x0025  /**< AES hardware accelerator failed. */
 | 
			
		||||
 | 
			
		||||
#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \
 | 
			
		||||
    !defined(inline) && !defined(__cplusplus)
 | 
			
		||||
| 
						 | 
				
			
			@ -57,68 +68,90 @@ extern "C" {
 | 
			
		|||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          AES context structure
 | 
			
		||||
 *
 | 
			
		||||
 * \note           buf is able to hold 32 extra bytes, which can be used:
 | 
			
		||||
 *                 - for alignment purposes if VIA padlock is used, and/or
 | 
			
		||||
 *                 - to simplify key expansion in the 256-bit case by
 | 
			
		||||
 *                 generating an extra round key
 | 
			
		||||
 * \brief The AES context-type definition.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct
 | 
			
		||||
{
 | 
			
		||||
    int nr;                     /*!<  number of rounds  */
 | 
			
		||||
    uint32_t *rk;               /*!<  AES round keys    */
 | 
			
		||||
    uint32_t buf[68];           /*!<  unaligned data    */
 | 
			
		||||
    int nr;                     /*!< The number of rounds. */
 | 
			
		||||
    uint32_t *rk;               /*!< AES round keys. */
 | 
			
		||||
    uint32_t buf[68];           /*!< Unaligned data buffer. This buffer can
 | 
			
		||||
                                     hold 32 extra Bytes, which can be used for
 | 
			
		||||
                                     one of the following purposes:
 | 
			
		||||
                                     <ul><li>Alignment if VIA padlock is
 | 
			
		||||
                                             used.</li>
 | 
			
		||||
                                     <li>Simplifying key expansion in the 256-bit
 | 
			
		||||
                                         case by generating an extra round key.
 | 
			
		||||
                                         </li></ul> */
 | 
			
		||||
}
 | 
			
		||||
mbedtls_aes_context;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          Initialize AES context
 | 
			
		||||
 * \brief          This function initializes the specified AES context.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      AES context to be initialized
 | 
			
		||||
 *                 It must be the first API called before using
 | 
			
		||||
 *                 the context.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      The AES context to initialize.
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_aes_init( mbedtls_aes_context *ctx );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          Clear AES context
 | 
			
		||||
 * \brief          This function releases and clears the specified AES context.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      AES context to be cleared
 | 
			
		||||
 * \param ctx      The AES context to clear.
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_aes_free( mbedtls_aes_context *ctx );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          AES key schedule (encryption)
 | 
			
		||||
 * \brief          This function sets the encryption key.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      AES context to be initialized
 | 
			
		||||
 * \param key      encryption key
 | 
			
		||||
 * \param keybits  must be 128, 192 or 256
 | 
			
		||||
 * \param ctx      The AES context to which the key should be bound.
 | 
			
		||||
 * \param key      The encryption key.
 | 
			
		||||
 * \param keybits  The size of data passed in bits. Valid options are:
 | 
			
		||||
 *                 <ul><li>128 bits</li>
 | 
			
		||||
 *                 <li>192 bits</li>
 | 
			
		||||
 *                 <li>256 bits</li></ul>
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful, or MBEDTLS_ERR_AES_INVALID_KEY_LENGTH
 | 
			
		||||
 * \return         \c 0 on success or #MBEDTLS_ERR_AES_INVALID_KEY_LENGTH
 | 
			
		||||
 *                 on failure.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_aes_setkey_enc( mbedtls_aes_context *ctx, const unsigned char *key,
 | 
			
		||||
                    unsigned int keybits );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          AES key schedule (decryption)
 | 
			
		||||
 * \brief          This function sets the decryption key.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      AES context to be initialized
 | 
			
		||||
 * \param key      decryption key
 | 
			
		||||
 * \param keybits  must be 128, 192 or 256
 | 
			
		||||
 * \param ctx      The AES context to which the key should be bound.
 | 
			
		||||
 * \param key      The decryption key.
 | 
			
		||||
 * \param keybits  The size of data passed. Valid options are:
 | 
			
		||||
 *                 <ul><li>128 bits</li>
 | 
			
		||||
 *                 <li>192 bits</li>
 | 
			
		||||
 *                 <li>256 bits</li></ul>
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful, or MBEDTLS_ERR_AES_INVALID_KEY_LENGTH
 | 
			
		||||
 * \return         \c 0 on success, or #MBEDTLS_ERR_AES_INVALID_KEY_LENGTH on failure.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_aes_setkey_dec( mbedtls_aes_context *ctx, const unsigned char *key,
 | 
			
		||||
                    unsigned int keybits );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          AES-ECB block encryption/decryption
 | 
			
		||||
 * \brief          This function performs an AES single-block encryption or
 | 
			
		||||
 *                 decryption operation.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      AES context
 | 
			
		||||
 * \param mode     MBEDTLS_AES_ENCRYPT or MBEDTLS_AES_DECRYPT
 | 
			
		||||
 * \param input    16-byte input block
 | 
			
		||||
 * \param output   16-byte output block
 | 
			
		||||
 *                 It performs the operation defined in the \p mode parameter
 | 
			
		||||
 *                 (encrypt or decrypt), on the input data buffer defined in
 | 
			
		||||
 *                 the \p input parameter.
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful
 | 
			
		||||
 *                 mbedtls_aes_init(), and either mbedtls_aes_setkey_enc() or
 | 
			
		||||
 *                 mbedtls_aes_setkey_dec() must be called before the first
 | 
			
		||||
 *                 call to this API with the same context.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      The AES context to use for encryption or decryption.
 | 
			
		||||
 * \param mode     The AES operation: #MBEDTLS_AES_ENCRYPT or
 | 
			
		||||
 *                 #MBEDTLS_AES_DECRYPT.
 | 
			
		||||
 * \param input    The 16-Byte buffer holding the input data.
 | 
			
		||||
 * \param output   The 16-Byte buffer holding the output data.
 | 
			
		||||
 | 
			
		||||
 * \return         \c 0 on success.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_aes_crypt_ecb( mbedtls_aes_context *ctx,
 | 
			
		||||
                    int mode,
 | 
			
		||||
| 
						 | 
				
			
			@ -127,26 +160,40 @@ int mbedtls_aes_crypt_ecb( mbedtls_aes_context *ctx,
 | 
			
		|||
 | 
			
		||||
#if defined(MBEDTLS_CIPHER_MODE_CBC)
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          AES-CBC buffer encryption/decryption
 | 
			
		||||
 *                 Length should be a multiple of the block
 | 
			
		||||
 *                 size (16 bytes)
 | 
			
		||||
 * \brief  This function performs an AES-CBC encryption or decryption operation
 | 
			
		||||
 *         on full blocks.
 | 
			
		||||
 *
 | 
			
		||||
 * \note           Upon exit, the content of the IV is updated so that you can
 | 
			
		||||
 *                 call the function same function again on the following
 | 
			
		||||
 *                 block(s) of data and get the same result as if it was
 | 
			
		||||
 *                 encrypted in one call. This allows a "streaming" usage.
 | 
			
		||||
 *                 If on the other hand you need to retain the contents of the
 | 
			
		||||
 *                 IV, you should either save it manually or use the cipher
 | 
			
		||||
 *                 module instead.
 | 
			
		||||
 *         It performs the operation defined in the \p mode
 | 
			
		||||
 *         parameter (encrypt/decrypt), on the input data buffer defined in
 | 
			
		||||
 *         the \p input parameter.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      AES context
 | 
			
		||||
 * \param mode     MBEDTLS_AES_ENCRYPT or MBEDTLS_AES_DECRYPT
 | 
			
		||||
 * \param length   length of the input data
 | 
			
		||||
 * \param iv       initialization vector (updated after use)
 | 
			
		||||
 * \param input    buffer holding the input data
 | 
			
		||||
 * \param output   buffer holding the output data
 | 
			
		||||
 *         It can be called as many times as needed, until all the input
 | 
			
		||||
 *         data is processed. mbedtls_aes_init(), and either
 | 
			
		||||
 *         mbedtls_aes_setkey_enc() or mbedtls_aes_setkey_dec() must be called
 | 
			
		||||
 *         before the first call to this API with the same context.
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful, or MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH
 | 
			
		||||
 * \note   This function operates on aligned blocks, that is, the input size
 | 
			
		||||
 *         must be a multiple of the AES block size of 16 Bytes.
 | 
			
		||||
 *
 | 
			
		||||
 * \note   Upon exit, the content of the IV is updated so that you can
 | 
			
		||||
 *         call the same function again on the next
 | 
			
		||||
 *         block(s) of data and get the same result as if it was
 | 
			
		||||
 *         encrypted in one call. This allows a "streaming" usage.
 | 
			
		||||
 *         If you need to retain the contents of the IV, you should
 | 
			
		||||
 *         either save it manually or use the cipher module instead.
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      The AES context to use for encryption or decryption.
 | 
			
		||||
 * \param mode     The AES operation: #MBEDTLS_AES_ENCRYPT or
 | 
			
		||||
 *                 #MBEDTLS_AES_DECRYPT.
 | 
			
		||||
 * \param length   The length of the input data in Bytes. This must be a
 | 
			
		||||
 *                 multiple of the block size (16 Bytes).
 | 
			
		||||
 * \param iv       Initialization vector (updated after use).
 | 
			
		||||
 * \param input    The buffer holding the input data.
 | 
			
		||||
 * \param output   The buffer holding the output data.
 | 
			
		||||
 *
 | 
			
		||||
 * \return         \c 0 on success, or #MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH
 | 
			
		||||
 *                 on failure.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_aes_crypt_cbc( mbedtls_aes_context *ctx,
 | 
			
		||||
                    int mode,
 | 
			
		||||
| 
						 | 
				
			
			@ -158,29 +205,38 @@ int mbedtls_aes_crypt_cbc( mbedtls_aes_context *ctx,
 | 
			
		|||
 | 
			
		||||
#if defined(MBEDTLS_CIPHER_MODE_CFB)
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          AES-CFB128 buffer encryption/decryption.
 | 
			
		||||
 * \brief This function performs an AES-CFB128 encryption or decryption
 | 
			
		||||
 *        operation.
 | 
			
		||||
 *
 | 
			
		||||
 * Note: Due to the nature of CFB you should use the same key schedule for
 | 
			
		||||
 * both encryption and decryption. So a context initialized with
 | 
			
		||||
 * mbedtls_aes_setkey_enc() for both MBEDTLS_AES_ENCRYPT and MBEDTLS_AES_DECRYPT.
 | 
			
		||||
 *        It performs the operation defined in the \p mode
 | 
			
		||||
 *        parameter (encrypt or decrypt), on the input data buffer
 | 
			
		||||
 *        defined in the \p input parameter.
 | 
			
		||||
 *
 | 
			
		||||
 * \note           Upon exit, the content of the IV is updated so that you can
 | 
			
		||||
 *                 call the function same function again on the following
 | 
			
		||||
 *                 block(s) of data and get the same result as if it was
 | 
			
		||||
 *                 encrypted in one call. This allows a "streaming" usage.
 | 
			
		||||
 *                 If on the other hand you need to retain the contents of the
 | 
			
		||||
 *                 IV, you should either save it manually or use the cipher
 | 
			
		||||
 *                 module instead.
 | 
			
		||||
 *        For CFB, you must set up the context with mbedtls_aes_setkey_enc(),
 | 
			
		||||
 *        regardless of whether you are performing an encryption or decryption
 | 
			
		||||
 *        operation, that is, regardless of the \p mode parameter. This is
 | 
			
		||||
 *        because CFB mode uses the same key schedule for encryption and
 | 
			
		||||
 *        decryption.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      AES context
 | 
			
		||||
 * \param mode     MBEDTLS_AES_ENCRYPT or MBEDTLS_AES_DECRYPT
 | 
			
		||||
 * \param length   length of the input data
 | 
			
		||||
 * \param iv_off   offset in IV (updated after use)
 | 
			
		||||
 * \param iv       initialization vector (updated after use)
 | 
			
		||||
 * \param input    buffer holding the input data
 | 
			
		||||
 * \param output   buffer holding the output data
 | 
			
		||||
 * \note  Upon exit, the content of the IV is updated so that you can
 | 
			
		||||
 *        call the same function again on the next
 | 
			
		||||
 *        block(s) of data and get the same result as if it was
 | 
			
		||||
 *        encrypted in one call. This allows a "streaming" usage.
 | 
			
		||||
 *        If you need to retain the contents of the
 | 
			
		||||
 *        IV, you must either save it manually or use the cipher
 | 
			
		||||
 *        module instead.
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      The AES context to use for encryption or decryption.
 | 
			
		||||
 * \param mode     The AES operation: #MBEDTLS_AES_ENCRYPT or
 | 
			
		||||
 *                 #MBEDTLS_AES_DECRYPT.
 | 
			
		||||
 * \param length   The length of the input data.
 | 
			
		||||
 * \param iv_off   The offset in IV (updated after use).
 | 
			
		||||
 * \param iv       The initialization vector (updated after use).
 | 
			
		||||
 * \param input    The buffer holding the input data.
 | 
			
		||||
 * \param output   The buffer holding the output data.
 | 
			
		||||
 *
 | 
			
		||||
 * \return         \c 0 on success.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_aes_crypt_cfb128( mbedtls_aes_context *ctx,
 | 
			
		||||
                       int mode,
 | 
			
		||||
| 
						 | 
				
			
			@ -191,28 +247,36 @@ int mbedtls_aes_crypt_cfb128( mbedtls_aes_context *ctx,
 | 
			
		|||
                       unsigned char *output );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          AES-CFB8 buffer encryption/decryption.
 | 
			
		||||
 * \brief This function performs an AES-CFB8 encryption or decryption
 | 
			
		||||
 *        operation.
 | 
			
		||||
 *
 | 
			
		||||
 * Note: Due to the nature of CFB you should use the same key schedule for
 | 
			
		||||
 * both encryption and decryption. So a context initialized with
 | 
			
		||||
 * mbedtls_aes_setkey_enc() for both MBEDTLS_AES_ENCRYPT and MBEDTLS_AES_DECRYPT.
 | 
			
		||||
 *        It performs the operation defined in the \p mode
 | 
			
		||||
 *        parameter (encrypt/decrypt), on the input data buffer defined
 | 
			
		||||
 *        in the \p input parameter.
 | 
			
		||||
 *
 | 
			
		||||
 * \note           Upon exit, the content of the IV is updated so that you can
 | 
			
		||||
 *                 call the function same function again on the following
 | 
			
		||||
 *                 block(s) of data and get the same result as if it was
 | 
			
		||||
 *                 encrypted in one call. This allows a "streaming" usage.
 | 
			
		||||
 *                 If on the other hand you need to retain the contents of the
 | 
			
		||||
 *                 IV, you should either save it manually or use the cipher
 | 
			
		||||
 *                 module instead.
 | 
			
		||||
 *        Due to the nature of CFB, you must use the same key schedule for
 | 
			
		||||
 *        both encryption and decryption operations. Therefore, you must
 | 
			
		||||
 *        use the context initialized with mbedtls_aes_setkey_enc() for
 | 
			
		||||
 *        both #MBEDTLS_AES_ENCRYPT and #MBEDTLS_AES_DECRYPT.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      AES context
 | 
			
		||||
 * \param mode     MBEDTLS_AES_ENCRYPT or MBEDTLS_AES_DECRYPT
 | 
			
		||||
 * \param length   length of the input data
 | 
			
		||||
 * \param iv       initialization vector (updated after use)
 | 
			
		||||
 * \param input    buffer holding the input data
 | 
			
		||||
 * \param output   buffer holding the output data
 | 
			
		||||
 * \note  Upon exit, the content of the IV is updated so that you can
 | 
			
		||||
 *        call the same function again on the next
 | 
			
		||||
 *        block(s) of data and get the same result as if it was
 | 
			
		||||
 *        encrypted in one call. This allows a "streaming" usage.
 | 
			
		||||
 *        If you need to retain the contents of the
 | 
			
		||||
 *        IV, you should either save it manually or use the cipher
 | 
			
		||||
 *        module instead.
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      The AES context to use for encryption or decryption.
 | 
			
		||||
 * \param mode     The AES operation: #MBEDTLS_AES_ENCRYPT or
 | 
			
		||||
 *                 #MBEDTLS_AES_DECRYPT
 | 
			
		||||
 * \param length   The length of the input data.
 | 
			
		||||
 * \param iv       The initialization vector (updated after use).
 | 
			
		||||
 * \param input    The buffer holding the input data.
 | 
			
		||||
 * \param output   The buffer holding the output data.
 | 
			
		||||
 *
 | 
			
		||||
 * \return         \c 0 on success.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_aes_crypt_cfb8( mbedtls_aes_context *ctx,
 | 
			
		||||
                    int mode,
 | 
			
		||||
| 
						 | 
				
			
			@ -224,26 +288,32 @@ int mbedtls_aes_crypt_cfb8( mbedtls_aes_context *ctx,
 | 
			
		|||
 | 
			
		||||
#if defined(MBEDTLS_CIPHER_MODE_CTR)
 | 
			
		||||
/**
 | 
			
		||||
 * \brief               AES-CTR buffer encryption/decryption
 | 
			
		||||
 * \brief      This function performs an AES-CTR encryption or decryption
 | 
			
		||||
 *             operation.
 | 
			
		||||
 *
 | 
			
		||||
 * Warning: You have to keep the maximum use of your counter in mind!
 | 
			
		||||
 *             This function performs the operation defined in the \p mode
 | 
			
		||||
 *             parameter (encrypt/decrypt), on the input data buffer
 | 
			
		||||
 *             defined in the \p input parameter.
 | 
			
		||||
 *
 | 
			
		||||
 * Note: Due to the nature of CTR you should use the same key schedule for
 | 
			
		||||
 * both encryption and decryption. So a context initialized with
 | 
			
		||||
 * mbedtls_aes_setkey_enc() for both MBEDTLS_AES_ENCRYPT and MBEDTLS_AES_DECRYPT.
 | 
			
		||||
 *             Due to the nature of CTR, you must use the same key schedule
 | 
			
		||||
 *             for both encryption and decryption operations. Therefore, you
 | 
			
		||||
 *             must use the context initialized with mbedtls_aes_setkey_enc()
 | 
			
		||||
 *             for both #MBEDTLS_AES_ENCRYPT and #MBEDTLS_AES_DECRYPT.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx           AES context
 | 
			
		||||
 * \param length        The length of the data
 | 
			
		||||
 * \param nc_off        The offset in the current stream_block (for resuming
 | 
			
		||||
 *                      within current cipher stream). The offset pointer to
 | 
			
		||||
 *                      should be 0 at the start of a stream.
 | 
			
		||||
 * \param nonce_counter The 128-bit nonce and counter.
 | 
			
		||||
 * \param stream_block  The saved stream-block for resuming. Is overwritten
 | 
			
		||||
 *                      by the function.
 | 
			
		||||
 * \param input         The input data stream
 | 
			
		||||
 * \param output        The output data stream
 | 
			
		||||
 * \warning    You must keep the maximum use of your counter in mind.
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful
 | 
			
		||||
 * \param ctx              The AES context to use for encryption or decryption.
 | 
			
		||||
 * \param length           The length of the input data.
 | 
			
		||||
 * \param nc_off           The offset in the current \p stream_block, for
 | 
			
		||||
 *                         resuming within the current cipher stream. The
 | 
			
		||||
 *                         offset pointer should be 0 at the start of a stream.
 | 
			
		||||
 * \param nonce_counter    The 128-bit nonce and counter.
 | 
			
		||||
 * \param stream_block     The saved stream block for resuming. This is
 | 
			
		||||
 *                         overwritten by the function.
 | 
			
		||||
 * \param input            The buffer holding the input data.
 | 
			
		||||
 * \param output           The buffer holding the output data.
 | 
			
		||||
 *
 | 
			
		||||
 * \return     \c 0 on success.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_aes_crypt_ctr( mbedtls_aes_context *ctx,
 | 
			
		||||
                       size_t length,
 | 
			
		||||
| 
						 | 
				
			
			@ -255,30 +325,30 @@ int mbedtls_aes_crypt_ctr( mbedtls_aes_context *ctx,
 | 
			
		|||
#endif /* MBEDTLS_CIPHER_MODE_CTR */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Internal AES block encryption function
 | 
			
		||||
 *                  (Only exposed to allow overriding it,
 | 
			
		||||
 *                  see MBEDTLS_AES_ENCRYPT_ALT)
 | 
			
		||||
 * \brief           Internal AES block encryption function. This is only
 | 
			
		||||
 *                  exposed to allow overriding it using
 | 
			
		||||
 *                  \c MBEDTLS_AES_ENCRYPT_ALT.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx       AES context
 | 
			
		||||
 * \param input     Plaintext block
 | 
			
		||||
 * \param output    Output (ciphertext) block
 | 
			
		||||
 * \param ctx       The AES context to use for encryption.
 | 
			
		||||
 * \param input     The plaintext block.
 | 
			
		||||
 * \param output    The output (ciphertext) block.
 | 
			
		||||
 *
 | 
			
		||||
 * \return          0 if successful
 | 
			
		||||
 * \return          \c 0 on success.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_internal_aes_encrypt( mbedtls_aes_context *ctx,
 | 
			
		||||
                                  const unsigned char input[16],
 | 
			
		||||
                                  unsigned char output[16] );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Internal AES block decryption function
 | 
			
		||||
 *                  (Only exposed to allow overriding it,
 | 
			
		||||
 *                  see MBEDTLS_AES_DECRYPT_ALT)
 | 
			
		||||
 * \brief           Internal AES block decryption function. This is only
 | 
			
		||||
 *                  exposed to allow overriding it using see
 | 
			
		||||
 *                  \c MBEDTLS_AES_DECRYPT_ALT.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx       AES context
 | 
			
		||||
 * \param input     Ciphertext block
 | 
			
		||||
 * \param output    Output (plaintext) block
 | 
			
		||||
 * \param ctx       The AES context to use for decryption.
 | 
			
		||||
 * \param input     The ciphertext block.
 | 
			
		||||
 * \param output    The output (plaintext) block.
 | 
			
		||||
 *
 | 
			
		||||
 * \return          0 if successful
 | 
			
		||||
 * \return          \c 0 on success.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_internal_aes_decrypt( mbedtls_aes_context *ctx,
 | 
			
		||||
                                  const unsigned char input[16],
 | 
			
		||||
| 
						 | 
				
			
			@ -294,11 +364,11 @@ int mbedtls_internal_aes_decrypt( mbedtls_aes_context *ctx,
 | 
			
		|||
 * \brief           Deprecated internal AES block encryption function
 | 
			
		||||
 *                  without return value.
 | 
			
		||||
 *
 | 
			
		||||
 * \deprecated      Superseded by mbedtls_aes_encrypt_ext() in 2.5.0
 | 
			
		||||
 * \deprecated      Superseded by mbedtls_aes_encrypt_ext() in 2.5.0.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx       AES context
 | 
			
		||||
 * \param input     Plaintext block
 | 
			
		||||
 * \param output    Output (ciphertext) block
 | 
			
		||||
 * \param ctx       The AES context to use for encryption.
 | 
			
		||||
 * \param input     Plaintext block.
 | 
			
		||||
 * \param output    Output (ciphertext) block.
 | 
			
		||||
 */
 | 
			
		||||
MBEDTLS_DEPRECATED void mbedtls_aes_encrypt( mbedtls_aes_context *ctx,
 | 
			
		||||
                                             const unsigned char input[16],
 | 
			
		||||
| 
						 | 
				
			
			@ -308,11 +378,11 @@ MBEDTLS_DEPRECATED void mbedtls_aes_encrypt( mbedtls_aes_context *ctx,
 | 
			
		|||
 * \brief           Deprecated internal AES block decryption function
 | 
			
		||||
 *                  without return value.
 | 
			
		||||
 *
 | 
			
		||||
 * \deprecated      Superseded by mbedtls_aes_decrypt_ext() in 2.5.0
 | 
			
		||||
 * \deprecated      Superseded by mbedtls_aes_decrypt_ext() in 2.5.0.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx       AES context
 | 
			
		||||
 * \param input     Ciphertext block
 | 
			
		||||
 * \param output    Output (plaintext) block
 | 
			
		||||
 * \param ctx       The AES context to use for decryption.
 | 
			
		||||
 * \param input     Ciphertext block.
 | 
			
		||||
 * \param output    Output (plaintext) block.
 | 
			
		||||
 */
 | 
			
		||||
MBEDTLS_DEPRECATED void mbedtls_aes_decrypt( mbedtls_aes_context *ctx,
 | 
			
		||||
                                             const unsigned char input[16],
 | 
			
		||||
| 
						 | 
				
			
			@ -334,9 +404,9 @@ extern "C" {
 | 
			
		|||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          Checkup routine
 | 
			
		||||
 * \brief          Checkup routine.
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful, or 1 if the test failed
 | 
			
		||||
 * \return         \c 0 on success, or \c 1 on failure.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_aes_self_test( int verbose );
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,8 @@
 | 
			
		|||
 * \file aesni.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief AES-NI for hardware AES acceleration on some Intel processors
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,6 +3,10 @@
 | 
			
		|||
 *
 | 
			
		||||
 * \brief The ARCFOUR stream cipher
 | 
			
		||||
 *
 | 
			
		||||
 * \warning   ARC4 is considered a weak cipher and its use constitutes a
 | 
			
		||||
 *            security risk. We recommend considering stronger ciphers instead.
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			@ -19,6 +23,7 @@
 | 
			
		|||
 *  limitations under the License.
 | 
			
		||||
 *
 | 
			
		||||
 *  This file is part of mbed TLS (https://tls.mbed.org)
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
#ifndef MBEDTLS_ARC4_H
 | 
			
		||||
#define MBEDTLS_ARC4_H
 | 
			
		||||
| 
						 | 
				
			
			@ -31,6 +36,8 @@
 | 
			
		|||
 | 
			
		||||
#include <stddef.h>
 | 
			
		||||
 | 
			
		||||
#define MBEDTLS_ERR_ARC4_HW_ACCEL_FAILED                  -0x0019  /**< ARC4 hardware accelerator failed. */
 | 
			
		||||
 | 
			
		||||
#if !defined(MBEDTLS_ARC4_ALT)
 | 
			
		||||
// Regular implementation
 | 
			
		||||
//
 | 
			
		||||
| 
						 | 
				
			
			@ -40,7 +47,11 @@ extern "C" {
 | 
			
		|||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          ARC4 context structure
 | 
			
		||||
 * \brief     ARC4 context structure
 | 
			
		||||
 *
 | 
			
		||||
 * \warning   ARC4 is considered a weak cipher and its use constitutes a
 | 
			
		||||
 *            security risk. We recommend considering stronger ciphers instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
typedef struct
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -54,6 +65,11 @@ mbedtls_arc4_context;
 | 
			
		|||
 * \brief          Initialize ARC4 context
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      ARC4 context to be initialized
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        ARC4 is considered a weak cipher and its use constitutes a
 | 
			
		||||
 *                 security risk. We recommend considering stronger ciphers
 | 
			
		||||
 *                 instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_arc4_init( mbedtls_arc4_context *ctx );
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -61,6 +77,11 @@ void mbedtls_arc4_init( mbedtls_arc4_context *ctx );
 | 
			
		|||
 * \brief          Clear ARC4 context
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      ARC4 context to be cleared
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        ARC4 is considered a weak cipher and its use constitutes a
 | 
			
		||||
 *                 security risk. We recommend considering stronger ciphers
 | 
			
		||||
 *                 instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_arc4_free( mbedtls_arc4_context *ctx );
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -70,6 +91,11 @@ void mbedtls_arc4_free( mbedtls_arc4_context *ctx );
 | 
			
		|||
 * \param ctx      ARC4 context to be setup
 | 
			
		||||
 * \param key      the secret key
 | 
			
		||||
 * \param keylen   length of the key, in bytes
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        ARC4 is considered a weak cipher and its use constitutes a
 | 
			
		||||
 *                 security risk. We recommend considering stronger ciphers
 | 
			
		||||
 *                 instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_arc4_setup( mbedtls_arc4_context *ctx, const unsigned char *key,
 | 
			
		||||
                 unsigned int keylen );
 | 
			
		||||
| 
						 | 
				
			
			@ -83,6 +109,11 @@ void mbedtls_arc4_setup( mbedtls_arc4_context *ctx, const unsigned char *key,
 | 
			
		|||
 * \param output   buffer for the output data
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        ARC4 is considered a weak cipher and its use constitutes a
 | 
			
		||||
 *                 security risk. We recommend considering stronger ciphers
 | 
			
		||||
 *                 instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_arc4_crypt( mbedtls_arc4_context *ctx, size_t length, const unsigned char *input,
 | 
			
		||||
                unsigned char *output );
 | 
			
		||||
| 
						 | 
				
			
			@ -103,6 +134,11 @@ extern "C" {
 | 
			
		|||
 * \brief          Checkup routine
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful, or 1 if the test failed
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        ARC4 is considered a weak cipher and its use constitutes a
 | 
			
		||||
 *                 security risk. We recommend considering stronger ciphers
 | 
			
		||||
 *                 instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_arc4_self_test( int verbose );
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,8 @@
 | 
			
		|||
 * \file asn1.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief Generic ASN.1 parsing
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,8 @@
 | 
			
		|||
 * \file asn1write.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief ASN.1 buffer writing functionality
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,8 @@
 | 
			
		|||
 * \file base64.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief RFC 1521 base64 encoding/decoding
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,8 +1,9 @@
 | 
			
		|||
/**
 | 
			
		||||
 * \file bignum.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief  Multi-precision integer library
 | 
			
		||||
 *
 | 
			
		||||
 * \brief Multi-precision integer library
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			@ -683,6 +684,10 @@ int mbedtls_mpi_exp_mod( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi
 | 
			
		|||
 *
 | 
			
		||||
 * \return         0 if successful,
 | 
			
		||||
 *                 MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed
 | 
			
		||||
 *
 | 
			
		||||
 * \note           The bytes obtained from the PRNG are interpreted
 | 
			
		||||
 *                 as a big-endian representation of an MPI; this can
 | 
			
		||||
 *                 be relevant in applications like deterministic ECDSA.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_mpi_fill_random( mbedtls_mpi *X, size_t size,
 | 
			
		||||
                     int (*f_rng)(void *, unsigned char *, size_t),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,8 @@
 | 
			
		|||
 * \file blowfish.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief Blowfish block cipher
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			@ -40,6 +41,7 @@
 | 
			
		|||
#define MBEDTLS_BLOWFISH_BLOCKSIZE   8          /* Blowfish uses 64 bit blocks */
 | 
			
		||||
 | 
			
		||||
#define MBEDTLS_ERR_BLOWFISH_INVALID_KEY_LENGTH                -0x0016  /**< Invalid key length. */
 | 
			
		||||
#define MBEDTLS_ERR_BLOWFISH_HW_ACCEL_FAILED                   -0x0017  /**< Blowfish hardware accelerator failed. */
 | 
			
		||||
#define MBEDTLS_ERR_BLOWFISH_INVALID_INPUT_LENGTH              -0x0018  /**< Invalid data input length. */
 | 
			
		||||
 | 
			
		||||
#if !defined(MBEDTLS_BLOWFISH_ALT)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,8 +1,9 @@
 | 
			
		|||
/**
 | 
			
		||||
 * \file bn_mul.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief  Multi-precision integer library
 | 
			
		||||
 *
 | 
			
		||||
 * \brief Multi-precision integer library
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,8 @@
 | 
			
		|||
 * \file camellia.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief Camellia block cipher
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			@ -37,6 +38,7 @@
 | 
			
		|||
 | 
			
		||||
#define MBEDTLS_ERR_CAMELLIA_INVALID_KEY_LENGTH           -0x0024  /**< Invalid key length. */
 | 
			
		||||
#define MBEDTLS_ERR_CAMELLIA_INVALID_INPUT_LENGTH         -0x0026  /**< Invalid data input length. */
 | 
			
		||||
#define MBEDTLS_ERR_CAMELLIA_HW_ACCEL_FAILED              -0x0027  /**< Camellia hardware accelerator failed. */
 | 
			
		||||
 | 
			
		||||
#if !defined(MBEDTLS_CAMELLIA_ALT)
 | 
			
		||||
// Regular implementation
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,9 +1,19 @@
 | 
			
		|||
/**
 | 
			
		||||
 * \file ccm.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief Counter with CBC-MAC (CCM) for 128-bit block ciphers
 | 
			
		||||
 * \brief CCM combines Counter mode encryption with CBC-MAC authentication
 | 
			
		||||
 *        for 128-bit block ciphers.
 | 
			
		||||
 *
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 * Input to CCM includes the following elements:
 | 
			
		||||
 * <ul><li>Payload - data that is both authenticated and encrypted.</li>
 | 
			
		||||
 * <li>Associated data (Adata) - data that is authenticated but not
 | 
			
		||||
 * encrypted, For example, a header.</li>
 | 
			
		||||
 * <li>Nonce - A unique value that is assigned to the payload and the
 | 
			
		||||
 * associated data.</li></ul>
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
 *  Licensed under the Apache License, Version 2.0 (the "License"); you may
 | 
			
		||||
| 
						 | 
				
			
			@ -18,15 +28,17 @@
 | 
			
		|||
 *  See the License for the specific language governing permissions and
 | 
			
		||||
 *  limitations under the License.
 | 
			
		||||
 *
 | 
			
		||||
 *  This file is part of mbed TLS (https://tls.mbed.org)
 | 
			
		||||
 *  This file is part of Mbed TLS (https://tls.mbed.org)
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef MBEDTLS_CCM_H
 | 
			
		||||
#define MBEDTLS_CCM_H
 | 
			
		||||
 | 
			
		||||
#include "cipher.h"
 | 
			
		||||
 | 
			
		||||
#define MBEDTLS_ERR_CCM_BAD_INPUT      -0x000D /**< Bad input parameters to function. */
 | 
			
		||||
#define MBEDTLS_ERR_CCM_AUTH_FAILED    -0x000F /**< Authenticated decryption failed. */
 | 
			
		||||
#define MBEDTLS_ERR_CCM_BAD_INPUT       -0x000D /**< Bad input parameters to the function. */
 | 
			
		||||
#define MBEDTLS_ERR_CCM_AUTH_FAILED     -0x000F /**< Authenticated decryption failed. */
 | 
			
		||||
#define MBEDTLS_ERR_CCM_HW_ACCEL_FAILED -0x0011 /**< CCM hardware accelerator failed. */
 | 
			
		||||
 | 
			
		||||
#if !defined(MBEDTLS_CCM_ALT)
 | 
			
		||||
// Regular implementation
 | 
			
		||||
| 
						 | 
				
			
			@ -37,31 +49,33 @@ extern "C" {
 | 
			
		|||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          CCM context structure
 | 
			
		||||
 * \brief    The CCM context-type definition. The CCM context is passed
 | 
			
		||||
 *           to the APIs called.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct {
 | 
			
		||||
    mbedtls_cipher_context_t cipher_ctx;    /*!< cipher context used */
 | 
			
		||||
    mbedtls_cipher_context_t cipher_ctx;    /*!< The cipher context used. */
 | 
			
		||||
}
 | 
			
		||||
mbedtls_ccm_context;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Initialize CCM context (just makes references valid)
 | 
			
		||||
 *                  Makes the context ready for mbedtls_ccm_setkey() or
 | 
			
		||||
 *                  mbedtls_ccm_free().
 | 
			
		||||
 * \brief           This function initializes the specified CCM context,
 | 
			
		||||
 *                  to make references valid, and prepare the context
 | 
			
		||||
 *                  for mbedtls_ccm_setkey() or mbedtls_ccm_free().
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx       CCM context to initialize
 | 
			
		||||
 * \param ctx       The CCM context to initialize.
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_ccm_init( mbedtls_ccm_context *ctx );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           CCM initialization (encryption and decryption)
 | 
			
		||||
 * \brief           This function initializes the CCM context set in the
 | 
			
		||||
 *                  \p ctx parameter and sets the encryption key.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx       CCM context to be initialized
 | 
			
		||||
 * \param cipher    cipher to use (a 128-bit block cipher)
 | 
			
		||||
 * \param key       encryption key
 | 
			
		||||
 * \param keybits   key size in bits (must be acceptable by the cipher)
 | 
			
		||||
 * \param ctx       The CCM context to initialize.
 | 
			
		||||
 * \param cipher    The 128-bit block cipher to use.
 | 
			
		||||
 * \param key       The encryption key.
 | 
			
		||||
 * \param keybits   The key size in bits. This must be acceptable by the cipher.
 | 
			
		||||
 *
 | 
			
		||||
 * \return          0 if successful, or a cipher specific error code
 | 
			
		||||
 * \return          \c 0 on success, or a cipher-specific error code.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_ccm_setkey( mbedtls_ccm_context *ctx,
 | 
			
		||||
                        mbedtls_cipher_id_t cipher,
 | 
			
		||||
| 
						 | 
				
			
			@ -69,36 +83,37 @@ int mbedtls_ccm_setkey( mbedtls_ccm_context *ctx,
 | 
			
		|||
                        unsigned int keybits );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Free a CCM context and underlying cipher sub-context
 | 
			
		||||
 * \brief   This function releases and clears the specified CCM context
 | 
			
		||||
 *          and underlying cipher sub-context.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx       CCM context to free
 | 
			
		||||
 * \param ctx       The CCM context to clear.
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_ccm_free( mbedtls_ccm_context *ctx );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           CCM buffer encryption
 | 
			
		||||
 * \brief           This function encrypts a buffer using CCM.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx       CCM context
 | 
			
		||||
 * \param length    length of the input data in bytes
 | 
			
		||||
 * \param iv        nonce (initialization vector)
 | 
			
		||||
 * \param iv_len    length of IV in bytes
 | 
			
		||||
 *                  must be 2, 3, 4, 5, 6, 7 or 8
 | 
			
		||||
 * \param add       additional data
 | 
			
		||||
 * \param add_len   length of additional data in bytes
 | 
			
		||||
 *                  must be less than 2^16 - 2^8
 | 
			
		||||
 * \param input     buffer holding the input data
 | 
			
		||||
 * \param output    buffer for holding the output data
 | 
			
		||||
 *                  must be at least 'length' bytes wide
 | 
			
		||||
 * \param tag       buffer for holding the tag
 | 
			
		||||
 * \param tag_len   length of the tag to generate in bytes
 | 
			
		||||
 *                  must be 4, 6, 8, 10, 14 or 16
 | 
			
		||||
 * \param ctx       The CCM context to use for encryption.
 | 
			
		||||
 * \param length    The length of the input data in Bytes.
 | 
			
		||||
 * \param iv        Initialization vector (nonce).
 | 
			
		||||
 * \param iv_len    The length of the IV in Bytes: 7, 8, 9, 10, 11, 12, or 13.
 | 
			
		||||
 * \param add       The additional data field.
 | 
			
		||||
 * \param add_len   The length of additional data in Bytes.
 | 
			
		||||
 *                  Must be less than 2^16 - 2^8.
 | 
			
		||||
 * \param input     The buffer holding the input data.
 | 
			
		||||
 * \param output    The buffer holding the output data.
 | 
			
		||||
 *                  Must be at least \p length Bytes wide.
 | 
			
		||||
 * \param tag       The buffer holding the tag.
 | 
			
		||||
 * \param tag_len   The length of the tag to generate in Bytes:
 | 
			
		||||
 *                  4, 6, 8, 10, 14 or 16.
 | 
			
		||||
 *
 | 
			
		||||
 * \note            The tag is written to a separate buffer. To get the tag
 | 
			
		||||
 *                  concatenated with the output as in the CCM spec, use
 | 
			
		||||
 *                  tag = output + length and make sure the output buffer is
 | 
			
		||||
 *                  at least length + tag_len wide.
 | 
			
		||||
 * \note            The tag is written to a separate buffer. To concatenate
 | 
			
		||||
 *                  the \p tag with the \p output, as done in <em>RFC-3610:
 | 
			
		||||
 *                  Counter with CBC-MAC (CCM)</em>, use
 | 
			
		||||
 *                  \p tag = \p output + \p length, and make sure that the
 | 
			
		||||
 *                  output buffer is at least \p length + \p tag_len wide.
 | 
			
		||||
 *
 | 
			
		||||
 * \return          0 if successful
 | 
			
		||||
 * \return          \c 0 on success.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_ccm_encrypt_and_tag( mbedtls_ccm_context *ctx, size_t length,
 | 
			
		||||
                         const unsigned char *iv, size_t iv_len,
 | 
			
		||||
| 
						 | 
				
			
			@ -107,21 +122,22 @@ int mbedtls_ccm_encrypt_and_tag( mbedtls_ccm_context *ctx, size_t length,
 | 
			
		|||
                         unsigned char *tag, size_t tag_len );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           CCM buffer authenticated decryption
 | 
			
		||||
 * \brief           This function performs a CCM authenticated decryption of a
 | 
			
		||||
 *                  buffer.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx       CCM context
 | 
			
		||||
 * \param length    length of the input data
 | 
			
		||||
 * \param iv        initialization vector
 | 
			
		||||
 * \param iv_len    length of IV
 | 
			
		||||
 * \param add       additional data
 | 
			
		||||
 * \param add_len   length of additional data
 | 
			
		||||
 * \param input     buffer holding the input data
 | 
			
		||||
 * \param output    buffer for holding the output data
 | 
			
		||||
 * \param tag       buffer holding the tag
 | 
			
		||||
 * \param tag_len   length of the tag
 | 
			
		||||
 * \param ctx       The CCM context to use for decryption.
 | 
			
		||||
 * \param length    The length of the input data in Bytes.
 | 
			
		||||
 * \param iv        Initialization vector.
 | 
			
		||||
 * \param iv_len    The length of the IV in Bytes: 7, 8, 9, 10, 11, 12, or 13.
 | 
			
		||||
 * \param add       The additional data field.
 | 
			
		||||
 * \param add_len   The length of additional data in Bytes.
 | 
			
		||||
 * \param input     The buffer holding the input data.
 | 
			
		||||
 * \param output    The buffer holding the output data.
 | 
			
		||||
 * \param tag       The buffer holding the tag.
 | 
			
		||||
 * \param tag_len   The length of the tag in Bytes.
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful and authenticated,
 | 
			
		||||
 *                 MBEDTLS_ERR_CCM_AUTH_FAILED if tag does not match
 | 
			
		||||
 * \return          0 if successful and authenticated, or
 | 
			
		||||
 *                  #MBEDTLS_ERR_CCM_AUTH_FAILED if the tag does not match.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_ccm_auth_decrypt( mbedtls_ccm_context *ctx, size_t length,
 | 
			
		||||
                      const unsigned char *iv, size_t iv_len,
 | 
			
		||||
| 
						 | 
				
			
			@ -133,9 +149,9 @@ int mbedtls_ccm_auth_decrypt( mbedtls_ccm_context *ctx, size_t length,
 | 
			
		|||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#else  /* !MBEDTLS_CCM_ALT */
 | 
			
		||||
#else  /* MBEDTLS_CCM_ALT */
 | 
			
		||||
#include "ccm_alt.h"
 | 
			
		||||
#endif /* !MBEDTLS_CCM_ALT */
 | 
			
		||||
#endif /* MBEDTLS_CCM_ALT */
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
| 
						 | 
				
			
			@ -143,9 +159,9 @@ extern "C" {
 | 
			
		|||
 | 
			
		||||
#if defined(MBEDTLS_SELF_TEST) && defined(MBEDTLS_AES_C)
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          Checkup routine
 | 
			
		||||
 * \brief          The CCM checkup routine.
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful, or 1 if the test failed
 | 
			
		||||
 * \return         \c 0 on success, or \c 1 on failure.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_ccm_self_test( int verbose );
 | 
			
		||||
#endif /* MBEDTLS_SELF_TEST && MBEDTLS_AES_C */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,8 @@
 | 
			
		|||
 * \file certs.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief Sample certificates and DHM parameters for testing
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,8 @@
 | 
			
		|||
 * \file check_config.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief Consistency checks for configuration options
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2016, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,11 +1,12 @@
 | 
			
		|||
/**
 | 
			
		||||
 * \file cipher.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief Generic cipher wrapper.
 | 
			
		||||
 * \brief The generic cipher wrapper.
 | 
			
		||||
 *
 | 
			
		||||
 * \author Adriaan de Jong <dejong@fox-it.com>
 | 
			
		||||
 *
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
 *  Licensed under the Apache License, Version 2.0 (the "License"); you may
 | 
			
		||||
| 
						 | 
				
			
			@ -20,7 +21,7 @@
 | 
			
		|||
 *  See the License for the specific language governing permissions and
 | 
			
		||||
 *  limitations under the License.
 | 
			
		||||
 *
 | 
			
		||||
 *  This file is part of mbed TLS (https://tls.mbed.org)
 | 
			
		||||
 *  This file is part of Mbed TLS (https://tls.mbed.org)
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef MBEDTLS_CIPHER_H
 | 
			
		||||
| 
						 | 
				
			
			@ -51,21 +52,29 @@
 | 
			
		|||
#define inline __inline
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE            -0x6080  /**< The selected feature is not available. */
 | 
			
		||||
#define MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA                 -0x6100  /**< Bad input parameters to function. */
 | 
			
		||||
#define MBEDTLS_ERR_CIPHER_ALLOC_FAILED                   -0x6180  /**< Failed to allocate memory. */
 | 
			
		||||
#define MBEDTLS_ERR_CIPHER_INVALID_PADDING                -0x6200  /**< Input data contains invalid padding and is rejected. */
 | 
			
		||||
#define MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED            -0x6280  /**< Decryption of block requires a full block. */
 | 
			
		||||
#define MBEDTLS_ERR_CIPHER_AUTH_FAILED                    -0x6300  /**< Authentication failed (for AEAD modes). */
 | 
			
		||||
#define MBEDTLS_ERR_CIPHER_INVALID_CONTEXT              -0x6380  /**< The context is invalid, eg because it was free()ed. */
 | 
			
		||||
#define MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE  -0x6080  /**< The selected feature is not available. */
 | 
			
		||||
#define MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA       -0x6100  /**< Bad input parameters. */
 | 
			
		||||
#define MBEDTLS_ERR_CIPHER_ALLOC_FAILED         -0x6180  /**< Failed to allocate memory. */
 | 
			
		||||
#define MBEDTLS_ERR_CIPHER_INVALID_PADDING      -0x6200  /**< Input data contains invalid padding and is rejected. */
 | 
			
		||||
#define MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED  -0x6280  /**< Decryption of block requires a full block. */
 | 
			
		||||
#define MBEDTLS_ERR_CIPHER_AUTH_FAILED          -0x6300  /**< Authentication failed (for AEAD modes). */
 | 
			
		||||
#define MBEDTLS_ERR_CIPHER_INVALID_CONTEXT      -0x6380  /**< The context is invalid. For example, because it was freed. */
 | 
			
		||||
#define MBEDTLS_ERR_CIPHER_HW_ACCEL_FAILED      -0x6400  /**< Cipher hardware accelerator failed. */
 | 
			
		||||
 | 
			
		||||
#define MBEDTLS_CIPHER_VARIABLE_IV_LEN     0x01    /**< Cipher accepts IVs of variable length */
 | 
			
		||||
#define MBEDTLS_CIPHER_VARIABLE_KEY_LEN    0x02    /**< Cipher accepts keys of variable length */
 | 
			
		||||
#define MBEDTLS_CIPHER_VARIABLE_IV_LEN     0x01    /**< Cipher accepts IVs of variable length. */
 | 
			
		||||
#define MBEDTLS_CIPHER_VARIABLE_KEY_LEN    0x02    /**< Cipher accepts keys of variable length. */
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief     An enumeration of supported ciphers.
 | 
			
		||||
 *
 | 
			
		||||
 * \warning   ARC4 and DES are considered weak ciphers and their use
 | 
			
		||||
 *            constitutes a security risk. We recommend considering stronger
 | 
			
		||||
 *            ciphers instead.
 | 
			
		||||
 */
 | 
			
		||||
typedef enum {
 | 
			
		||||
    MBEDTLS_CIPHER_ID_NONE = 0,
 | 
			
		||||
    MBEDTLS_CIPHER_ID_NULL,
 | 
			
		||||
| 
						 | 
				
			
			@ -77,6 +86,13 @@ typedef enum {
 | 
			
		|||
    MBEDTLS_CIPHER_ID_ARC4,
 | 
			
		||||
} mbedtls_cipher_id_t;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief     An enumeration of supported (cipher, mode) pairs.
 | 
			
		||||
 *
 | 
			
		||||
 * \warning   ARC4 and DES are considered weak ciphers and their use
 | 
			
		||||
 *            constitutes a security risk. We recommend considering stronger
 | 
			
		||||
 *            ciphers instead.
 | 
			
		||||
 */
 | 
			
		||||
typedef enum {
 | 
			
		||||
    MBEDTLS_CIPHER_NONE = 0,
 | 
			
		||||
    MBEDTLS_CIPHER_NULL,
 | 
			
		||||
| 
						 | 
				
			
			@ -129,6 +145,7 @@ typedef enum {
 | 
			
		|||
    MBEDTLS_CIPHER_CAMELLIA_256_CCM,
 | 
			
		||||
} mbedtls_cipher_type_t;
 | 
			
		||||
 | 
			
		||||
/** Supported cipher modes. */
 | 
			
		||||
typedef enum {
 | 
			
		||||
    MBEDTLS_MODE_NONE = 0,
 | 
			
		||||
    MBEDTLS_MODE_ECB,
 | 
			
		||||
| 
						 | 
				
			
			@ -141,14 +158,16 @@ typedef enum {
 | 
			
		|||
    MBEDTLS_MODE_CCM,
 | 
			
		||||
} mbedtls_cipher_mode_t;
 | 
			
		||||
 | 
			
		||||
/** Supported cipher padding types. */
 | 
			
		||||
typedef enum {
 | 
			
		||||
    MBEDTLS_PADDING_PKCS7 = 0,     /**< PKCS7 padding (default)        */
 | 
			
		||||
    MBEDTLS_PADDING_ONE_AND_ZEROS, /**< ISO/IEC 7816-4 padding         */
 | 
			
		||||
    MBEDTLS_PADDING_ZEROS_AND_LEN, /**< ANSI X.923 padding             */
 | 
			
		||||
    MBEDTLS_PADDING_ZEROS,         /**< zero padding (not reversible!) */
 | 
			
		||||
    MBEDTLS_PADDING_NONE,          /**< never pad (full blocks only)   */
 | 
			
		||||
    MBEDTLS_PADDING_PKCS7 = 0,     /**< PKCS7 padding (default).        */
 | 
			
		||||
    MBEDTLS_PADDING_ONE_AND_ZEROS, /**< ISO/IEC 7816-4 padding.         */
 | 
			
		||||
    MBEDTLS_PADDING_ZEROS_AND_LEN, /**< ANSI X.923 padding.             */
 | 
			
		||||
    MBEDTLS_PADDING_ZEROS,         /**< zero padding (not reversible). */
 | 
			
		||||
    MBEDTLS_PADDING_NONE,          /**< never pad (full blocks only).   */
 | 
			
		||||
} mbedtls_cipher_padding_t;
 | 
			
		||||
 | 
			
		||||
/** Type of operation. */
 | 
			
		||||
typedef enum {
 | 
			
		||||
    MBEDTLS_OPERATION_NONE = -1,
 | 
			
		||||
    MBEDTLS_DECRYPT = 0,
 | 
			
		||||
| 
						 | 
				
			
			@ -156,19 +175,19 @@ typedef enum {
 | 
			
		|||
} mbedtls_operation_t;
 | 
			
		||||
 | 
			
		||||
enum {
 | 
			
		||||
    /** Undefined key length */
 | 
			
		||||
    /** Undefined key length. */
 | 
			
		||||
    MBEDTLS_KEY_LENGTH_NONE = 0,
 | 
			
		||||
    /** Key length, in bits (including parity), for DES keys */
 | 
			
		||||
    /** Key length, in bits (including parity), for DES keys. */
 | 
			
		||||
    MBEDTLS_KEY_LENGTH_DES  = 64,
 | 
			
		||||
    /** Key length, in bits (including parity), for DES in two key EDE */
 | 
			
		||||
    /** Key length in bits, including parity, for DES in two-key EDE. */
 | 
			
		||||
    MBEDTLS_KEY_LENGTH_DES_EDE = 128,
 | 
			
		||||
    /** Key length, in bits (including parity), for DES in three-key EDE */
 | 
			
		||||
    /** Key length in bits, including parity, for DES in three-key EDE. */
 | 
			
		||||
    MBEDTLS_KEY_LENGTH_DES_EDE3 = 192,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/** Maximum length of any IV, in bytes */
 | 
			
		||||
/** Maximum length of any IV, in Bytes. */
 | 
			
		||||
#define MBEDTLS_MAX_IV_LENGTH      16
 | 
			
		||||
/** Maximum block size of any cipher, in bytes */
 | 
			
		||||
/** Maximum block size of any cipher, in Bytes. */
 | 
			
		||||
#define MBEDTLS_MAX_BLOCK_LENGTH   16
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
| 
						 | 
				
			
			@ -182,33 +201,40 @@ typedef struct mbedtls_cipher_base_t mbedtls_cipher_base_t;
 | 
			
		|||
typedef struct mbedtls_cmac_context_t mbedtls_cmac_context_t;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Cipher information. Allows cipher functions to be called in a generic way.
 | 
			
		||||
 * Cipher information. Allows calling cipher functions
 | 
			
		||||
 * in a generic way.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct {
 | 
			
		||||
    /** Full cipher identifier (e.g. MBEDTLS_CIPHER_AES_256_CBC) */
 | 
			
		||||
    /** Full cipher identifier. For example,
 | 
			
		||||
     * MBEDTLS_CIPHER_AES_256_CBC.
 | 
			
		||||
     */
 | 
			
		||||
    mbedtls_cipher_type_t type;
 | 
			
		||||
 | 
			
		||||
    /** Cipher mode (e.g. MBEDTLS_MODE_CBC) */
 | 
			
		||||
    /** The cipher mode. For example, MBEDTLS_MODE_CBC. */
 | 
			
		||||
    mbedtls_cipher_mode_t mode;
 | 
			
		||||
 | 
			
		||||
    /** Cipher key length, in bits (default length for variable sized ciphers)
 | 
			
		||||
     *  (Includes parity bits for ciphers like DES) */
 | 
			
		||||
    /** The cipher key length, in bits. This is the
 | 
			
		||||
     * default length for variable sized ciphers.
 | 
			
		||||
     * Includes parity bits for ciphers like DES.
 | 
			
		||||
     */
 | 
			
		||||
    unsigned int key_bitlen;
 | 
			
		||||
 | 
			
		||||
    /** Name of the cipher */
 | 
			
		||||
    /** Name of the cipher. */
 | 
			
		||||
    const char * name;
 | 
			
		||||
 | 
			
		||||
    /** IV/NONCE size, in bytes.
 | 
			
		||||
     *  For cipher that accept many sizes: recommended size */
 | 
			
		||||
    /** IV or nonce size, in Bytes.
 | 
			
		||||
     * For ciphers that accept variable IV sizes,
 | 
			
		||||
     * this is the recommended size.
 | 
			
		||||
     */
 | 
			
		||||
    unsigned int iv_size;
 | 
			
		||||
 | 
			
		||||
    /** Flags for variable IV size, variable key size, etc. */
 | 
			
		||||
    /** Flags to set. For example, if the cipher supports variable IV sizes or variable key sizes. */
 | 
			
		||||
    int flags;
 | 
			
		||||
 | 
			
		||||
    /** block size, in bytes */
 | 
			
		||||
    /** The block size, in Bytes. */
 | 
			
		||||
    unsigned int block_size;
 | 
			
		||||
 | 
			
		||||
    /** Base cipher information and functions */
 | 
			
		||||
    /** Struct for base cipher information and functions. */
 | 
			
		||||
    const mbedtls_cipher_base_t *base;
 | 
			
		||||
 | 
			
		||||
} mbedtls_cipher_info_t;
 | 
			
		||||
| 
						 | 
				
			
			@ -217,125 +243,133 @@ typedef struct {
 | 
			
		|||
 * Generic cipher context.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct {
 | 
			
		||||
    /** Information about the associated cipher */
 | 
			
		||||
    /** Information about the associated cipher. */
 | 
			
		||||
    const mbedtls_cipher_info_t *cipher_info;
 | 
			
		||||
 | 
			
		||||
    /** Key length to use */
 | 
			
		||||
    /** Key length to use. */
 | 
			
		||||
    int key_bitlen;
 | 
			
		||||
 | 
			
		||||
    /** Operation that the context's key has been initialised for */
 | 
			
		||||
    /** Operation that the key of the context has been
 | 
			
		||||
     * initialized for.
 | 
			
		||||
     */
 | 
			
		||||
    mbedtls_operation_t operation;
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
 | 
			
		||||
    /** Padding functions to use, if relevant for cipher mode */
 | 
			
		||||
    /** Padding functions to use, if relevant for
 | 
			
		||||
     * the specific cipher mode.
 | 
			
		||||
     */
 | 
			
		||||
    void (*add_padding)( unsigned char *output, size_t olen, size_t data_len );
 | 
			
		||||
    int (*get_padding)( unsigned char *input, size_t ilen, size_t *data_len );
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    /** Buffer for data that hasn't been encrypted yet */
 | 
			
		||||
    /** Buffer for input that has not been processed yet. */
 | 
			
		||||
    unsigned char unprocessed_data[MBEDTLS_MAX_BLOCK_LENGTH];
 | 
			
		||||
 | 
			
		||||
    /** Number of bytes that still need processing */
 | 
			
		||||
    /** Number of Bytes that have not been processed yet. */
 | 
			
		||||
    size_t unprocessed_len;
 | 
			
		||||
 | 
			
		||||
    /** Current IV or NONCE_COUNTER for CTR-mode */
 | 
			
		||||
    /** Current IV or NONCE_COUNTER for CTR-mode. */
 | 
			
		||||
    unsigned char iv[MBEDTLS_MAX_IV_LENGTH];
 | 
			
		||||
 | 
			
		||||
    /** IV size in bytes (for ciphers with variable-length IVs) */
 | 
			
		||||
    /** IV size in Bytes, for ciphers with variable-length IVs. */
 | 
			
		||||
    size_t iv_size;
 | 
			
		||||
 | 
			
		||||
    /** Cipher-specific context */
 | 
			
		||||
    /** The cipher-specific context. */
 | 
			
		||||
    void *cipher_ctx;
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_CMAC_C)
 | 
			
		||||
    /** CMAC Specific context */
 | 
			
		||||
    /** CMAC-specific context. */
 | 
			
		||||
    mbedtls_cmac_context_t *cmac_ctx;
 | 
			
		||||
#endif
 | 
			
		||||
} mbedtls_cipher_context_t;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief Returns the list of ciphers supported by the generic cipher module.
 | 
			
		||||
 * \brief This function retrieves the list of ciphers supported by the generic
 | 
			
		||||
 * cipher module.
 | 
			
		||||
 *
 | 
			
		||||
 * \return              a statically allocated array of ciphers, the last entry
 | 
			
		||||
 *                      is 0.
 | 
			
		||||
 * \return      A statically-allocated array of ciphers. The last entry
 | 
			
		||||
 *              is zero.
 | 
			
		||||
 */
 | 
			
		||||
const int *mbedtls_cipher_list( void );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief               Returns the cipher information structure associated
 | 
			
		||||
 *                      with the given cipher name.
 | 
			
		||||
 * \brief               This function retrieves the cipher-information
 | 
			
		||||
 *                      structure associated with the given cipher name.
 | 
			
		||||
 *
 | 
			
		||||
 * \param cipher_name   Name of the cipher to search for.
 | 
			
		||||
 *
 | 
			
		||||
 * \return              the cipher information structure associated with the
 | 
			
		||||
 *                      given cipher_name, or NULL if not found.
 | 
			
		||||
 * \return              The cipher information structure associated with the
 | 
			
		||||
 *                      given \p cipher_name, or NULL if not found.
 | 
			
		||||
 */
 | 
			
		||||
const mbedtls_cipher_info_t *mbedtls_cipher_info_from_string( const char *cipher_name );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief               Returns the cipher information structure associated
 | 
			
		||||
 *                      with the given cipher type.
 | 
			
		||||
 * \brief               This function retrieves the cipher-information
 | 
			
		||||
 *                      structure associated with the given cipher type.
 | 
			
		||||
 *
 | 
			
		||||
 * \param cipher_type   Type of the cipher to search for.
 | 
			
		||||
 *
 | 
			
		||||
 * \return              the cipher information structure associated with the
 | 
			
		||||
 *                      given cipher_type, or NULL if not found.
 | 
			
		||||
 * \return              The cipher information structure associated with the
 | 
			
		||||
 *                      given \p cipher_type, or NULL if not found.
 | 
			
		||||
 */
 | 
			
		||||
const mbedtls_cipher_info_t *mbedtls_cipher_info_from_type( const mbedtls_cipher_type_t cipher_type );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief               Returns the cipher information structure associated
 | 
			
		||||
 *                      with the given cipher id, key size and mode.
 | 
			
		||||
 * \brief               This function retrieves the cipher-information
 | 
			
		||||
 *                      structure associated with the given cipher ID,
 | 
			
		||||
 *                      key size and mode.
 | 
			
		||||
 *
 | 
			
		||||
 * \param cipher_id     Id of the cipher to search for
 | 
			
		||||
 *                      (e.g. MBEDTLS_CIPHER_ID_AES)
 | 
			
		||||
 * \param key_bitlen    Length of the key in bits
 | 
			
		||||
 * \param mode          Cipher mode (e.g. MBEDTLS_MODE_CBC)
 | 
			
		||||
 * \param cipher_id     The ID of the cipher to search for. For example,
 | 
			
		||||
 *                      #MBEDTLS_CIPHER_ID_AES.
 | 
			
		||||
 * \param key_bitlen    The length of the key in bits.
 | 
			
		||||
 * \param mode          The cipher mode. For example, #MBEDTLS_MODE_CBC.
 | 
			
		||||
 *
 | 
			
		||||
 * \return              the cipher information structure associated with the
 | 
			
		||||
 *                      given cipher_type, or NULL if not found.
 | 
			
		||||
 * \return              The cipher information structure associated with the
 | 
			
		||||
 *                      given \p cipher_id, or NULL if not found.
 | 
			
		||||
 */
 | 
			
		||||
const mbedtls_cipher_info_t *mbedtls_cipher_info_from_values( const mbedtls_cipher_id_t cipher_id,
 | 
			
		||||
                                              int key_bitlen,
 | 
			
		||||
                                              const mbedtls_cipher_mode_t mode );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief               Initialize a cipher_context (as NONE)
 | 
			
		||||
 * \brief               This function initializes a \p cipher_context as NONE.
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_cipher_init( mbedtls_cipher_context_t *ctx );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief               Free and clear the cipher-specific context of ctx.
 | 
			
		||||
 *                      Freeing ctx itself remains the responsibility of the
 | 
			
		||||
 *                      caller.
 | 
			
		||||
 * \brief               This function frees and clears the cipher-specific
 | 
			
		||||
 *                      context of \p ctx. Freeing \p ctx itself remains the
 | 
			
		||||
 *                      responsibility of the caller.
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_cipher_free( mbedtls_cipher_context_t *ctx );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief               Initialises and fills the cipher context structure with
 | 
			
		||||
 *                      the appropriate values.
 | 
			
		||||
 * \brief               This function initializes and fills the cipher-context
 | 
			
		||||
 *                      structure with the appropriate values. It also clears
 | 
			
		||||
 *                      the structure.
 | 
			
		||||
 *
 | 
			
		||||
 * \note                Currently also clears structure. In future versions you
 | 
			
		||||
 *                      will be required to call mbedtls_cipher_init() on the structure
 | 
			
		||||
 *                      first.
 | 
			
		||||
 * \param ctx           The context to initialize. May not be NULL.
 | 
			
		||||
 * \param cipher_info   The cipher to use.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx           context to initialise. May not be NULL.
 | 
			
		||||
 * \param cipher_info   cipher to use.
 | 
			
		||||
 *
 | 
			
		||||
 * \return              0 on success,
 | 
			
		||||
 *                      MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on parameter failure,
 | 
			
		||||
 *                      MBEDTLS_ERR_CIPHER_ALLOC_FAILED if allocation of the
 | 
			
		||||
 * \return              \c 0 on success,
 | 
			
		||||
 *                      #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on parameter failure,
 | 
			
		||||
 *                      #MBEDTLS_ERR_CIPHER_ALLOC_FAILED if allocation of the
 | 
			
		||||
 *                      cipher-specific context failed.
 | 
			
		||||
 *
 | 
			
		||||
 * \internal Currently, the function also clears the structure.
 | 
			
		||||
 * In future versions, the caller will be required to call
 | 
			
		||||
 * mbedtls_cipher_init() on the structure first.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_cipher_setup( mbedtls_cipher_context_t *ctx, const mbedtls_cipher_info_t *cipher_info );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief               Returns the block size of the given cipher.
 | 
			
		||||
 * \brief        This function returns the block size of the given cipher.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx           cipher's context. Must have been initialised.
 | 
			
		||||
 * \param ctx    The context of the cipher. Must be initialized.
 | 
			
		||||
 *
 | 
			
		||||
 * \return              size of the cipher's blocks, or 0 if ctx has not been
 | 
			
		||||
 *                      initialised.
 | 
			
		||||
 * \return       The size of the blocks of the cipher, or zero if \p ctx
 | 
			
		||||
 *               has not been initialized.
 | 
			
		||||
 */
 | 
			
		||||
static inline unsigned int mbedtls_cipher_get_block_size( const mbedtls_cipher_context_t *ctx )
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -346,13 +380,13 @@ static inline unsigned int mbedtls_cipher_get_block_size( const mbedtls_cipher_c
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief               Returns the mode of operation for the cipher.
 | 
			
		||||
 *                      (e.g. MBEDTLS_MODE_CBC)
 | 
			
		||||
 * \brief        This function returns the mode of operation for
 | 
			
		||||
 *               the cipher. For example, MBEDTLS_MODE_CBC.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx           cipher's context. Must have been initialised.
 | 
			
		||||
 * \param ctx    The context of the cipher. Must be initialized.
 | 
			
		||||
 *
 | 
			
		||||
 * \return              mode of operation, or MBEDTLS_MODE_NONE if ctx
 | 
			
		||||
 *                      has not been initialised.
 | 
			
		||||
 * \return       The mode of operation, or #MBEDTLS_MODE_NONE if
 | 
			
		||||
 *               \p ctx has not been initialized.
 | 
			
		||||
 */
 | 
			
		||||
static inline mbedtls_cipher_mode_t mbedtls_cipher_get_cipher_mode( const mbedtls_cipher_context_t *ctx )
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -363,13 +397,14 @@ static inline mbedtls_cipher_mode_t mbedtls_cipher_get_cipher_mode( const mbedtl
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief               Returns the size of the cipher's IV/NONCE in bytes.
 | 
			
		||||
 * \brief       This function returns the size of the IV or nonce
 | 
			
		||||
 *              of the cipher, in Bytes.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx           cipher's context. Must have been initialised.
 | 
			
		||||
 * \param ctx   The context of the cipher. Must be initialized.
 | 
			
		||||
 *
 | 
			
		||||
 * \return              If IV has not been set yet: (recommended) IV size
 | 
			
		||||
 *                      (0 for ciphers not using IV/NONCE).
 | 
			
		||||
 *                      If IV has already been set: actual size.
 | 
			
		||||
 * \return      <ul><li>If no IV has been set: the recommended IV size.
 | 
			
		||||
 *              0 for ciphers not using IV or nonce.</li>
 | 
			
		||||
 *              <li>If IV has already been set: the actual size.</li></ul>
 | 
			
		||||
 */
 | 
			
		||||
static inline int mbedtls_cipher_get_iv_size( const mbedtls_cipher_context_t *ctx )
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -383,12 +418,12 @@ static inline int mbedtls_cipher_get_iv_size( const mbedtls_cipher_context_t *ct
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief               Returns the type of the given cipher.
 | 
			
		||||
 * \brief               This function returns the type of the given cipher.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx           cipher's context. Must have been initialised.
 | 
			
		||||
 * \param ctx           The context of the cipher. Must be initialized.
 | 
			
		||||
 *
 | 
			
		||||
 * \return              type of the cipher, or MBEDTLS_CIPHER_NONE if ctx has
 | 
			
		||||
 *                      not been initialised.
 | 
			
		||||
 * \return              The type of the cipher, or #MBEDTLS_CIPHER_NONE if
 | 
			
		||||
 *                      \p ctx has not been initialized.
 | 
			
		||||
 */
 | 
			
		||||
static inline mbedtls_cipher_type_t mbedtls_cipher_get_type( const mbedtls_cipher_context_t *ctx )
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -399,11 +434,13 @@ static inline mbedtls_cipher_type_t mbedtls_cipher_get_type( const mbedtls_ciphe
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief               Returns the name of the given cipher, as a string.
 | 
			
		||||
 * \brief               This function returns the name of the given cipher
 | 
			
		||||
 *                      as a string.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx           cipher's context. Must have been initialised.
 | 
			
		||||
 * \param ctx           The context of the cipher. Must be initialized.
 | 
			
		||||
 *
 | 
			
		||||
 * \return              name of the cipher, or NULL if ctx was not initialised.
 | 
			
		||||
 * \return              The name of the cipher, or NULL if \p ctx has not
 | 
			
		||||
 *                      been not initialized.
 | 
			
		||||
 */
 | 
			
		||||
static inline const char *mbedtls_cipher_get_name( const mbedtls_cipher_context_t *ctx )
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -414,13 +451,13 @@ static inline const char *mbedtls_cipher_get_name( const mbedtls_cipher_context_
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief               Returns the key length of the cipher.
 | 
			
		||||
 * \brief               This function returns the key length of the cipher.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx           cipher's context. Must have been initialised.
 | 
			
		||||
 * \param ctx           The context of the cipher. Must be initialized.
 | 
			
		||||
 *
 | 
			
		||||
 * \return              cipher's key length, in bits, or
 | 
			
		||||
 *                      MBEDTLS_KEY_LENGTH_NONE if ctx has not been
 | 
			
		||||
 *                      initialised.
 | 
			
		||||
 * \return              The key length of the cipher in bits, or
 | 
			
		||||
 *                      #MBEDTLS_KEY_LENGTH_NONE if ctx \p has not been
 | 
			
		||||
 *                      initialized.
 | 
			
		||||
 */
 | 
			
		||||
static inline int mbedtls_cipher_get_key_bitlen( const mbedtls_cipher_context_t *ctx )
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -431,13 +468,13 @@ static inline int mbedtls_cipher_get_key_bitlen( const mbedtls_cipher_context_t
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief               Returns the operation of the given cipher.
 | 
			
		||||
 * \brief          This function returns the operation of the given cipher.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx           cipher's context. Must have been initialised.
 | 
			
		||||
 * \param ctx      The context of the cipher. Must be initialized.
 | 
			
		||||
 *
 | 
			
		||||
 * \return              operation (MBEDTLS_ENCRYPT or MBEDTLS_DECRYPT),
 | 
			
		||||
 *                      or MBEDTLS_OPERATION_NONE if ctx has not been
 | 
			
		||||
 *                      initialised.
 | 
			
		||||
 * \return         The type of operation: #MBEDTLS_ENCRYPT or
 | 
			
		||||
 *                 #MBEDTLS_DECRYPT, or #MBEDTLS_OPERATION_NONE if \p ctx
 | 
			
		||||
 *                 has not been initialized.
 | 
			
		||||
 */
 | 
			
		||||
static inline mbedtls_operation_t mbedtls_cipher_get_operation( const mbedtls_cipher_context_t *ctx )
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -448,18 +485,18 @@ static inline mbedtls_operation_t mbedtls_cipher_get_operation( const mbedtls_ci
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief               Set the key to use with the given context.
 | 
			
		||||
 * \brief               This function sets the key to use with the given context.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx           generic cipher context. May not be NULL. Must have been
 | 
			
		||||
 *                      initialised using cipher_context_from_type or
 | 
			
		||||
 *                      cipher_context_from_string.
 | 
			
		||||
 * \param ctx           The generic cipher context. May not be NULL. Must have
 | 
			
		||||
 *                      been initialized using mbedtls_cipher_info_from_type()
 | 
			
		||||
 *                      or mbedtls_cipher_info_from_string().
 | 
			
		||||
 * \param key           The key to use.
 | 
			
		||||
 * \param key_bitlen    key length to use, in bits.
 | 
			
		||||
 * \param operation     Operation that the key will be used for, either
 | 
			
		||||
 *                      MBEDTLS_ENCRYPT or MBEDTLS_DECRYPT.
 | 
			
		||||
 * \param key_bitlen    The key length to use, in bits.
 | 
			
		||||
 * \param operation     The operation that the key will be used for:
 | 
			
		||||
 *                      #MBEDTLS_ENCRYPT or #MBEDTLS_DECRYPT.
 | 
			
		||||
 *
 | 
			
		||||
 * \returns             0 on success, MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA if
 | 
			
		||||
 *                      parameter verification fails or a cipher specific
 | 
			
		||||
 * \returns             \c 0 on success, #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA if
 | 
			
		||||
 *                      parameter verification fails, or a cipher-specific
 | 
			
		||||
 *                      error code.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_cipher_setkey( mbedtls_cipher_context_t *ctx, const unsigned char *key,
 | 
			
		||||
| 
						 | 
				
			
			@ -467,170 +504,176 @@ int mbedtls_cipher_setkey( mbedtls_cipher_context_t *ctx, const unsigned char *k
 | 
			
		|||
 | 
			
		||||
#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
 | 
			
		||||
/**
 | 
			
		||||
 * \brief               Set padding mode, for cipher modes that use padding.
 | 
			
		||||
 *                      (Default: PKCS7 padding.)
 | 
			
		||||
 * \brief               This function sets the padding mode, for cipher modes
 | 
			
		||||
 *                      that use padding.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx           generic cipher context
 | 
			
		||||
 * \param mode          padding mode
 | 
			
		||||
 *                      The default passing mode is PKCS7 padding.
 | 
			
		||||
 *
 | 
			
		||||
 * \returns             0 on success, MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE
 | 
			
		||||
 *                      if selected padding mode is not supported, or
 | 
			
		||||
 *                      MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA if the cipher mode
 | 
			
		||||
 * \param ctx           The generic cipher context.
 | 
			
		||||
 * \param mode          The padding mode.
 | 
			
		||||
 *
 | 
			
		||||
 * \returns             \c 0 on success, #MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE
 | 
			
		||||
 *                      if the selected padding mode is not supported, or
 | 
			
		||||
 *                      #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA if the cipher mode
 | 
			
		||||
 *                      does not support padding.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_cipher_set_padding_mode( mbedtls_cipher_context_t *ctx, mbedtls_cipher_padding_t mode );
 | 
			
		||||
#endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief               Set the initialization vector (IV) or nonce
 | 
			
		||||
 * \brief           This function sets the initialization vector (IV)
 | 
			
		||||
 *                  or nonce.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx           generic cipher context
 | 
			
		||||
 * \param iv            IV to use (or NONCE_COUNTER for CTR-mode ciphers)
 | 
			
		||||
 * \param iv_len        IV length for ciphers with variable-size IV;
 | 
			
		||||
 *                      discarded by ciphers with fixed-size IV.
 | 
			
		||||
 * \param ctx       The generic cipher context.
 | 
			
		||||
 * \param iv        The IV to use, or NONCE_COUNTER for CTR-mode ciphers.
 | 
			
		||||
 * \param iv_len    The IV length for ciphers with variable-size IV.
 | 
			
		||||
 *                  This parameter is discarded by ciphers with fixed-size IV.
 | 
			
		||||
 *
 | 
			
		||||
 * \returns             0 on success, or MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA
 | 
			
		||||
 * \returns         \c 0 on success, or #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA
 | 
			
		||||
 *
 | 
			
		||||
 * \note                Some ciphers don't use IVs nor NONCE. For these
 | 
			
		||||
 *                      ciphers, this function has no effect.
 | 
			
		||||
 * \note            Some ciphers do not use IVs nor nonce. For these
 | 
			
		||||
 *                  ciphers, this function has no effect.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_cipher_set_iv( mbedtls_cipher_context_t *ctx,
 | 
			
		||||
                   const unsigned char *iv, size_t iv_len );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief               Finish preparation of the given context
 | 
			
		||||
 * \brief         This function resets the cipher state.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx           generic cipher context
 | 
			
		||||
 * \param ctx     The generic cipher context.
 | 
			
		||||
 *
 | 
			
		||||
 * \returns             0 on success, MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA
 | 
			
		||||
 *                      if parameter verification fails.
 | 
			
		||||
 * \returns       \c 0 on success, #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA
 | 
			
		||||
 *                if parameter verification fails.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_cipher_reset( mbedtls_cipher_context_t *ctx );
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_GCM_C)
 | 
			
		||||
/**
 | 
			
		||||
 * \brief               Add additional data (for AEAD ciphers).
 | 
			
		||||
 *                      Currently only supported with GCM.
 | 
			
		||||
 *                      Must be called exactly once, after mbedtls_cipher_reset().
 | 
			
		||||
 * \brief               This function adds additional data for AEAD ciphers.
 | 
			
		||||
 *                      Only supported with GCM. Must be called
 | 
			
		||||
 *                      exactly once, after mbedtls_cipher_reset().
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx           generic cipher context
 | 
			
		||||
 * \param ad            Additional data to use.
 | 
			
		||||
 * \param ad_len        Length of ad.
 | 
			
		||||
 * \param ctx           The generic cipher context.
 | 
			
		||||
 * \param ad            The additional data to use.
 | 
			
		||||
 * \param ad_len        the Length of \p ad.
 | 
			
		||||
 *
 | 
			
		||||
 * \return              0 on success, or a specific error code.
 | 
			
		||||
 * \return              \c 0 on success, or a specific error code on failure.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_cipher_update_ad( mbedtls_cipher_context_t *ctx,
 | 
			
		||||
                      const unsigned char *ad, size_t ad_len );
 | 
			
		||||
#endif /* MBEDTLS_GCM_C */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief               Generic cipher update function. Encrypts/decrypts
 | 
			
		||||
 *                      using the given cipher context. Writes as many block
 | 
			
		||||
 *                      size'd blocks of data as possible to output. Any data
 | 
			
		||||
 *                      that cannot be written immediately will either be added
 | 
			
		||||
 *                      to the next block, or flushed when cipher_final is
 | 
			
		||||
 *                      called.
 | 
			
		||||
 *                      Exception: for MBEDTLS_MODE_ECB, expects single block
 | 
			
		||||
 *                                 in size (e.g. 16 bytes for AES)
 | 
			
		||||
 * \brief               The generic cipher update function. It encrypts or
 | 
			
		||||
 *                      decrypts using the given cipher context. Writes as
 | 
			
		||||
 *                      many block-sized blocks of data as possible to output.
 | 
			
		||||
 *                      Any data that cannot be written immediately is either
 | 
			
		||||
 *                      added to the next block, or flushed when
 | 
			
		||||
 *                      mbedtls_cipher_finish() is called.
 | 
			
		||||
 *                      Exception: For MBEDTLS_MODE_ECB, expects a single block
 | 
			
		||||
 *                      in size. For example, 16 Bytes for AES.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx           generic cipher context
 | 
			
		||||
 * \param input         buffer holding the input data
 | 
			
		||||
 * \param ilen          length of the input data
 | 
			
		||||
 * \param output        buffer for the output data. Should be able to hold at
 | 
			
		||||
 *                      least ilen + block_size. Cannot be the same buffer as
 | 
			
		||||
 *                      input!
 | 
			
		||||
 * \param olen          length of the output data, will be filled with the
 | 
			
		||||
 *                      actual number of bytes written.
 | 
			
		||||
 * \param ctx           The generic cipher context.
 | 
			
		||||
 * \param input         The buffer holding the input data.
 | 
			
		||||
 * \param ilen          The length of the input data.
 | 
			
		||||
 * \param output        The buffer for the output data. Must be able to hold at
 | 
			
		||||
 *                      least \p ilen + block_size. Must not be the same buffer
 | 
			
		||||
 *                      as input.
 | 
			
		||||
 * \param olen          The length of the output data, to be updated with the
 | 
			
		||||
 *                      actual number of Bytes written.
 | 
			
		||||
 *
 | 
			
		||||
 * \returns             0 on success, MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA if
 | 
			
		||||
 * \returns             \c 0 on success, #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA if
 | 
			
		||||
 *                      parameter verification fails,
 | 
			
		||||
 *                      MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE on an
 | 
			
		||||
 *                      unsupported mode for a cipher or a cipher specific
 | 
			
		||||
 *                      #MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE on an
 | 
			
		||||
 *                      unsupported mode for a cipher, or a cipher-specific
 | 
			
		||||
 *                      error code.
 | 
			
		||||
 *
 | 
			
		||||
 * \note                If the underlying cipher is GCM, all calls to this
 | 
			
		||||
 *                      function, except the last one before mbedtls_cipher_finish(),
 | 
			
		||||
 *                      must have ilen a multiple of the block size.
 | 
			
		||||
 *                      function, except the last one before
 | 
			
		||||
 *                      mbedtls_cipher_finish(). Must have \p ilen as a
 | 
			
		||||
 *                      multiple of the block_size.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_cipher_update( mbedtls_cipher_context_t *ctx, const unsigned char *input,
 | 
			
		||||
                   size_t ilen, unsigned char *output, size_t *olen );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief               Generic cipher finalisation function. If data still
 | 
			
		||||
 *                      needs to be flushed from an incomplete block, data
 | 
			
		||||
 *                      contained within it will be padded with the size of
 | 
			
		||||
 *                      the last block, and written to the output buffer.
 | 
			
		||||
 * \brief               The generic cipher finalization function. If data still
 | 
			
		||||
 *                      needs to be flushed from an incomplete block, the data
 | 
			
		||||
 *                      contained in it is padded to the size of
 | 
			
		||||
 *                      the last block, and written to the \p output buffer.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx           Generic cipher context
 | 
			
		||||
 * \param output        buffer to write data to. Needs block_size available.
 | 
			
		||||
 * \param olen          length of the data written to the output buffer.
 | 
			
		||||
 * \param ctx           The generic cipher context.
 | 
			
		||||
 * \param output        The buffer to write data to. Needs block_size available.
 | 
			
		||||
 * \param olen          The length of the data written to the \p output buffer.
 | 
			
		||||
 *
 | 
			
		||||
 * \returns             0 on success, MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA if
 | 
			
		||||
 * \returns             \c 0 on success, #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA if
 | 
			
		||||
 *                      parameter verification fails,
 | 
			
		||||
 *                      MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED if decryption
 | 
			
		||||
 *                      #MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED if decryption
 | 
			
		||||
 *                      expected a full block but was not provided one,
 | 
			
		||||
 *                      MBEDTLS_ERR_CIPHER_INVALID_PADDING on invalid padding
 | 
			
		||||
 *                      while decrypting or a cipher specific error code.
 | 
			
		||||
 *                      #MBEDTLS_ERR_CIPHER_INVALID_PADDING on invalid padding
 | 
			
		||||
 *                      while decrypting, or a cipher-specific error code
 | 
			
		||||
 *                      on failure for any other reason.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_cipher_finish( mbedtls_cipher_context_t *ctx,
 | 
			
		||||
                   unsigned char *output, size_t *olen );
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_GCM_C)
 | 
			
		||||
/**
 | 
			
		||||
 * \brief               Write tag for AEAD ciphers.
 | 
			
		||||
 *                      Currently only supported with GCM.
 | 
			
		||||
 * \brief               This function writes a tag for AEAD ciphers.
 | 
			
		||||
 *                      Only supported with GCM.
 | 
			
		||||
 *                      Must be called after mbedtls_cipher_finish().
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx           Generic cipher context
 | 
			
		||||
 * \param tag           buffer to write the tag
 | 
			
		||||
 * \param tag_len       Length of the tag to write
 | 
			
		||||
 * \param ctx           The generic cipher context.
 | 
			
		||||
 * \param tag           The buffer to write the tag to.
 | 
			
		||||
 * \param tag_len       The length of the tag to write.
 | 
			
		||||
 *
 | 
			
		||||
 * \return              0 on success, or a specific error code.
 | 
			
		||||
 * \return              \c 0 on success, or a specific error code on failure.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_cipher_write_tag( mbedtls_cipher_context_t *ctx,
 | 
			
		||||
                      unsigned char *tag, size_t tag_len );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief               Check tag for AEAD ciphers.
 | 
			
		||||
 *                      Currently only supported with GCM.
 | 
			
		||||
 * \brief               This function checks the tag for AEAD ciphers.
 | 
			
		||||
 *                      Only supported with GCM.
 | 
			
		||||
 *                      Must be called after mbedtls_cipher_finish().
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx           Generic cipher context
 | 
			
		||||
 * \param tag           Buffer holding the tag
 | 
			
		||||
 * \param tag_len       Length of the tag to check
 | 
			
		||||
 * \param ctx           The generic cipher context.
 | 
			
		||||
 * \param tag           The buffer holding the tag.
 | 
			
		||||
 * \param tag_len       The length of the tag to check.
 | 
			
		||||
 *
 | 
			
		||||
 * \return              0 on success, or a specific error code.
 | 
			
		||||
 * \return              \c 0 on success, or a specific error code on failure.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_cipher_check_tag( mbedtls_cipher_context_t *ctx,
 | 
			
		||||
                      const unsigned char *tag, size_t tag_len );
 | 
			
		||||
#endif /* MBEDTLS_GCM_C */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief               Generic all-in-one encryption/decryption
 | 
			
		||||
 *                      (for all ciphers except AEAD constructs).
 | 
			
		||||
 * \brief               The generic all-in-one encryption/decryption function,
 | 
			
		||||
 *                      for all ciphers except AEAD constructs.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx           generic cipher context
 | 
			
		||||
 * \param iv            IV to use (or NONCE_COUNTER for CTR-mode ciphers)
 | 
			
		||||
 * \param iv_len        IV length for ciphers with variable-size IV;
 | 
			
		||||
 *                      discarded by ciphers with fixed-size IV.
 | 
			
		||||
 * \param input         buffer holding the input data
 | 
			
		||||
 * \param ilen          length of the input data
 | 
			
		||||
 * \param output        buffer for the output data. Should be able to hold at
 | 
			
		||||
 *                      least ilen + block_size. Cannot be the same buffer as
 | 
			
		||||
 *                      input!
 | 
			
		||||
 * \param olen          length of the output data, will be filled with the
 | 
			
		||||
 *                      actual number of bytes written.
 | 
			
		||||
 * \param ctx           The generic cipher context.
 | 
			
		||||
 * \param iv            The IV to use, or NONCE_COUNTER for CTR-mode ciphers.
 | 
			
		||||
 * \param iv_len        The IV length for ciphers with variable-size IV.
 | 
			
		||||
 *                      This parameter is discarded by ciphers with fixed-size
 | 
			
		||||
 *                      IV.
 | 
			
		||||
 * \param input         The buffer holding the input data.
 | 
			
		||||
 * \param ilen          The length of the input data.
 | 
			
		||||
 * \param output        The buffer for the output data. Must be able to hold at
 | 
			
		||||
 *                      least \p ilen + block_size. Must not be the same buffer
 | 
			
		||||
 *                      as input.
 | 
			
		||||
 * \param olen          The length of the output data, to be updated with the
 | 
			
		||||
 *                      actual number of Bytes written.
 | 
			
		||||
 *
 | 
			
		||||
 * \note                Some ciphers don't use IVs nor NONCE. For these
 | 
			
		||||
 *                      ciphers, use iv = NULL and iv_len = 0.
 | 
			
		||||
 * \note                Some ciphers do not use IVs nor nonce. For these
 | 
			
		||||
 *                      ciphers, use \p iv = NULL and \p iv_len = 0.
 | 
			
		||||
 *
 | 
			
		||||
 * \returns             0 on success, or
 | 
			
		||||
 *                      MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA, or
 | 
			
		||||
 *                      MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED if decryption
 | 
			
		||||
 * \returns             \c 0 on success, or
 | 
			
		||||
 *                      #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA, or
 | 
			
		||||
 *                      #MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED if decryption
 | 
			
		||||
 *                      expected a full block but was not provided one, or
 | 
			
		||||
 *                      MBEDTLS_ERR_CIPHER_INVALID_PADDING on invalid padding
 | 
			
		||||
 *                      while decrypting, or
 | 
			
		||||
 *                      a cipher specific error code.
 | 
			
		||||
 *                      #MBEDTLS_ERR_CIPHER_INVALID_PADDING on invalid padding
 | 
			
		||||
 *                      while decrypting, or a cipher-specific error code on
 | 
			
		||||
 *                      failure for any other reason.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_cipher_crypt( mbedtls_cipher_context_t *ctx,
 | 
			
		||||
                  const unsigned char *iv, size_t iv_len,
 | 
			
		||||
| 
						 | 
				
			
			@ -639,26 +682,26 @@ int mbedtls_cipher_crypt( mbedtls_cipher_context_t *ctx,
 | 
			
		|||
 | 
			
		||||
#if defined(MBEDTLS_CIPHER_MODE_AEAD)
 | 
			
		||||
/**
 | 
			
		||||
 * \brief               Generic autenticated encryption (AEAD ciphers).
 | 
			
		||||
 * \brief               The generic autenticated encryption (AEAD) function.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx           generic cipher context
 | 
			
		||||
 * \param iv            IV to use (or NONCE_COUNTER for CTR-mode ciphers)
 | 
			
		||||
 * \param iv_len        IV length for ciphers with variable-size IV;
 | 
			
		||||
 *                      discarded by ciphers with fixed-size IV.
 | 
			
		||||
 * \param ad            Additional data to authenticate.
 | 
			
		||||
 * \param ad_len        Length of ad.
 | 
			
		||||
 * \param input         buffer holding the input data
 | 
			
		||||
 * \param ilen          length of the input data
 | 
			
		||||
 * \param output        buffer for the output data.
 | 
			
		||||
 *                      Should be able to hold at least ilen.
 | 
			
		||||
 * \param olen          length of the output data, will be filled with the
 | 
			
		||||
 *                      actual number of bytes written.
 | 
			
		||||
 * \param tag           buffer for the authentication tag
 | 
			
		||||
 * \param tag_len       desired tag length
 | 
			
		||||
 * \param ctx           The generic cipher context.
 | 
			
		||||
 * \param iv            The IV to use, or NONCE_COUNTER for CTR-mode ciphers.
 | 
			
		||||
 * \param iv_len        The IV length for ciphers with variable-size IV.
 | 
			
		||||
 *                      This parameter is discarded by ciphers with fixed-size IV.
 | 
			
		||||
 * \param ad            The additional data to authenticate.
 | 
			
		||||
 * \param ad_len        The length of \p ad.
 | 
			
		||||
 * \param input         The buffer holding the input data.
 | 
			
		||||
 * \param ilen          The length of the input data.
 | 
			
		||||
 * \param output        The buffer for the output data.
 | 
			
		||||
 *                      Must be able to hold at least \p ilen.
 | 
			
		||||
 * \param olen          The length of the output data, to be updated with the
 | 
			
		||||
 *                      actual number of Bytes written.
 | 
			
		||||
 * \param tag           The buffer for the authentication tag.
 | 
			
		||||
 * \param tag_len       The desired length of the authentication tag.
 | 
			
		||||
 *
 | 
			
		||||
 * \returns             0 on success, or
 | 
			
		||||
 *                      MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA, or
 | 
			
		||||
 *                      a cipher specific error code.
 | 
			
		||||
 * \returns             \c 0 on success, or
 | 
			
		||||
 *                      #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA, or
 | 
			
		||||
 *                      a cipher-specific error code.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_cipher_auth_encrypt( mbedtls_cipher_context_t *ctx,
 | 
			
		||||
                         const unsigned char *iv, size_t iv_len,
 | 
			
		||||
| 
						 | 
				
			
			@ -668,31 +711,31 @@ int mbedtls_cipher_auth_encrypt( mbedtls_cipher_context_t *ctx,
 | 
			
		|||
                         unsigned char *tag, size_t tag_len );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief               Generic autenticated decryption (AEAD ciphers).
 | 
			
		||||
 * \brief               The generic autenticated decryption (AEAD) function.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx           generic cipher context
 | 
			
		||||
 * \param iv            IV to use (or NONCE_COUNTER for CTR-mode ciphers)
 | 
			
		||||
 * \param iv_len        IV length for ciphers with variable-size IV;
 | 
			
		||||
 *                      discarded by ciphers with fixed-size IV.
 | 
			
		||||
 * \param ad            Additional data to be authenticated.
 | 
			
		||||
 * \param ad_len        Length of ad.
 | 
			
		||||
 * \param input         buffer holding the input data
 | 
			
		||||
 * \param ilen          length of the input data
 | 
			
		||||
 * \param output        buffer for the output data.
 | 
			
		||||
 *                      Should be able to hold at least ilen.
 | 
			
		||||
 * \param olen          length of the output data, will be filled with the
 | 
			
		||||
 *                      actual number of bytes written.
 | 
			
		||||
 * \param tag           buffer holding the authentication tag
 | 
			
		||||
 * \param tag_len       length of the authentication tag
 | 
			
		||||
 * \param ctx           The generic cipher context.
 | 
			
		||||
 * \param iv            The IV to use, or NONCE_COUNTER for CTR-mode ciphers.
 | 
			
		||||
 * \param iv_len        The IV length for ciphers with variable-size IV.
 | 
			
		||||
 *                      This parameter is discarded by ciphers with fixed-size IV.
 | 
			
		||||
 * \param ad            The additional data to be authenticated.
 | 
			
		||||
 * \param ad_len        The length of \p ad.
 | 
			
		||||
 * \param input         The buffer holding the input data.
 | 
			
		||||
 * \param ilen          The length of the input data.
 | 
			
		||||
 * \param output        The buffer for the output data.
 | 
			
		||||
 *                      Must be able to hold at least \p ilen.
 | 
			
		||||
 * \param olen          The length of the output data, to be updated with the
 | 
			
		||||
 *                      actual number of Bytes written.
 | 
			
		||||
 * \param tag           The buffer holding the authentication tag.
 | 
			
		||||
 * \param tag_len       The length of the authentication tag.
 | 
			
		||||
 *
 | 
			
		||||
 * \returns             0 on success, or
 | 
			
		||||
 *                      MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA, or
 | 
			
		||||
 *                      MBEDTLS_ERR_CIPHER_AUTH_FAILED if data isn't authentic,
 | 
			
		||||
 *                      or a cipher specific error code.
 | 
			
		||||
 * \returns             \c 0 on success, or
 | 
			
		||||
 *                      #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA, or
 | 
			
		||||
 *                      #MBEDTLS_ERR_CIPHER_AUTH_FAILED if data is not authentic,
 | 
			
		||||
 *                      or a cipher-specific error code on failure for any other reason.
 | 
			
		||||
 *
 | 
			
		||||
 * \note                If the data is not authentic, then the output buffer
 | 
			
		||||
 *                      is zeroed out to prevent the unauthentic plaintext to
 | 
			
		||||
 *                      be used by mistake, making this interface safer.
 | 
			
		||||
 *                      is zeroed out to prevent the unauthentic plaintext being
 | 
			
		||||
 *                      used, making this interface safer.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_cipher_auth_decrypt( mbedtls_cipher_context_t *ctx,
 | 
			
		||||
                         const unsigned char *iv, size_t iv_len,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,7 +4,8 @@
 | 
			
		|||
 * \brief Cipher wrappers.
 | 
			
		||||
 *
 | 
			
		||||
 * \author Adriaan de Jong <dejong@fox-it.com>
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,10 +1,11 @@
 | 
			
		|||
/**
 | 
			
		||||
 * \file cmac.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief Cipher-based Message Authentication Code (CMAC) Mode for
 | 
			
		||||
 *        Authentication
 | 
			
		||||
 *
 | 
			
		||||
 *  Copyright (C) 2015-2016, ARM Limited, All Rights Reserved
 | 
			
		||||
 * \brief The Cipher-based Message Authentication Code (CMAC) Mode for
 | 
			
		||||
 *        Authentication.
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2015-2018, Arm Limited (or its affiliates), All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
 *  Licensed under the Apache License, Version 2.0 (the "License"); you may
 | 
			
		||||
| 
						 | 
				
			
			@ -19,8 +20,9 @@
 | 
			
		|||
 *  See the License for the specific language governing permissions and
 | 
			
		||||
 *  limitations under the License.
 | 
			
		||||
 *
 | 
			
		||||
 *  This file is part of mbed TLS (https://tls.mbed.org)
 | 
			
		||||
 *  This file is part of Mbed TLS (https://tls.mbed.org)
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef MBEDTLS_CMAC_H
 | 
			
		||||
#define MBEDTLS_CMAC_H
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -30,108 +32,125 @@
 | 
			
		|||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define MBEDTLS_ERR_CMAC_HW_ACCEL_FAILED -0x007A  /**< CMAC hardware accelerator failed. */
 | 
			
		||||
 | 
			
		||||
#define MBEDTLS_AES_BLOCK_SIZE          16
 | 
			
		||||
#define MBEDTLS_DES3_BLOCK_SIZE         8
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_AES_C)
 | 
			
		||||
#define MBEDTLS_CIPHER_BLKSIZE_MAX      16  /* longest used by CMAC is AES */
 | 
			
		||||
#define MBEDTLS_CIPHER_BLKSIZE_MAX      16  /* The longest block used by CMAC is that of AES. */
 | 
			
		||||
#else
 | 
			
		||||
#define MBEDTLS_CIPHER_BLKSIZE_MAX      8   /* longest used by CMAC is 3DES */
 | 
			
		||||
#define MBEDTLS_CIPHER_BLKSIZE_MAX      8   /* The longest block used by CMAC is that of 3DES. */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined(MBEDTLS_CMAC_ALT)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * CMAC context structure - Contains internal state information only
 | 
			
		||||
 * The CMAC context structure.
 | 
			
		||||
 */
 | 
			
		||||
struct mbedtls_cmac_context_t
 | 
			
		||||
{
 | 
			
		||||
    /** Internal state of the CMAC algorithm  */
 | 
			
		||||
    /** The internal state of the CMAC algorithm.  */
 | 
			
		||||
    unsigned char       state[MBEDTLS_CIPHER_BLKSIZE_MAX];
 | 
			
		||||
 | 
			
		||||
    /** Unprocessed data - either data that was not block aligned and is still
 | 
			
		||||
     *  pending to be processed, or the final block */
 | 
			
		||||
     *  pending processing, or the final block. */
 | 
			
		||||
    unsigned char       unprocessed_block[MBEDTLS_CIPHER_BLKSIZE_MAX];
 | 
			
		||||
 | 
			
		||||
    /** Length of data pending to be processed */
 | 
			
		||||
    /** The length of data pending processing. */
 | 
			
		||||
    size_t              unprocessed_len;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief               Set the CMAC key and prepare to authenticate the input
 | 
			
		||||
 *                      data.
 | 
			
		||||
 *                      Should be called with an initialized cipher context.
 | 
			
		||||
 * \brief               This function sets the CMAC key, and prepares to authenticate
 | 
			
		||||
 *                      the input data.
 | 
			
		||||
 *                      Must be called with an initialized cipher context.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx           Cipher context. This should be a cipher context,
 | 
			
		||||
 *                      initialized to be one of the following types:
 | 
			
		||||
 *                      MBEDTLS_CIPHER_AES_128_ECB, MBEDTLS_CIPHER_AES_192_ECB,
 | 
			
		||||
 *                      MBEDTLS_CIPHER_AES_256_ECB or
 | 
			
		||||
 *                      MBEDTLS_CIPHER_DES_EDE3_ECB.
 | 
			
		||||
 * \param key           CMAC key
 | 
			
		||||
 * \param keybits       length of the CMAC key in bits
 | 
			
		||||
 *                      (must be acceptable by the cipher)
 | 
			
		||||
 * \param ctx           The cipher context used for the CMAC operation, initialized
 | 
			
		||||
 *                      as one of the following types:<ul>
 | 
			
		||||
 *                      <li>MBEDTLS_CIPHER_AES_128_ECB</li>
 | 
			
		||||
 *                      <li>MBEDTLS_CIPHER_AES_192_ECB</li>
 | 
			
		||||
 *                      <li>MBEDTLS_CIPHER_AES_256_ECB</li>
 | 
			
		||||
 *                      <li>MBEDTLS_CIPHER_DES_EDE3_ECB</li></ul>
 | 
			
		||||
 * \param key           The CMAC key.
 | 
			
		||||
 * \param keybits       The length of the CMAC key in bits.
 | 
			
		||||
 *                      Must be supported by the cipher.
 | 
			
		||||
 *
 | 
			
		||||
 * \return              0 if successful, or a cipher specific error code
 | 
			
		||||
 * \return              \c 0 on success, or a cipher-specific error code.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_cipher_cmac_starts( mbedtls_cipher_context_t *ctx,
 | 
			
		||||
                                const unsigned char *key, size_t keybits );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief               Generic CMAC process buffer.
 | 
			
		||||
 *                      Called between mbedtls_cipher_cmac_starts() or
 | 
			
		||||
 *                      mbedtls_cipher_cmac_reset() and
 | 
			
		||||
 *                      mbedtls_cipher_cmac_finish().
 | 
			
		||||
 *                      May be called repeatedly.
 | 
			
		||||
 * \brief               This function feeds an input buffer into an ongoing CMAC
 | 
			
		||||
 *                      computation.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx           CMAC context
 | 
			
		||||
 * \param input         buffer holding the  data
 | 
			
		||||
 * \param ilen          length of the input data
 | 
			
		||||
 *                      It is called between mbedtls_cipher_cmac_starts() or
 | 
			
		||||
 *                      mbedtls_cipher_cmac_reset(), and mbedtls_cipher_cmac_finish().
 | 
			
		||||
 *                      Can be called repeatedly.
 | 
			
		||||
 *
 | 
			
		||||
 * \returns             0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter
 | 
			
		||||
 *                      verification fails.
 | 
			
		||||
 * \param ctx           The cipher context used for the CMAC operation.
 | 
			
		||||
 * \param input         The buffer holding the input data.
 | 
			
		||||
 * \param ilen          The length of the input data.
 | 
			
		||||
 *
 | 
			
		||||
 * \returns             \c 0 on success, or #MBEDTLS_ERR_MD_BAD_INPUT_DATA
 | 
			
		||||
 *                      if parameter verification fails.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_cipher_cmac_update( mbedtls_cipher_context_t *ctx,
 | 
			
		||||
                                const unsigned char *input, size_t ilen );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief               Output CMAC.
 | 
			
		||||
 *                      Called after mbedtls_cipher_cmac_update().
 | 
			
		||||
 *                      Usually followed by mbedtls_cipher_cmac_reset(), then
 | 
			
		||||
 *                      mbedtls_cipher_cmac_starts(), or mbedtls_cipher_free().
 | 
			
		||||
 * \brief               This function finishes the CMAC operation, and writes
 | 
			
		||||
 *                      the result to the output buffer.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx           CMAC context
 | 
			
		||||
 * \param output        Generic CMAC checksum result
 | 
			
		||||
 *                      It is called after mbedtls_cipher_cmac_update().
 | 
			
		||||
 *                      It can be followed by mbedtls_cipher_cmac_reset() and
 | 
			
		||||
 *                      mbedtls_cipher_cmac_update(), or mbedtls_cipher_free().
 | 
			
		||||
 *
 | 
			
		||||
 * \returns             0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter
 | 
			
		||||
 *                      verification fails.
 | 
			
		||||
 * \param ctx           The cipher context used for the CMAC operation.
 | 
			
		||||
 * \param output        The output buffer for the CMAC checksum result.
 | 
			
		||||
 *
 | 
			
		||||
 * \returns             \c 0 on success, or #MBEDTLS_ERR_MD_BAD_INPUT_DATA
 | 
			
		||||
 *                      if parameter verification fails.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_cipher_cmac_finish( mbedtls_cipher_context_t *ctx,
 | 
			
		||||
                                unsigned char *output );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief               Prepare to authenticate a new message with the same key.
 | 
			
		||||
 *                      Called after mbedtls_cipher_cmac_finish() and before
 | 
			
		||||
 *                      mbedtls_cipher_cmac_update().
 | 
			
		||||
 * \brief               This function prepares the authentication of another
 | 
			
		||||
 *                      message with the same key as the previous CMAC
 | 
			
		||||
 *                      operation.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx           CMAC context to be reset
 | 
			
		||||
 *                      It is called after mbedtls_cipher_cmac_finish()
 | 
			
		||||
 *                      and before mbedtls_cipher_cmac_update().
 | 
			
		||||
 *
 | 
			
		||||
 * \returns             0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter
 | 
			
		||||
 *                      verification fails.
 | 
			
		||||
 * \param ctx           The cipher context used for the CMAC operation.
 | 
			
		||||
 *
 | 
			
		||||
 * \returns             \c 0 on success, or #MBEDTLS_ERR_MD_BAD_INPUT_DATA
 | 
			
		||||
 *                      if parameter verification fails.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_cipher_cmac_reset( mbedtls_cipher_context_t *ctx );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief               Output = Generic_CMAC( cmac key, input buffer )
 | 
			
		||||
 * \brief               This function calculates the full generic CMAC
 | 
			
		||||
 *                      on the input buffer with the provided key.
 | 
			
		||||
 *
 | 
			
		||||
 * \param cipher_info   message digest info
 | 
			
		||||
 * \param key           CMAC key
 | 
			
		||||
 * \param keylen        length of the CMAC key in bits
 | 
			
		||||
 * \param input         buffer holding the  data
 | 
			
		||||
 * \param ilen          length of the input data
 | 
			
		||||
 * \param output        Generic CMAC-result
 | 
			
		||||
 *                      The function allocates the context, performs the
 | 
			
		||||
 *                      calculation, and frees the context.
 | 
			
		||||
 *
 | 
			
		||||
 * \returns             0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter
 | 
			
		||||
 *                      verification fails.
 | 
			
		||||
 *                      The CMAC result is calculated as
 | 
			
		||||
 *                      output = generic CMAC(cmac key, input buffer).
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 * \param cipher_info   The cipher information.
 | 
			
		||||
 * \param key           The CMAC key.
 | 
			
		||||
 * \param keylen        The length of the CMAC key in bits.
 | 
			
		||||
 * \param input         The buffer holding the input data.
 | 
			
		||||
 * \param ilen          The length of the input data.
 | 
			
		||||
 * \param output        The buffer for the generic CMAC result.
 | 
			
		||||
 *
 | 
			
		||||
 * \returns             \c 0 on success, or #MBEDTLS_ERR_MD_BAD_INPUT_DATA
 | 
			
		||||
 *                      if parameter verification fails.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_cipher_cmac( const mbedtls_cipher_info_t *cipher_info,
 | 
			
		||||
                         const unsigned char *key, size_t keylen,
 | 
			
		||||
| 
						 | 
				
			
			@ -140,16 +159,21 @@ int mbedtls_cipher_cmac( const mbedtls_cipher_info_t *cipher_info,
 | 
			
		|||
 | 
			
		||||
#if defined(MBEDTLS_AES_C)
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           AES-CMAC-128-PRF
 | 
			
		||||
 *                  Implementation of (AES-CMAC-PRF-128), as defined in RFC 4615
 | 
			
		||||
 * \brief           This function implements the AES-CMAC-PRF-128 pseudorandom
 | 
			
		||||
 *                  function, as defined in
 | 
			
		||||
 *                  <em>RFC-4615: The Advanced Encryption Standard-Cipher-based
 | 
			
		||||
 *                  Message Authentication Code-Pseudo-Random Function-128
 | 
			
		||||
 *                  (AES-CMAC-PRF-128) Algorithm for the Internet Key
 | 
			
		||||
 *                  Exchange Protocol (IKE).</em>
 | 
			
		||||
 *
 | 
			
		||||
 * \param key       PRF key
 | 
			
		||||
 * \param key_len   PRF key length in bytes
 | 
			
		||||
 * \param input     buffer holding the input data
 | 
			
		||||
 * \param in_len    length of the input data in bytes
 | 
			
		||||
 * \param output    buffer holding the generated pseudorandom output (16 bytes)
 | 
			
		||||
 * \param key       The key to use.
 | 
			
		||||
 * \param key_len   The key length in Bytes.
 | 
			
		||||
 * \param input     The buffer holding the input data.
 | 
			
		||||
 * \param in_len    The length of the input data in Bytes.
 | 
			
		||||
 * \param output    The buffer holding the generated 16 Bytes of
 | 
			
		||||
 *                  pseudorandom output.
 | 
			
		||||
 *
 | 
			
		||||
 * \return          0 if successful
 | 
			
		||||
 * \return          \c 0 on success.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_aes_cmac_prf_128( const unsigned char *key, size_t key_len,
 | 
			
		||||
                              const unsigned char *input, size_t in_len,
 | 
			
		||||
| 
						 | 
				
			
			@ -170,9 +194,9 @@ extern "C" {
 | 
			
		|||
 | 
			
		||||
#if defined(MBEDTLS_SELF_TEST) && ( defined(MBEDTLS_AES_C) || defined(MBEDTLS_DES_C) )
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          Checkup routine
 | 
			
		||||
 * \brief          The CMAC checkup routine.
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful, or 1 if the test failed
 | 
			
		||||
 * \return         \c 0 on success, or \c 1 on failure.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_cmac_self_test( int verbose );
 | 
			
		||||
#endif /* MBEDTLS_SELF_TEST && ( MBEDTLS_AES_C || MBEDTLS_DES_C ) */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,7 +5,8 @@
 | 
			
		|||
 *  for the PolarSSL naming conventions.
 | 
			
		||||
 *
 | 
			
		||||
 * \deprecated Use the new names directly instead
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,7 +6,8 @@
 | 
			
		|||
 *  This set of compile-time options may be used to enable
 | 
			
		||||
 *  or disable features selectively, and reduce the global
 | 
			
		||||
 *  memory footprint.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			@ -261,6 +262,12 @@
 | 
			
		|||
 *
 | 
			
		||||
 * Uncomment a macro to enable alternate implementation of the corresponding
 | 
			
		||||
 * module.
 | 
			
		||||
 *
 | 
			
		||||
 * \warning   MD2, MD4, MD5, ARC4, DES and SHA-1 are considered weak and their
 | 
			
		||||
 *            use constitutes a security risk. If possible, we recommend
 | 
			
		||||
 *            avoiding dependencies on them, and considering stronger message
 | 
			
		||||
 *            digests and ciphers instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
//#define MBEDTLS_AES_ALT
 | 
			
		||||
//#define MBEDTLS_ARC4_ALT
 | 
			
		||||
| 
						 | 
				
			
			@ -269,6 +276,8 @@
 | 
			
		|||
//#define MBEDTLS_CCM_ALT
 | 
			
		||||
//#define MBEDTLS_CMAC_ALT
 | 
			
		||||
//#define MBEDTLS_DES_ALT
 | 
			
		||||
//#define MBEDTLS_DHM_ALT
 | 
			
		||||
//#define MBEDTLS_ECJPAKE_ALT
 | 
			
		||||
//#define MBEDTLS_GCM_ALT
 | 
			
		||||
//#define MBEDTLS_MD2_ALT
 | 
			
		||||
//#define MBEDTLS_MD4_ALT
 | 
			
		||||
| 
						 | 
				
			
			@ -318,6 +327,12 @@
 | 
			
		|||
 *
 | 
			
		||||
 * Uncomment a macro to enable alternate implementation of the corresponding
 | 
			
		||||
 * function.
 | 
			
		||||
 *
 | 
			
		||||
 * \warning   MD2, MD4, MD5, DES and SHA-1 are considered weak and their use
 | 
			
		||||
 *            constitutes a security risk. If possible, we recommend avoiding
 | 
			
		||||
 *            dependencies on them, and considering stronger message digests
 | 
			
		||||
 *            and ciphers instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
//#define MBEDTLS_MD2_PROCESS_ALT
 | 
			
		||||
//#define MBEDTLS_MD4_PROCESS_ALT
 | 
			
		||||
| 
						 | 
				
			
			@ -522,6 +537,9 @@
 | 
			
		|||
 *      MBEDTLS_TLS_DHE_RSA_WITH_DES_CBC_SHA
 | 
			
		||||
 *
 | 
			
		||||
 * Uncomment this macro to enable weak ciphersuites
 | 
			
		||||
 *
 | 
			
		||||
 * \warning   DES is considered a weak cipher and its use constitutes a
 | 
			
		||||
 *            security risk. We recommend considering stronger ciphers instead.
 | 
			
		||||
 */
 | 
			
		||||
//#define MBEDTLS_ENABLE_WEAK_CIPHERSUITES
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -627,6 +645,13 @@
 | 
			
		|||
 *      MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256
 | 
			
		||||
 *      MBEDTLS_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA
 | 
			
		||||
 *      MBEDTLS_TLS_DHE_PSK_WITH_RC4_128_SHA
 | 
			
		||||
 *
 | 
			
		||||
 * \warning    Using DHE constitutes a security risk as it
 | 
			
		||||
 *             is not possible to validate custom DH parameters.
 | 
			
		||||
 *             If possible, it is recommended users should consider
 | 
			
		||||
 *             preferring other methods of key exchange.
 | 
			
		||||
 *             See dhm.h for more details.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
#define MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -726,6 +751,13 @@
 | 
			
		|||
 *      MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
 | 
			
		||||
 *      MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
 | 
			
		||||
 *      MBEDTLS_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
 | 
			
		||||
 *
 | 
			
		||||
 * \warning    Using DHE constitutes a security risk as it
 | 
			
		||||
 *             is not possible to validate custom DH parameters.
 | 
			
		||||
 *             If possible, it is recommended users should consider
 | 
			
		||||
 *             preferring other methods of key exchange.
 | 
			
		||||
 *             See dhm.h for more details.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
#define MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1612,6 +1644,11 @@
 | 
			
		|||
 *      MBEDTLS_TLS_RSA_WITH_RC4_128_MD5
 | 
			
		||||
 *      MBEDTLS_TLS_RSA_PSK_WITH_RC4_128_SHA
 | 
			
		||||
 *      MBEDTLS_TLS_PSK_WITH_RC4_128_SHA
 | 
			
		||||
 *
 | 
			
		||||
 * \warning   ARC4 is considered a weak cipher and its use constitutes a
 | 
			
		||||
 *            security risk. If possible, we recommend avoidng dependencies on
 | 
			
		||||
 *            it, and considering stronger ciphers instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
#define MBEDTLS_ARC4_C
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1838,6 +1875,9 @@
 | 
			
		|||
 *      MBEDTLS_TLS_PSK_WITH_3DES_EDE_CBC_SHA
 | 
			
		||||
 *
 | 
			
		||||
 * PEM_PARSE uses DES/3DES for decrypting encrypted keys.
 | 
			
		||||
 *
 | 
			
		||||
 * \warning   DES is considered a weak cipher and its use constitutes a
 | 
			
		||||
 *            security risk. We recommend considering stronger ciphers instead.
 | 
			
		||||
 */
 | 
			
		||||
#define MBEDTLS_DES_C
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1852,6 +1892,13 @@
 | 
			
		|||
 *
 | 
			
		||||
 * This module is used by the following key exchanges:
 | 
			
		||||
 *      DHE-RSA, DHE-PSK
 | 
			
		||||
 *
 | 
			
		||||
 * \warning    Using DHE constitutes a security risk as it
 | 
			
		||||
 *             is not possible to validate custom DH parameters.
 | 
			
		||||
 *             If possible, it is recommended users should consider
 | 
			
		||||
 *             preferring other methods of key exchange.
 | 
			
		||||
 *             See dhm.h for more details.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
#define MBEDTLS_DHM_C
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2017,6 +2064,11 @@
 | 
			
		|||
 * Caller:
 | 
			
		||||
 *
 | 
			
		||||
 * Uncomment to enable support for (rare) MD2-signed X.509 certs.
 | 
			
		||||
 *
 | 
			
		||||
 * \warning   MD2 is considered a weak message digest and its use constitutes a
 | 
			
		||||
 *            security risk. If possible, we recommend avoiding dependencies on
 | 
			
		||||
 *            it, and considering stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
//#define MBEDTLS_MD2_C
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2029,6 +2081,11 @@
 | 
			
		|||
 * Caller:
 | 
			
		||||
 *
 | 
			
		||||
 * Uncomment to enable support for (rare) MD4-signed X.509 certs.
 | 
			
		||||
 *
 | 
			
		||||
 * \warning   MD4 is considered a weak message digest and its use constitutes a
 | 
			
		||||
 *            security risk. If possible, we recommend avoiding dependencies on
 | 
			
		||||
 *            it, and considering stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
//#define MBEDTLS_MD4_C
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2042,8 +2099,15 @@
 | 
			
		|||
 *          library/pem.c
 | 
			
		||||
 *          library/ssl_tls.c
 | 
			
		||||
 *
 | 
			
		||||
 * This module is required for SSL/TLS and X.509.
 | 
			
		||||
 * PEM_PARSE uses MD5 for decrypting encrypted keys.
 | 
			
		||||
 * This module is required for SSL/TLS up to version 1.1, and for TLS 1.2
 | 
			
		||||
 * depending on the handshake parameters. Further, it is used for checking
 | 
			
		||||
 * MD5-signed certificates, and for PBKDF1 when decrypting PEM-encoded
 | 
			
		||||
 * encrypted keys.
 | 
			
		||||
 *
 | 
			
		||||
 * \warning   MD5 is considered a weak message digest and its use constitutes a
 | 
			
		||||
 *            security risk. If possible, we recommend avoiding dependencies on
 | 
			
		||||
 *            it, and considering stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
#define MBEDTLS_MD5_C
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2306,6 +2370,11 @@
 | 
			
		|||
 *
 | 
			
		||||
 * This module is required for SSL/TLS up to version 1.1, for TLS 1.2
 | 
			
		||||
 * depending on the handshake parameters, and for SHA1-signed certificates.
 | 
			
		||||
 *
 | 
			
		||||
 * \warning   SHA-1 is considered a weak message digest and its use constitutes
 | 
			
		||||
 *            a security risk. If possible, we recommend avoiding dependencies
 | 
			
		||||
 *            on it, and considering stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
#define MBEDTLS_SHA1_C
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2694,8 +2763,13 @@
 | 
			
		|||
 * Allow SHA-1 in the default TLS configuration for certificate signing.
 | 
			
		||||
 * Without this build-time option, SHA-1 support must be activated explicitly
 | 
			
		||||
 * through mbedtls_ssl_conf_cert_profile. Turning on this option is not
 | 
			
		||||
 * recommended because of it is possible to generte SHA-1 collisions, however
 | 
			
		||||
 * recommended because of it is possible to generate SHA-1 collisions, however
 | 
			
		||||
 * this may be safe for legacy infrastructure where additional controls apply.
 | 
			
		||||
 *
 | 
			
		||||
 * \warning   SHA-1 is considered a weak message digest and its use constitutes
 | 
			
		||||
 *            a security risk. If possible, we recommend avoiding dependencies
 | 
			
		||||
 *            on it, and considering stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
// #define MBEDTLS_TLS_DEFAULT_ALLOW_SHA1_IN_CERTIFICATES
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2706,7 +2780,13 @@
 | 
			
		|||
 * The use of SHA-1 in TLS <= 1.1 and in HMAC-SHA-1 is always allowed by
 | 
			
		||||
 * default. At the time of writing, there is no practical attack on the use
 | 
			
		||||
 * of SHA-1 in handshake signatures, hence this option is turned on by default
 | 
			
		||||
 * for compatibility with existing peers.
 | 
			
		||||
 * to preserve compatibility with existing peers, but the general
 | 
			
		||||
 * warning applies nonetheless:
 | 
			
		||||
 *
 | 
			
		||||
 * \warning   SHA-1 is considered a weak message digest and its use constitutes
 | 
			
		||||
 *            a security risk. If possible, we recommend avoiding dependencies
 | 
			
		||||
 *            on it, and considering stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
#define MBEDTLS_TLS_DEFAULT_ALLOW_SHA1_IN_KEY_EXCHANGE
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,9 +1,13 @@
 | 
			
		|||
/**
 | 
			
		||||
 * \file ctr_drbg.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief CTR_DRBG based on AES-256 (NIST SP 800-90)
 | 
			
		||||
 * \brief    CTR_DRBG is based on AES-256, as defined in <em>NIST SP 800-90A:
 | 
			
		||||
 *           Recommendation for Random Number Generation Using Deterministic
 | 
			
		||||
 *           Random Bit Generators</em>.
 | 
			
		||||
 *
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
 *  Licensed under the Apache License, Version 2.0 (the "License"); you may
 | 
			
		||||
| 
						 | 
				
			
			@ -18,8 +22,9 @@
 | 
			
		|||
 *  See the License for the specific language governing permissions and
 | 
			
		||||
 *  limitations under the License.
 | 
			
		||||
 *
 | 
			
		||||
 *  This file is part of mbed TLS (https://tls.mbed.org)
 | 
			
		||||
 *  This file is part of Mbed TLS (https://tls.mbed.org)
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef MBEDTLS_CTR_DRBG_H
 | 
			
		||||
#define MBEDTLS_CTR_DRBG_H
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -30,78 +35,95 @@
 | 
			
		|||
#endif
 | 
			
		||||
 | 
			
		||||
#define MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED        -0x0034  /**< The entropy source failed. */
 | 
			
		||||
#define MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG              -0x0036  /**< Too many random requested in single call. */
 | 
			
		||||
#define MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG                -0x0038  /**< Input too large (Entropy + additional). */
 | 
			
		||||
#define MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR                -0x003A  /**< Read/write error in file. */
 | 
			
		||||
#define MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG              -0x0036  /**< The requested random buffer length is too big. */
 | 
			
		||||
#define MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG                -0x0038  /**< The input (entropy + additional data) is too large. */
 | 
			
		||||
#define MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR                -0x003A  /**< Read or write error in file. */
 | 
			
		||||
 | 
			
		||||
#define MBEDTLS_CTR_DRBG_BLOCKSIZE          16      /**< Block size used by the cipher                  */
 | 
			
		||||
#define MBEDTLS_CTR_DRBG_KEYSIZE            32      /**< Key size used by the cipher                    */
 | 
			
		||||
#define MBEDTLS_CTR_DRBG_KEYBITS            ( MBEDTLS_CTR_DRBG_KEYSIZE * 8 )
 | 
			
		||||
#define MBEDTLS_CTR_DRBG_SEEDLEN            ( MBEDTLS_CTR_DRBG_KEYSIZE + MBEDTLS_CTR_DRBG_BLOCKSIZE )
 | 
			
		||||
                                            /**< The seed length (counter + AES key)            */
 | 
			
		||||
#define MBEDTLS_CTR_DRBG_BLOCKSIZE          16 /**< The block size used by the cipher. */
 | 
			
		||||
#define MBEDTLS_CTR_DRBG_KEYSIZE            32 /**< The key size used by the cipher. */
 | 
			
		||||
#define MBEDTLS_CTR_DRBG_KEYBITS            ( MBEDTLS_CTR_DRBG_KEYSIZE * 8 ) /**< The key size for the DRBG operation, in bits. */
 | 
			
		||||
#define MBEDTLS_CTR_DRBG_SEEDLEN            ( MBEDTLS_CTR_DRBG_KEYSIZE + MBEDTLS_CTR_DRBG_BLOCKSIZE ) /**< The seed length, calculated as (counter + AES key). */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \name SECTION: Module settings
 | 
			
		||||
 *
 | 
			
		||||
 * The configuration options you can set for this module are in this section.
 | 
			
		||||
 * Either change them in config.h or define them on the compiler command line.
 | 
			
		||||
 * Either change them in config.h or define them using the compiler command
 | 
			
		||||
 * line.
 | 
			
		||||
 * \{
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#if !defined(MBEDTLS_CTR_DRBG_ENTROPY_LEN)
 | 
			
		||||
#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_ENTROPY_FORCE_SHA256)
 | 
			
		||||
#define MBEDTLS_CTR_DRBG_ENTROPY_LEN        48      /**< Amount of entropy used per seed by default (48 with SHA-512, 32 with SHA-256) */
 | 
			
		||||
#define MBEDTLS_CTR_DRBG_ENTROPY_LEN        48
 | 
			
		||||
/**< The amount of entropy used per seed by default:
 | 
			
		||||
 * <ul><li>48 with SHA-512.</li>
 | 
			
		||||
 * <li>32 with SHA-256.</li></ul>
 | 
			
		||||
 */
 | 
			
		||||
#else
 | 
			
		||||
#define MBEDTLS_CTR_DRBG_ENTROPY_LEN        32      /**< Amount of entropy used per seed by default (48 with SHA-512, 32 with SHA-256) */
 | 
			
		||||
#define MBEDTLS_CTR_DRBG_ENTROPY_LEN        32
 | 
			
		||||
/**< Amount of entropy used per seed by default:
 | 
			
		||||
 * <ul><li>48 with SHA-512.</li>
 | 
			
		||||
 * <li>32 with SHA-256.</li></ul>
 | 
			
		||||
 */
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined(MBEDTLS_CTR_DRBG_RESEED_INTERVAL)
 | 
			
		||||
#define MBEDTLS_CTR_DRBG_RESEED_INTERVAL    10000   /**< Interval before reseed is performed by default */
 | 
			
		||||
#define MBEDTLS_CTR_DRBG_RESEED_INTERVAL    10000
 | 
			
		||||
/**< The interval before reseed is performed by default. */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined(MBEDTLS_CTR_DRBG_MAX_INPUT)
 | 
			
		||||
#define MBEDTLS_CTR_DRBG_MAX_INPUT          256     /**< Maximum number of additional input bytes */
 | 
			
		||||
#define MBEDTLS_CTR_DRBG_MAX_INPUT          256
 | 
			
		||||
/**< The maximum number of additional input Bytes. */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined(MBEDTLS_CTR_DRBG_MAX_REQUEST)
 | 
			
		||||
#define MBEDTLS_CTR_DRBG_MAX_REQUEST        1024    /**< Maximum number of requested bytes per call */
 | 
			
		||||
#define MBEDTLS_CTR_DRBG_MAX_REQUEST        1024
 | 
			
		||||
/**< The maximum number of requested Bytes per call. */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined(MBEDTLS_CTR_DRBG_MAX_SEED_INPUT)
 | 
			
		||||
#define MBEDTLS_CTR_DRBG_MAX_SEED_INPUT     384     /**< Maximum size of (re)seed buffer */
 | 
			
		||||
#define MBEDTLS_CTR_DRBG_MAX_SEED_INPUT     384
 | 
			
		||||
/**< The maximum size of seed or reseed buffer. */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* \} name SECTION: Module settings */
 | 
			
		||||
 | 
			
		||||
#define MBEDTLS_CTR_DRBG_PR_OFF             0       /**< No prediction resistance       */
 | 
			
		||||
#define MBEDTLS_CTR_DRBG_PR_ON              1       /**< Prediction resistance enabled  */
 | 
			
		||||
#define MBEDTLS_CTR_DRBG_PR_OFF             0
 | 
			
		||||
/**< Prediction resistance is disabled. */
 | 
			
		||||
#define MBEDTLS_CTR_DRBG_PR_ON              1
 | 
			
		||||
/**< Prediction resistance is enabled. */
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          CTR_DRBG context structure
 | 
			
		||||
 * \brief          The CTR_DRBG context structure.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct
 | 
			
		||||
{
 | 
			
		||||
    unsigned char counter[16];  /*!<  counter (V)       */
 | 
			
		||||
    int reseed_counter;         /*!<  reseed counter    */
 | 
			
		||||
    int prediction_resistance;  /*!<  enable prediction resistance (Automatic
 | 
			
		||||
                                      reseed before every random generation)  */
 | 
			
		||||
    size_t entropy_len;         /*!<  amount of entropy grabbed on each
 | 
			
		||||
                                      (re)seed          */
 | 
			
		||||
    int reseed_interval;        /*!<  reseed interval   */
 | 
			
		||||
    unsigned char counter[16];  /*!< The counter (V). */
 | 
			
		||||
    int reseed_counter;         /*!< The reseed counter. */
 | 
			
		||||
    int prediction_resistance;  /*!< This determines whether prediction
 | 
			
		||||
                                     resistance is enabled, that is
 | 
			
		||||
                                     whether to systematically reseed before
 | 
			
		||||
                                     each random generation. */
 | 
			
		||||
    size_t entropy_len;         /*!< The amount of entropy grabbed on each
 | 
			
		||||
                                     seed or reseed operation. */
 | 
			
		||||
    int reseed_interval;        /*!< The reseed interval. */
 | 
			
		||||
 | 
			
		||||
    mbedtls_aes_context aes_ctx;        /*!<  AES context       */
 | 
			
		||||
    mbedtls_aes_context aes_ctx;        /*!< The AES context. */
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
     * Callbacks (Entropy)
 | 
			
		||||
     */
 | 
			
		||||
    int (*f_entropy)(void *, unsigned char *, size_t);
 | 
			
		||||
                                /*!< The entropy callback function. */
 | 
			
		||||
 | 
			
		||||
    void *p_entropy;            /*!<  context for the entropy function */
 | 
			
		||||
    void *p_entropy;            /*!< The context for the entropy function. */
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_THREADING_C)
 | 
			
		||||
    mbedtls_threading_mutex_t mutex;
 | 
			
		||||
| 
						 | 
				
			
			@ -110,31 +132,32 @@ typedef struct
 | 
			
		|||
mbedtls_ctr_drbg_context;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief               CTR_DRBG context initialization
 | 
			
		||||
 *                      Makes the context ready for mbedtls_ctr_drbg_seed() or
 | 
			
		||||
 *                      mbedtls_ctr_drbg_free().
 | 
			
		||||
 * \brief               This function initializes the CTR_DRBG context,
 | 
			
		||||
 *                      and prepares it for mbedtls_ctr_drbg_seed()
 | 
			
		||||
 *                      or mbedtls_ctr_drbg_free().
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx           CTR_DRBG context to be initialized
 | 
			
		||||
 * \param ctx           The CTR_DRBG context to initialize.
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_ctr_drbg_init( mbedtls_ctr_drbg_context *ctx );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief               CTR_DRBG initial seeding
 | 
			
		||||
 *                      Seed and setup entropy source for future reseeds.
 | 
			
		||||
 * \brief               This function seeds and sets up the CTR_DRBG
 | 
			
		||||
 *                      entropy source for future reseeds.
 | 
			
		||||
 *
 | 
			
		||||
 * Note: Personalization data can be provided in addition to the more generic
 | 
			
		||||
 *       entropy source to make this instantiation as unique as possible.
 | 
			
		||||
 * \note Personalization data can be provided in addition to the more generic
 | 
			
		||||
 *       entropy source, to make this instantiation as unique as possible.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx           CTR_DRBG context to be seeded
 | 
			
		||||
 * \param f_entropy     Entropy callback (p_entropy, buffer to fill, buffer
 | 
			
		||||
 *                      length)
 | 
			
		||||
 * \param p_entropy     Entropy context
 | 
			
		||||
 * \param custom        Personalization data (Device specific identifiers)
 | 
			
		||||
 *                      (Can be NULL)
 | 
			
		||||
 * \param len           Length of personalization data
 | 
			
		||||
 * \param ctx           The CTR_DRBG context to seed.
 | 
			
		||||
 * \param f_entropy     The entropy callback, taking as arguments the
 | 
			
		||||
 *                      \p p_entropy context, the buffer to fill, and the
 | 
			
		||||
                        length of the buffer.
 | 
			
		||||
 * \param p_entropy     The entropy context.
 | 
			
		||||
 * \param custom        Personalization data, that is device-specific
 | 
			
		||||
                        identifiers. Can be NULL.
 | 
			
		||||
 * \param len           The length of the personalization data.
 | 
			
		||||
 *
 | 
			
		||||
 * \return              0 if successful, or
 | 
			
		||||
 *                      MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED
 | 
			
		||||
 * \return              \c 0 on success, or
 | 
			
		||||
 *                      #MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED on failure.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_ctr_drbg_seed( mbedtls_ctr_drbg_context *ctx,
 | 
			
		||||
                   int (*f_entropy)(void *, unsigned char *, size_t),
 | 
			
		||||
| 
						 | 
				
			
			@ -143,138 +166,147 @@ int mbedtls_ctr_drbg_seed( mbedtls_ctr_drbg_context *ctx,
 | 
			
		|||
                   size_t len );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief               Clear CTR_CRBG context data
 | 
			
		||||
 * \brief               This function clears CTR_CRBG context data.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx           CTR_DRBG context to clear
 | 
			
		||||
 * \param ctx           The CTR_DRBG context to clear.
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_ctr_drbg_free( mbedtls_ctr_drbg_context *ctx );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief               Enable / disable prediction resistance (Default: Off)
 | 
			
		||||
 * \brief               This function turns prediction resistance on or off.
 | 
			
		||||
 *                      The default value is off.
 | 
			
		||||
 *
 | 
			
		||||
 * Note: If enabled, entropy is used for ctx->entropy_len before each call!
 | 
			
		||||
 *       Only use this if you have ample supply of good entropy!
 | 
			
		||||
 * \note                If enabled, entropy is gathered at the beginning of
 | 
			
		||||
 *                      every call to mbedtls_ctr_drbg_random_with_add().
 | 
			
		||||
 *                      Only use this if your entropy source has sufficient
 | 
			
		||||
 *                      throughput.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx           CTR_DRBG context
 | 
			
		||||
 * \param resistance    MBEDTLS_CTR_DRBG_PR_ON or MBEDTLS_CTR_DRBG_PR_OFF
 | 
			
		||||
 * \param ctx           The CTR_DRBG context.
 | 
			
		||||
 * \param resistance    #MBEDTLS_CTR_DRBG_PR_ON or #MBEDTLS_CTR_DRBG_PR_OFF.
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_ctr_drbg_set_prediction_resistance( mbedtls_ctr_drbg_context *ctx,
 | 
			
		||||
                                         int resistance );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief               Set the amount of entropy grabbed on each (re)seed
 | 
			
		||||
 *                      (Default: MBEDTLS_CTR_DRBG_ENTROPY_LEN)
 | 
			
		||||
 * \brief               This function sets the amount of entropy grabbed on each
 | 
			
		||||
 *                      seed or reseed. The default value is
 | 
			
		||||
 *                      #MBEDTLS_CTR_DRBG_ENTROPY_LEN.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx           CTR_DRBG context
 | 
			
		||||
 * \param len           Amount of entropy to grab
 | 
			
		||||
 * \param ctx           The CTR_DRBG context.
 | 
			
		||||
 * \param len           The amount of entropy to grab.
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_ctr_drbg_set_entropy_len( mbedtls_ctr_drbg_context *ctx,
 | 
			
		||||
                               size_t len );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief               Set the reseed interval
 | 
			
		||||
 *                      (Default: MBEDTLS_CTR_DRBG_RESEED_INTERVAL)
 | 
			
		||||
 * \brief               This function sets the reseed interval.
 | 
			
		||||
 *                      The default value is #MBEDTLS_CTR_DRBG_RESEED_INTERVAL.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx           CTR_DRBG context
 | 
			
		||||
 * \param interval      Reseed interval
 | 
			
		||||
 * \param ctx           The CTR_DRBG context.
 | 
			
		||||
 * \param interval      The reseed interval.
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_ctr_drbg_set_reseed_interval( mbedtls_ctr_drbg_context *ctx,
 | 
			
		||||
                                   int interval );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief               CTR_DRBG reseeding (extracts data from entropy source)
 | 
			
		||||
 * \brief               This function reseeds the CTR_DRBG context, that is
 | 
			
		||||
 *                      extracts data from the entropy source.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx           CTR_DRBG context
 | 
			
		||||
 * \param additional    Additional data to add to state (Can be NULL)
 | 
			
		||||
 * \param len           Length of additional data
 | 
			
		||||
 * \param ctx           The CTR_DRBG context.
 | 
			
		||||
 * \param additional    Additional data to add to the state. Can be NULL.
 | 
			
		||||
 * \param len           The length of the additional data.
 | 
			
		||||
 *
 | 
			
		||||
 * \return              0 if successful, or
 | 
			
		||||
 *                      MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED
 | 
			
		||||
 * \return   \c 0 on success, or
 | 
			
		||||
 *           #MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED on failure.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_ctr_drbg_reseed( mbedtls_ctr_drbg_context *ctx,
 | 
			
		||||
                     const unsigned char *additional, size_t len );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief               CTR_DRBG update state
 | 
			
		||||
 * \brief               This function updates the state of the CTR_DRBG context.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx           CTR_DRBG context
 | 
			
		||||
 * \param additional    Additional data to update state with
 | 
			
		||||
 * \param add_len       Length of additional data
 | 
			
		||||
 * \param ctx           The CTR_DRBG context.
 | 
			
		||||
 * \param additional    The data to update the state with.
 | 
			
		||||
 * \param add_len       Length of \p additional data.
 | 
			
		||||
 *
 | 
			
		||||
 * \note                If add_len is greater than MBEDTLS_CTR_DRBG_MAX_SEED_INPUT,
 | 
			
		||||
 *                      only the first MBEDTLS_CTR_DRBG_MAX_SEED_INPUT bytes are used,
 | 
			
		||||
 *                      the remaining ones are silently discarded.
 | 
			
		||||
 * \note     If \p add_len is greater than #MBEDTLS_CTR_DRBG_MAX_SEED_INPUT,
 | 
			
		||||
 *           only the first #MBEDTLS_CTR_DRBG_MAX_SEED_INPUT Bytes are used.
 | 
			
		||||
 *           The remaining Bytes are silently discarded.
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_ctr_drbg_update( mbedtls_ctr_drbg_context *ctx,
 | 
			
		||||
                      const unsigned char *additional, size_t add_len );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief               CTR_DRBG generate random with additional update input
 | 
			
		||||
 * \brief   This function updates a CTR_DRBG instance with additional
 | 
			
		||||
 *          data and uses it to generate random data.
 | 
			
		||||
 *
 | 
			
		||||
 * Note: Automatically reseeds if reseed_counter is reached.
 | 
			
		||||
 * \note    The function automatically reseeds if the reseed counter is exceeded.
 | 
			
		||||
 *
 | 
			
		||||
 * \param p_rng         CTR_DRBG context
 | 
			
		||||
 * \param output        Buffer to fill
 | 
			
		||||
 * \param output_len    Length of the buffer
 | 
			
		||||
 * \param additional    Additional data to update with (Can be NULL)
 | 
			
		||||
 * \param add_len       Length of additional data
 | 
			
		||||
 * \param p_rng         The CTR_DRBG context. This must be a pointer to a
 | 
			
		||||
 *                      #mbedtls_ctr_drbg_context structure.
 | 
			
		||||
 * \param output        The buffer to fill.
 | 
			
		||||
 * \param output_len    The length of the buffer.
 | 
			
		||||
 * \param additional    Additional data to update. Can be NULL.
 | 
			
		||||
 * \param add_len       The length of the additional data.
 | 
			
		||||
 *
 | 
			
		||||
 * \return              0 if successful, or
 | 
			
		||||
 *                      MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED, or
 | 
			
		||||
 *                      MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG
 | 
			
		||||
 * \return    \c 0 on success, or
 | 
			
		||||
 *            #MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED or
 | 
			
		||||
 *            #MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG on failure.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_ctr_drbg_random_with_add( void *p_rng,
 | 
			
		||||
                              unsigned char *output, size_t output_len,
 | 
			
		||||
                              const unsigned char *additional, size_t add_len );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief               CTR_DRBG generate random
 | 
			
		||||
 * \brief   This function uses CTR_DRBG to generate random data.
 | 
			
		||||
 *
 | 
			
		||||
 * Note: Automatically reseeds if reseed_counter is reached.
 | 
			
		||||
 * \note    The function automatically reseeds if the reseed counter is exceeded.
 | 
			
		||||
 *
 | 
			
		||||
 * \param p_rng         CTR_DRBG context
 | 
			
		||||
 * \param output        Buffer to fill
 | 
			
		||||
 * \param output_len    Length of the buffer
 | 
			
		||||
 * \param p_rng         The CTR_DRBG context. This must be a pointer to a
 | 
			
		||||
 *                      #mbedtls_ctr_drbg_context structure.
 | 
			
		||||
 * \param output        The buffer to fill.
 | 
			
		||||
 * \param output_len    The length of the buffer.
 | 
			
		||||
 *
 | 
			
		||||
 * \return              0 if successful, or
 | 
			
		||||
 *                      MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED, or
 | 
			
		||||
 *                      MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG
 | 
			
		||||
 * \return              \c 0 on success, or
 | 
			
		||||
 *                      #MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED or
 | 
			
		||||
 *                      #MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG on failure.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_ctr_drbg_random( void *p_rng,
 | 
			
		||||
                     unsigned char *output, size_t output_len );
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_FS_IO)
 | 
			
		||||
/**
 | 
			
		||||
 * \brief               Write a seed file
 | 
			
		||||
 * \brief               This function writes a seed file.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx           CTR_DRBG context
 | 
			
		||||
 * \param path          Name of the file
 | 
			
		||||
 * \param ctx           The CTR_DRBG context.
 | 
			
		||||
 * \param path          The name of the file.
 | 
			
		||||
 *
 | 
			
		||||
 * \return              0 if successful,
 | 
			
		||||
 *                      MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR on file error, or
 | 
			
		||||
 *                      MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED
 | 
			
		||||
 * \return              \c 0 on success,
 | 
			
		||||
 *                      #MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR on file error, or
 | 
			
		||||
 *                      #MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED on
 | 
			
		||||
 *                      failure.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_ctr_drbg_write_seed_file( mbedtls_ctr_drbg_context *ctx, const char *path );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief               Read and update a seed file. Seed is added to this
 | 
			
		||||
 *                      instance
 | 
			
		||||
 * \brief               This function reads and updates a seed file. The seed
 | 
			
		||||
 *                      is added to this instance.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx           CTR_DRBG context
 | 
			
		||||
 * \param path          Name of the file
 | 
			
		||||
 * \param ctx           The CTR_DRBG context.
 | 
			
		||||
 * \param path          The name of the file.
 | 
			
		||||
 *
 | 
			
		||||
 * \return              0 if successful,
 | 
			
		||||
 *                      MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR on file error,
 | 
			
		||||
 *                      MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED or
 | 
			
		||||
 *                      MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG
 | 
			
		||||
 * \return              \c 0 on success,
 | 
			
		||||
 *                      #MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR on file error,
 | 
			
		||||
 *                      #MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED or
 | 
			
		||||
 *                      #MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG on failure.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_ctr_drbg_update_seed_file( mbedtls_ctr_drbg_context *ctx, const char *path );
 | 
			
		||||
#endif /* MBEDTLS_FS_IO */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief               Checkup routine
 | 
			
		||||
 * \brief               The CTR_DRBG checkup routine.
 | 
			
		||||
 *
 | 
			
		||||
 * \return              0 if successful, or 1 if the test failed
 | 
			
		||||
 * \return              \c 0 on success, or \c 1 on failure.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_ctr_drbg_self_test( int verbose );
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,8 @@
 | 
			
		|||
 * \file debug.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief Functions for controlling and providing debug output from the library.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,6 +3,11 @@
 | 
			
		|||
 *
 | 
			
		||||
 * \brief DES block cipher
 | 
			
		||||
 *
 | 
			
		||||
 * \warning   DES is considered a weak cipher and its use constitutes a
 | 
			
		||||
 *            security risk. We recommend considering stronger ciphers
 | 
			
		||||
 *            instead.
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			@ -19,6 +24,7 @@
 | 
			
		|||
 *  limitations under the License.
 | 
			
		||||
 *
 | 
			
		||||
 *  This file is part of mbed TLS (https://tls.mbed.org)
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
#ifndef MBEDTLS_DES_H
 | 
			
		||||
#define MBEDTLS_DES_H
 | 
			
		||||
| 
						 | 
				
			
			@ -36,6 +42,7 @@
 | 
			
		|||
#define MBEDTLS_DES_DECRYPT     0
 | 
			
		||||
 | 
			
		||||
#define MBEDTLS_ERR_DES_INVALID_INPUT_LENGTH              -0x0032  /**< The data input has an invalid length. */
 | 
			
		||||
#define MBEDTLS_ERR_DES_HW_ACCEL_FAILED                   -0x0033  /**< DES hardware accelerator failed. */
 | 
			
		||||
 | 
			
		||||
#define MBEDTLS_DES_KEY_SIZE    8
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -49,6 +56,10 @@ extern "C" {
 | 
			
		|||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          DES context structure
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        DES is considered a weak cipher and its use constitutes a
 | 
			
		||||
 *                 security risk. We recommend considering stronger ciphers
 | 
			
		||||
 *                 instead.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -69,6 +80,10 @@ mbedtls_des3_context;
 | 
			
		|||
 * \brief          Initialize DES context
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      DES context to be initialized
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        DES is considered a weak cipher and its use constitutes a
 | 
			
		||||
 *                 security risk. We recommend considering stronger ciphers
 | 
			
		||||
 *                 instead.
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_des_init( mbedtls_des_context *ctx );
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -76,6 +91,10 @@ void mbedtls_des_init( mbedtls_des_context *ctx );
 | 
			
		|||
 * \brief          Clear DES context
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      DES context to be cleared
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        DES is considered a weak cipher and its use constitutes a
 | 
			
		||||
 *                 security risk. We recommend considering stronger ciphers
 | 
			
		||||
 *                 instead.
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_des_free( mbedtls_des_context *ctx );
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -100,6 +119,10 @@ void mbedtls_des3_free( mbedtls_des3_context *ctx );
 | 
			
		|||
 *                 a parity bit to allow verification.
 | 
			
		||||
 *
 | 
			
		||||
 * \param key      8-byte secret key
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        DES is considered a weak cipher and its use constitutes a
 | 
			
		||||
 *                 security risk. We recommend considering stronger ciphers
 | 
			
		||||
 *                 instead.
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_des_key_set_parity( unsigned char key[MBEDTLS_DES_KEY_SIZE] );
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -112,6 +135,10 @@ void mbedtls_des_key_set_parity( unsigned char key[MBEDTLS_DES_KEY_SIZE] );
 | 
			
		|||
 * \param key      8-byte secret key
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 is parity was ok, 1 if parity was not correct.
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        DES is considered a weak cipher and its use constitutes a
 | 
			
		||||
 *                 security risk. We recommend considering stronger ciphers
 | 
			
		||||
 *                 instead.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_des_key_check_key_parity( const unsigned char key[MBEDTLS_DES_KEY_SIZE] );
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -121,6 +148,10 @@ int mbedtls_des_key_check_key_parity( const unsigned char key[MBEDTLS_DES_KEY_SI
 | 
			
		|||
 * \param key      8-byte secret key
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if no weak key was found, 1 if a weak key was identified.
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        DES is considered a weak cipher and its use constitutes a
 | 
			
		||||
 *                 security risk. We recommend considering stronger ciphers
 | 
			
		||||
 *                 instead.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_des_key_check_weak( const unsigned char key[MBEDTLS_DES_KEY_SIZE] );
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -131,6 +162,10 @@ int mbedtls_des_key_check_weak( const unsigned char key[MBEDTLS_DES_KEY_SIZE] );
 | 
			
		|||
 * \param key      8-byte secret key
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        DES is considered a weak cipher and its use constitutes a
 | 
			
		||||
 *                 security risk. We recommend considering stronger ciphers
 | 
			
		||||
 *                 instead.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_des_setkey_enc( mbedtls_des_context *ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE] );
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -141,6 +176,10 @@ int mbedtls_des_setkey_enc( mbedtls_des_context *ctx, const unsigned char key[MB
 | 
			
		|||
 * \param key      8-byte secret key
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        DES is considered a weak cipher and its use constitutes a
 | 
			
		||||
 *                 security risk. We recommend considering stronger ciphers
 | 
			
		||||
 *                 instead.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_des_setkey_dec( mbedtls_des_context *ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE] );
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -196,6 +235,10 @@ int mbedtls_des3_set3key_dec( mbedtls_des3_context *ctx,
 | 
			
		|||
 * \param output   64-bit output block
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        DES is considered a weak cipher and its use constitutes a
 | 
			
		||||
 *                 security risk. We recommend considering stronger ciphers
 | 
			
		||||
 *                 instead.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_des_crypt_ecb( mbedtls_des_context *ctx,
 | 
			
		||||
                    const unsigned char input[8],
 | 
			
		||||
| 
						 | 
				
			
			@ -219,6 +262,10 @@ int mbedtls_des_crypt_ecb( mbedtls_des_context *ctx,
 | 
			
		|||
 * \param iv       initialization vector (updated after use)
 | 
			
		||||
 * \param input    buffer holding the input data
 | 
			
		||||
 * \param output   buffer holding the output data
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        DES is considered a weak cipher and its use constitutes a
 | 
			
		||||
 *                 security risk. We recommend considering stronger ciphers
 | 
			
		||||
 *                 instead.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_des_crypt_cbc( mbedtls_des_context *ctx,
 | 
			
		||||
                    int mode,
 | 
			
		||||
| 
						 | 
				
			
			@ -277,6 +324,10 @@ int mbedtls_des3_crypt_cbc( mbedtls_des3_context *ctx,
 | 
			
		|||
 *
 | 
			
		||||
 * \param SK       Round keys
 | 
			
		||||
 * \param key      Base key
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        DES is considered a weak cipher and its use constitutes a
 | 
			
		||||
 *                 security risk. We recommend considering stronger ciphers
 | 
			
		||||
 *                 instead.
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_des_setkey( uint32_t SK[32],
 | 
			
		||||
                         const unsigned char key[MBEDTLS_DES_KEY_SIZE] );
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							| 
						 | 
				
			
			@ -1,9 +1,18 @@
 | 
			
		|||
/**
 | 
			
		||||
 * \file ecdh.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief Elliptic curve Diffie-Hellman
 | 
			
		||||
 * \brief The Elliptic Curve Diffie-Hellman (ECDH) protocol APIs.
 | 
			
		||||
 *
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 * ECDH is an anonymous key agreement protocol allowing two parties to
 | 
			
		||||
 * establish a shared secret over an insecure channel. Each party must have an
 | 
			
		||||
 * elliptic-curve public–private key pair.
 | 
			
		||||
 *
 | 
			
		||||
 * For more information, see <em>NIST SP 800-56A Rev. 2: Recommendation for
 | 
			
		||||
 * Pair-Wise Key Establishment Schemes Using Discrete Logarithm
 | 
			
		||||
 * Cryptography</em>.
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
 *  Licensed under the Apache License, Version 2.0 (the "License"); you may
 | 
			
		||||
| 
						 | 
				
			
			@ -18,8 +27,9 @@
 | 
			
		|||
 *  See the License for the specific language governing permissions and
 | 
			
		||||
 *  limitations under the License.
 | 
			
		||||
 *
 | 
			
		||||
 *  This file is part of mbed TLS (https://tls.mbed.org)
 | 
			
		||||
 *  This file is part of Mbed TLS (https://tls.mbed.org)
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef MBEDTLS_ECDH_H
 | 
			
		||||
#define MBEDTLS_ECDH_H
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -30,7 +40,9 @@ extern "C" {
 | 
			
		|||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * When importing from an EC key, select if it is our key or the peer's key
 | 
			
		||||
 * Defines the source of the imported EC key:
 | 
			
		||||
 * <ul><li>Our key.</li>
 | 
			
		||||
 * <li>The key of the peer.</li></ul>
 | 
			
		||||
 */
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -39,56 +51,67 @@ typedef enum
 | 
			
		|||
} mbedtls_ecdh_side;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           ECDH context structure
 | 
			
		||||
 * \brief           The ECDH context structure.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct
 | 
			
		||||
{
 | 
			
		||||
    mbedtls_ecp_group grp;      /*!<  elliptic curve used                           */
 | 
			
		||||
    mbedtls_mpi d;              /*!<  our secret value (private key)                */
 | 
			
		||||
    mbedtls_ecp_point Q;        /*!<  our public value (public key)                 */
 | 
			
		||||
    mbedtls_ecp_point Qp;       /*!<  peer's public value (public key)              */
 | 
			
		||||
    mbedtls_mpi z;              /*!<  shared secret                                 */
 | 
			
		||||
    int point_format;   /*!<  format for point export in TLS messages       */
 | 
			
		||||
    mbedtls_ecp_point Vi;       /*!<  blinding value (for later)                    */
 | 
			
		||||
    mbedtls_ecp_point Vf;       /*!<  un-blinding value (for later)                 */
 | 
			
		||||
    mbedtls_mpi _d;             /*!<  previous d (for later)                        */
 | 
			
		||||
    mbedtls_ecp_group grp;   /*!< The elliptic curve used. */
 | 
			
		||||
    mbedtls_mpi d;           /*!< The private key. */
 | 
			
		||||
    mbedtls_ecp_point Q;     /*!< The public key. */
 | 
			
		||||
    mbedtls_ecp_point Qp;    /*!< The value of the public key of the peer. */
 | 
			
		||||
    mbedtls_mpi z;           /*!< The shared secret. */
 | 
			
		||||
    int point_format;        /*!< The format of point export in TLS messages. */
 | 
			
		||||
    mbedtls_ecp_point Vi;    /*!< The blinding value. */
 | 
			
		||||
    mbedtls_ecp_point Vf;    /*!< The unblinding value. */
 | 
			
		||||
    mbedtls_mpi _d;          /*!< The previous \p d. */
 | 
			
		||||
}
 | 
			
		||||
mbedtls_ecdh_context;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Generate a public key.
 | 
			
		||||
 *                  Raw function that only does the core computation.
 | 
			
		||||
 * \brief           This function generates an ECDH keypair on an elliptic
 | 
			
		||||
 *                  curve.
 | 
			
		||||
 *
 | 
			
		||||
 * \param grp       ECP group
 | 
			
		||||
 * \param d         Destination MPI (secret exponent, aka private key)
 | 
			
		||||
 * \param Q         Destination point (public key)
 | 
			
		||||
 * \param f_rng     RNG function
 | 
			
		||||
 * \param p_rng     RNG parameter
 | 
			
		||||
 *                  This function performs the first of two core computations
 | 
			
		||||
 *                  implemented during the ECDH key exchange. The second core
 | 
			
		||||
 *                  computation is performed by mbedtls_ecdh_compute_shared().
 | 
			
		||||
 *
 | 
			
		||||
 * \return          0 if successful,
 | 
			
		||||
 *                  or a MBEDTLS_ERR_ECP_XXX or MBEDTLS_MPI_XXX error code
 | 
			
		||||
 * \param grp       The ECP group.
 | 
			
		||||
 * \param d         The destination MPI (private key).
 | 
			
		||||
 * \param Q         The destination point (public key).
 | 
			
		||||
 * \param f_rng     The RNG function.
 | 
			
		||||
 * \param p_rng     The RNG parameter.
 | 
			
		||||
 *
 | 
			
		||||
 * \return          \c 0 on success, or an \c MBEDTLS_ERR_ECP_XXX or
 | 
			
		||||
 *                  \c MBEDTLS_MPI_XXX error code on failure.
 | 
			
		||||
 *
 | 
			
		||||
 * \see             ecp.h
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_ecdh_gen_public( mbedtls_ecp_group *grp, mbedtls_mpi *d, mbedtls_ecp_point *Q,
 | 
			
		||||
                     int (*f_rng)(void *, unsigned char *, size_t),
 | 
			
		||||
                     void *p_rng );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Compute shared secret
 | 
			
		||||
 *                  Raw function that only does the core computation.
 | 
			
		||||
 * \brief           This function computes the shared secret.
 | 
			
		||||
 *
 | 
			
		||||
 * \param grp       ECP group
 | 
			
		||||
 * \param z         Destination MPI (shared secret)
 | 
			
		||||
 * \param Q         Public key from other party
 | 
			
		||||
 * \param d         Our secret exponent (private key)
 | 
			
		||||
 * \param f_rng     RNG function (see notes)
 | 
			
		||||
 * \param p_rng     RNG parameter
 | 
			
		||||
 *                  This function performs the second of two core computations
 | 
			
		||||
 *                  implemented during the ECDH key exchange. The first core
 | 
			
		||||
 *                  computation is performed by mbedtls_ecdh_gen_public().
 | 
			
		||||
 *
 | 
			
		||||
 * \return          0 if successful,
 | 
			
		||||
 *                  or a MBEDTLS_ERR_ECP_XXX or MBEDTLS_MPI_XXX error code
 | 
			
		||||
 * \param grp       The ECP group.
 | 
			
		||||
 * \param z         The destination MPI (shared secret).
 | 
			
		||||
 * \param Q         The public key from another party.
 | 
			
		||||
 * \param d         Our secret exponent (private key).
 | 
			
		||||
 * \param f_rng     The RNG function.
 | 
			
		||||
 * \param p_rng     The RNG parameter.
 | 
			
		||||
 *
 | 
			
		||||
 * \note            If f_rng is not NULL, it is used to implement
 | 
			
		||||
 * \return          \c 0 on success, or an \c MBEDTLS_ERR_ECP_XXX or
 | 
			
		||||
 *                  \c MBEDTLS_MPI_XXX error code on failure.
 | 
			
		||||
 *
 | 
			
		||||
 * \see             ecp.h
 | 
			
		||||
 *
 | 
			
		||||
 * \note            If \p f_rng is not NULL, it is used to implement
 | 
			
		||||
 *                  countermeasures against potential elaborate timing
 | 
			
		||||
 *                  attacks, see \c mbedtls_ecp_mul() for details.
 | 
			
		||||
 *                  attacks. For more information, see mbedtls_ecp_mul().
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_ecdh_compute_shared( mbedtls_ecp_group *grp, mbedtls_mpi *z,
 | 
			
		||||
                         const mbedtls_ecp_point *Q, const mbedtls_mpi *d,
 | 
			
		||||
| 
						 | 
				
			
			@ -96,34 +119,41 @@ int mbedtls_ecdh_compute_shared( mbedtls_ecp_group *grp, mbedtls_mpi *z,
 | 
			
		|||
                         void *p_rng );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Initialize context
 | 
			
		||||
 * \brief           This function initializes an ECDH context.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx       Context to initialize
 | 
			
		||||
 * \param ctx       The ECDH context to initialize.
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_ecdh_init( mbedtls_ecdh_context *ctx );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Free context
 | 
			
		||||
 * \brief           This function frees a context.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx       Context to free
 | 
			
		||||
 * \param ctx       The context to free.
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_ecdh_free( mbedtls_ecdh_context *ctx );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Generate a public key and a TLS ServerKeyExchange payload.
 | 
			
		||||
 *                  (First function used by a TLS server for ECDHE.)
 | 
			
		||||
 * \brief           This function generates a public key and a TLS
 | 
			
		||||
 *                  ServerKeyExchange payload.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx       ECDH context
 | 
			
		||||
 * \param olen      number of chars written
 | 
			
		||||
 * \param buf       destination buffer
 | 
			
		||||
 * \param blen      length of buffer
 | 
			
		||||
 * \param f_rng     RNG function
 | 
			
		||||
 * \param p_rng     RNG parameter
 | 
			
		||||
 *                  This is the first function used by a TLS server for ECDHE
 | 
			
		||||
 *                  ciphersuites.
 | 
			
		||||
 *
 | 
			
		||||
 * \note            This function assumes that ctx->grp has already been
 | 
			
		||||
 *                  properly set (for example using mbedtls_ecp_group_load).
 | 
			
		||||
 * \param ctx       The ECDH context.
 | 
			
		||||
 * \param olen      The number of characters written.
 | 
			
		||||
 * \param buf       The destination buffer.
 | 
			
		||||
 * \param blen      The length of the destination buffer.
 | 
			
		||||
 * \param f_rng     The RNG function.
 | 
			
		||||
 * \param p_rng     The RNG parameter.
 | 
			
		||||
 *
 | 
			
		||||
 * \return          0 if successful, or an MBEDTLS_ERR_ECP_XXX error code
 | 
			
		||||
 * \note            This function assumes that the ECP group (grp) of the
 | 
			
		||||
 *                  \p ctx context has already been properly set,
 | 
			
		||||
 *                  for example, using mbedtls_ecp_group_load().
 | 
			
		||||
 *
 | 
			
		||||
 * \return          \c 0 on success, or an \c MBEDTLS_ERR_ECP_XXX error code
 | 
			
		||||
 *                  on failure.
 | 
			
		||||
 *
 | 
			
		||||
 * \see             ecp.h
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_ecdh_make_params( mbedtls_ecdh_context *ctx, size_t *olen,
 | 
			
		||||
                      unsigned char *buf, size_t blen,
 | 
			
		||||
| 
						 | 
				
			
			@ -131,45 +161,63 @@ int mbedtls_ecdh_make_params( mbedtls_ecdh_context *ctx, size_t *olen,
 | 
			
		|||
                      void *p_rng );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Parse and procress a TLS ServerKeyExhange payload.
 | 
			
		||||
 *                  (First function used by a TLS client for ECDHE.)
 | 
			
		||||
 * \brief           This function parses and processes a TLS ServerKeyExhange
 | 
			
		||||
 *                  payload.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx       ECDH context
 | 
			
		||||
 * \param buf       pointer to start of input buffer
 | 
			
		||||
 * \param end       one past end of buffer
 | 
			
		||||
 *                  This is the first function used by a TLS client for ECDHE
 | 
			
		||||
 *                  ciphersuites.
 | 
			
		||||
 *
 | 
			
		||||
 * \return          0 if successful, or an MBEDTLS_ERR_ECP_XXX error code
 | 
			
		||||
 * \param ctx       The ECDH context.
 | 
			
		||||
 * \param buf       The pointer to the start of the input buffer.
 | 
			
		||||
 * \param end       The address for one Byte past the end of the buffer.
 | 
			
		||||
 *
 | 
			
		||||
 * \return          \c 0 on success, or an \c MBEDTLS_ERR_ECP_XXX error code
 | 
			
		||||
 *                  on failure.
 | 
			
		||||
 *
 | 
			
		||||
 * \see             ecp.h
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_ecdh_read_params( mbedtls_ecdh_context *ctx,
 | 
			
		||||
                      const unsigned char **buf, const unsigned char *end );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Setup an ECDH context from an EC key.
 | 
			
		||||
 *                  (Used by clients and servers in place of the
 | 
			
		||||
 *                  ServerKeyEchange for static ECDH: import ECDH parameters
 | 
			
		||||
 *                  from a certificate's EC key information.)
 | 
			
		||||
 * \brief           This function sets up an ECDH context from an EC key.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx       ECDH constext to set
 | 
			
		||||
 * \param key       EC key to use
 | 
			
		||||
 * \param side      Is it our key (1) or the peer's key (0) ?
 | 
			
		||||
 *                  It is used by clients and servers in place of the
 | 
			
		||||
 *                  ServerKeyEchange for static ECDH, and imports ECDH
 | 
			
		||||
 *                  parameters from the EC key information of a certificate.
 | 
			
		||||
 *
 | 
			
		||||
 * \return          0 if successful, or an MBEDTLS_ERR_ECP_XXX error code
 | 
			
		||||
 * \param ctx       The ECDH context to set up.
 | 
			
		||||
 * \param key       The EC key to use.
 | 
			
		||||
 * \param side      Defines the source of the key:
 | 
			
		||||
 *                  <ul><li>1: Our key.</li>
 | 
			
		||||
                    <li>0: The key of the peer.</li></ul>
 | 
			
		||||
 *
 | 
			
		||||
 * \return          \c 0 on success, or an \c MBEDTLS_ERR_ECP_XXX error code
 | 
			
		||||
 *                  on failure.
 | 
			
		||||
 *
 | 
			
		||||
 * \see             ecp.h
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_ecdh_get_params( mbedtls_ecdh_context *ctx, const mbedtls_ecp_keypair *key,
 | 
			
		||||
                     mbedtls_ecdh_side side );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Generate a public key and a TLS ClientKeyExchange payload.
 | 
			
		||||
 *                  (Second function used by a TLS client for ECDH(E).)
 | 
			
		||||
 * \brief           This function generates a public key and a TLS
 | 
			
		||||
 *                  ClientKeyExchange payload.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx       ECDH context
 | 
			
		||||
 * \param olen      number of bytes actually written
 | 
			
		||||
 * \param buf       destination buffer
 | 
			
		||||
 * \param blen      size of destination buffer
 | 
			
		||||
 * \param f_rng     RNG function
 | 
			
		||||
 * \param p_rng     RNG parameter
 | 
			
		||||
 *                  This is the second function used by a TLS client for ECDH(E)
 | 
			
		||||
 *                  ciphersuites.
 | 
			
		||||
 *
 | 
			
		||||
 * \return          0 if successful, or an MBEDTLS_ERR_ECP_XXX error code
 | 
			
		||||
 * \param ctx       The ECDH context.
 | 
			
		||||
 * \param olen      The number of Bytes written.
 | 
			
		||||
 * \param buf       The destination buffer.
 | 
			
		||||
 * \param blen      The size of the destination buffer.
 | 
			
		||||
 * \param f_rng     The RNG function.
 | 
			
		||||
 * \param p_rng     The RNG parameter.
 | 
			
		||||
 *
 | 
			
		||||
 * \return          \c 0 on success, or an \c MBEDTLS_ERR_ECP_XXX error code
 | 
			
		||||
 *                  on failure.
 | 
			
		||||
 *
 | 
			
		||||
 * \see             ecp.h
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_ecdh_make_public( mbedtls_ecdh_context *ctx, size_t *olen,
 | 
			
		||||
                      unsigned char *buf, size_t blen,
 | 
			
		||||
| 
						 | 
				
			
			@ -177,30 +225,45 @@ int mbedtls_ecdh_make_public( mbedtls_ecdh_context *ctx, size_t *olen,
 | 
			
		|||
                      void *p_rng );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Parse and process a TLS ClientKeyExchange payload.
 | 
			
		||||
 *                  (Second function used by a TLS server for ECDH(E).)
 | 
			
		||||
 * \brief       This function parses and processes a TLS ClientKeyExchange
 | 
			
		||||
 *              payload.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx       ECDH context
 | 
			
		||||
 * \param buf       start of input buffer
 | 
			
		||||
 * \param blen      length of input buffer
 | 
			
		||||
 *              This is the second function used by a TLS server for ECDH(E)
 | 
			
		||||
 *              ciphersuites.
 | 
			
		||||
 *
 | 
			
		||||
 * \return          0 if successful, or an MBEDTLS_ERR_ECP_XXX error code
 | 
			
		||||
 * \param ctx   The ECDH context.
 | 
			
		||||
 * \param buf   The start of the input buffer.
 | 
			
		||||
 * \param blen  The length of the input buffer.
 | 
			
		||||
 *
 | 
			
		||||
 * \return      \c 0 on success, or an \c MBEDTLS_ERR_ECP_XXX error code
 | 
			
		||||
 *              on failure.
 | 
			
		||||
 *
 | 
			
		||||
 * \see         ecp.h
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_ecdh_read_public( mbedtls_ecdh_context *ctx,
 | 
			
		||||
                      const unsigned char *buf, size_t blen );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Derive and export the shared secret.
 | 
			
		||||
 *                  (Last function used by both TLS client en servers.)
 | 
			
		||||
 * \brief           This function derives and exports the shared secret.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx       ECDH context
 | 
			
		||||
 * \param olen      number of bytes written
 | 
			
		||||
 * \param buf       destination buffer
 | 
			
		||||
 * \param blen      buffer length
 | 
			
		||||
 * \param f_rng     RNG function, see notes for \c mbedtls_ecdh_compute_shared()
 | 
			
		||||
 * \param p_rng     RNG parameter
 | 
			
		||||
 *                  This is the last function used by both TLS client
 | 
			
		||||
 *                  and servers.
 | 
			
		||||
 *
 | 
			
		||||
 * \return          0 if successful, or an MBEDTLS_ERR_ECP_XXX error code
 | 
			
		||||
 * \param ctx       The ECDH context.
 | 
			
		||||
 * \param olen      The number of Bytes written.
 | 
			
		||||
 * \param buf       The destination buffer.
 | 
			
		||||
 * \param blen      The length of the destination buffer.
 | 
			
		||||
 * \param f_rng     The RNG function.
 | 
			
		||||
 * \param p_rng     The RNG parameter.
 | 
			
		||||
 *
 | 
			
		||||
 * \return          \c 0 on success, or an \c MBEDTLS_ERR_ECP_XXX error code
 | 
			
		||||
 *                  on failure.
 | 
			
		||||
 *
 | 
			
		||||
 * \see             ecp.h
 | 
			
		||||
 *
 | 
			
		||||
 * \note            If \p f_rng is not NULL, it is used to implement
 | 
			
		||||
 *                  countermeasures against potential elaborate timing
 | 
			
		||||
 *                  attacks. For more information, see mbedtls_ecp_mul().
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_ecdh_calc_secret( mbedtls_ecdh_context *ctx, size_t *olen,
 | 
			
		||||
                      unsigned char *buf, size_t blen,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,9 +1,16 @@
 | 
			
		|||
/**
 | 
			
		||||
 * \file ecdsa.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief Elliptic curve DSA
 | 
			
		||||
 * \brief The Elliptic Curve Digital Signature Algorithm (ECDSA).
 | 
			
		||||
 *
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 * ECDSA is defined in <em>Standards for Efficient Cryptography Group (SECG):
 | 
			
		||||
 * SEC1 Elliptic Curve Cryptography</em>.
 | 
			
		||||
 * The use of ECDSA for TLS is defined in <em>RFC-4492: Elliptic Curve
 | 
			
		||||
 * Cryptography (ECC) Cipher Suites for Transport Layer Security (TLS)</em>.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
 *  Licensed under the Apache License, Version 2.0 (the "License"); you may
 | 
			
		||||
| 
						 | 
				
			
			@ -18,8 +25,9 @@
 | 
			
		|||
 *  See the License for the specific language governing permissions and
 | 
			
		||||
 *  limitations under the License.
 | 
			
		||||
 *
 | 
			
		||||
 *  This file is part of mbed TLS (https://tls.mbed.org)
 | 
			
		||||
 *  This file is part of Mbed TLS (https://tls.mbed.org)
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef MBEDTLS_ECDSA_H
 | 
			
		||||
#define MBEDTLS_ECDSA_H
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -27,7 +35,7 @@
 | 
			
		|||
#include "md.h"
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * RFC 4492 page 20:
 | 
			
		||||
 * RFC-4492 page 20:
 | 
			
		||||
 *
 | 
			
		||||
 *     Ecdsa-Sig-Value ::= SEQUENCE {
 | 
			
		||||
 *         r       INTEGER,
 | 
			
		||||
| 
						 | 
				
			
			@ -74,11 +82,11 @@ static inline size_t mbedtls_ecdsa_max_sig_len( size_t bits )
 | 
			
		|||
    return( MBEDTLS_ECDSA_MAX_SIG_LEN( bits ) );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Maximum size of an ECDSA signature in bytes */
 | 
			
		||||
/** The maximal size of an ECDSA signature in Bytes. */
 | 
			
		||||
#define MBEDTLS_ECDSA_MAX_LEN (MBEDTLS_ECDSA_MAX_SIG_LEN( \
 | 
			
		||||
        8 * MBEDTLS_ECP_MAX_BYTES ) )
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           ECDSA context structure
 | 
			
		||||
 * \brief           The ECDSA context structure.
 | 
			
		||||
 */
 | 
			
		||||
typedef mbedtls_ecp_keypair mbedtls_ecdsa_context;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -87,25 +95,30 @@ extern "C" {
 | 
			
		|||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Compute ECDSA signature of a previously hashed message
 | 
			
		||||
 * \brief           This function computes the ECDSA signature of a
 | 
			
		||||
 *                  previously-hashed message.
 | 
			
		||||
 *
 | 
			
		||||
 * \note            The deterministic version is usually prefered.
 | 
			
		||||
 * \note            The deterministic version is usually preferred.
 | 
			
		||||
 *
 | 
			
		||||
 * \param grp       ECP group
 | 
			
		||||
 * \param r         First output integer
 | 
			
		||||
 * \param s         Second output integer
 | 
			
		||||
 * \param d         Private signing key
 | 
			
		||||
 * \param buf       Message hash
 | 
			
		||||
 * \param blen      Length of buf
 | 
			
		||||
 * \param f_rng     RNG function
 | 
			
		||||
 * \param p_rng     RNG parameter
 | 
			
		||||
 * \param grp       The ECP group.
 | 
			
		||||
 * \param r         The first output integer.
 | 
			
		||||
 * \param s         The second output integer.
 | 
			
		||||
 * \param d         The private signing key.
 | 
			
		||||
 * \param buf       The message hash.
 | 
			
		||||
 * \param blen      The length of \p buf.
 | 
			
		||||
 * \param f_rng     The RNG function.
 | 
			
		||||
 * \param p_rng     The RNG parameter.
 | 
			
		||||
 *
 | 
			
		||||
 * \note            If the bitlength of the message hash is larger than the
 | 
			
		||||
 *                  bitlength of the group order, then the hash is truncated as
 | 
			
		||||
 *                  prescribed by SEC1 4.1.3 step 5.
 | 
			
		||||
 *                  bitlength of the group order, then the hash is truncated
 | 
			
		||||
 *                  as defined in <em>Standards for Efficient Cryptography Group
 | 
			
		||||
 *                  (SECG): SEC1 Elliptic Curve Cryptography</em>, section
 | 
			
		||||
 *                  4.1.3, step 5.
 | 
			
		||||
 *
 | 
			
		||||
 * \return          0 if successful,
 | 
			
		||||
 *                  or a MBEDTLS_ERR_ECP_XXX or MBEDTLS_MPI_XXX error code
 | 
			
		||||
 * \return          \c 0 on success, or an \c MBEDTLS_ERR_ECP_XXX
 | 
			
		||||
 *                  or \c MBEDTLS_MPI_XXX error code on failure.
 | 
			
		||||
 *
 | 
			
		||||
 * \see             ecp.h
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_ecdsa_sign( mbedtls_ecp_group *grp, mbedtls_mpi *r, mbedtls_mpi *s,
 | 
			
		||||
                const mbedtls_mpi *d, const unsigned char *buf, size_t blen,
 | 
			
		||||
| 
						 | 
				
			
			@ -113,23 +126,31 @@ int mbedtls_ecdsa_sign( mbedtls_ecp_group *grp, mbedtls_mpi *r, mbedtls_mpi *s,
 | 
			
		|||
 | 
			
		||||
#if defined(MBEDTLS_ECDSA_DETERMINISTIC)
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Compute ECDSA signature of a previously hashed message,
 | 
			
		||||
 *                  deterministic version (RFC 6979).
 | 
			
		||||
 * \brief           This function computes the ECDSA signature of a
 | 
			
		||||
 *                  previously-hashed message, deterministic version.
 | 
			
		||||
 *                  For more information, see <em>RFC-6979: Deterministic
 | 
			
		||||
 *                  Usage of the Digital Signature Algorithm (DSA) and Elliptic
 | 
			
		||||
 *                  Curve Digital Signature Algorithm (ECDSA)</em>.
 | 
			
		||||
 *
 | 
			
		||||
 * \param grp       ECP group
 | 
			
		||||
 * \param r         First output integer
 | 
			
		||||
 * \param s         Second output integer
 | 
			
		||||
 * \param d         Private signing key
 | 
			
		||||
 * \param buf       Message hash
 | 
			
		||||
 * \param blen      Length of buf
 | 
			
		||||
 * \param md_alg    MD algorithm used to hash the message
 | 
			
		||||
 * \param grp       The ECP group.
 | 
			
		||||
 * \param r         The first output integer.
 | 
			
		||||
 * \param s         The second output integer.
 | 
			
		||||
 * \param d         The private signing key.
 | 
			
		||||
 * \param buf       The message hash.
 | 
			
		||||
 * \param blen      The length of \p buf.
 | 
			
		||||
 * \param md_alg    The MD algorithm used to hash the message.
 | 
			
		||||
 *
 | 
			
		||||
 * \note            If the bitlength of the message hash is larger than the
 | 
			
		||||
 *                  bitlength of the group order, then the hash is truncated as
 | 
			
		||||
 *                  prescribed by SEC1 4.1.3 step 5.
 | 
			
		||||
 *                  defined in <em>Standards for Efficient Cryptography Group
 | 
			
		||||
 *                  (SECG): SEC1 Elliptic Curve Cryptography</em>, section
 | 
			
		||||
 *                  4.1.3, step 5.
 | 
			
		||||
 *
 | 
			
		||||
 * \return          0 if successful,
 | 
			
		||||
 *                  or a MBEDTLS_ERR_ECP_XXX or MBEDTLS_MPI_XXX error code
 | 
			
		||||
 * \return          \c 0 on success,
 | 
			
		||||
 *                  or an \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_MPI_XXX
 | 
			
		||||
 *                  error code on failure.
 | 
			
		||||
 *
 | 
			
		||||
 * \see             ecp.h
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_ecdsa_sign_det( mbedtls_ecp_group *grp, mbedtls_mpi *r, mbedtls_mpi *s,
 | 
			
		||||
                    const mbedtls_mpi *d, const unsigned char *buf, size_t blen,
 | 
			
		||||
| 
						 | 
				
			
			@ -137,55 +158,73 @@ int mbedtls_ecdsa_sign_det( mbedtls_ecp_group *grp, mbedtls_mpi *r, mbedtls_mpi
 | 
			
		|||
#endif /* MBEDTLS_ECDSA_DETERMINISTIC */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Verify ECDSA signature of a previously hashed message
 | 
			
		||||
 * \brief           This function verifies the ECDSA signature of a
 | 
			
		||||
 *                  previously-hashed message.
 | 
			
		||||
 *
 | 
			
		||||
 * \param grp       ECP group
 | 
			
		||||
 * \param buf       Message hash
 | 
			
		||||
 * \param blen      Length of buf
 | 
			
		||||
 * \param Q         Public key to use for verification
 | 
			
		||||
 * \param r         First integer of the signature
 | 
			
		||||
 * \param s         Second integer of the signature
 | 
			
		||||
 * \param grp       The ECP group.
 | 
			
		||||
 * \param buf       The message hash.
 | 
			
		||||
 * \param blen      The length of \p buf.
 | 
			
		||||
 * \param Q         The public key to use for verification.
 | 
			
		||||
 * \param r         The first integer of the signature.
 | 
			
		||||
 * \param s         The second integer of the signature.
 | 
			
		||||
 *
 | 
			
		||||
 * \note            If the bitlength of the message hash is larger than the
 | 
			
		||||
 *                  bitlength of the group order, then the hash is truncated as
 | 
			
		||||
 *                  prescribed by SEC1 4.1.4 step 3.
 | 
			
		||||
 *                  defined in <em>Standards for Efficient Cryptography Group
 | 
			
		||||
 *                  (SECG): SEC1 Elliptic Curve Cryptography</em>, section
 | 
			
		||||
 *                  4.1.4, step 3.
 | 
			
		||||
 *
 | 
			
		||||
 * \return          0 if successful,
 | 
			
		||||
 *                  MBEDTLS_ERR_ECP_BAD_INPUT_DATA if signature is invalid
 | 
			
		||||
 *                  or a MBEDTLS_ERR_ECP_XXX or MBEDTLS_MPI_XXX error code
 | 
			
		||||
 * \return          \c 0 on success,
 | 
			
		||||
 *                  #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if signature is invalid,
 | 
			
		||||
 *                  or an \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_MPI_XXX
 | 
			
		||||
 *                  error code on failure for any other reason.
 | 
			
		||||
 *
 | 
			
		||||
 * \see             ecp.h
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_ecdsa_verify( mbedtls_ecp_group *grp,
 | 
			
		||||
                  const unsigned char *buf, size_t blen,
 | 
			
		||||
                  const mbedtls_ecp_point *Q, const mbedtls_mpi *r, const mbedtls_mpi *s);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Compute ECDSA signature and write it to buffer,
 | 
			
		||||
 *                  serialized as defined in RFC 4492 page 20.
 | 
			
		||||
 *                  (Not thread-safe to use same context in multiple threads)
 | 
			
		||||
 * \brief           This function computes the ECDSA signature and writes it
 | 
			
		||||
 *                  to a buffer, serialized as defined in <em>RFC-4492:
 | 
			
		||||
 *                  Elliptic Curve Cryptography (ECC) Cipher Suites for
 | 
			
		||||
 *                  Transport Layer Security (TLS)</em>.
 | 
			
		||||
 *
 | 
			
		||||
 * \note            The deterministic version (RFC 6979) is used if
 | 
			
		||||
 *                  MBEDTLS_ECDSA_DETERMINISTIC is defined.
 | 
			
		||||
 * \warning         It is not thread-safe to use the same context in
 | 
			
		||||
 *                  multiple threads.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx       ECDSA context
 | 
			
		||||
 * \param md_alg    Algorithm that was used to hash the message
 | 
			
		||||
 * \param hash      Message hash
 | 
			
		||||
 * \param hlen      Length of hash
 | 
			
		||||
 * \param sig       Buffer that will hold the signature
 | 
			
		||||
 * \param slen      Length of the signature written
 | 
			
		||||
 * \param f_rng     RNG function
 | 
			
		||||
 * \param p_rng     RNG parameter
 | 
			
		||||
 * \note            The deterministic version is used if
 | 
			
		||||
 *                  #MBEDTLS_ECDSA_DETERMINISTIC is defined. For more
 | 
			
		||||
 *                  information, see <em>RFC-6979: Deterministic Usage
 | 
			
		||||
 *                  of the Digital Signature Algorithm (DSA) and Elliptic
 | 
			
		||||
 *                  Curve Digital Signature Algorithm (ECDSA)</em>.
 | 
			
		||||
 *
 | 
			
		||||
 * \note            The \c sig buffer must be at least
 | 
			
		||||
 *                  `MBEDTLS_ECDSA_MAX_SIG_LEN(ctx->grp.pbits)` bytes long.
 | 
			
		||||
 *                  MBEDTLS_ECDSA_MAX_LEN is always safe.
 | 
			
		||||
 * \param ctx       The ECDSA context.
 | 
			
		||||
 * \param md_alg    The message digest that was used to hash the message.
 | 
			
		||||
 * \param hash      The message hash.
 | 
			
		||||
 * \param hlen      The length of the hash.
 | 
			
		||||
 * \param sig       The buffer that holds the signature.
 | 
			
		||||
 * \param slen      The length of the signature written.
 | 
			
		||||
 * \param f_rng     The RNG function.
 | 
			
		||||
 * \param p_rng     The RNG parameter.
 | 
			
		||||
 *
 | 
			
		||||
 * \note            The \p sig buffer must be at least twice as large as the
 | 
			
		||||
 *                  size of the curve used, plus 9. For example, 73 Bytes if
 | 
			
		||||
 *                  a 256-bit curve is used. A buffer length of
 | 
			
		||||
 *                  #MBEDTLS_ECDSA_MAX_LEN is always safe.
 | 
			
		||||
 *
 | 
			
		||||
 * \note            If the bitlength of the message hash is larger than the
 | 
			
		||||
 *                  bitlength of the group order, then the hash is truncated as
 | 
			
		||||
 *                  prescribed by SEC1 4.1.3 step 5.
 | 
			
		||||
 *                  defined in <em>Standards for Efficient Cryptography Group
 | 
			
		||||
 *                  (SECG): SEC1 Elliptic Curve Cryptography</em>, section
 | 
			
		||||
 *                  4.1.3, step 5.
 | 
			
		||||
 *
 | 
			
		||||
 * \return          0 if successful,
 | 
			
		||||
 *                  or a MBEDTLS_ERR_ECP_XXX, MBEDTLS_ERR_MPI_XXX or
 | 
			
		||||
 *                  MBEDTLS_ERR_ASN1_XXX error code
 | 
			
		||||
 * \return          \c 0 on success,
 | 
			
		||||
 *                  or an \c MBEDTLS_ERR_ECP_XXX, \c MBEDTLS_ERR_MPI_XXX or
 | 
			
		||||
 *                  \c MBEDTLS_ERR_ASN1_XXX error code on failure.
 | 
			
		||||
 *
 | 
			
		||||
 * \see             ecp.h
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_ecdsa_write_signature( mbedtls_ecdsa_context *ctx, mbedtls_md_type_t md_alg,
 | 
			
		||||
                           const unsigned char *hash, size_t hlen,
 | 
			
		||||
| 
						 | 
				
			
			@ -201,31 +240,43 @@ int mbedtls_ecdsa_write_signature( mbedtls_ecdsa_context *ctx, mbedtls_md_type_t
 | 
			
		|||
#define MBEDTLS_DEPRECATED
 | 
			
		||||
#endif
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Compute ECDSA signature and write it to buffer,
 | 
			
		||||
 *                  serialized as defined in RFC 4492 page 20.
 | 
			
		||||
 *                  Deterministic version, RFC 6979.
 | 
			
		||||
 *                  (Not thread-safe to use same context in multiple threads)
 | 
			
		||||
 * \brief   This function computes an ECDSA signature and writes it to a buffer,
 | 
			
		||||
 *          serialized as defined in <em>RFC-4492: Elliptic Curve Cryptography
 | 
			
		||||
 *          (ECC) Cipher Suites for Transport Layer Security (TLS)</em>.
 | 
			
		||||
 *
 | 
			
		||||
 *          The deterministic version is defined in <em>RFC-6979:
 | 
			
		||||
 *          Deterministic Usage of the Digital Signature Algorithm (DSA) and
 | 
			
		||||
 *          Elliptic Curve Digital Signature Algorithm (ECDSA)</em>.
 | 
			
		||||
 *
 | 
			
		||||
 * \warning         It is not thread-safe to use the same context in
 | 
			
		||||
 *                  multiple threads.
 | 
			
		||||
 | 
			
		||||
 *
 | 
			
		||||
 * \deprecated      Superseded by mbedtls_ecdsa_write_signature() in 2.0.0
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx       ECDSA context
 | 
			
		||||
 * \param hash      Message hash
 | 
			
		||||
 * \param hlen      Length of hash
 | 
			
		||||
 * \param sig       Buffer that will hold the signature
 | 
			
		||||
 * \param slen      Length of the signature written
 | 
			
		||||
 * \param md_alg    MD algorithm used to hash the message
 | 
			
		||||
 * \param ctx       The ECDSA context.
 | 
			
		||||
 * \param hash      The Message hash.
 | 
			
		||||
 * \param hlen      The length of the hash.
 | 
			
		||||
 * \param sig       The buffer that holds the signature.
 | 
			
		||||
 * \param slen      The length of the signature written.
 | 
			
		||||
 * \param md_alg    The MD algorithm used to hash the message.
 | 
			
		||||
 *
 | 
			
		||||
 * \note            The \c sig buffer must be at least
 | 
			
		||||
 *                  `MBEDTLS_ECDSA_MAX_SIG_LEN(ctx->grp.pbits)` bytes long.
 | 
			
		||||
 *                  MBEDTLS_ECDSA_MAX_LEN is always safe.
 | 
			
		||||
 * \note            The \p sig buffer must be at least twice as large as the
 | 
			
		||||
 *                  size of the curve used, plus 9. For example, 73 Bytes if a
 | 
			
		||||
 *                  256-bit curve is used. A buffer length of
 | 
			
		||||
 *                  #MBEDTLS_ECDSA_MAX_LEN is always safe.
 | 
			
		||||
 *
 | 
			
		||||
 * \note            If the bitlength of the message hash is larger than the
 | 
			
		||||
 *                  bitlength of the group order, then the hash is truncated as
 | 
			
		||||
 *                  prescribed by SEC1 4.1.3 step 5.
 | 
			
		||||
 *                  defined in <em>Standards for Efficient Cryptography Group
 | 
			
		||||
 *                  (SECG): SEC1 Elliptic Curve Cryptography</em>, section
 | 
			
		||||
 *                  4.1.3, step 5.
 | 
			
		||||
 *
 | 
			
		||||
 * \return          0 if successful,
 | 
			
		||||
 *                  or a MBEDTLS_ERR_ECP_XXX, MBEDTLS_ERR_MPI_XXX or
 | 
			
		||||
 *                  MBEDTLS_ERR_ASN1_XXX error code
 | 
			
		||||
 * \return          \c 0 on success,
 | 
			
		||||
 *                  or an \c MBEDTLS_ERR_ECP_XXX, \c MBEDTLS_ERR_MPI_XXX or
 | 
			
		||||
 *                  \c MBEDTLS_ERR_ASN1_XXX error code on failure.
 | 
			
		||||
 *
 | 
			
		||||
 * \see             ecp.h
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_ecdsa_write_signature_det( mbedtls_ecdsa_context *ctx,
 | 
			
		||||
                               const unsigned char *hash, size_t hlen,
 | 
			
		||||
| 
						 | 
				
			
			@ -263,63 +314,74 @@ int mbedtls_ecdsa_signature_to_asn1( const mbedtls_mpi *r, const mbedtls_mpi *s,
 | 
			
		|||
                             size_t ssize );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Read and verify an ECDSA signature
 | 
			
		||||
 * \brief           This function reads and verifies an ECDSA signature.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx       ECDSA context
 | 
			
		||||
 * \param hash      Message hash
 | 
			
		||||
 * \param hlen      Size of hash
 | 
			
		||||
 * \param sig       Signature to read and verify
 | 
			
		||||
 * \param slen      Size of sig
 | 
			
		||||
 * \param ctx       The ECDSA context.
 | 
			
		||||
 * \param hash      The message hash.
 | 
			
		||||
 * \param hlen      The size of the hash.
 | 
			
		||||
 * \param sig       The signature to read and verify.
 | 
			
		||||
 * \param slen      The size of \p sig.
 | 
			
		||||
 *
 | 
			
		||||
 * \note            If the bitlength of the message hash is larger than the
 | 
			
		||||
 *                  bitlength of the group order, then the hash is truncated as
 | 
			
		||||
 *                  prescribed by SEC1 4.1.4 step 3.
 | 
			
		||||
 *                  defined in <em>Standards for Efficient Cryptography Group
 | 
			
		||||
 *                  (SECG): SEC1 Elliptic Curve Cryptography</em>, section
 | 
			
		||||
 *                  4.1.4, step 3.
 | 
			
		||||
 *
 | 
			
		||||
 * \return          0 if successful,
 | 
			
		||||
 *                  MBEDTLS_ERR_ECP_BAD_INPUT_DATA if signature is invalid,
 | 
			
		||||
 *                  MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH if the signature is
 | 
			
		||||
 *                  valid but its actual length is less than siglen,
 | 
			
		||||
 *                  or a MBEDTLS_ERR_ECP_XXX or MBEDTLS_ERR_MPI_XXX error code
 | 
			
		||||
 * \return          \c 0 on success,
 | 
			
		||||
 *                  #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if signature is invalid,
 | 
			
		||||
 *                  #MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH if the signature is
 | 
			
		||||
 *                  valid but its actual length is less than \p siglen,
 | 
			
		||||
 *                  or an \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_ERR_MPI_XXX
 | 
			
		||||
 *                  error code on failure for any other reason.
 | 
			
		||||
 *
 | 
			
		||||
 * \see             ecp.h
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_ecdsa_read_signature( mbedtls_ecdsa_context *ctx,
 | 
			
		||||
                          const unsigned char *hash, size_t hlen,
 | 
			
		||||
                          const unsigned char *sig, size_t slen );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Generate an ECDSA keypair on the given curve
 | 
			
		||||
 * \brief          This function generates an ECDSA keypair on the given curve.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx       ECDSA context in which the keypair should be stored
 | 
			
		||||
 * \param gid       Group (elliptic curve) to use. One of the various
 | 
			
		||||
 *                  MBEDTLS_ECP_DP_XXX macros depending on configuration.
 | 
			
		||||
 * \param f_rng     RNG function
 | 
			
		||||
 * \param p_rng     RNG parameter
 | 
			
		||||
 * \param ctx      The ECDSA context to store the keypair in.
 | 
			
		||||
 * \param gid      The elliptic curve to use. One of the various
 | 
			
		||||
 *                 \c MBEDTLS_ECP_DP_XXX macros depending on configuration.
 | 
			
		||||
 * \param f_rng    The RNG function.
 | 
			
		||||
 * \param p_rng    The RNG parameter.
 | 
			
		||||
 *
 | 
			
		||||
 * \return          0 on success, or a MBEDTLS_ERR_ECP_XXX code.
 | 
			
		||||
 * \return         \c 0 on success, or an \c MBEDTLS_ERR_ECP_XXX code on
 | 
			
		||||
 *                 failure.
 | 
			
		||||
 *
 | 
			
		||||
 * \see            ecp.h
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_ecdsa_genkey( mbedtls_ecdsa_context *ctx, mbedtls_ecp_group_id gid,
 | 
			
		||||
                  int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Set an ECDSA context from an EC key pair
 | 
			
		||||
 * \brief           This function sets an ECDSA context from an EC key pair.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx       ECDSA context to set
 | 
			
		||||
 * \param key       EC key to use
 | 
			
		||||
 * \param ctx       The ECDSA context to set.
 | 
			
		||||
 * \param key       The EC key to use.
 | 
			
		||||
 *
 | 
			
		||||
 * \return          0 on success, or a MBEDTLS_ERR_ECP_XXX code.
 | 
			
		||||
 * \return          \c 0 on success, or an \c MBEDTLS_ERR_ECP_XXX code on
 | 
			
		||||
 *                  failure.
 | 
			
		||||
 *
 | 
			
		||||
 * \see             ecp.h
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_ecdsa_from_keypair( mbedtls_ecdsa_context *ctx, const mbedtls_ecp_keypair *key );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Initialize context
 | 
			
		||||
 * \brief           This function initializes an ECDSA context.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx       Context to initialize
 | 
			
		||||
 * \param ctx       The ECDSA context to initialize.
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_ecdsa_init( mbedtls_ecdsa_context *ctx );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Free context
 | 
			
		||||
 * \brief           This function frees an ECDSA context.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx       Context to free
 | 
			
		||||
 * \param ctx       The ECDSA context to free.
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_ecdsa_free( mbedtls_ecdsa_context *ctx );
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,8 @@
 | 
			
		|||
 * \file ecjpake.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief Elliptic curve J-PAKE
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			@ -43,6 +44,8 @@
 | 
			
		|||
#include "ecp.h"
 | 
			
		||||
#include "md.h"
 | 
			
		||||
 | 
			
		||||
#if !defined(MBEDTLS_ECJPAKE_ALT)
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -222,17 +225,31 @@ int mbedtls_ecjpake_derive_secret( mbedtls_ecjpake_context *ctx,
 | 
			
		|||
 */
 | 
			
		||||
void mbedtls_ecjpake_free( mbedtls_ecjpake_context *ctx );
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#else  /* MBEDTLS_ECJPAKE_ALT */
 | 
			
		||||
#include "ecjpake_alt.h"
 | 
			
		||||
#endif /* MBEDTLS_ECJPAKE_ALT */
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_SELF_TEST)
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          Checkup routine
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful, or 1 if a test failed
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_ecjpake_self_test( int verbose );
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* MBEDTLS_SELF_TEST */
 | 
			
		||||
 | 
			
		||||
#endif /* ecjpake.h */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,8 @@
 | 
			
		|||
 * \file ecp.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief Elliptic curves over GF(p)
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			@ -36,6 +37,7 @@
 | 
			
		|||
#define MBEDTLS_ERR_ECP_RANDOM_FAILED                     -0x4D00  /**< Generation of random value, such as (ephemeral) key, failed. */
 | 
			
		||||
#define MBEDTLS_ERR_ECP_INVALID_KEY                       -0x4C80  /**< Invalid private or public key. */
 | 
			
		||||
#define MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH                  -0x4C00  /**< Signature is valid but shorter than the user-supplied length. */
 | 
			
		||||
#define MBEDTLS_ERR_ECP_HW_ACCEL_FAILED                   -0x4B80  /**< ECP hardware accelerator failed. */
 | 
			
		||||
 | 
			
		||||
#if !defined(MBEDTLS_ECP_ALT)
 | 
			
		||||
/*
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,7 +3,8 @@
 | 
			
		|||
 *
 | 
			
		||||
 * \brief Function declarations for alternative implementation of elliptic curve
 | 
			
		||||
 * point arithmetic.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2016, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,8 @@
 | 
			
		|||
 * \file entropy.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief Entropy accumulator implementation
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2016, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			@ -121,6 +122,7 @@ mbedtls_entropy_source_state;
 | 
			
		|||
 */
 | 
			
		||||
typedef struct
 | 
			
		||||
{
 | 
			
		||||
    int accumulator_started;
 | 
			
		||||
#if defined(MBEDTLS_ENTROPY_SHA512_ACCUMULATOR)
 | 
			
		||||
    mbedtls_sha512_context  accumulator;
 | 
			
		||||
#else
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,8 @@
 | 
			
		|||
 * \file entropy_poll.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief Platform-specific and custom entropy polling functions
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2016, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,8 @@
 | 
			
		|||
 * \file error.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief Error to string translation
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			@ -49,23 +50,32 @@
 | 
			
		|||
 *
 | 
			
		||||
 * Module   Nr  Codes assigned
 | 
			
		||||
 * MPI       7  0x0002-0x0010
 | 
			
		||||
 * GCM       2  0x0012-0x0014
 | 
			
		||||
 * BLOWFISH  2  0x0016-0x0018
 | 
			
		||||
 * GCM       3  0x0012-0x0014   0x0013-0x0013
 | 
			
		||||
 * BLOWFISH  3  0x0016-0x0018   0x0017-0x0017
 | 
			
		||||
 * THREADING 3  0x001A-0x001E
 | 
			
		||||
 * AES       2  0x0020-0x0022   0x0023-0x0023
 | 
			
		||||
 * CAMELLIA  2  0x0024-0x0026
 | 
			
		||||
 * XTEA      1  0x0028-0x0028
 | 
			
		||||
 * AES       4  0x0020-0x0022   0x0023-0x0025
 | 
			
		||||
 * CAMELLIA  3  0x0024-0x0026   0x0027-0x0027
 | 
			
		||||
 * XTEA      2  0x0028-0x0028   0x0029-0x0029
 | 
			
		||||
 * BASE64    2  0x002A-0x002C
 | 
			
		||||
 * OID       1  0x002E-0x002E   0x000B-0x000B
 | 
			
		||||
 * PADLOCK   1  0x0030-0x0030
 | 
			
		||||
 * DES       1  0x0032-0x0032
 | 
			
		||||
 * DES       2  0x0032-0x0032   0x0033-0x0033
 | 
			
		||||
 * CTR_DBRG  4  0x0034-0x003A
 | 
			
		||||
 * ENTROPY   3  0x003C-0x0040   0x003D-0x003F
 | 
			
		||||
 * NET      11  0x0042-0x0052   0x0043-0x0045
 | 
			
		||||
 * ASN1      7  0x0060-0x006C
 | 
			
		||||
 * CMAC      1  0x007A-0x007A
 | 
			
		||||
 * PBKDF2    1  0x007C-0x007C
 | 
			
		||||
 * HMAC_DRBG 4  0x0003-0x0009
 | 
			
		||||
 * CCM       2                  0x000D-0x000F
 | 
			
		||||
 * HMAC_DRBG 4                  0x0003-0x0009
 | 
			
		||||
 * CCM       3                  0x000D-0x0011
 | 
			
		||||
 * ARC4      1                  0x0019-0x0019
 | 
			
		||||
 * MD2       1                  0x002B-0x002B
 | 
			
		||||
 * MD4       1                  0x002D-0x002D
 | 
			
		||||
 * MD5       1                  0x002F-0x002F
 | 
			
		||||
 * RIPEMD160 1                  0x0031-0x0031
 | 
			
		||||
 * SHA1      1                  0x0035-0x0035
 | 
			
		||||
 * SHA256    1                  0x0037-0x0037
 | 
			
		||||
 * SHA512    1                  0x0039-0x0039
 | 
			
		||||
 *
 | 
			
		||||
 * High-level module nr (3 bits - 0x0...-0x7...)
 | 
			
		||||
 * Name      ID  Nr of Errors
 | 
			
		||||
| 
						 | 
				
			
			@ -73,12 +83,12 @@
 | 
			
		|||
 * PKCS#12   1   4 (Started from top)
 | 
			
		||||
 * X509      2   20
 | 
			
		||||
 * PKCS5     2   4 (Started from top)
 | 
			
		||||
 * DHM       3   9
 | 
			
		||||
 * PK        3   17 (Started from top)
 | 
			
		||||
 * RSA       4   10
 | 
			
		||||
 * ECP       4   8 (Started from top)
 | 
			
		||||
 * MD        5   4
 | 
			
		||||
 * CIPHER    6   6
 | 
			
		||||
 * DHM       3   11
 | 
			
		||||
 * PK        3   18 (Started from top)
 | 
			
		||||
 * RSA       4   11
 | 
			
		||||
 * ECP       4   9 (Started from top)
 | 
			
		||||
 * MD        5   5
 | 
			
		||||
 * CIPHER    6   8
 | 
			
		||||
 * SSL       6   17 (Started from top)
 | 
			
		||||
 * SSL       7   31
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,9 +1,16 @@
 | 
			
		|||
/**
 | 
			
		||||
 * \file gcm.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief Galois/Counter mode for 128-bit block ciphers
 | 
			
		||||
 * \brief Galois/Counter Mode (GCM) for 128-bit block ciphers, as defined
 | 
			
		||||
 *        in <em>D. McGrew, J. Viega, The Galois/Counter Mode of Operation
 | 
			
		||||
 *        (GCM), Natl. Inst. Stand. Technol.</em>
 | 
			
		||||
 *
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 * For more information on GCM, see <em>NIST SP 800-38D: Recommendation for
 | 
			
		||||
 * Block Cipher Modes of Operation: Galois/Counter Mode (GCM) and GMAC</em>.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
 *  Licensed under the Apache License, Version 2.0 (the "License"); you may
 | 
			
		||||
| 
						 | 
				
			
			@ -18,8 +25,9 @@
 | 
			
		|||
 *  See the License for the specific language governing permissions and
 | 
			
		||||
 *  limitations under the License.
 | 
			
		||||
 *
 | 
			
		||||
 *  This file is part of mbed TLS (https://tls.mbed.org)
 | 
			
		||||
 *  This file is part of Mbed TLS (https://tls.mbed.org)
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef MBEDTLS_GCM_H
 | 
			
		||||
#define MBEDTLS_GCM_H
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -31,6 +39,7 @@
 | 
			
		|||
#define MBEDTLS_GCM_DECRYPT     0
 | 
			
		||||
 | 
			
		||||
#define MBEDTLS_ERR_GCM_AUTH_FAILED                       -0x0012  /**< Authenticated decryption failed. */
 | 
			
		||||
#define MBEDTLS_ERR_GCM_HW_ACCEL_FAILED                   -0x0013  /**< GCM hardware accelerator failed. */
 | 
			
		||||
#define MBEDTLS_ERR_GCM_BAD_INPUT                         -0x0014  /**< Bad input parameters to function. */
 | 
			
		||||
 | 
			
		||||
#if !defined(MBEDTLS_GCM_ALT)
 | 
			
		||||
| 
						 | 
				
			
			@ -40,39 +49,49 @@ extern "C" {
 | 
			
		|||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          GCM context structure
 | 
			
		||||
 * \brief          The GCM context structure.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct {
 | 
			
		||||
    mbedtls_cipher_context_t cipher_ctx;/*!< cipher context used */
 | 
			
		||||
    uint64_t HL[16];            /*!< Precalculated HTable */
 | 
			
		||||
    uint64_t HH[16];            /*!< Precalculated HTable */
 | 
			
		||||
    uint64_t len;               /*!< Total data length */
 | 
			
		||||
    uint64_t add_len;           /*!< Total add length */
 | 
			
		||||
    unsigned char base_ectr[16];/*!< First ECTR for tag */
 | 
			
		||||
    unsigned char y[16];        /*!< Y working value */
 | 
			
		||||
    unsigned char buf[16];      /*!< buf working value */
 | 
			
		||||
    int mode;                   /*!< Encrypt or Decrypt */
 | 
			
		||||
    mbedtls_cipher_context_t cipher_ctx;  /*!< The cipher context used. */
 | 
			
		||||
    uint64_t HL[16];                      /*!< Precalculated HTable low. */
 | 
			
		||||
    uint64_t HH[16];                      /*!< Precalculated HTable high. */
 | 
			
		||||
    uint64_t len;                         /*!< The total length of the encrypted data. */
 | 
			
		||||
    uint64_t add_len;                     /*!< The total length of the additional data. */
 | 
			
		||||
    unsigned char base_ectr[16];          /*!< The first ECTR for tag. */
 | 
			
		||||
    unsigned char y[16];                  /*!< The Y working value. */
 | 
			
		||||
    unsigned char buf[16];                /*!< The buf working value. */
 | 
			
		||||
    int mode;                             /*!< The operation to perform:
 | 
			
		||||
                                               #MBEDTLS_GCM_ENCRYPT or
 | 
			
		||||
                                               #MBEDTLS_GCM_DECRYPT. */
 | 
			
		||||
}
 | 
			
		||||
mbedtls_gcm_context;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Initialize GCM context (just makes references valid)
 | 
			
		||||
 *                  Makes the context ready for mbedtls_gcm_setkey() or
 | 
			
		||||
 *                  mbedtls_gcm_free().
 | 
			
		||||
 * \brief           This function initializes the specified GCM context,
 | 
			
		||||
 *                  to make references valid, and prepares the context
 | 
			
		||||
 *                  for mbedtls_gcm_setkey() or mbedtls_gcm_free().
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx       GCM context to initialize
 | 
			
		||||
 *                  The function does not bind the GCM context to a particular
 | 
			
		||||
 *                  cipher, nor set the key. For this purpose, use
 | 
			
		||||
 *                  mbedtls_gcm_setkey().
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx       The GCM context to initialize.
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_gcm_init( mbedtls_gcm_context *ctx );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           GCM initialization (encryption)
 | 
			
		||||
 * \brief           This function associates a GCM context with a
 | 
			
		||||
 *                  cipher algorithm and a key.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx       GCM context to be initialized
 | 
			
		||||
 * \param cipher    cipher to use (a 128-bit block cipher)
 | 
			
		||||
 * \param key       encryption key
 | 
			
		||||
 * \param keybits   must be 128, 192 or 256
 | 
			
		||||
 * \param ctx       The GCM context to initialize.
 | 
			
		||||
 * \param cipher    The 128-bit block cipher to use.
 | 
			
		||||
 * \param key       The encryption key.
 | 
			
		||||
 * \param keybits   The key size in bits. Valid options are:
 | 
			
		||||
 *                  <ul><li>128 bits</li>
 | 
			
		||||
 *                  <li>192 bits</li>
 | 
			
		||||
 *                  <li>256 bits</li></ul>
 | 
			
		||||
 *
 | 
			
		||||
 * \return          0 if successful, or a cipher specific error code
 | 
			
		||||
 * \return          \c 0 on success, or a cipher specific error code.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_gcm_setkey( mbedtls_gcm_context *ctx,
 | 
			
		||||
                        mbedtls_cipher_id_t cipher,
 | 
			
		||||
| 
						 | 
				
			
			@ -80,26 +99,27 @@ int mbedtls_gcm_setkey( mbedtls_gcm_context *ctx,
 | 
			
		|||
                        unsigned int keybits );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           GCM buffer encryption/decryption using a block cipher
 | 
			
		||||
 * \brief           This function performs GCM encryption or decryption of a buffer.
 | 
			
		||||
 *
 | 
			
		||||
 * \note On encryption, the output buffer can be the same as the input buffer.
 | 
			
		||||
 *       On decryption, the output buffer cannot be the same as input buffer.
 | 
			
		||||
 *       If buffers overlap, the output buffer must trail at least 8 bytes
 | 
			
		||||
 * \note For encryption, the output buffer can be the same as the input buffer.
 | 
			
		||||
 *       For decryption, the output buffer cannot be the same as input buffer.
 | 
			
		||||
 *       If the buffers overlap, the output buffer must trail at least 8 Bytes
 | 
			
		||||
 *       behind the input buffer.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx       GCM context
 | 
			
		||||
 * \param mode      MBEDTLS_GCM_ENCRYPT or MBEDTLS_GCM_DECRYPT
 | 
			
		||||
 * \param length    length of the input data
 | 
			
		||||
 * \param iv        initialization vector
 | 
			
		||||
 * \param iv_len    length of IV
 | 
			
		||||
 * \param add       additional data
 | 
			
		||||
 * \param add_len   length of additional data
 | 
			
		||||
 * \param input     buffer holding the input data
 | 
			
		||||
 * \param output    buffer for holding the output data
 | 
			
		||||
 * \param tag_len   length of the tag to generate
 | 
			
		||||
 * \param tag       buffer for holding the tag
 | 
			
		||||
 * \param ctx       The GCM context to use for encryption or decryption.
 | 
			
		||||
 * \param mode      The operation to perform: #MBEDTLS_GCM_ENCRYPT or
 | 
			
		||||
 *                  #MBEDTLS_GCM_DECRYPT.
 | 
			
		||||
 * \param length    The length of the input data. This must be a multiple of 16 except in the last call before mbedtls_gcm_finish().
 | 
			
		||||
 * \param iv        The initialization vector.
 | 
			
		||||
 * \param iv_len    The length of the IV.
 | 
			
		||||
 * \param add       The buffer holding the additional data.
 | 
			
		||||
 * \param add_len   The length of the additional data.
 | 
			
		||||
 * \param input     The buffer holding the input data.
 | 
			
		||||
 * \param output    The buffer for holding the output data.
 | 
			
		||||
 * \param tag_len   The length of the tag to generate.
 | 
			
		||||
 * \param tag       The buffer for holding the tag.
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful
 | 
			
		||||
 * \return         \c 0 on success.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_gcm_crypt_and_tag( mbedtls_gcm_context *ctx,
 | 
			
		||||
                       int mode,
 | 
			
		||||
| 
						 | 
				
			
			@ -114,25 +134,26 @@ int mbedtls_gcm_crypt_and_tag( mbedtls_gcm_context *ctx,
 | 
			
		|||
                       unsigned char *tag );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           GCM buffer authenticated decryption using a block cipher
 | 
			
		||||
 * \brief           This function performs a GCM authenticated decryption of a
 | 
			
		||||
 *                  buffer.
 | 
			
		||||
 *
 | 
			
		||||
 * \note On decryption, the output buffer cannot be the same as input buffer.
 | 
			
		||||
 *       If buffers overlap, the output buffer must trail at least 8 bytes
 | 
			
		||||
 * \note For decryption, the output buffer cannot be the same as input buffer.
 | 
			
		||||
 *       If the buffers overlap, the output buffer must trail at least 8 Bytes
 | 
			
		||||
 *       behind the input buffer.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx       GCM context
 | 
			
		||||
 * \param length    length of the input data
 | 
			
		||||
 * \param iv        initialization vector
 | 
			
		||||
 * \param iv_len    length of IV
 | 
			
		||||
 * \param add       additional data
 | 
			
		||||
 * \param add_len   length of additional data
 | 
			
		||||
 * \param tag       buffer holding the tag
 | 
			
		||||
 * \param tag_len   length of the tag
 | 
			
		||||
 * \param input     buffer holding the input data
 | 
			
		||||
 * \param output    buffer for holding the output data
 | 
			
		||||
 * \param ctx       The GCM context.
 | 
			
		||||
 * \param length    The length of the input data. This must be a multiple of 16 except in the last call before mbedtls_gcm_finish().
 | 
			
		||||
 * \param iv        The initialization vector.
 | 
			
		||||
 * \param iv_len    The length of the IV.
 | 
			
		||||
 * \param add       The buffer holding the additional data.
 | 
			
		||||
 * \param add_len   The length of the additional data.
 | 
			
		||||
 * \param tag       The buffer holding the tag.
 | 
			
		||||
 * \param tag_len   The length of the tag.
 | 
			
		||||
 * \param input     The buffer holding the input data.
 | 
			
		||||
 * \param output    The buffer for holding the output data.
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful and authenticated,
 | 
			
		||||
 *                 MBEDTLS_ERR_GCM_AUTH_FAILED if tag does not match
 | 
			
		||||
 * \return         0 if successful and authenticated, or
 | 
			
		||||
 *                 #MBEDTLS_ERR_GCM_AUTH_FAILED if tag does not match.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_gcm_auth_decrypt( mbedtls_gcm_context *ctx,
 | 
			
		||||
                      size_t length,
 | 
			
		||||
| 
						 | 
				
			
			@ -146,16 +167,18 @@ int mbedtls_gcm_auth_decrypt( mbedtls_gcm_context *ctx,
 | 
			
		|||
                      unsigned char *output );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Generic GCM stream start function
 | 
			
		||||
 * \brief           This function starts a GCM encryption or decryption
 | 
			
		||||
 *                  operation.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx       GCM context
 | 
			
		||||
 * \param mode      MBEDTLS_GCM_ENCRYPT or MBEDTLS_GCM_DECRYPT
 | 
			
		||||
 * \param iv        initialization vector
 | 
			
		||||
 * \param iv_len    length of IV
 | 
			
		||||
 * \param add       additional data (or NULL if length is 0)
 | 
			
		||||
 * \param add_len   length of additional data
 | 
			
		||||
 * \param ctx       The GCM context.
 | 
			
		||||
 * \param mode      The operation to perform: #MBEDTLS_GCM_ENCRYPT or
 | 
			
		||||
 *                  #MBEDTLS_GCM_DECRYPT.
 | 
			
		||||
 * \param iv        The initialization vector.
 | 
			
		||||
 * \param iv_len    The length of the IV.
 | 
			
		||||
 * \param add       The buffer holding the additional data, or NULL if \p add_len is 0.
 | 
			
		||||
 * \param add_len   The length of the additional data. If 0, \p  add is NULL.
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful
 | 
			
		||||
 * \return         \c 0 on success.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_gcm_starts( mbedtls_gcm_context *ctx,
 | 
			
		||||
                int mode,
 | 
			
		||||
| 
						 | 
				
			
			@ -165,21 +188,23 @@ int mbedtls_gcm_starts( mbedtls_gcm_context *ctx,
 | 
			
		|||
                size_t add_len );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Generic GCM update function. Encrypts/decrypts using the
 | 
			
		||||
 *                  given GCM context. Expects input to be a multiple of 16
 | 
			
		||||
 *                  bytes! Only the last call before mbedtls_gcm_finish() can be less
 | 
			
		||||
 *                  than 16 bytes!
 | 
			
		||||
 * \brief           This function feeds an input buffer into an ongoing GCM
 | 
			
		||||
 *                  encryption or decryption operation.
 | 
			
		||||
 *
 | 
			
		||||
 * \note On decryption, the output buffer cannot be the same as input buffer.
 | 
			
		||||
 *       If buffers overlap, the output buffer must trail at least 8 bytes
 | 
			
		||||
 *    `             The function expects input to be a multiple of 16
 | 
			
		||||
 *                  Bytes. Only the last call before calling
 | 
			
		||||
 *                  mbedtls_gcm_finish() can be less than 16 Bytes.
 | 
			
		||||
 *
 | 
			
		||||
 * \note For decryption, the output buffer cannot be the same as input buffer.
 | 
			
		||||
 *       If the buffers overlap, the output buffer must trail at least 8 Bytes
 | 
			
		||||
 *       behind the input buffer.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx       GCM context
 | 
			
		||||
 * \param length    length of the input data
 | 
			
		||||
 * \param input     buffer holding the input data
 | 
			
		||||
 * \param output    buffer for holding the output data
 | 
			
		||||
 * \param ctx       The GCM context.
 | 
			
		||||
 * \param length    The length of the input data. This must be a multiple of 16 except in the last call before mbedtls_gcm_finish().
 | 
			
		||||
 * \param input     The buffer holding the input data.
 | 
			
		||||
 * \param output    The buffer for holding the output data.
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful or MBEDTLS_ERR_GCM_BAD_INPUT
 | 
			
		||||
 * \return         \c 0 on success, or #MBEDTLS_ERR_GCM_BAD_INPUT on failure.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_gcm_update( mbedtls_gcm_context *ctx,
 | 
			
		||||
                size_t length,
 | 
			
		||||
| 
						 | 
				
			
			@ -187,24 +212,27 @@ int mbedtls_gcm_update( mbedtls_gcm_context *ctx,
 | 
			
		|||
                unsigned char *output );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Generic GCM finalisation function. Wraps up the GCM stream
 | 
			
		||||
 *                  and generates the tag. The tag can have a maximum length of
 | 
			
		||||
 *                  16 bytes.
 | 
			
		||||
 * \brief           This function finishes the GCM operation and generates
 | 
			
		||||
 *                  the authentication tag.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx       GCM context
 | 
			
		||||
 * \param tag       buffer for holding the tag
 | 
			
		||||
 * \param tag_len   length of the tag to generate (must be at least 4)
 | 
			
		||||
 *                  It wraps up the GCM stream, and generates the
 | 
			
		||||
 *                  tag. The tag can have a maximum length of 16 Bytes.
 | 
			
		||||
 *
 | 
			
		||||
 * \return          0 if successful or MBEDTLS_ERR_GCM_BAD_INPUT
 | 
			
		||||
 * \param ctx       The GCM context.
 | 
			
		||||
 * \param tag       The buffer for holding the tag.
 | 
			
		||||
 * \param tag_len   The length of the tag to generate. Must be at least four.
 | 
			
		||||
 *
 | 
			
		||||
 * \return          \c 0 on success, or #MBEDTLS_ERR_GCM_BAD_INPUT on failure.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_gcm_finish( mbedtls_gcm_context *ctx,
 | 
			
		||||
                unsigned char *tag,
 | 
			
		||||
                size_t tag_len );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Free a GCM context and underlying cipher sub-context
 | 
			
		||||
 * \brief           This function clears a GCM context and the underlying
 | 
			
		||||
 *                  cipher sub-context.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx       GCM context to free
 | 
			
		||||
 * \param ctx       The GCM context to clear.
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_gcm_free( mbedtls_gcm_context *ctx );
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -221,9 +249,9 @@ extern "C" {
 | 
			
		|||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          Checkup routine
 | 
			
		||||
 * \brief          The GCM checkup routine.
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful, or 1 if the test failed
 | 
			
		||||
 * \return         \c 0 on success, or \c 1 on failure.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_gcm_self_test( int verbose );
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,8 @@
 | 
			
		|||
 * \file havege.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief HAVEGE: HArdware Volatile Entropy Gathering and Expansion
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,8 @@
 | 
			
		|||
 * \file hmac_drbg.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief HMAC_DRBG (NIST SP 800-90A)
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,11 +1,12 @@
 | 
			
		|||
/**
 | 
			
		||||
 /**
 | 
			
		||||
 * \file md.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief Generic message digest wrapper
 | 
			
		||||
 * \brief The generic message-digest wrapper.
 | 
			
		||||
 *
 | 
			
		||||
 * \author Adriaan de Jong <dejong@fox-it.com>
 | 
			
		||||
 *
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
 *  Licensed under the Apache License, Version 2.0 (the "License"); you may
 | 
			
		||||
| 
						 | 
				
			
			@ -20,8 +21,9 @@
 | 
			
		|||
 *  See the License for the specific language governing permissions and
 | 
			
		||||
 *  limitations under the License.
 | 
			
		||||
 *
 | 
			
		||||
 *  This file is part of mbed TLS (https://tls.mbed.org)
 | 
			
		||||
 *  This file is part of Mbed TLS (https://tls.mbed.org)
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef MBEDTLS_MD_H
 | 
			
		||||
#define MBEDTLS_MD_H
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -37,11 +39,20 @@
 | 
			
		|||
#define MBEDTLS_ERR_MD_BAD_INPUT_DATA                     -0x5100  /**< Bad input parameters to function. */
 | 
			
		||||
#define MBEDTLS_ERR_MD_ALLOC_FAILED                       -0x5180  /**< Failed to allocate memory. */
 | 
			
		||||
#define MBEDTLS_ERR_MD_FILE_IO_ERROR                      -0x5200  /**< Opening or reading of file failed. */
 | 
			
		||||
#define MBEDTLS_ERR_MD_HW_ACCEL_FAILED                    -0x5280  /**< MD hardware accelerator failed. */
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief     Enumeration of supported message digests
 | 
			
		||||
 *
 | 
			
		||||
 * \warning   MD2, MD4, MD5 and SHA-1 are considered weak message digests and
 | 
			
		||||
 *            their use constitutes a security risk. We recommend considering
 | 
			
		||||
 *            stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
typedef enum {
 | 
			
		||||
    MBEDTLS_MD_NONE=0,
 | 
			
		||||
    MBEDTLS_MD_MD2,
 | 
			
		||||
| 
						 | 
				
			
			@ -62,65 +73,79 @@ typedef enum {
 | 
			
		|||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Opaque struct defined in md_internal.h
 | 
			
		||||
 * Opaque struct defined in md_internal.h.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct mbedtls_md_info_t mbedtls_md_info_t;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Generic message digest context.
 | 
			
		||||
 * The generic message-digest context.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct {
 | 
			
		||||
    /** Information about the associated message digest */
 | 
			
		||||
    /** Information about the associated message digest. */
 | 
			
		||||
    const mbedtls_md_info_t *md_info;
 | 
			
		||||
 | 
			
		||||
    /** Digest-specific context */
 | 
			
		||||
    /** The digest-specific context. */
 | 
			
		||||
    void *md_ctx;
 | 
			
		||||
 | 
			
		||||
    /** HMAC part of the context */
 | 
			
		||||
    /** The HMAC part of the context. */
 | 
			
		||||
    void *hmac_ctx;
 | 
			
		||||
} mbedtls_md_context_t;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief Returns the list of digests supported by the generic digest module.
 | 
			
		||||
 * \brief           This function returns the list of digests supported by the
 | 
			
		||||
 *                  generic digest module.
 | 
			
		||||
 *
 | 
			
		||||
 * \return          a statically allocated array of digests, the last entry
 | 
			
		||||
 *                  is 0.
 | 
			
		||||
 * \return          A statically allocated array of digests. Each element
 | 
			
		||||
 *                  in the returned list is an integer belonging to the
 | 
			
		||||
 *                  message-digest enumeration #mbedtls_md_type_t.
 | 
			
		||||
 *                  The last entry is 0.
 | 
			
		||||
 */
 | 
			
		||||
const int *mbedtls_md_list( void );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Returns the message digest information associated with the
 | 
			
		||||
 *                  given digest name.
 | 
			
		||||
 * \brief           This function returns the message-digest information
 | 
			
		||||
 *                  associated with the given digest name.
 | 
			
		||||
 *
 | 
			
		||||
 * \param md_name   Name of the digest to search for.
 | 
			
		||||
 * \param md_name   The name of the digest to search for.
 | 
			
		||||
 *
 | 
			
		||||
 * \return          The message digest information associated with md_name or
 | 
			
		||||
 *                  NULL if not found.
 | 
			
		||||
 * \return          The message-digest information associated with \p md_name,
 | 
			
		||||
 *                  or NULL if not found.
 | 
			
		||||
 */
 | 
			
		||||
const mbedtls_md_info_t *mbedtls_md_info_from_string( const char *md_name );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Returns the message digest information associated with the
 | 
			
		||||
 *                  given digest type.
 | 
			
		||||
 * \brief           This function returns the message-digest information
 | 
			
		||||
 *                  associated with the given digest type.
 | 
			
		||||
 *
 | 
			
		||||
 * \param md_type   type of digest to search for.
 | 
			
		||||
 * \param md_type   The type of digest to search for.
 | 
			
		||||
 *
 | 
			
		||||
 * \return          The message digest information associated with md_type or
 | 
			
		||||
 *                  NULL if not found.
 | 
			
		||||
 * \return          The message-digest information associated with \p md_type,
 | 
			
		||||
 *                  or NULL if not found.
 | 
			
		||||
 */
 | 
			
		||||
const mbedtls_md_info_t *mbedtls_md_info_from_type( mbedtls_md_type_t md_type );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Initialize a md_context (as NONE)
 | 
			
		||||
 *                  This should always be called first.
 | 
			
		||||
 *                  Prepares the context for mbedtls_md_setup() or mbedtls_md_free().
 | 
			
		||||
 * \brief           This function initializes a message-digest context without
 | 
			
		||||
 *                  binding it to a particular message-digest algorithm.
 | 
			
		||||
 *
 | 
			
		||||
 *                  This function should always be called first. It prepares the
 | 
			
		||||
 *                  context for mbedtls_md_setup() for binding it to a
 | 
			
		||||
 *                  message-digest algorithm.
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_md_init( mbedtls_md_context_t *ctx );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Free and clear the internal structures of ctx.
 | 
			
		||||
 *                  Can be called at any time after mbedtls_md_init().
 | 
			
		||||
 *                  Mandatory once mbedtls_md_setup() has been called.
 | 
			
		||||
 * \brief           This function clears the internal structure of \p ctx and
 | 
			
		||||
 *                  frees any embedded internal structure, but does not free
 | 
			
		||||
 *                  \p ctx itself.
 | 
			
		||||
 *
 | 
			
		||||
 *                  If you have called mbedtls_md_setup() on \p ctx, you must
 | 
			
		||||
 *                  call mbedtls_md_free() when you are no longer using the
 | 
			
		||||
 *                  context.
 | 
			
		||||
 *                  Calling this function if you have previously
 | 
			
		||||
 *                  called mbedtls_md_init() and nothing else is optional.
 | 
			
		||||
 *                  You must not call this function if you have not called
 | 
			
		||||
 *                  mbedtls_md_init().
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_md_free( mbedtls_md_context_t *ctx );
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -131,220 +156,288 @@ void mbedtls_md_free( mbedtls_md_context_t *ctx );
 | 
			
		|||
#define MBEDTLS_DEPRECATED
 | 
			
		||||
#endif
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Select MD to use and allocate internal structures.
 | 
			
		||||
 *                  Should be called after mbedtls_md_init() or mbedtls_md_free().
 | 
			
		||||
 * \brief           This function selects the message digest algorithm to use,
 | 
			
		||||
 *                  and allocates internal structures.
 | 
			
		||||
 *
 | 
			
		||||
 *                  It should be called after mbedtls_md_init() or mbedtls_md_free().
 | 
			
		||||
 *                  Makes it necessary to call mbedtls_md_free() later.
 | 
			
		||||
 *
 | 
			
		||||
 * \deprecated      Superseded by mbedtls_md_setup() in 2.0.0
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx       Context to set up.
 | 
			
		||||
 * \param md_info   Message digest to use.
 | 
			
		||||
 * \param ctx       The context to set up.
 | 
			
		||||
 * \param md_info   The information structure of the message-digest algorithm
 | 
			
		||||
 *                  to use.
 | 
			
		||||
 *
 | 
			
		||||
 * \returns         \c 0 on success,
 | 
			
		||||
 *                  \c MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter failure,
 | 
			
		||||
 *                  \c MBEDTLS_ERR_MD_ALLOC_FAILED memory allocation failure.
 | 
			
		||||
 *                  #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter failure,
 | 
			
		||||
 *                  #MBEDTLS_ERR_MD_ALLOC_FAILED memory allocation failure.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_md_init_ctx( mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info ) MBEDTLS_DEPRECATED;
 | 
			
		||||
#undef MBEDTLS_DEPRECATED
 | 
			
		||||
#endif /* MBEDTLS_DEPRECATED_REMOVED */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Select MD to use and allocate internal structures.
 | 
			
		||||
 *                  Should be called after mbedtls_md_init() or mbedtls_md_free().
 | 
			
		||||
 *                  Makes it necessary to call mbedtls_md_free() later.
 | 
			
		||||
 * \brief           This function selects the message digest algorithm to use,
 | 
			
		||||
 *                  and allocates internal structures.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx       Context to set up.
 | 
			
		||||
 * \param md_info   Message digest to use.
 | 
			
		||||
 * \param hmac      0 to save some memory if HMAC will not be used,
 | 
			
		||||
 *                  non-zero is HMAC is going to be used with this context.
 | 
			
		||||
 *                  It should be called after mbedtls_md_init() or
 | 
			
		||||
 *                  mbedtls_md_free(). Makes it necessary to call
 | 
			
		||||
 *                  mbedtls_md_free() later.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx       The context to set up.
 | 
			
		||||
 * \param md_info   The information structure of the message-digest algorithm
 | 
			
		||||
 *                  to use.
 | 
			
		||||
 * \param hmac      <ul><li>0: HMAC is not used. Saves some memory.</li>
 | 
			
		||||
 *                  <li>non-zero: HMAC is used with this context.</li></ul>
 | 
			
		||||
 *
 | 
			
		||||
 * \returns         \c 0 on success,
 | 
			
		||||
 *                  \c MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter failure,
 | 
			
		||||
 *                  \c MBEDTLS_ERR_MD_ALLOC_FAILED memory allocation failure.
 | 
			
		||||
 *                  #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter failure, or
 | 
			
		||||
 *                  #MBEDTLS_ERR_MD_ALLOC_FAILED on memory allocation failure.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_md_setup( mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info, int hmac );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Clone the state of an MD context
 | 
			
		||||
 * \brief           This function clones the state of an message-digest
 | 
			
		||||
 *                  context.
 | 
			
		||||
 *
 | 
			
		||||
 * \note            The two contexts must have been setup to the same type
 | 
			
		||||
 *                  (cloning from SHA-256 to SHA-512 make no sense).
 | 
			
		||||
 * \note            You must call mbedtls_md_setup() on \c dst before calling
 | 
			
		||||
 *                  this function.
 | 
			
		||||
 *
 | 
			
		||||
 * \warning         Only clones the MD state, not the HMAC state! (for now)
 | 
			
		||||
 * \note            The two contexts must have the same type,
 | 
			
		||||
 *                  for example, both are SHA-256.
 | 
			
		||||
 *
 | 
			
		||||
 * \param dst       The destination context
 | 
			
		||||
 * \param src       The context to be cloned
 | 
			
		||||
 * \warning         This function clones the message-digest state, not the
 | 
			
		||||
 *                  HMAC state.
 | 
			
		||||
 *
 | 
			
		||||
 * \param dst       The destination context.
 | 
			
		||||
 * \param src       The context to be cloned.
 | 
			
		||||
 *
 | 
			
		||||
 * \return          \c 0 on success,
 | 
			
		||||
 *                  \c MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter failure.
 | 
			
		||||
 *                  #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter failure.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_md_clone( mbedtls_md_context_t *dst,
 | 
			
		||||
                      const mbedtls_md_context_t *src );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Returns the size of the message digest output.
 | 
			
		||||
 * \brief           This function extracts the message-digest size from the
 | 
			
		||||
 *                  message-digest information structure.
 | 
			
		||||
 *
 | 
			
		||||
 * \param md_info   message digest info
 | 
			
		||||
 * \param md_info   The information structure of the message-digest algorithm
 | 
			
		||||
 *                  to use.
 | 
			
		||||
 *
 | 
			
		||||
 * \return          size of the message digest output in bytes.
 | 
			
		||||
 * \return          The size of the message-digest output in Bytes.
 | 
			
		||||
 */
 | 
			
		||||
unsigned char mbedtls_md_get_size( const mbedtls_md_info_t *md_info );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Returns the type of the message digest output.
 | 
			
		||||
 * \brief           This function extracts the message-digest type from the
 | 
			
		||||
 *                  message-digest information structure.
 | 
			
		||||
 *
 | 
			
		||||
 * \param md_info   message digest info
 | 
			
		||||
 * \param md_info   The information structure of the message-digest algorithm
 | 
			
		||||
 *                  to use.
 | 
			
		||||
 *
 | 
			
		||||
 * \return          type of the message digest output.
 | 
			
		||||
 * \return          The type of the message digest.
 | 
			
		||||
 */
 | 
			
		||||
mbedtls_md_type_t mbedtls_md_get_type( const mbedtls_md_info_t *md_info );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Returns the name of the message digest output.
 | 
			
		||||
 * \brief           This function extracts the message-digest name from the
 | 
			
		||||
 *                  message-digest information structure.
 | 
			
		||||
 *
 | 
			
		||||
 * \param md_info   message digest info
 | 
			
		||||
 * \param md_info   The information structure of the message-digest algorithm
 | 
			
		||||
 *                  to use.
 | 
			
		||||
 *
 | 
			
		||||
 * \return          name of the message digest output.
 | 
			
		||||
 * \return          The name of the message digest.
 | 
			
		||||
 */
 | 
			
		||||
const char *mbedtls_md_get_name( const mbedtls_md_info_t *md_info );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Prepare the context to digest a new message.
 | 
			
		||||
 *                  Generally called after mbedtls_md_setup() or mbedtls_md_finish().
 | 
			
		||||
 *                  Followed by mbedtls_md_update().
 | 
			
		||||
 * \brief           This function starts a message-digest computation.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx       generic message digest context.
 | 
			
		||||
 *                  You must call this function after setting up the context
 | 
			
		||||
 *                  with mbedtls_md_setup(), and before passing data with
 | 
			
		||||
 *                  mbedtls_md_update().
 | 
			
		||||
 *
 | 
			
		||||
 * \returns         0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter
 | 
			
		||||
 *                  verification fails.
 | 
			
		||||
 * \param ctx       The generic message-digest context.
 | 
			
		||||
 *
 | 
			
		||||
 * \returns         \c 0 on success, #MBEDTLS_ERR_MD_BAD_INPUT_DATA if
 | 
			
		||||
 *                  parameter verification fails.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_md_starts( mbedtls_md_context_t *ctx );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Generic message digest process buffer
 | 
			
		||||
 *                  Called between mbedtls_md_starts() and mbedtls_md_finish().
 | 
			
		||||
 *                  May be called repeatedly.
 | 
			
		||||
 * \brief           This function feeds an input buffer into an ongoing
 | 
			
		||||
 *                  message-digest computation.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx       Generic message digest context
 | 
			
		||||
 * \param input     buffer holding the  datal
 | 
			
		||||
 * \param ilen      length of the input data
 | 
			
		||||
 *                  You must call mbedtls_md_starts() before calling this
 | 
			
		||||
 *                  function. You may call this function multiple times.
 | 
			
		||||
 *                  Afterwards, call mbedtls_md_finish().
 | 
			
		||||
 *
 | 
			
		||||
 * \returns         0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter
 | 
			
		||||
 *                  verification fails.
 | 
			
		||||
 * \param ctx       The generic message-digest context.
 | 
			
		||||
 * \param input     The buffer holding the input data.
 | 
			
		||||
 * \param ilen      The length of the input data.
 | 
			
		||||
 *
 | 
			
		||||
 * \returns         \c 0 on success, #MBEDTLS_ERR_MD_BAD_INPUT_DATA if
 | 
			
		||||
 *                  parameter verification fails.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_md_update( mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Generic message digest final digest
 | 
			
		||||
 *                  Called after mbedtls_md_update().
 | 
			
		||||
 *                  Usually followed by mbedtls_md_free() or mbedtls_md_starts().
 | 
			
		||||
 * \brief           This function finishes the digest operation,
 | 
			
		||||
 *                  and writes the result to the output buffer.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx       Generic message digest context
 | 
			
		||||
 * \param output    Generic message digest checksum result
 | 
			
		||||
 *                  Call this function after a call to mbedtls_md_starts(),
 | 
			
		||||
 *                  followed by any number of calls to mbedtls_md_update().
 | 
			
		||||
 *                  Afterwards, you may either clear the context with
 | 
			
		||||
 *                  mbedtls_md_free(), or call mbedtls_md_starts() to reuse
 | 
			
		||||
 *                  the context for another digest operation with the same
 | 
			
		||||
 *                  algorithm.
 | 
			
		||||
 *
 | 
			
		||||
 * \returns         0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter
 | 
			
		||||
 *                  verification fails.
 | 
			
		||||
 * \param ctx       The generic message-digest context.
 | 
			
		||||
 * \param output    The buffer for the generic message-digest checksum result.
 | 
			
		||||
 *
 | 
			
		||||
 * \returns         \c 0 on success, or #MBEDTLS_ERR_MD_BAD_INPUT_DATA if
 | 
			
		||||
 *                  parameter verification fails.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_md_finish( mbedtls_md_context_t *ctx, unsigned char *output );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          Output = message_digest( input buffer )
 | 
			
		||||
 * \brief          This function calculates the message-digest of a buffer,
 | 
			
		||||
 *                 with respect to a configurable message-digest algorithm
 | 
			
		||||
 *                 in a single call.
 | 
			
		||||
 *
 | 
			
		||||
 * \param md_info  message digest info
 | 
			
		||||
 * \param input    buffer holding the  data
 | 
			
		||||
 * \param ilen     length of the input data
 | 
			
		||||
 * \param output   Generic message digest checksum result
 | 
			
		||||
 *                 The result is calculated as
 | 
			
		||||
 *                 Output = message_digest(input buffer).
 | 
			
		||||
 *
 | 
			
		||||
 * \returns        0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter
 | 
			
		||||
 *                 verification fails.
 | 
			
		||||
 * \param md_info  The information structure of the message-digest algorithm
 | 
			
		||||
 *                 to use.
 | 
			
		||||
 * \param input    The buffer holding the data.
 | 
			
		||||
 * \param ilen     The length of the input data.
 | 
			
		||||
 * \param output   The generic message-digest checksum result.
 | 
			
		||||
 *
 | 
			
		||||
 * \returns        \c 0 on success, or #MBEDTLS_ERR_MD_BAD_INPUT_DATA if
 | 
			
		||||
 *                 parameter verification fails.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_md( const mbedtls_md_info_t *md_info, const unsigned char *input, size_t ilen,
 | 
			
		||||
        unsigned char *output );
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_FS_IO)
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          Output = message_digest( file contents )
 | 
			
		||||
 * \brief          This function calculates the message-digest checksum
 | 
			
		||||
 *                 result of the contents of the provided file.
 | 
			
		||||
 *
 | 
			
		||||
 * \param md_info  message digest info
 | 
			
		||||
 * \param path     input file name
 | 
			
		||||
 * \param output   generic message digest checksum result
 | 
			
		||||
 *                 The result is calculated as
 | 
			
		||||
 *                 Output = message_digest(file contents).
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful,
 | 
			
		||||
 *                 MBEDTLS_ERR_MD_FILE_IO_ERROR if file input failed,
 | 
			
		||||
 *                 MBEDTLS_ERR_MD_BAD_INPUT_DATA if md_info was NULL.
 | 
			
		||||
 * \param md_info  The information structure of the message-digest algorithm
 | 
			
		||||
 *                 to use.
 | 
			
		||||
 * \param path     The input file name.
 | 
			
		||||
 * \param output   The generic message-digest checksum result.
 | 
			
		||||
 *
 | 
			
		||||
 * \return         \c 0 on success,
 | 
			
		||||
 *                 #MBEDTLS_ERR_MD_FILE_IO_ERROR if file input failed, or
 | 
			
		||||
 *                 #MBEDTLS_ERR_MD_BAD_INPUT_DATA if \p md_info was NULL.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_md_file( const mbedtls_md_info_t *md_info, const char *path,
 | 
			
		||||
                     unsigned char *output );
 | 
			
		||||
#endif /* MBEDTLS_FS_IO */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Set HMAC key and prepare to authenticate a new message.
 | 
			
		||||
 *                  Usually called after mbedtls_md_setup() or mbedtls_md_hmac_finish().
 | 
			
		||||
 * \brief           This function sets the HMAC key and prepares to
 | 
			
		||||
 *                  authenticate a new message.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx       HMAC context
 | 
			
		||||
 * \param key       HMAC secret key
 | 
			
		||||
 * \param keylen    length of the HMAC key in bytes
 | 
			
		||||
 *                  Call this function after mbedtls_md_setup(), to use
 | 
			
		||||
 *                  the MD context for an HMAC calculation, then call
 | 
			
		||||
 *                  mbedtls_md_hmac_update() to provide the input data, and
 | 
			
		||||
 *                  mbedtls_md_hmac_finish() to get the HMAC value.
 | 
			
		||||
 *
 | 
			
		||||
 * \returns         0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter
 | 
			
		||||
 *                  verification fails.
 | 
			
		||||
 * \param ctx       The message digest context containing an embedded HMAC
 | 
			
		||||
 *                  context.
 | 
			
		||||
 * \param key       The HMAC secret key.
 | 
			
		||||
 * \param keylen    The length of the HMAC key in Bytes.
 | 
			
		||||
 *
 | 
			
		||||
 * \returns         \c 0 on success, or #MBEDTLS_ERR_MD_BAD_INPUT_DATA if
 | 
			
		||||
 *                  parameter verification fails.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_md_hmac_starts( mbedtls_md_context_t *ctx, const unsigned char *key,
 | 
			
		||||
                    size_t keylen );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Generic HMAC process buffer.
 | 
			
		||||
 *                  Called between mbedtls_md_hmac_starts() or mbedtls_md_hmac_reset()
 | 
			
		||||
 *                  and mbedtls_md_hmac_finish().
 | 
			
		||||
 *                  May be called repeatedly.
 | 
			
		||||
 * \brief           This function feeds an input buffer into an ongoing HMAC
 | 
			
		||||
 *                  computation.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx       HMAC context
 | 
			
		||||
 * \param input     buffer holding the  data
 | 
			
		||||
 * \param ilen      length of the input data
 | 
			
		||||
 *                  Call mbedtls_md_hmac_starts() or mbedtls_md_hmac_reset()
 | 
			
		||||
 *                  before calling this function.
 | 
			
		||||
 *                  You may call this function multiple times to pass the
 | 
			
		||||
 *                  input piecewise.
 | 
			
		||||
 *                  Afterwards, call mbedtls_md_hmac_finish().
 | 
			
		||||
 *
 | 
			
		||||
 * \returns         0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter
 | 
			
		||||
 *                  verification fails.
 | 
			
		||||
 * \param ctx       The message digest context containing an embedded HMAC
 | 
			
		||||
 *                  context.
 | 
			
		||||
 * \param input     The buffer holding the input data.
 | 
			
		||||
 * \param ilen      The length of the input data.
 | 
			
		||||
 *
 | 
			
		||||
 * \returns         \c 0 on success, or #MBEDTLS_ERR_MD_BAD_INPUT_DATA if
 | 
			
		||||
 *                  parameter verification fails.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_md_hmac_update( mbedtls_md_context_t *ctx, const unsigned char *input,
 | 
			
		||||
                    size_t ilen );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Output HMAC.
 | 
			
		||||
 *                  Called after mbedtls_md_hmac_update().
 | 
			
		||||
 *                  Usually followed by mbedtls_md_hmac_reset(),
 | 
			
		||||
 *                  mbedtls_md_hmac_starts(), or mbedtls_md_free().
 | 
			
		||||
 * \brief           This function finishes the HMAC operation, and writes
 | 
			
		||||
 *                  the result to the output buffer.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx       HMAC context
 | 
			
		||||
 * \param output    Generic HMAC checksum result
 | 
			
		||||
 *                  Call this function after mbedtls_md_hmac_starts() and
 | 
			
		||||
 *                  mbedtls_md_hmac_update() to get the HMAC value. Afterwards
 | 
			
		||||
 *                  you may either call mbedtls_md_free() to clear the context,
 | 
			
		||||
 *                  or call mbedtls_md_hmac_reset() to reuse the context with
 | 
			
		||||
 *                  the same HMAC key.
 | 
			
		||||
 *
 | 
			
		||||
 * \returns         0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter
 | 
			
		||||
 *                  verification fails.
 | 
			
		||||
 * \param ctx       The message digest context containing an embedded HMAC
 | 
			
		||||
 *                  context.
 | 
			
		||||
 * \param output    The generic HMAC checksum result.
 | 
			
		||||
 *
 | 
			
		||||
 * \returns         \c 0 on success, or #MBEDTLS_ERR_MD_BAD_INPUT_DATA if
 | 
			
		||||
 *                  parameter verification fails.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_md_hmac_finish( mbedtls_md_context_t *ctx, unsigned char *output);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief           Prepare to authenticate a new message with the same key.
 | 
			
		||||
 *                  Called after mbedtls_md_hmac_finish() and before
 | 
			
		||||
 *                  mbedtls_md_hmac_update().
 | 
			
		||||
 * \brief           This function prepares to authenticate a new message with
 | 
			
		||||
 *                  the same key as the previous HMAC operation.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx       HMAC context to be reset
 | 
			
		||||
 *                  You may call this function after mbedtls_md_hmac_finish().
 | 
			
		||||
 *                  Afterwards call mbedtls_md_hmac_update() to pass the new
 | 
			
		||||
 *                  input.
 | 
			
		||||
 *
 | 
			
		||||
 * \returns         0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter
 | 
			
		||||
 *                  verification fails.
 | 
			
		||||
 * \param ctx       The message digest context containing an embedded HMAC
 | 
			
		||||
 *                  context.
 | 
			
		||||
 *
 | 
			
		||||
 * \returns         \c 0 on success, or #MBEDTLS_ERR_MD_BAD_INPUT_DATA if
 | 
			
		||||
 *                  parameter verification fails.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_md_hmac_reset( mbedtls_md_context_t *ctx );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          Output = Generic_HMAC( hmac key, input buffer )
 | 
			
		||||
 * \brief          This function calculates the full generic HMAC
 | 
			
		||||
 *                 on the input buffer with the provided key.
 | 
			
		||||
 *
 | 
			
		||||
 * \param md_info  message digest info
 | 
			
		||||
 * \param key      HMAC secret key
 | 
			
		||||
 * \param keylen   length of the HMAC key in bytes
 | 
			
		||||
 * \param input    buffer holding the  data
 | 
			
		||||
 * \param ilen     length of the input data
 | 
			
		||||
 * \param output   Generic HMAC-result
 | 
			
		||||
 *                 The function allocates the context, performs the
 | 
			
		||||
 *                 calculation, and frees the context.
 | 
			
		||||
 *
 | 
			
		||||
 * \returns        0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter
 | 
			
		||||
 *                 verification fails.
 | 
			
		||||
 *                 The HMAC result is calculated as
 | 
			
		||||
 *                 output = generic HMAC(hmac key, input buffer).
 | 
			
		||||
 *
 | 
			
		||||
 * \param md_info  The information structure of the message-digest algorithm
 | 
			
		||||
 *                 to use.
 | 
			
		||||
 * \param key      The HMAC secret key.
 | 
			
		||||
 * \param keylen   The length of the HMAC secret key in Bytes.
 | 
			
		||||
 * \param input    The buffer holding the input data.
 | 
			
		||||
 * \param ilen     The length of the input data.
 | 
			
		||||
 * \param output   The generic HMAC result.
 | 
			
		||||
 *
 | 
			
		||||
 * \returns        \c 0 on success, or #MBEDTLS_ERR_MD_BAD_INPUT_DATA if
 | 
			
		||||
 *                 parameter verification fails.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_md_hmac( const mbedtls_md_info_t *md_info, const unsigned char *key, size_t keylen,
 | 
			
		||||
                const unsigned char *input, size_t ilen,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,6 +3,11 @@
 | 
			
		|||
 *
 | 
			
		||||
 * \brief MD2 message digest algorithm (hash function)
 | 
			
		||||
 *
 | 
			
		||||
 * \warning MD2 is considered a weak message digest and its use constitutes a
 | 
			
		||||
 *          security risk. We recommend considering stronger message digests
 | 
			
		||||
 *          instead.
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			@ -19,6 +24,7 @@
 | 
			
		|||
 *  limitations under the License.
 | 
			
		||||
 *
 | 
			
		||||
 *  This file is part of mbed TLS (https://tls.mbed.org)
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
#ifndef MBEDTLS_MD2_H
 | 
			
		||||
#define MBEDTLS_MD2_H
 | 
			
		||||
| 
						 | 
				
			
			@ -31,6 +37,13 @@
 | 
			
		|||
 | 
			
		||||
#include <stddef.h>
 | 
			
		||||
 | 
			
		||||
#define MBEDTLS_ERR_MD2_HW_ACCEL_FAILED                   -0x002B  /**< MD2 hardware accelerator failed */
 | 
			
		||||
 | 
			
		||||
#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \
 | 
			
		||||
    !defined(inline) && !defined(__cplusplus)
 | 
			
		||||
#define inline __inline
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined(MBEDTLS_MD2_ALT)
 | 
			
		||||
// Regular implementation
 | 
			
		||||
//
 | 
			
		||||
| 
						 | 
				
			
			@ -41,6 +54,11 @@ extern "C" {
 | 
			
		|||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          MD2 context structure
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        MD2 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
typedef struct
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -55,6 +73,11 @@ mbedtls_md2_context;
 | 
			
		|||
 * \brief          Initialize MD2 context
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      MD2 context to be initialized
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        MD2 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_md2_init( mbedtls_md2_context *ctx );
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -62,6 +85,11 @@ void mbedtls_md2_init( mbedtls_md2_context *ctx );
 | 
			
		|||
 * \brief          Clear MD2 context
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      MD2 context to be cleared
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        MD2 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_md2_free( mbedtls_md2_context *ctx );
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -70,6 +98,11 @@ void mbedtls_md2_free( mbedtls_md2_context *ctx );
 | 
			
		|||
 *
 | 
			
		||||
 * \param dst      The destination context
 | 
			
		||||
 * \param src      The context to be cloned
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        MD2 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_md2_clone( mbedtls_md2_context *dst,
 | 
			
		||||
                        const mbedtls_md2_context *src );
 | 
			
		||||
| 
						 | 
				
			
			@ -78,25 +111,150 @@ void mbedtls_md2_clone( mbedtls_md2_context *dst,
 | 
			
		|||
 * \brief          MD2 context setup
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      context to be initialized
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        MD2 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_md2_starts( mbedtls_md2_context *ctx );
 | 
			
		||||
int mbedtls_md2_starts_ret( mbedtls_md2_context *ctx );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          MD2 process buffer
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      MD2 context
 | 
			
		||||
 * \param input    buffer holding the  data
 | 
			
		||||
 * \param input    buffer holding the data
 | 
			
		||||
 * \param ilen     length of the input data
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        MD2 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_md2_update( mbedtls_md2_context *ctx, const unsigned char *input, size_t ilen );
 | 
			
		||||
int mbedtls_md2_update_ret( mbedtls_md2_context *ctx,
 | 
			
		||||
                            const unsigned char *input,
 | 
			
		||||
                            size_t ilen );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          MD2 final digest
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      MD2 context
 | 
			
		||||
 * \param output   MD2 checksum result
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        MD2 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_md2_finish( mbedtls_md2_context *ctx, unsigned char output[16] );
 | 
			
		||||
int mbedtls_md2_finish_ret( mbedtls_md2_context *ctx,
 | 
			
		||||
                            unsigned char output[16] );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          MD2 process data block (internal use only)
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      MD2 context
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        MD2 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_internal_md2_process( mbedtls_md2_context *ctx );
 | 
			
		||||
 | 
			
		||||
#if !defined(MBEDTLS_DEPRECATED_REMOVED)
 | 
			
		||||
#if defined(MBEDTLS_DEPRECATED_WARNING)
 | 
			
		||||
#define MBEDTLS_DEPRECATED      __attribute__((deprecated))
 | 
			
		||||
#else
 | 
			
		||||
#define MBEDTLS_DEPRECATED
 | 
			
		||||
#endif
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          MD2 context setup
 | 
			
		||||
 *
 | 
			
		||||
 * \deprecated     Superseded by mbedtls_md2_starts_ret() in 2.7.0
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      context to be initialized
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        MD2 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
MBEDTLS_DEPRECATED static inline void mbedtls_md2_starts(
 | 
			
		||||
                                                    mbedtls_md2_context *ctx )
 | 
			
		||||
{
 | 
			
		||||
    mbedtls_md2_starts_ret( ctx );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          MD2 process buffer
 | 
			
		||||
 *
 | 
			
		||||
 * \deprecated     Superseded by mbedtls_md2_update_ret() in 2.7.0
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      MD2 context
 | 
			
		||||
 * \param input    buffer holding the data
 | 
			
		||||
 * \param ilen     length of the input data
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        MD2 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
MBEDTLS_DEPRECATED static inline void mbedtls_md2_update(
 | 
			
		||||
                                                mbedtls_md2_context *ctx,
 | 
			
		||||
                                                const unsigned char *input,
 | 
			
		||||
                                                size_t ilen )
 | 
			
		||||
{
 | 
			
		||||
    mbedtls_md2_update_ret( ctx, input, ilen );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          MD2 final digest
 | 
			
		||||
 *
 | 
			
		||||
 * \deprecated     Superseded by mbedtls_md2_finish_ret() in 2.7.0
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      MD2 context
 | 
			
		||||
 * \param output   MD2 checksum result
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        MD2 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
MBEDTLS_DEPRECATED static inline void mbedtls_md2_finish(
 | 
			
		||||
                                                    mbedtls_md2_context *ctx,
 | 
			
		||||
                                                    unsigned char output[16] )
 | 
			
		||||
{
 | 
			
		||||
    mbedtls_md2_finish_ret( ctx, output );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          MD2 process data block (internal use only)
 | 
			
		||||
 *
 | 
			
		||||
 * \deprecated     Superseded by mbedtls_internal_md2_process() in 2.7.0
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      MD2 context
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        MD2 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
MBEDTLS_DEPRECATED static inline void mbedtls_md2_process(
 | 
			
		||||
                                                    mbedtls_md2_context *ctx )
 | 
			
		||||
{
 | 
			
		||||
    mbedtls_internal_md2_process( ctx );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#undef MBEDTLS_DEPRECATED
 | 
			
		||||
#endif /* !MBEDTLS_DEPRECATED_REMOVED */
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -113,22 +271,61 @@ extern "C" {
 | 
			
		|||
/**
 | 
			
		||||
 * \brief          Output = MD2( input buffer )
 | 
			
		||||
 *
 | 
			
		||||
 * \param input    buffer holding the  data
 | 
			
		||||
 * \param input    buffer holding the data
 | 
			
		||||
 * \param ilen     length of the input data
 | 
			
		||||
 * \param output   MD2 checksum result
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        MD2 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_md2( const unsigned char *input, size_t ilen, unsigned char output[16] );
 | 
			
		||||
int mbedtls_md2_ret( const unsigned char *input,
 | 
			
		||||
                     size_t ilen,
 | 
			
		||||
                     unsigned char output[16] );
 | 
			
		||||
 | 
			
		||||
#if !defined(MBEDTLS_DEPRECATED_REMOVED)
 | 
			
		||||
#if defined(MBEDTLS_DEPRECATED_WARNING)
 | 
			
		||||
#define MBEDTLS_DEPRECATED      __attribute__((deprecated))
 | 
			
		||||
#else
 | 
			
		||||
#define MBEDTLS_DEPRECATED
 | 
			
		||||
#endif
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          Output = MD2( input buffer )
 | 
			
		||||
 *
 | 
			
		||||
 * \deprecated     Superseded by mbedtls_md2_ret() in 2.7.0
 | 
			
		||||
 *
 | 
			
		||||
 * \param input    buffer holding the data
 | 
			
		||||
 * \param ilen     length of the input data
 | 
			
		||||
 * \param output   MD2 checksum result
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        MD2 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
MBEDTLS_DEPRECATED static inline void mbedtls_md2( const unsigned char *input,
 | 
			
		||||
                                                   size_t ilen,
 | 
			
		||||
                                                   unsigned char output[16] )
 | 
			
		||||
{
 | 
			
		||||
    mbedtls_md2_ret( input, ilen, output );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#undef MBEDTLS_DEPRECATED
 | 
			
		||||
#endif /* !MBEDTLS_DEPRECATED_REMOVED */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          Checkup routine
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful, or 1 if the test failed
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        MD2 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_md2_self_test( int verbose );
 | 
			
		||||
 | 
			
		||||
/* Internal use */
 | 
			
		||||
void mbedtls_md2_process( mbedtls_md2_context *ctx );
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,6 +3,11 @@
 | 
			
		|||
 *
 | 
			
		||||
 * \brief MD4 message digest algorithm (hash function)
 | 
			
		||||
 *
 | 
			
		||||
 * \warning MD4 is considered a weak message digest and its use constitutes a
 | 
			
		||||
 *          security risk. We recommend considering stronger message digests
 | 
			
		||||
 *          instead.
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			@ -19,6 +24,7 @@
 | 
			
		|||
 *  limitations under the License.
 | 
			
		||||
 *
 | 
			
		||||
 *  This file is part of mbed TLS (https://tls.mbed.org)
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
#ifndef MBEDTLS_MD4_H
 | 
			
		||||
#define MBEDTLS_MD4_H
 | 
			
		||||
| 
						 | 
				
			
			@ -32,6 +38,13 @@
 | 
			
		|||
#include <stddef.h>
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
#define MBEDTLS_ERR_MD4_HW_ACCEL_FAILED                   -0x002D  /**< MD4 hardware accelerator failed */
 | 
			
		||||
 | 
			
		||||
#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \
 | 
			
		||||
    !defined(inline) && !defined(__cplusplus)
 | 
			
		||||
#define inline __inline
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined(MBEDTLS_MD4_ALT)
 | 
			
		||||
// Regular implementation
 | 
			
		||||
//
 | 
			
		||||
| 
						 | 
				
			
			@ -42,6 +55,11 @@ extern "C" {
 | 
			
		|||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          MD4 context structure
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        MD4 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
typedef struct
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -55,6 +73,11 @@ mbedtls_md4_context;
 | 
			
		|||
 * \brief          Initialize MD4 context
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      MD4 context to be initialized
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        MD4 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_md4_init( mbedtls_md4_context *ctx );
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -62,6 +85,11 @@ void mbedtls_md4_init( mbedtls_md4_context *ctx );
 | 
			
		|||
 * \brief          Clear MD4 context
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      MD4 context to be cleared
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        MD4 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_md4_free( mbedtls_md4_context *ctx );
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -70,6 +98,11 @@ void mbedtls_md4_free( mbedtls_md4_context *ctx );
 | 
			
		|||
 *
 | 
			
		||||
 * \param dst      The destination context
 | 
			
		||||
 * \param src      The context to be cloned
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        MD4 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_md4_clone( mbedtls_md4_context *dst,
 | 
			
		||||
                        const mbedtls_md4_context *src );
 | 
			
		||||
| 
						 | 
				
			
			@ -78,25 +111,153 @@ void mbedtls_md4_clone( mbedtls_md4_context *dst,
 | 
			
		|||
 * \brief          MD4 context setup
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      context to be initialized
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        MD4 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_md4_starts( mbedtls_md4_context *ctx );
 | 
			
		||||
int mbedtls_md4_starts_ret( mbedtls_md4_context *ctx );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          MD4 process buffer
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      MD4 context
 | 
			
		||||
 * \param input    buffer holding the  data
 | 
			
		||||
 * \param input    buffer holding the data
 | 
			
		||||
 * \param ilen     length of the input data
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        MD4 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_md4_update( mbedtls_md4_context *ctx, const unsigned char *input, size_t ilen );
 | 
			
		||||
int mbedtls_md4_update_ret( mbedtls_md4_context *ctx,
 | 
			
		||||
                            const unsigned char *input,
 | 
			
		||||
                            size_t ilen );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          MD4 final digest
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      MD4 context
 | 
			
		||||
 * \param output   MD4 checksum result
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        MD4 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_md4_finish( mbedtls_md4_context *ctx, unsigned char output[16] );
 | 
			
		||||
int mbedtls_md4_finish_ret( mbedtls_md4_context *ctx,
 | 
			
		||||
                            unsigned char output[16] );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          MD4 process data block (internal use only)
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      MD4 context
 | 
			
		||||
 * \param data     buffer holding one block of data
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        MD4 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_internal_md4_process( mbedtls_md4_context *ctx,
 | 
			
		||||
                                  const unsigned char data[64] );
 | 
			
		||||
 | 
			
		||||
#if !defined(MBEDTLS_DEPRECATED_REMOVED)
 | 
			
		||||
#if defined(MBEDTLS_DEPRECATED_WARNING)
 | 
			
		||||
#define MBEDTLS_DEPRECATED      __attribute__((deprecated))
 | 
			
		||||
#else
 | 
			
		||||
#define MBEDTLS_DEPRECATED
 | 
			
		||||
#endif
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          MD4 context setup
 | 
			
		||||
 *
 | 
			
		||||
 * \deprecated     Superseded by mbedtls_md4_starts_ret() in 2.7.0
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      context to be initialized
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        MD4 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
MBEDTLS_DEPRECATED static inline void mbedtls_md4_starts(
 | 
			
		||||
                                                    mbedtls_md4_context *ctx )
 | 
			
		||||
{
 | 
			
		||||
    mbedtls_md4_starts_ret( ctx );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          MD4 process buffer
 | 
			
		||||
 *
 | 
			
		||||
 * \deprecated     Superseded by mbedtls_md4_update_ret() in 2.7.0
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      MD4 context
 | 
			
		||||
 * \param input    buffer holding the data
 | 
			
		||||
 * \param ilen     length of the input data
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        MD4 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
MBEDTLS_DEPRECATED static inline void mbedtls_md4_update(
 | 
			
		||||
                                                    mbedtls_md4_context *ctx,
 | 
			
		||||
                                                    const unsigned char *input,
 | 
			
		||||
                                                    size_t ilen )
 | 
			
		||||
{
 | 
			
		||||
    mbedtls_md4_update_ret( ctx, input, ilen );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          MD4 final digest
 | 
			
		||||
 *
 | 
			
		||||
 * \deprecated     Superseded by mbedtls_md4_finish_ret() in 2.7.0
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      MD4 context
 | 
			
		||||
 * \param output   MD4 checksum result
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        MD4 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
MBEDTLS_DEPRECATED static inline void mbedtls_md4_finish(
 | 
			
		||||
                                                    mbedtls_md4_context *ctx,
 | 
			
		||||
                                                    unsigned char output[16] )
 | 
			
		||||
{
 | 
			
		||||
    mbedtls_md4_finish_ret( ctx, output );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          MD4 process data block (internal use only)
 | 
			
		||||
 *
 | 
			
		||||
 * \deprecated     Superseded by mbedtls_internal_md4_process() in 2.7.0
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      MD4 context
 | 
			
		||||
 * \param data     buffer holding one block of data
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        MD4 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
MBEDTLS_DEPRECATED static inline void mbedtls_md4_process(
 | 
			
		||||
                                                mbedtls_md4_context *ctx,
 | 
			
		||||
                                                const unsigned char data[64] )
 | 
			
		||||
{
 | 
			
		||||
    mbedtls_internal_md4_process( ctx, data );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#undef MBEDTLS_DEPRECATED
 | 
			
		||||
#endif /* !MBEDTLS_DEPRECATED_REMOVED */
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -113,22 +274,63 @@ extern "C" {
 | 
			
		|||
/**
 | 
			
		||||
 * \brief          Output = MD4( input buffer )
 | 
			
		||||
 *
 | 
			
		||||
 * \param input    buffer holding the  data
 | 
			
		||||
 * \param input    buffer holding the data
 | 
			
		||||
 * \param ilen     length of the input data
 | 
			
		||||
 * \param output   MD4 checksum result
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        MD4 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_md4( const unsigned char *input, size_t ilen, unsigned char output[16] );
 | 
			
		||||
int mbedtls_md4_ret( const unsigned char *input,
 | 
			
		||||
                     size_t ilen,
 | 
			
		||||
                     unsigned char output[16] );
 | 
			
		||||
 | 
			
		||||
#if !defined(MBEDTLS_DEPRECATED_REMOVED)
 | 
			
		||||
#if defined(MBEDTLS_DEPRECATED_WARNING)
 | 
			
		||||
#define MBEDTLS_DEPRECATED      __attribute__((deprecated))
 | 
			
		||||
#else
 | 
			
		||||
#define MBEDTLS_DEPRECATED
 | 
			
		||||
#endif
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          Output = MD4( input buffer )
 | 
			
		||||
 *
 | 
			
		||||
 * \deprecated     Superseded by mbedtls_md4_ret() in 2.7.0
 | 
			
		||||
 *
 | 
			
		||||
 * \param input    buffer holding the data
 | 
			
		||||
 * \param ilen     length of the input data
 | 
			
		||||
 * \param output   MD4 checksum result
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        MD4 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
MBEDTLS_DEPRECATED static inline void mbedtls_md4( const unsigned char *input,
 | 
			
		||||
                                                   size_t ilen,
 | 
			
		||||
                                                   unsigned char output[16] )
 | 
			
		||||
{
 | 
			
		||||
    mbedtls_md4_ret( input, ilen, output );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#undef MBEDTLS_DEPRECATED
 | 
			
		||||
#endif /* !MBEDTLS_DEPRECATED_REMOVED */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          Checkup routine
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful, or 1 if the test failed
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        MD4 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_md4_self_test( int verbose );
 | 
			
		||||
 | 
			
		||||
/* Internal use */
 | 
			
		||||
void mbedtls_md4_process( mbedtls_md4_context *ctx, const unsigned char data[64] );
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,6 +3,11 @@
 | 
			
		|||
 *
 | 
			
		||||
 * \brief MD5 message digest algorithm (hash function)
 | 
			
		||||
 *
 | 
			
		||||
 * \warning   MD5 is considered a weak message digest and its use constitutes a
 | 
			
		||||
 *            security risk. We recommend considering stronger message
 | 
			
		||||
 *            digests instead.
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			@ -32,16 +37,28 @@
 | 
			
		|||
#include <stddef.h>
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
#define MBEDTLS_ERR_MD5_HW_ACCEL_FAILED                   -0x002F  /**< MD5 hardware accelerator failed */
 | 
			
		||||
 | 
			
		||||
#if !defined(MBEDTLS_MD5_ALT)
 | 
			
		||||
// Regular implementation
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \
 | 
			
		||||
    !defined(inline) && !defined(__cplusplus)
 | 
			
		||||
#define inline __inline
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          MD5 context structure
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        MD5 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
typedef struct
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -55,6 +72,11 @@ mbedtls_md5_context;
 | 
			
		|||
 * \brief          Initialize MD5 context
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      MD5 context to be initialized
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        MD5 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_md5_init( mbedtls_md5_context *ctx );
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -62,6 +84,11 @@ void mbedtls_md5_init( mbedtls_md5_context *ctx );
 | 
			
		|||
 * \brief          Clear MD5 context
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      MD5 context to be cleared
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        MD5 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_md5_free( mbedtls_md5_context *ctx );
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -70,6 +97,11 @@ void mbedtls_md5_free( mbedtls_md5_context *ctx );
 | 
			
		|||
 *
 | 
			
		||||
 * \param dst      The destination context
 | 
			
		||||
 * \param src      The context to be cloned
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        MD5 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_md5_clone( mbedtls_md5_context *dst,
 | 
			
		||||
                        const mbedtls_md5_context *src );
 | 
			
		||||
| 
						 | 
				
			
			@ -78,28 +110,154 @@ void mbedtls_md5_clone( mbedtls_md5_context *dst,
 | 
			
		|||
 * \brief          MD5 context setup
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      context to be initialized
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        MD5 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_md5_starts( mbedtls_md5_context *ctx );
 | 
			
		||||
int mbedtls_md5_starts_ret( mbedtls_md5_context *ctx );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          MD5 process buffer
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      MD5 context
 | 
			
		||||
 * \param input    buffer holding the  data
 | 
			
		||||
 * \param input    buffer holding the data
 | 
			
		||||
 * \param ilen     length of the input data
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        MD5 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_md5_update( mbedtls_md5_context *ctx, const unsigned char *input, size_t ilen );
 | 
			
		||||
int mbedtls_md5_update_ret( mbedtls_md5_context *ctx,
 | 
			
		||||
                            const unsigned char *input,
 | 
			
		||||
                            size_t ilen );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          MD5 final digest
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      MD5 context
 | 
			
		||||
 * \param output   MD5 checksum result
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        MD5 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_md5_finish( mbedtls_md5_context *ctx, unsigned char output[16] );
 | 
			
		||||
int mbedtls_md5_finish_ret( mbedtls_md5_context *ctx,
 | 
			
		||||
                            unsigned char output[16] );
 | 
			
		||||
 | 
			
		||||
/* Internal use */
 | 
			
		||||
void mbedtls_md5_process( mbedtls_md5_context *ctx, const unsigned char data[64] );
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          MD5 process data block (internal use only)
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      MD5 context
 | 
			
		||||
 * \param data     buffer holding one block of data
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        MD5 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_internal_md5_process( mbedtls_md5_context *ctx,
 | 
			
		||||
                                  const unsigned char data[64] );
 | 
			
		||||
 | 
			
		||||
#if !defined(MBEDTLS_DEPRECATED_REMOVED)
 | 
			
		||||
#if defined(MBEDTLS_DEPRECATED_WARNING)
 | 
			
		||||
#define MBEDTLS_DEPRECATED      __attribute__((deprecated))
 | 
			
		||||
#else
 | 
			
		||||
#define MBEDTLS_DEPRECATED
 | 
			
		||||
#endif
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          MD5 context setup
 | 
			
		||||
 *
 | 
			
		||||
 * \deprecated     Superseded by mbedtls_md5_starts_ret() in 2.7.0
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      context to be initialized
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        MD5 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
MBEDTLS_DEPRECATED static inline void mbedtls_md5_starts(
 | 
			
		||||
                                                    mbedtls_md5_context *ctx )
 | 
			
		||||
{
 | 
			
		||||
    mbedtls_md5_starts_ret( ctx );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          MD5 process buffer
 | 
			
		||||
 *
 | 
			
		||||
 * \deprecated     Superseded by mbedtls_md5_update_ret() in 2.7.0
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      MD5 context
 | 
			
		||||
 * \param input    buffer holding the data
 | 
			
		||||
 * \param ilen     length of the input data
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        MD5 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
MBEDTLS_DEPRECATED static inline void mbedtls_md5_update(
 | 
			
		||||
                                                    mbedtls_md5_context *ctx,
 | 
			
		||||
                                                    const unsigned char *input,
 | 
			
		||||
                                                    size_t ilen )
 | 
			
		||||
{
 | 
			
		||||
    mbedtls_md5_update_ret( ctx, input, ilen );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          MD5 final digest
 | 
			
		||||
 *
 | 
			
		||||
 * \deprecated     Superseded by mbedtls_md5_finish_ret() in 2.7.0
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      MD5 context
 | 
			
		||||
 * \param output   MD5 checksum result
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        MD5 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
MBEDTLS_DEPRECATED static inline void mbedtls_md5_finish(
 | 
			
		||||
                                                    mbedtls_md5_context *ctx,
 | 
			
		||||
                                                    unsigned char output[16] )
 | 
			
		||||
{
 | 
			
		||||
    mbedtls_md5_finish_ret( ctx, output );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          MD5 process data block (internal use only)
 | 
			
		||||
 *
 | 
			
		||||
 * \deprecated     Superseded by mbedtls_internal_md5_process() in 2.7.0
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      MD5 context
 | 
			
		||||
 * \param data     buffer holding one block of data
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        MD5 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
MBEDTLS_DEPRECATED static inline void mbedtls_md5_process(
 | 
			
		||||
                                                mbedtls_md5_context *ctx,
 | 
			
		||||
                                                const unsigned char data[64] )
 | 
			
		||||
{
 | 
			
		||||
    mbedtls_internal_md5_process( ctx, data );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#undef MBEDTLS_DEPRECATED
 | 
			
		||||
#endif /* !MBEDTLS_DEPRECATED_REMOVED */
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -116,16 +274,60 @@ extern "C" {
 | 
			
		|||
/**
 | 
			
		||||
 * \brief          Output = MD5( input buffer )
 | 
			
		||||
 *
 | 
			
		||||
 * \param input    buffer holding the  data
 | 
			
		||||
 * \param input    buffer holding the data
 | 
			
		||||
 * \param ilen     length of the input data
 | 
			
		||||
 * \param output   MD5 checksum result
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        MD5 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_md5( const unsigned char *input, size_t ilen, unsigned char output[16] );
 | 
			
		||||
int mbedtls_md5_ret( const unsigned char *input,
 | 
			
		||||
                     size_t ilen,
 | 
			
		||||
                     unsigned char output[16] );
 | 
			
		||||
 | 
			
		||||
#if !defined(MBEDTLS_DEPRECATED_REMOVED)
 | 
			
		||||
#if defined(MBEDTLS_DEPRECATED_WARNING)
 | 
			
		||||
#define MBEDTLS_DEPRECATED      __attribute__((deprecated))
 | 
			
		||||
#else
 | 
			
		||||
#define MBEDTLS_DEPRECATED
 | 
			
		||||
#endif
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          Output = MD5( input buffer )
 | 
			
		||||
 *
 | 
			
		||||
 * \deprecated     Superseded by mbedtls_md5_ret() in 2.7.0
 | 
			
		||||
 *
 | 
			
		||||
 * \param input    buffer holding the data
 | 
			
		||||
 * \param ilen     length of the input data
 | 
			
		||||
 * \param output   MD5 checksum result
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        MD5 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
MBEDTLS_DEPRECATED static inline void mbedtls_md5( const unsigned char *input,
 | 
			
		||||
                                                   size_t ilen,
 | 
			
		||||
                                                   unsigned char output[16] )
 | 
			
		||||
{
 | 
			
		||||
    mbedtls_md5_ret( input, ilen, output );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#undef MBEDTLS_DEPRECATED
 | 
			
		||||
#endif /* !MBEDTLS_DEPRECATED_REMOVED */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          Checkup routine
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful, or 1 if the test failed
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        MD5 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_md5_self_test( int verbose );
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,7 +6,8 @@
 | 
			
		|||
 * \warning This in an internal header. Do not include directly.
 | 
			
		||||
 *
 | 
			
		||||
 * \author Adriaan de Jong <dejong@fox-it.com>
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			@ -58,17 +59,17 @@ struct mbedtls_md_info_t
 | 
			
		|||
    int block_size;
 | 
			
		||||
 | 
			
		||||
    /** Digest initialisation function */
 | 
			
		||||
    void (*starts_func)( void *ctx );
 | 
			
		||||
    int (*starts_func)( void *ctx );
 | 
			
		||||
 | 
			
		||||
    /** Digest update function */
 | 
			
		||||
    void (*update_func)( void *ctx, const unsigned char *input, size_t ilen );
 | 
			
		||||
    int (*update_func)( void *ctx, const unsigned char *input, size_t ilen );
 | 
			
		||||
 | 
			
		||||
    /** Digest finalisation function */
 | 
			
		||||
    void (*finish_func)( void *ctx, unsigned char *output );
 | 
			
		||||
    int (*finish_func)( void *ctx, unsigned char *output );
 | 
			
		||||
 | 
			
		||||
    /** Generic digest function */
 | 
			
		||||
    void (*digest_func)( const unsigned char *input, size_t ilen,
 | 
			
		||||
                         unsigned char *output );
 | 
			
		||||
    int (*digest_func)( const unsigned char *input, size_t ilen,
 | 
			
		||||
                        unsigned char *output );
 | 
			
		||||
 | 
			
		||||
    /** Allocate a new context */
 | 
			
		||||
    void * (*ctx_alloc_func)( void );
 | 
			
		||||
| 
						 | 
				
			
			@ -80,7 +81,7 @@ struct mbedtls_md_info_t
 | 
			
		|||
    void (*clone_func)( void *dst, const void *src );
 | 
			
		||||
 | 
			
		||||
    /** Internal use only */
 | 
			
		||||
    void (*process_func)( void *ctx, const unsigned char *input );
 | 
			
		||||
    int (*process_func)( void *ctx, const unsigned char *input );
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_MD2_C)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,8 @@
 | 
			
		|||
 * \file memory_buffer_alloc.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief Buffer-based memory allocator
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,6 +3,9 @@
 | 
			
		|||
 *
 | 
			
		||||
 * \brief Deprecated header file that includes mbedtls/net_sockets.h
 | 
			
		||||
 *
 | 
			
		||||
 * \deprecated Superseded by mbedtls/net_sockets.h
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2016, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			@ -19,8 +22,6 @@
 | 
			
		|||
 *  limitations under the License.
 | 
			
		||||
 *
 | 
			
		||||
 *  This file is part of mbed TLS (https://tls.mbed.org)
 | 
			
		||||
 *
 | 
			
		||||
 * \deprecated Superseded by mbedtls/net_sockets.h
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#if !defined(MBEDTLS_DEPRECATED_REMOVED)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,8 @@
 | 
			
		|||
 * \file net_sockets.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief Network communication functions
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,8 @@
 | 
			
		|||
 * \file oid.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief Object Identifier (OID) database
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,7 +3,8 @@
 | 
			
		|||
 *
 | 
			
		||||
 * \brief VIA PadLock ACE for HW encryption/decryption supported by some
 | 
			
		||||
 *        processors
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,8 @@
 | 
			
		|||
 * \file pem.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief Privacy Enhanced Mail (PEM) decoding
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -66,6 +66,7 @@
 | 
			
		|||
#define MBEDTLS_ERR_PK_UNKNOWN_NAMED_CURVE -0x3A00  /**< Elliptic curve is unsupported (only NIST curves are supported). */
 | 
			
		||||
#define MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE -0x3980  /**< Unavailable feature, e.g. RSA disabled for RSA key. */
 | 
			
		||||
#define MBEDTLS_ERR_PK_SIG_LEN_MISMATCH    -0x3900  /**< The signature is valid but its length is less than expected. */
 | 
			
		||||
#define MBEDTLS_ERR_PK_HW_ACCEL_FAILED     -0x3880  /**< PK hardware accelerator failed. */
 | 
			
		||||
#define MBEDTLS_ERR_PK_INVALID_SIGNATURE   -0x3800  /**< Invalid signature */
 | 
			
		||||
#define MBEDTLS_ERR_PK_BUFFER_TOO_SMALL    -0x3780  /**< Output buffer too small */
 | 
			
		||||
#define MBEDTLS_ERR_PK_NOT_PERMITTED       -0x3700  /**< Operation not permitted */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,7 +4,8 @@
 | 
			
		|||
 * \brief Wrapper for PKCS#11 library libpkcs11-helper
 | 
			
		||||
 *
 | 
			
		||||
 * \author Adriaan de Jong <dejong@fox-it.com>
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,8 @@
 | 
			
		|||
 * \file pkcs12.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief PKCS#12 Personal Information Exchange Syntax
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,7 +4,8 @@
 | 
			
		|||
 * \brief PKCS#5 functions
 | 
			
		||||
 *
 | 
			
		||||
 * \author Mathias Olsson <mathias@kompetensum.com>
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,9 +1,10 @@
 | 
			
		|||
/**
 | 
			
		||||
 * \file platform.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief mbed TLS Platform abstraction layer
 | 
			
		||||
 *
 | 
			
		||||
 *  Copyright (C) 2006-2016, ARM Limited, All Rights Reserved
 | 
			
		||||
 * \brief The Mbed TLS platform abstraction layer.
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
 *  Licensed under the Apache License, Version 2.0 (the "License"); you may
 | 
			
		||||
| 
						 | 
				
			
			@ -18,7 +19,7 @@
 | 
			
		|||
 *  See the License for the specific language governing permissions and
 | 
			
		||||
 *  limitations under the License.
 | 
			
		||||
 *
 | 
			
		||||
 *  This file is part of mbed TLS (https://tls.mbed.org)
 | 
			
		||||
 *  This file is part of Mbed TLS (https://tls.mbed.org)
 | 
			
		||||
 */
 | 
			
		||||
#ifndef MBEDTLS_PLATFORM_H
 | 
			
		||||
#define MBEDTLS_PLATFORM_H
 | 
			
		||||
| 
						 | 
				
			
			@ -51,34 +52,34 @@ extern "C" {
 | 
			
		|||
#include <time.h>
 | 
			
		||||
#if !defined(MBEDTLS_PLATFORM_STD_SNPRINTF)
 | 
			
		||||
#if defined(_WIN32)
 | 
			
		||||
#define MBEDTLS_PLATFORM_STD_SNPRINTF   mbedtls_platform_win32_snprintf /**< Default snprintf to use  */
 | 
			
		||||
#define MBEDTLS_PLATFORM_STD_SNPRINTF   mbedtls_platform_win32_snprintf /**< The default \c snprintf function to use.  */
 | 
			
		||||
#else
 | 
			
		||||
#define MBEDTLS_PLATFORM_STD_SNPRINTF   snprintf /**< Default snprintf to use  */
 | 
			
		||||
#define MBEDTLS_PLATFORM_STD_SNPRINTF   snprintf /**< The default \c snprintf function to use.  */
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
#if !defined(MBEDTLS_PLATFORM_STD_PRINTF)
 | 
			
		||||
#define MBEDTLS_PLATFORM_STD_PRINTF   printf /**< Default printf to use  */
 | 
			
		||||
#define MBEDTLS_PLATFORM_STD_PRINTF   printf /**< The default \c printf function to use. */
 | 
			
		||||
#endif
 | 
			
		||||
#if !defined(MBEDTLS_PLATFORM_STD_FPRINTF)
 | 
			
		||||
#define MBEDTLS_PLATFORM_STD_FPRINTF fprintf /**< Default fprintf to use */
 | 
			
		||||
#define MBEDTLS_PLATFORM_STD_FPRINTF fprintf /**< The default \c fprintf function to use. */
 | 
			
		||||
#endif
 | 
			
		||||
#if !defined(MBEDTLS_PLATFORM_STD_CALLOC)
 | 
			
		||||
#define MBEDTLS_PLATFORM_STD_CALLOC   calloc /**< Default allocator to use */
 | 
			
		||||
#define MBEDTLS_PLATFORM_STD_CALLOC   calloc /**< The default \c calloc function to use. */
 | 
			
		||||
#endif
 | 
			
		||||
#if !defined(MBEDTLS_PLATFORM_STD_FREE)
 | 
			
		||||
#define MBEDTLS_PLATFORM_STD_FREE       free /**< Default free to use */
 | 
			
		||||
#define MBEDTLS_PLATFORM_STD_FREE       free /**< The default \c free function to use. */
 | 
			
		||||
#endif
 | 
			
		||||
#if !defined(MBEDTLS_PLATFORM_STD_EXIT)
 | 
			
		||||
#define MBEDTLS_PLATFORM_STD_EXIT      exit /**< Default exit to use */
 | 
			
		||||
#define MBEDTLS_PLATFORM_STD_EXIT      exit /**< The default \c exit function to use. */
 | 
			
		||||
#endif
 | 
			
		||||
#if !defined(MBEDTLS_PLATFORM_STD_TIME)
 | 
			
		||||
#define MBEDTLS_PLATFORM_STD_TIME       time    /**< Default time to use */
 | 
			
		||||
#define MBEDTLS_PLATFORM_STD_TIME       time    /**< The default \c time function to use. */
 | 
			
		||||
#endif
 | 
			
		||||
#if !defined(MBEDTLS_PLATFORM_STD_EXIT_SUCCESS)
 | 
			
		||||
#define MBEDTLS_PLATFORM_STD_EXIT_SUCCESS  EXIT_SUCCESS /**< Default exit value to use */
 | 
			
		||||
#define MBEDTLS_PLATFORM_STD_EXIT_SUCCESS  EXIT_SUCCESS /**< The default exit value to use. */
 | 
			
		||||
#endif
 | 
			
		||||
#if !defined(MBEDTLS_PLATFORM_STD_EXIT_FAILURE)
 | 
			
		||||
#define MBEDTLS_PLATFORM_STD_EXIT_FAILURE  EXIT_FAILURE /**< Default exit value to use */
 | 
			
		||||
#define MBEDTLS_PLATFORM_STD_EXIT_FAILURE  EXIT_FAILURE /**< The default exit value to use. */
 | 
			
		||||
#endif
 | 
			
		||||
#if defined(MBEDTLS_FS_IO)
 | 
			
		||||
#if !defined(MBEDTLS_PLATFORM_STD_NV_SEED_READ)
 | 
			
		||||
| 
						 | 
				
			
			@ -115,12 +116,12 @@ extern void * (*mbedtls_calloc)( size_t n, size_t size );
 | 
			
		|||
extern void (*mbedtls_free)( void *ptr );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief   Set your own memory implementation function pointers
 | 
			
		||||
 * \brief   This function allows configuring custom memory-management functions.
 | 
			
		||||
 *
 | 
			
		||||
 * \param calloc_func   the calloc function implementation
 | 
			
		||||
 * \param free_func     the free function implementation
 | 
			
		||||
 * \param calloc_func   The \c calloc function implementation.
 | 
			
		||||
 * \param free_func     The \c free function implementation.
 | 
			
		||||
 *
 | 
			
		||||
 * \return              0 if successful
 | 
			
		||||
 * \return              \c 0.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_platform_set_calloc_free( void * (*calloc_func)( size_t, size_t ),
 | 
			
		||||
                              void (*free_func)( void * ) );
 | 
			
		||||
| 
						 | 
				
			
			@ -139,11 +140,11 @@ int mbedtls_platform_set_calloc_free( void * (*calloc_func)( size_t, size_t ),
 | 
			
		|||
extern int (*mbedtls_fprintf)( FILE *stream, const char *format, ... );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief   Set your own fprintf function pointer
 | 
			
		||||
 * \brief   This function allows configuring a custom \p fprintf function pointer.
 | 
			
		||||
 *
 | 
			
		||||
 * \param fprintf_func   the fprintf function implementation
 | 
			
		||||
 * \param fprintf_func   The \c fprintf function implementation.
 | 
			
		||||
 *
 | 
			
		||||
 * \return              0
 | 
			
		||||
 * \return               \c 0.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_platform_set_fprintf( int (*fprintf_func)( FILE *stream, const char *,
 | 
			
		||||
                                               ... ) );
 | 
			
		||||
| 
						 | 
				
			
			@ -162,11 +163,12 @@ int mbedtls_platform_set_fprintf( int (*fprintf_func)( FILE *stream, const char
 | 
			
		|||
extern int (*mbedtls_printf)( const char *format, ... );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief   Set your own printf function pointer
 | 
			
		||||
 * \brief    This function allows configuring a custom \c printf function
 | 
			
		||||
 *           pointer.
 | 
			
		||||
 *
 | 
			
		||||
 * \param printf_func   the printf function implementation
 | 
			
		||||
 * \param printf_func   The \c printf function implementation.
 | 
			
		||||
 *
 | 
			
		||||
 * \return              0
 | 
			
		||||
 * \return              \c 0 on success.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_platform_set_printf( int (*printf_func)( const char *, ... ) );
 | 
			
		||||
#else /* !MBEDTLS_PLATFORM_PRINTF_ALT */
 | 
			
		||||
| 
						 | 
				
			
			@ -195,11 +197,12 @@ int mbedtls_platform_win32_snprintf( char *s, size_t n, const char *fmt, ... );
 | 
			
		|||
extern int (*mbedtls_snprintf)( char * s, size_t n, const char * format, ... );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief   Set your own snprintf function pointer
 | 
			
		||||
 * \brief   This function allows configuring a custom \c snprintf function
 | 
			
		||||
 *          pointer.
 | 
			
		||||
 *
 | 
			
		||||
 * \param snprintf_func   the snprintf function implementation
 | 
			
		||||
 * \param snprintf_func   The \c snprintf function implementation.
 | 
			
		||||
 *
 | 
			
		||||
 * \return              0
 | 
			
		||||
 * \return    \c 0 on success.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_platform_set_snprintf( int (*snprintf_func)( char * s, size_t n,
 | 
			
		||||
                                                 const char * format, ... ) );
 | 
			
		||||
| 
						 | 
				
			
			@ -218,11 +221,12 @@ int mbedtls_platform_set_snprintf( int (*snprintf_func)( char * s, size_t n,
 | 
			
		|||
extern void (*mbedtls_exit)( int status );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief   Set your own exit function pointer
 | 
			
		||||
 * \brief   This function allows configuring a custom \c exit function
 | 
			
		||||
 *          pointer.
 | 
			
		||||
 *
 | 
			
		||||
 * \param exit_func   the exit function implementation
 | 
			
		||||
 * \param exit_func   The \c exit function implementation.
 | 
			
		||||
 *
 | 
			
		||||
 * \return              0
 | 
			
		||||
 * \return  \c 0 on success.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_platform_set_exit( void (*exit_func)( int status ) );
 | 
			
		||||
#else
 | 
			
		||||
| 
						 | 
				
			
			@ -265,12 +269,13 @@ extern int (*mbedtls_nv_seed_read)( unsigned char *buf, size_t buf_len );
 | 
			
		|||
extern int (*mbedtls_nv_seed_write)( unsigned char *buf, size_t buf_len );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief   Set your own seed file writing/reading functions
 | 
			
		||||
 * \brief   This function allows configuring custom seed file writing and
 | 
			
		||||
 *          reading functions.
 | 
			
		||||
 *
 | 
			
		||||
 * \param   nv_seed_read_func   the seed reading function implementation
 | 
			
		||||
 * \param   nv_seed_write_func  the seed writing function implementation
 | 
			
		||||
 * \param   nv_seed_read_func   The seed reading function implementation.
 | 
			
		||||
 * \param   nv_seed_write_func  The seed writing function implementation.
 | 
			
		||||
 *
 | 
			
		||||
 * \return              0
 | 
			
		||||
 * \return  \c 0 on success.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_platform_set_nv_seed(
 | 
			
		||||
            int (*nv_seed_read_func)( unsigned char *buf, size_t buf_len ),
 | 
			
		||||
| 
						 | 
				
			
			@ -291,13 +296,13 @@ int mbedtls_platform_set_nv_seed(
 | 
			
		|||
#if !defined(MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief   Platform context structure
 | 
			
		||||
 * \brief   The platform context structure.
 | 
			
		||||
 *
 | 
			
		||||
 * \note    This structure may be used to assist platform-specific
 | 
			
		||||
 *          setup/teardown operations.
 | 
			
		||||
 *          setup or teardown operations.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct {
 | 
			
		||||
    char dummy; /**< Placeholder member as empty structs are not portable */
 | 
			
		||||
    char dummy; /**< Placeholder member, as empty structs are not portable. */
 | 
			
		||||
}
 | 
			
		||||
mbedtls_platform_context;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -306,32 +311,32 @@ mbedtls_platform_context;
 | 
			
		|||
#endif /* !MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief   Perform any platform initialisation operations
 | 
			
		||||
 * \brief   This function performs any platform initialization operations.
 | 
			
		||||
 *
 | 
			
		||||
 * \param   ctx     mbed TLS context
 | 
			
		||||
 * \param   ctx     The Mbed TLS context.
 | 
			
		||||
 *
 | 
			
		||||
 * \return  0 if successful
 | 
			
		||||
 * \return  \c 0 on success.
 | 
			
		||||
 *
 | 
			
		||||
 * \note    This function is intended to allow platform specific initialisation,
 | 
			
		||||
 * \note    This function is intended to allow platform-specific initialization,
 | 
			
		||||
 *          and should be called before any other library functions. Its
 | 
			
		||||
 *          implementation is platform specific, and by default, unless platform
 | 
			
		||||
 *          specific code is provided, it does nothing.
 | 
			
		||||
 *          implementation is platform-specific, and unless
 | 
			
		||||
 *          platform-specific code is provided, it does nothing.
 | 
			
		||||
 *
 | 
			
		||||
 *          Its use and whether its necessary to be called is dependent on the
 | 
			
		||||
 *          Its use and whether it is necessary to call it is dependent on the
 | 
			
		||||
 *          platform.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_platform_setup( mbedtls_platform_context *ctx );
 | 
			
		||||
/**
 | 
			
		||||
 * \brief   Perform any platform teardown operations
 | 
			
		||||
 * \brief   This function performs any platform teardown operations.
 | 
			
		||||
 *
 | 
			
		||||
 * \param   ctx     mbed TLS context
 | 
			
		||||
 * \param   ctx     The Mbed TLS context.
 | 
			
		||||
 *
 | 
			
		||||
 * \note    This function should be called after every other mbed TLS module has
 | 
			
		||||
 *          been correctly freed using the appropriate free function.
 | 
			
		||||
 *          Its implementation is platform specific, and by default, unless
 | 
			
		||||
 *          platform specific code is provided, it does nothing.
 | 
			
		||||
 * \note    This function should be called after every other Mbed TLS module
 | 
			
		||||
 *          has been correctly freed using the appropriate free function.
 | 
			
		||||
 *          Its implementation is platform-specific, and unless
 | 
			
		||||
 *          platform-specific code is provided, it does nothing.
 | 
			
		||||
 *
 | 
			
		||||
 *          Its use and whether its necessary to be called is dependent on the
 | 
			
		||||
 *          Its use and whether it is necessary to call it is dependent on the
 | 
			
		||||
 *          platform.
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_platform_teardown( mbedtls_platform_context *ctx );
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,8 @@
 | 
			
		|||
 * \file platform_time.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief mbed TLS Platform time abstraction
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2016, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,8 @@
 | 
			
		|||
 * \file ripemd160.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief RIPE MD-160 message digest
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			@ -32,6 +33,13 @@
 | 
			
		|||
#include <stddef.h>
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
#define MBEDTLS_ERR_RIPEMD160_HW_ACCEL_FAILED             -0x0031  /**< RIPEMD160 hardware accelerator failed */
 | 
			
		||||
 | 
			
		||||
#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \
 | 
			
		||||
    !defined(inline) && !defined(__cplusplus)
 | 
			
		||||
#define inline __inline
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined(MBEDTLS_RIPEMD160_ALT)
 | 
			
		||||
// Regular implementation
 | 
			
		||||
//
 | 
			
		||||
| 
						 | 
				
			
			@ -78,36 +86,121 @@ void mbedtls_ripemd160_clone( mbedtls_ripemd160_context *dst,
 | 
			
		|||
 * \brief          RIPEMD-160 context setup
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      context to be initialized
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_ripemd160_starts( mbedtls_ripemd160_context *ctx );
 | 
			
		||||
int mbedtls_ripemd160_starts_ret( mbedtls_ripemd160_context *ctx );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          RIPEMD-160 process buffer
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      RIPEMD-160 context
 | 
			
		||||
 * \param input    buffer holding the  data
 | 
			
		||||
 * \param input    buffer holding the data
 | 
			
		||||
 * \param ilen     length of the input data
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_ripemd160_update( mbedtls_ripemd160_context *ctx,
 | 
			
		||||
                       const unsigned char *input, size_t ilen );
 | 
			
		||||
int mbedtls_ripemd160_update_ret( mbedtls_ripemd160_context *ctx,
 | 
			
		||||
                                  const unsigned char *input,
 | 
			
		||||
                                  size_t ilen );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          RIPEMD-160 final digest
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      RIPEMD-160 context
 | 
			
		||||
 * \param output   RIPEMD-160 checksum result
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_ripemd160_finish( mbedtls_ripemd160_context *ctx, unsigned char output[20] );
 | 
			
		||||
int mbedtls_ripemd160_finish_ret( mbedtls_ripemd160_context *ctx,
 | 
			
		||||
                                  unsigned char output[20] );
 | 
			
		||||
 | 
			
		||||
/* Internal use */
 | 
			
		||||
void mbedtls_ripemd160_process( mbedtls_ripemd160_context *ctx, const unsigned char data[64] );
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          RIPEMD-160 process data block (internal use only)
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      RIPEMD-160 context
 | 
			
		||||
 * \param data     buffer holding one block of data
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_internal_ripemd160_process( mbedtls_ripemd160_context *ctx,
 | 
			
		||||
                                        const unsigned char data[64] );
 | 
			
		||||
 | 
			
		||||
#if !defined(MBEDTLS_DEPRECATED_REMOVED)
 | 
			
		||||
#if defined(MBEDTLS_DEPRECATED_WARNING)
 | 
			
		||||
#define MBEDTLS_DEPRECATED      __attribute__((deprecated))
 | 
			
		||||
#else
 | 
			
		||||
#define MBEDTLS_DEPRECATED
 | 
			
		||||
#endif
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          RIPEMD-160 context setup
 | 
			
		||||
 *
 | 
			
		||||
 * \deprecated     Superseded by mbedtls_ripemd160_starts_ret() in 2.7.0
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      context to be initialized
 | 
			
		||||
 */
 | 
			
		||||
MBEDTLS_DEPRECATED static inline void mbedtls_ripemd160_starts(
 | 
			
		||||
                                            mbedtls_ripemd160_context *ctx )
 | 
			
		||||
{
 | 
			
		||||
    mbedtls_ripemd160_starts_ret( ctx );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          RIPEMD-160 process buffer
 | 
			
		||||
 *
 | 
			
		||||
 * \deprecated     Superseded by mbedtls_ripemd160_update_ret() in 2.7.0
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      RIPEMD-160 context
 | 
			
		||||
 * \param input    buffer holding the data
 | 
			
		||||
 * \param ilen     length of the input data
 | 
			
		||||
 */
 | 
			
		||||
MBEDTLS_DEPRECATED static inline void mbedtls_ripemd160_update(
 | 
			
		||||
                                                mbedtls_ripemd160_context *ctx,
 | 
			
		||||
                                                const unsigned char *input,
 | 
			
		||||
                                                size_t ilen )
 | 
			
		||||
{
 | 
			
		||||
    mbedtls_ripemd160_update_ret( ctx, input, ilen );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          RIPEMD-160 final digest
 | 
			
		||||
 *
 | 
			
		||||
 * \deprecated     Superseded by mbedtls_ripemd160_finish_ret() in 2.7.0
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      RIPEMD-160 context
 | 
			
		||||
 * \param output   RIPEMD-160 checksum result
 | 
			
		||||
 */
 | 
			
		||||
MBEDTLS_DEPRECATED static inline void mbedtls_ripemd160_finish(
 | 
			
		||||
                                                mbedtls_ripemd160_context *ctx,
 | 
			
		||||
                                                unsigned char output[20] )
 | 
			
		||||
{
 | 
			
		||||
    mbedtls_ripemd160_finish_ret( ctx, output );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          RIPEMD-160 process data block (internal use only)
 | 
			
		||||
 *
 | 
			
		||||
 * \deprecated     Superseded by mbedtls_internal_ripemd160_process() in 2.7.0
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      RIPEMD-160 context
 | 
			
		||||
 * \param data     buffer holding one block of data
 | 
			
		||||
 */
 | 
			
		||||
MBEDTLS_DEPRECATED static inline void mbedtls_ripemd160_process(
 | 
			
		||||
                                            mbedtls_ripemd160_context *ctx,
 | 
			
		||||
                                            const unsigned char data[64] )
 | 
			
		||||
{
 | 
			
		||||
    mbedtls_internal_ripemd160_process( ctx, data );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#undef MBEDTLS_DEPRECATED
 | 
			
		||||
#endif /* !MBEDTLS_DEPRECATED_REMOVED */
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#else  /* MBEDTLS_RIPEMD160_ALT */
 | 
			
		||||
#include "ripemd160.h"
 | 
			
		||||
#include "ripemd160_alt.h"
 | 
			
		||||
#endif /* MBEDTLS_RIPEMD160_ALT */
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
| 
						 | 
				
			
			@ -117,12 +210,41 @@ extern "C" {
 | 
			
		|||
/**
 | 
			
		||||
 * \brief          Output = RIPEMD-160( input buffer )
 | 
			
		||||
 *
 | 
			
		||||
 * \param input    buffer holding the  data
 | 
			
		||||
 * \param input    buffer holding the data
 | 
			
		||||
 * \param ilen     length of the input data
 | 
			
		||||
 * \param output   RIPEMD-160 checksum result
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_ripemd160_ret( const unsigned char *input,
 | 
			
		||||
                           size_t ilen,
 | 
			
		||||
                           unsigned char output[20] );
 | 
			
		||||
 | 
			
		||||
#if !defined(MBEDTLS_DEPRECATED_REMOVED)
 | 
			
		||||
#if defined(MBEDTLS_DEPRECATED_WARNING)
 | 
			
		||||
#define MBEDTLS_DEPRECATED      __attribute__((deprecated))
 | 
			
		||||
#else
 | 
			
		||||
#define MBEDTLS_DEPRECATED
 | 
			
		||||
#endif
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          Output = RIPEMD-160( input buffer )
 | 
			
		||||
 *
 | 
			
		||||
 * \deprecated     Superseded by mbedtls_ripemd160_ret() in 2.7.0
 | 
			
		||||
 *
 | 
			
		||||
 * \param input    buffer holding the data
 | 
			
		||||
 * \param ilen     length of the input data
 | 
			
		||||
 * \param output   RIPEMD-160 checksum result
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_ripemd160( const unsigned char *input, size_t ilen,
 | 
			
		||||
                unsigned char output[20] );
 | 
			
		||||
MBEDTLS_DEPRECATED static inline void mbedtls_ripemd160(
 | 
			
		||||
                                                    const unsigned char *input,
 | 
			
		||||
                                                    size_t ilen,
 | 
			
		||||
                                                    unsigned char output[20] )
 | 
			
		||||
{
 | 
			
		||||
    mbedtls_ripemd160_ret( input, ilen, output );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#undef MBEDTLS_DEPRECATED
 | 
			
		||||
#endif /* !MBEDTLS_DEPRECATED_REMOVED */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          Checkup routine
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							| 
						 | 
				
			
			@ -2,7 +2,8 @@
 | 
			
		|||
 * \file rsa_internal.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief Context-independent RSA helper functions
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2017, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,9 +1,14 @@
 | 
			
		|||
/**
 | 
			
		||||
 * \file sha1.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief SHA-1 cryptographic hash function
 | 
			
		||||
 * \brief The SHA-1 cryptographic hash function.
 | 
			
		||||
 *
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 * \warning   SHA-1 is considered a weak message digest and its use constitutes
 | 
			
		||||
 *            a security risk. We recommend considering stronger message
 | 
			
		||||
 *            digests instead.
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
 *  Licensed under the Apache License, Version 2.0 (the "License"); you may
 | 
			
		||||
| 
						 | 
				
			
			@ -18,7 +23,7 @@
 | 
			
		|||
 *  See the License for the specific language governing permissions and
 | 
			
		||||
 *  limitations under the License.
 | 
			
		||||
 *
 | 
			
		||||
 *  This file is part of mbed TLS (https://tls.mbed.org)
 | 
			
		||||
 *  This file is part of Mbed TLS (https://tls.mbed.org)
 | 
			
		||||
 */
 | 
			
		||||
#ifndef MBEDTLS_SHA1_H
 | 
			
		||||
#define MBEDTLS_SHA1_H
 | 
			
		||||
| 
						 | 
				
			
			@ -32,6 +37,13 @@
 | 
			
		|||
#include <stddef.h>
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
#define MBEDTLS_ERR_SHA1_HW_ACCEL_FAILED                  -0x0035  /**< SHA-1 hardware accelerator failed */
 | 
			
		||||
 | 
			
		||||
#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \
 | 
			
		||||
    !defined(inline) && !defined(__cplusplus)
 | 
			
		||||
#define inline __inline
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined(MBEDTLS_SHA1_ALT)
 | 
			
		||||
// Regular implementation
 | 
			
		||||
//
 | 
			
		||||
| 
						 | 
				
			
			@ -41,65 +53,213 @@ extern "C" {
 | 
			
		|||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          SHA-1 context structure
 | 
			
		||||
 * \brief          The SHA-1 context structure.
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        SHA-1 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
typedef struct
 | 
			
		||||
{
 | 
			
		||||
    uint32_t total[2];          /*!< number of bytes processed  */
 | 
			
		||||
    uint32_t state[5];          /*!< intermediate digest state  */
 | 
			
		||||
    unsigned char buffer[64];   /*!< data block being processed */
 | 
			
		||||
    uint32_t total[2];          /*!< The number of Bytes processed.  */
 | 
			
		||||
    uint32_t state[5];          /*!< The intermediate digest state.  */
 | 
			
		||||
    unsigned char buffer[64];   /*!< The data block being processed. */
 | 
			
		||||
}
 | 
			
		||||
mbedtls_sha1_context;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          Initialize SHA-1 context
 | 
			
		||||
 * \brief          This function initializes a SHA-1 context.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      The SHA-1 context to initialize.
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        SHA-1 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      SHA-1 context to be initialized
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_sha1_init( mbedtls_sha1_context *ctx );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          Clear SHA-1 context
 | 
			
		||||
 * \brief          This function clears a SHA-1 context.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      The SHA-1 context to clear.
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        SHA-1 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      SHA-1 context to be cleared
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_sha1_free( mbedtls_sha1_context *ctx );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          Clone (the state of) a SHA-1 context
 | 
			
		||||
 * \brief          This function clones the state of a SHA-1 context.
 | 
			
		||||
 *
 | 
			
		||||
 * \param dst      The destination context.
 | 
			
		||||
 * \param src      The context to clone.
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        SHA-1 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 * \param dst      The destination context
 | 
			
		||||
 * \param src      The context to be cloned
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_sha1_clone( mbedtls_sha1_context *dst,
 | 
			
		||||
                         const mbedtls_sha1_context *src );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          This function starts a SHA-1 checksum calculation.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      The context to initialize.
 | 
			
		||||
 *
 | 
			
		||||
 * \return         \c 0 if successful
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        SHA-1 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_sha1_starts_ret( mbedtls_sha1_context *ctx );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          This function feeds an input buffer into an ongoing SHA-1
 | 
			
		||||
 *                 checksum calculation.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      The SHA-1 context.
 | 
			
		||||
 * \param input    The buffer holding the input data.
 | 
			
		||||
 * \param ilen     The length of the input data.
 | 
			
		||||
 *
 | 
			
		||||
 * \return         \c 0 if successful
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        SHA-1 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_sha1_update_ret( mbedtls_sha1_context *ctx,
 | 
			
		||||
                             const unsigned char *input,
 | 
			
		||||
                             size_t ilen );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          This function finishes the SHA-1 operation, and writes
 | 
			
		||||
 *                 the result to the output buffer.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      The SHA-1 context.
 | 
			
		||||
 * \param output   The SHA-1 checksum result.
 | 
			
		||||
 *
 | 
			
		||||
 * \return         \c 0 if successful
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        SHA-1 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_sha1_finish_ret( mbedtls_sha1_context *ctx,
 | 
			
		||||
                             unsigned char output[20] );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          SHA-1 process data block (internal use only)
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      SHA-1 context
 | 
			
		||||
 * \param data     The data block being processed.
 | 
			
		||||
 *
 | 
			
		||||
 * \return         \c 0 if successful
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        SHA-1 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_internal_sha1_process( mbedtls_sha1_context *ctx,
 | 
			
		||||
                                   const unsigned char data[64] );
 | 
			
		||||
 | 
			
		||||
#if !defined(MBEDTLS_DEPRECATED_REMOVED)
 | 
			
		||||
#if defined(MBEDTLS_DEPRECATED_WARNING)
 | 
			
		||||
#define MBEDTLS_DEPRECATED      __attribute__((deprecated))
 | 
			
		||||
#else
 | 
			
		||||
#define MBEDTLS_DEPRECATED
 | 
			
		||||
#endif
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          SHA-1 context setup
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      context to be initialized
 | 
			
		||||
 * \deprecated     Superseded by mbedtls_sha1_starts_ret() in 2.7.0
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      The SHA-1 context to be initialized.
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        SHA-1 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_sha1_starts( mbedtls_sha1_context *ctx );
 | 
			
		||||
MBEDTLS_DEPRECATED static inline void mbedtls_sha1_starts(
 | 
			
		||||
                                                mbedtls_sha1_context *ctx )
 | 
			
		||||
{
 | 
			
		||||
    mbedtls_sha1_starts_ret( ctx );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          SHA-1 process buffer
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      SHA-1 context
 | 
			
		||||
 * \param input    buffer holding the  data
 | 
			
		||||
 * \param ilen     length of the input data
 | 
			
		||||
 * \deprecated     Superseded by mbedtls_sha1_update_ret() in 2.7.0
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      The SHA-1 context.
 | 
			
		||||
 * \param input    The buffer holding the input data.
 | 
			
		||||
 * \param ilen     The length of the input data.
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        SHA-1 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_sha1_update( mbedtls_sha1_context *ctx, const unsigned char *input, size_t ilen );
 | 
			
		||||
MBEDTLS_DEPRECATED static inline void mbedtls_sha1_update(
 | 
			
		||||
                                                mbedtls_sha1_context *ctx,
 | 
			
		||||
                                                const unsigned char *input,
 | 
			
		||||
                                                size_t ilen )
 | 
			
		||||
{
 | 
			
		||||
    mbedtls_sha1_update_ret( ctx, input, ilen );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          SHA-1 final digest
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      SHA-1 context
 | 
			
		||||
 * \param output   SHA-1 checksum result
 | 
			
		||||
 * \deprecated     Superseded by mbedtls_sha1_finish_ret() in 2.7.0
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      The SHA-1 context.
 | 
			
		||||
 * \param output   The SHA-1 checksum result.
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        SHA-1 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_sha1_finish( mbedtls_sha1_context *ctx, unsigned char output[20] );
 | 
			
		||||
MBEDTLS_DEPRECATED static inline void mbedtls_sha1_finish(
 | 
			
		||||
                                                mbedtls_sha1_context *ctx,
 | 
			
		||||
                                                unsigned char output[20] )
 | 
			
		||||
{
 | 
			
		||||
    mbedtls_sha1_finish_ret( ctx, output );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Internal use */
 | 
			
		||||
void mbedtls_sha1_process( mbedtls_sha1_context *ctx, const unsigned char data[64] );
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          SHA-1 process data block (internal use only)
 | 
			
		||||
 *
 | 
			
		||||
 * \deprecated     Superseded by mbedtls_internal_sha1_process() in 2.7.0
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      The SHA-1 context.
 | 
			
		||||
 * \param data     The data block being processed.
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        SHA-1 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
MBEDTLS_DEPRECATED static inline void mbedtls_sha1_process(
 | 
			
		||||
                                                mbedtls_sha1_context *ctx,
 | 
			
		||||
                                                const unsigned char data[64] )
 | 
			
		||||
{
 | 
			
		||||
    mbedtls_internal_sha1_process( ctx, data );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#undef MBEDTLS_DEPRECATED
 | 
			
		||||
#endif /* !MBEDTLS_DEPRECATED_REMOVED */
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -113,19 +273,69 @@ void mbedtls_sha1_process( mbedtls_sha1_context *ctx, const unsigned char data[6
 | 
			
		|||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          This function calculates the SHA-1 checksum of a buffer.
 | 
			
		||||
 *
 | 
			
		||||
 *                 The function allocates the context, performs the
 | 
			
		||||
 *                 calculation, and frees the context.
 | 
			
		||||
 *
 | 
			
		||||
 *                 The SHA-1 result is calculated as
 | 
			
		||||
 *                 output = SHA-1(input buffer).
 | 
			
		||||
 *
 | 
			
		||||
 * \param input    The buffer holding the input data.
 | 
			
		||||
 * \param ilen     The length of the input data.
 | 
			
		||||
 * \param output   The SHA-1 checksum result.
 | 
			
		||||
 *
 | 
			
		||||
 * \return         \c 0 if successful
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        SHA-1 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_sha1_ret( const unsigned char *input,
 | 
			
		||||
                      size_t ilen,
 | 
			
		||||
                      unsigned char output[20] );
 | 
			
		||||
 | 
			
		||||
#if !defined(MBEDTLS_DEPRECATED_REMOVED)
 | 
			
		||||
#if defined(MBEDTLS_DEPRECATED_WARNING)
 | 
			
		||||
#define MBEDTLS_DEPRECATED      __attribute__((deprecated))
 | 
			
		||||
#else
 | 
			
		||||
#define MBEDTLS_DEPRECATED
 | 
			
		||||
#endif
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          Output = SHA-1( input buffer )
 | 
			
		||||
 *
 | 
			
		||||
 * \param input    buffer holding the  data
 | 
			
		||||
 * \param ilen     length of the input data
 | 
			
		||||
 * \param output   SHA-1 checksum result
 | 
			
		||||
 * \deprecated     Superseded by mbedtls_sha1_ret() in 2.7.0
 | 
			
		||||
 *
 | 
			
		||||
 * \param input    The buffer holding the input data.
 | 
			
		||||
 * \param ilen     The length of the input data.
 | 
			
		||||
 * \param output   The SHA-1 checksum result.
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        SHA-1 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_sha1( const unsigned char *input, size_t ilen, unsigned char output[20] );
 | 
			
		||||
MBEDTLS_DEPRECATED static inline void mbedtls_sha1( const unsigned char *input,
 | 
			
		||||
                                                    size_t ilen,
 | 
			
		||||
                                                    unsigned char output[20] )
 | 
			
		||||
{
 | 
			
		||||
    mbedtls_sha1_ret( input, ilen, output );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#undef MBEDTLS_DEPRECATED
 | 
			
		||||
#endif /* !MBEDTLS_DEPRECATED_REMOVED */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          Checkup routine
 | 
			
		||||
 * \brief          The SHA-1 checkup routine.
 | 
			
		||||
 *
 | 
			
		||||
 * \return         \c 0 on success, or \c 1 on failure.
 | 
			
		||||
 *
 | 
			
		||||
 * \warning        SHA-1 is considered a weak message digest and its use
 | 
			
		||||
 *                 constitutes a security risk. We recommend considering
 | 
			
		||||
 *                 stronger message digests instead.
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful, or 1 if the test failed
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_sha1_self_test( int verbose );
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,9 +1,10 @@
 | 
			
		|||
/**
 | 
			
		||||
 * \file sha256.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief SHA-224 and SHA-256 cryptographic hash function
 | 
			
		||||
 *
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 * \brief The SHA-224 and SHA-256 cryptographic hash function.
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
 *  Licensed under the Apache License, Version 2.0 (the "License"); you may
 | 
			
		||||
| 
						 | 
				
			
			@ -18,7 +19,7 @@
 | 
			
		|||
 *  See the License for the specific language governing permissions and
 | 
			
		||||
 *  limitations under the License.
 | 
			
		||||
 *
 | 
			
		||||
 *  This file is part of mbed TLS (https://tls.mbed.org)
 | 
			
		||||
 *  This file is part of Mbed TLS (https://tls.mbed.org)
 | 
			
		||||
 */
 | 
			
		||||
#ifndef MBEDTLS_SHA256_H
 | 
			
		||||
#define MBEDTLS_SHA256_H
 | 
			
		||||
| 
						 | 
				
			
			@ -32,6 +33,12 @@
 | 
			
		|||
#include <stddef.h>
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
#define MBEDTLS_ERR_SHA256_HW_ACCEL_FAILED                -0x0037  /**< SHA-256 hardware accelerator failed */
 | 
			
		||||
 | 
			
		||||
#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \
 | 
			
		||||
    !defined(inline) && !defined(__cplusplus)
 | 
			
		||||
#define inline __inline
 | 
			
		||||
#endif
 | 
			
		||||
#if !defined(MBEDTLS_SHA256_ALT)
 | 
			
		||||
// Regular implementation
 | 
			
		||||
//
 | 
			
		||||
| 
						 | 
				
			
			@ -41,69 +48,174 @@ extern "C" {
 | 
			
		|||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          SHA-256 context structure
 | 
			
		||||
 * \brief          The SHA-256 context structure.
 | 
			
		||||
 *
 | 
			
		||||
 *                 The structure is used both for SHA-256 and for SHA-224
 | 
			
		||||
 *                 checksum calculations. The choice between these two is
 | 
			
		||||
 *                 made in the call to mbedtls_sha256_starts_ret().
 | 
			
		||||
 */
 | 
			
		||||
typedef struct
 | 
			
		||||
{
 | 
			
		||||
    uint32_t total[2];          /*!< number of bytes processed  */
 | 
			
		||||
    uint32_t state[8];          /*!< intermediate digest state  */
 | 
			
		||||
    unsigned char buffer[64];   /*!< data block being processed */
 | 
			
		||||
    int is224;                  /*!< 0 => SHA-256, else SHA-224 */
 | 
			
		||||
    uint32_t total[2];          /*!< The number of Bytes processed.  */
 | 
			
		||||
    uint32_t state[8];          /*!< The intermediate digest state.  */
 | 
			
		||||
    unsigned char buffer[64];   /*!< The data block being processed. */
 | 
			
		||||
    int is224;                  /*!< Determines which function to use.
 | 
			
		||||
                                     <ul><li>0: Use SHA-256.</li>
 | 
			
		||||
                                     <li>1: Use SHA-224.</li></ul> */
 | 
			
		||||
}
 | 
			
		||||
mbedtls_sha256_context;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          Initialize SHA-256 context
 | 
			
		||||
 * \brief          This function initializes a SHA-256 context.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      SHA-256 context to be initialized
 | 
			
		||||
 * \param ctx      The SHA-256 context to initialize.
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_sha256_init( mbedtls_sha256_context *ctx );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          Clear SHA-256 context
 | 
			
		||||
 * \brief          This function clears a SHA-256 context.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      SHA-256 context to be cleared
 | 
			
		||||
 * \param ctx      The SHA-256 context to clear.
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_sha256_free( mbedtls_sha256_context *ctx );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          Clone (the state of) a SHA-256 context
 | 
			
		||||
 * \brief          This function clones the state of a SHA-256 context.
 | 
			
		||||
 *
 | 
			
		||||
 * \param dst      The destination context
 | 
			
		||||
 * \param src      The context to be cloned
 | 
			
		||||
 * \param dst      The destination context.
 | 
			
		||||
 * \param src      The context to clone.
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_sha256_clone( mbedtls_sha256_context *dst,
 | 
			
		||||
                           const mbedtls_sha256_context *src );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          SHA-256 context setup
 | 
			
		||||
 * \brief          This function starts a SHA-224 or SHA-256 checksum
 | 
			
		||||
 *                 calculation.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      context to be initialized
 | 
			
		||||
 * \param is224    0 = use SHA256, 1 = use SHA224
 | 
			
		||||
 * \param ctx      The context to initialize.
 | 
			
		||||
 * \param is224    Determines which function to use.
 | 
			
		||||
 *                 <ul><li>0: Use SHA-256.</li>
 | 
			
		||||
 *                 <li>1: Use SHA-224.</li></ul>
 | 
			
		||||
 *
 | 
			
		||||
 * \return         \c 0 on success.
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_sha256_starts( mbedtls_sha256_context *ctx, int is224 );
 | 
			
		||||
int mbedtls_sha256_starts_ret( mbedtls_sha256_context *ctx, int is224 );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          SHA-256 process buffer
 | 
			
		||||
 * \brief          This function feeds an input buffer into an ongoing
 | 
			
		||||
 *                 SHA-256 checksum calculation.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      SHA-256 context
 | 
			
		||||
 * \param input    buffer holding the  data
 | 
			
		||||
 * \param input    buffer holding the data
 | 
			
		||||
 * \param ilen     length of the input data
 | 
			
		||||
 *
 | 
			
		||||
 * \return         \c 0 on success.
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_sha256_update( mbedtls_sha256_context *ctx, const unsigned char *input,
 | 
			
		||||
                    size_t ilen );
 | 
			
		||||
int mbedtls_sha256_update_ret( mbedtls_sha256_context *ctx,
 | 
			
		||||
                               const unsigned char *input,
 | 
			
		||||
                               size_t ilen );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          SHA-256 final digest
 | 
			
		||||
 * \brief          This function finishes the SHA-256 operation, and writes
 | 
			
		||||
 *                 the result to the output buffer.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      SHA-256 context
 | 
			
		||||
 * \param output   SHA-224/256 checksum result
 | 
			
		||||
 * \param ctx      The SHA-256 context.
 | 
			
		||||
 * \param output   The SHA-224 or SHA-256 checksum result.
 | 
			
		||||
 *
 | 
			
		||||
 * \return         \c 0 on success.
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_sha256_finish( mbedtls_sha256_context *ctx, unsigned char output[32] );
 | 
			
		||||
int mbedtls_sha256_finish_ret( mbedtls_sha256_context *ctx,
 | 
			
		||||
                               unsigned char output[32] );
 | 
			
		||||
 | 
			
		||||
/* Internal use */
 | 
			
		||||
void mbedtls_sha256_process( mbedtls_sha256_context *ctx, const unsigned char data[64] );
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          This function processes a single data block within
 | 
			
		||||
 *                 the ongoing SHA-256 computation. This function is for
 | 
			
		||||
 *                 internal use only.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      The SHA-256 context.
 | 
			
		||||
 * \param data     The buffer holding one block of data.
 | 
			
		||||
 *
 | 
			
		||||
 * \return         \c 0 on success.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_internal_sha256_process( mbedtls_sha256_context *ctx,
 | 
			
		||||
                                     const unsigned char data[64] );
 | 
			
		||||
 | 
			
		||||
#if !defined(MBEDTLS_DEPRECATED_REMOVED)
 | 
			
		||||
#if defined(MBEDTLS_DEPRECATED_WARNING)
 | 
			
		||||
#define MBEDTLS_DEPRECATED      __attribute__((deprecated))
 | 
			
		||||
#else
 | 
			
		||||
#define MBEDTLS_DEPRECATED
 | 
			
		||||
#endif
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          This function starts a SHA-256 checksum calculation.
 | 
			
		||||
 *
 | 
			
		||||
 * \deprecated     Superseded by mbedtls_sha256_starts_ret() in 2.7.0.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      The SHA-256 context to initialize.
 | 
			
		||||
 * \param is224    Determines which function to use.
 | 
			
		||||
 *                 <ul><li>0: Use SHA-256.</li>
 | 
			
		||||
 *                 <li>1: Use SHA-224.</li></ul>
 | 
			
		||||
 */
 | 
			
		||||
MBEDTLS_DEPRECATED static inline void mbedtls_sha256_starts(
 | 
			
		||||
                                                mbedtls_sha256_context *ctx,
 | 
			
		||||
                                                int is224 )
 | 
			
		||||
{
 | 
			
		||||
    mbedtls_sha256_starts_ret( ctx, is224 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          This function feeds an input buffer into an ongoing
 | 
			
		||||
 *                 SHA-256 checksum calculation.
 | 
			
		||||
 *
 | 
			
		||||
 * \deprecated     Superseded by mbedtls_sha256_update_ret() in 2.7.0.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      The SHA-256 context to initialize.
 | 
			
		||||
 * \param input    The buffer holding the data.
 | 
			
		||||
 * \param ilen     The length of the input data.
 | 
			
		||||
 */
 | 
			
		||||
MBEDTLS_DEPRECATED static inline void mbedtls_sha256_update(
 | 
			
		||||
                                                mbedtls_sha256_context *ctx,
 | 
			
		||||
                                                const unsigned char *input,
 | 
			
		||||
                                                size_t ilen )
 | 
			
		||||
{
 | 
			
		||||
    mbedtls_sha256_update_ret( ctx, input, ilen );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          This function finishes the SHA-256 operation, and writes
 | 
			
		||||
 *                 the result to the output buffer.
 | 
			
		||||
 *
 | 
			
		||||
 * \deprecated     Superseded by mbedtls_sha256_finish_ret() in 2.7.0.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      The SHA-256 context.
 | 
			
		||||
 * \param output   The SHA-224or SHA-256 checksum result.
 | 
			
		||||
 */
 | 
			
		||||
MBEDTLS_DEPRECATED static inline void mbedtls_sha256_finish(
 | 
			
		||||
                                                mbedtls_sha256_context *ctx,
 | 
			
		||||
                                                unsigned char output[32] )
 | 
			
		||||
{
 | 
			
		||||
    mbedtls_sha256_finish_ret( ctx, output );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          This function processes a single data block within
 | 
			
		||||
 *                 the ongoing SHA-256 computation. This function is for
 | 
			
		||||
 *                 internal use only.
 | 
			
		||||
 *
 | 
			
		||||
 * \deprecated     Superseded by mbedtls_internal_sha256_process() in 2.7.0.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      The SHA-256 context.
 | 
			
		||||
 * \param data     The buffer holding one block of data.
 | 
			
		||||
 */
 | 
			
		||||
MBEDTLS_DEPRECATED static inline void mbedtls_sha256_process(
 | 
			
		||||
                                                mbedtls_sha256_context *ctx,
 | 
			
		||||
                                                const unsigned char data[64] )
 | 
			
		||||
{
 | 
			
		||||
    mbedtls_internal_sha256_process( ctx, data );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#undef MBEDTLS_DEPRECATED
 | 
			
		||||
#endif /* !MBEDTLS_DEPRECATED_REMOVED */
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -117,20 +229,69 @@ extern "C" {
 | 
			
		|||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          Output = SHA-256( input buffer )
 | 
			
		||||
 * \brief          This function calculates the SHA-224 or SHA-256
 | 
			
		||||
 *                 checksum of a buffer.
 | 
			
		||||
 *
 | 
			
		||||
 * \param input    buffer holding the  data
 | 
			
		||||
 * \param ilen     length of the input data
 | 
			
		||||
 * \param output   SHA-224/256 checksum result
 | 
			
		||||
 * \param is224    0 = use SHA256, 1 = use SHA224
 | 
			
		||||
 *                 The function allocates the context, performs the
 | 
			
		||||
 *                 calculation, and frees the context.
 | 
			
		||||
 *
 | 
			
		||||
 *                 The SHA-256 result is calculated as
 | 
			
		||||
 *                 output = SHA-256(input buffer).
 | 
			
		||||
 *
 | 
			
		||||
 * \param input    The buffer holding the input data.
 | 
			
		||||
 * \param ilen     The length of the input data.
 | 
			
		||||
 * \param output   The SHA-224 or SHA-256 checksum result.
 | 
			
		||||
 * \param is224    Determines which function to use.
 | 
			
		||||
 *                 <ul><li>0: Use SHA-256.</li>
 | 
			
		||||
 *                 <li>1: Use SHA-224.</li></ul>
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_sha256( const unsigned char *input, size_t ilen,
 | 
			
		||||
           unsigned char output[32], int is224 );
 | 
			
		||||
int mbedtls_sha256_ret( const unsigned char *input,
 | 
			
		||||
                        size_t ilen,
 | 
			
		||||
                        unsigned char output[32],
 | 
			
		||||
                        int is224 );
 | 
			
		||||
 | 
			
		||||
#if !defined(MBEDTLS_DEPRECATED_REMOVED)
 | 
			
		||||
#if defined(MBEDTLS_DEPRECATED_WARNING)
 | 
			
		||||
#define MBEDTLS_DEPRECATED      __attribute__((deprecated))
 | 
			
		||||
#else
 | 
			
		||||
#define MBEDTLS_DEPRECATED
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          Checkup routine
 | 
			
		||||
 * \brief          This function calculates the SHA-224 or SHA-256 checksum
 | 
			
		||||
 *                 of a buffer.
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful, or 1 if the test failed
 | 
			
		||||
 *                 The function allocates the context, performs the
 | 
			
		||||
 *                 calculation, and frees the context.
 | 
			
		||||
 *
 | 
			
		||||
 *                 The SHA-256 result is calculated as
 | 
			
		||||
 *                 output = SHA-256(input buffer).
 | 
			
		||||
 *
 | 
			
		||||
 * \deprecated     Superseded by mbedtls_sha256_ret() in 2.7.0.
 | 
			
		||||
 *
 | 
			
		||||
 * \param input    The buffer holding the data.
 | 
			
		||||
 * \param ilen     The length of the input data.
 | 
			
		||||
 * \param output   The SHA-224 or SHA-256 checksum result.
 | 
			
		||||
 * \param is224    Determines which function to use.
 | 
			
		||||
 *                 <ul><li>0: Use SHA-256.</li>
 | 
			
		||||
 *                 <li>1: Use SHA-224.</li></ul>
 | 
			
		||||
 */
 | 
			
		||||
MBEDTLS_DEPRECATED static inline void mbedtls_sha256(
 | 
			
		||||
                                                    const unsigned char *input,
 | 
			
		||||
                                                    size_t ilen,
 | 
			
		||||
                                                    unsigned char output[32],
 | 
			
		||||
                                                    int is224 )
 | 
			
		||||
{
 | 
			
		||||
    mbedtls_sha256_ret( input, ilen, output, is224 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#undef MBEDTLS_DEPRECATED
 | 
			
		||||
#endif /* !MBEDTLS_DEPRECATED_REMOVED */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          The SHA-224 and SHA-256 checkup routine.
 | 
			
		||||
 *
 | 
			
		||||
 * \return         \c 0 on success, or \c 1 on failure.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_sha256_self_test( int verbose );
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,9 +1,10 @@
 | 
			
		|||
/**
 | 
			
		||||
 * \file sha512.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief SHA-384 and SHA-512 cryptographic hash function
 | 
			
		||||
 *
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 * \brief The SHA-384 and SHA-512 cryptographic hash function.
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
 *  Licensed under the Apache License, Version 2.0 (the "License"); you may
 | 
			
		||||
| 
						 | 
				
			
			@ -18,7 +19,7 @@
 | 
			
		|||
 *  See the License for the specific language governing permissions and
 | 
			
		||||
 *  limitations under the License.
 | 
			
		||||
 *
 | 
			
		||||
 *  This file is part of mbed TLS (https://tls.mbed.org)
 | 
			
		||||
 *  This file is part of Mbed TLS (https://tls.mbed.org)
 | 
			
		||||
 */
 | 
			
		||||
#ifndef MBEDTLS_SHA512_H
 | 
			
		||||
#define MBEDTLS_SHA512_H
 | 
			
		||||
| 
						 | 
				
			
			@ -32,6 +33,12 @@
 | 
			
		|||
#include <stddef.h>
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
#define MBEDTLS_ERR_SHA512_HW_ACCEL_FAILED                -0x0039  /**< SHA-512 hardware accelerator failed */
 | 
			
		||||
 | 
			
		||||
#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \
 | 
			
		||||
    !defined(inline) && !defined(__cplusplus)
 | 
			
		||||
#define inline __inline
 | 
			
		||||
#endif
 | 
			
		||||
#if !defined(MBEDTLS_SHA512_ALT)
 | 
			
		||||
// Regular implementation
 | 
			
		||||
//
 | 
			
		||||
| 
						 | 
				
			
			@ -41,65 +48,174 @@ extern "C" {
 | 
			
		|||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          SHA-512 context structure
 | 
			
		||||
 * \brief          The SHA-512 context structure.
 | 
			
		||||
 *
 | 
			
		||||
 *                 The structure is used both for SHA-384 and for SHA-512
 | 
			
		||||
 *                 checksum calculations. The choice between these two is
 | 
			
		||||
 *                 made in the call to mbedtls_sha512_starts_ret().
 | 
			
		||||
 */
 | 
			
		||||
typedef struct
 | 
			
		||||
{
 | 
			
		||||
    uint64_t total[2];          /*!< number of bytes processed  */
 | 
			
		||||
    uint64_t state[8];          /*!< intermediate digest state  */
 | 
			
		||||
    unsigned char buffer[128];  /*!< data block being processed */
 | 
			
		||||
    int is384;                  /*!< 0 => SHA-512, else SHA-384 */
 | 
			
		||||
    uint64_t total[2];          /*!< The number of Bytes processed. */
 | 
			
		||||
    uint64_t state[8];          /*!< The intermediate digest state. */
 | 
			
		||||
    unsigned char buffer[128];  /*!< The data block being processed. */
 | 
			
		||||
    int is384;                  /*!< Determines which function to use.
 | 
			
		||||
                                 *   <ul><li>0: Use SHA-512.</li>
 | 
			
		||||
                                 *   <li>1: Use SHA-384.</li></ul> */
 | 
			
		||||
}
 | 
			
		||||
mbedtls_sha512_context;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          Initialize SHA-512 context
 | 
			
		||||
 * \brief          This function initializes a SHA-512 context.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      SHA-512 context to be initialized
 | 
			
		||||
 * \param ctx      The SHA-512 context to initialize.
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_sha512_init( mbedtls_sha512_context *ctx );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          Clear SHA-512 context
 | 
			
		||||
 * \brief          This function clears a SHA-512 context.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      SHA-512 context to be cleared
 | 
			
		||||
 * \param ctx      The SHA-512 context to clear.
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_sha512_free( mbedtls_sha512_context *ctx );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          Clone (the state of) a SHA-512 context
 | 
			
		||||
 * \brief          This function clones the state of a SHA-512 context.
 | 
			
		||||
 *
 | 
			
		||||
 * \param dst      The destination context
 | 
			
		||||
 * \param src      The context to be cloned
 | 
			
		||||
 * \param dst      The destination context.
 | 
			
		||||
 * \param src      The context to clone.
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_sha512_clone( mbedtls_sha512_context *dst,
 | 
			
		||||
                           const mbedtls_sha512_context *src );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          SHA-512 context setup
 | 
			
		||||
 * \brief          This function starts a SHA-384 or SHA-512 checksum
 | 
			
		||||
 *                 calculation.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      context to be initialized
 | 
			
		||||
 * \param is384    0 = use SHA512, 1 = use SHA384
 | 
			
		||||
 * \param ctx      The SHA-512 context to initialize.
 | 
			
		||||
 * \param is384    Determines which function to use.
 | 
			
		||||
 *                 <ul><li>0: Use SHA-512.</li>
 | 
			
		||||
 *                 <li>1: Use SHA-384.</li></ul>
 | 
			
		||||
 *
 | 
			
		||||
 * \return         \c 0 on success.
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_sha512_starts( mbedtls_sha512_context *ctx, int is384 );
 | 
			
		||||
int mbedtls_sha512_starts_ret( mbedtls_sha512_context *ctx, int is384 );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          SHA-512 process buffer
 | 
			
		||||
 * \brief          This function feeds an input buffer into an ongoing
 | 
			
		||||
 *                 SHA-512 checksum calculation.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      SHA-512 context
 | 
			
		||||
 * \param input    buffer holding the  data
 | 
			
		||||
 * \param ilen     length of the input data
 | 
			
		||||
 * \param ctx      The SHA-512 context.
 | 
			
		||||
 * \param input    The buffer holding the input data.
 | 
			
		||||
 * \param ilen     The length of the input data.
 | 
			
		||||
 *
 | 
			
		||||
 * \return         \c 0 on success.
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_sha512_update( mbedtls_sha512_context *ctx, const unsigned char *input,
 | 
			
		||||
int mbedtls_sha512_update_ret( mbedtls_sha512_context *ctx,
 | 
			
		||||
                    const unsigned char *input,
 | 
			
		||||
                    size_t ilen );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          SHA-512 final digest
 | 
			
		||||
 * \brief          This function finishes the SHA-512 operation, and writes
 | 
			
		||||
 *                 the result to the output buffer. This function is for
 | 
			
		||||
 *                 internal use only.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      SHA-512 context
 | 
			
		||||
 * \param output   SHA-384/512 checksum result
 | 
			
		||||
 * \param ctx      The SHA-512 context.
 | 
			
		||||
 * \param output   The SHA-384 or SHA-512 checksum result.
 | 
			
		||||
 *
 | 
			
		||||
 * \return         \c 0 on success.
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_sha512_finish( mbedtls_sha512_context *ctx, unsigned char output[64] );
 | 
			
		||||
int mbedtls_sha512_finish_ret( mbedtls_sha512_context *ctx,
 | 
			
		||||
                               unsigned char output[64] );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          This function processes a single data block within
 | 
			
		||||
 *                 the ongoing SHA-512 computation.
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      The SHA-512 context.
 | 
			
		||||
 * \param data     The buffer holding one block of data.
 | 
			
		||||
 *
 | 
			
		||||
 * \return         \c 0 on success.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_internal_sha512_process( mbedtls_sha512_context *ctx,
 | 
			
		||||
                                     const unsigned char data[128] );
 | 
			
		||||
#if !defined(MBEDTLS_DEPRECATED_REMOVED)
 | 
			
		||||
#if defined(MBEDTLS_DEPRECATED_WARNING)
 | 
			
		||||
#define MBEDTLS_DEPRECATED      __attribute__((deprecated))
 | 
			
		||||
#else
 | 
			
		||||
#define MBEDTLS_DEPRECATED
 | 
			
		||||
#endif
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          This function starts a SHA-384 or SHA-512 checksum
 | 
			
		||||
 *                 calculation.
 | 
			
		||||
 *
 | 
			
		||||
 * \deprecated     Superseded by mbedtls_sha512_starts_ret() in 2.7.0
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      The SHA-512 context to initialize.
 | 
			
		||||
 * \param is384    Determines which function to use.
 | 
			
		||||
 *                 <ul><li>0: Use SHA-512.</li>
 | 
			
		||||
 *                 <li>1: Use SHA-384.</li></ul>
 | 
			
		||||
 */
 | 
			
		||||
MBEDTLS_DEPRECATED static inline void mbedtls_sha512_starts(
 | 
			
		||||
                                                mbedtls_sha512_context *ctx,
 | 
			
		||||
                                                int is384 )
 | 
			
		||||
{
 | 
			
		||||
    mbedtls_sha512_starts_ret( ctx, is384 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          This function feeds an input buffer into an ongoing
 | 
			
		||||
 *                 SHA-512 checksum calculation.
 | 
			
		||||
 *
 | 
			
		||||
 * \deprecated     Superseded by mbedtls_sha512_update_ret() in 2.7.0
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      The SHA-512 context.
 | 
			
		||||
 * \param input    The buffer holding the data.
 | 
			
		||||
 * \param ilen     The length of the input data.
 | 
			
		||||
 */
 | 
			
		||||
MBEDTLS_DEPRECATED static inline void mbedtls_sha512_update(
 | 
			
		||||
                                                mbedtls_sha512_context *ctx,
 | 
			
		||||
                                                const unsigned char *input,
 | 
			
		||||
                                                size_t ilen )
 | 
			
		||||
{
 | 
			
		||||
    mbedtls_sha512_update_ret( ctx, input, ilen );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          This function finishes the SHA-512 operation, and writes
 | 
			
		||||
 *                 the result to the output buffer.
 | 
			
		||||
 *
 | 
			
		||||
 * \deprecated     Superseded by mbedtls_sha512_finish_ret() in 2.7.0
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      The SHA-512 context.
 | 
			
		||||
 * \param output   The SHA-384 or SHA-512 checksum result.
 | 
			
		||||
 */
 | 
			
		||||
MBEDTLS_DEPRECATED static inline void mbedtls_sha512_finish(
 | 
			
		||||
                                                mbedtls_sha512_context *ctx,
 | 
			
		||||
                                                unsigned char output[64] )
 | 
			
		||||
{
 | 
			
		||||
    mbedtls_sha512_finish_ret( ctx, output );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          This function processes a single data block within
 | 
			
		||||
 *                 the ongoing SHA-512 computation. This function is for
 | 
			
		||||
 *                 internal use only.
 | 
			
		||||
 *
 | 
			
		||||
 * \deprecated     Superseded by mbedtls_internal_sha512_process() in 2.7.0
 | 
			
		||||
 *
 | 
			
		||||
 * \param ctx      The SHA-512 context.
 | 
			
		||||
 * \param data     The buffer holding one block of data.
 | 
			
		||||
 */
 | 
			
		||||
MBEDTLS_DEPRECATED static inline void mbedtls_sha512_process(
 | 
			
		||||
                                            mbedtls_sha512_context *ctx,
 | 
			
		||||
                                            const unsigned char data[128] )
 | 
			
		||||
{
 | 
			
		||||
    mbedtls_internal_sha512_process( ctx, data );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#undef MBEDTLS_DEPRECATED
 | 
			
		||||
#endif /* !MBEDTLS_DEPRECATED_REMOVED */
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -114,26 +230,72 @@ extern "C" {
 | 
			
		|||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          Output = SHA-512( input buffer )
 | 
			
		||||
 * \brief          This function calculates the SHA-512 or SHA-384
 | 
			
		||||
 *                 checksum of a buffer.
 | 
			
		||||
 *
 | 
			
		||||
 * \param input    buffer holding the  data
 | 
			
		||||
 * \param ilen     length of the input data
 | 
			
		||||
 * \param output   SHA-384/512 checksum result
 | 
			
		||||
 * \param is384    0 = use SHA512, 1 = use SHA384
 | 
			
		||||
 *                 The function allocates the context, performs the
 | 
			
		||||
 *                 calculation, and frees the context.
 | 
			
		||||
 *
 | 
			
		||||
 *                 The SHA-512 result is calculated as
 | 
			
		||||
 *                 output = SHA-512(input buffer).
 | 
			
		||||
 *
 | 
			
		||||
 * \param input    The buffer holding the input data.
 | 
			
		||||
 * \param ilen     The length of the input data.
 | 
			
		||||
 * \param output   The SHA-384 or SHA-512 checksum result.
 | 
			
		||||
 * \param is384    Determines which function to use.
 | 
			
		||||
 *                 <ul><li>0: Use SHA-512.</li>
 | 
			
		||||
 *                 <li>1: Use SHA-384.</li></ul>
 | 
			
		||||
 *
 | 
			
		||||
 * \return         \c 0 on success.
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_sha512( const unsigned char *input, size_t ilen,
 | 
			
		||||
             unsigned char output[64], int is384 );
 | 
			
		||||
int mbedtls_sha512_ret( const unsigned char *input,
 | 
			
		||||
                        size_t ilen,
 | 
			
		||||
                        unsigned char output[64],
 | 
			
		||||
                        int is384 );
 | 
			
		||||
 | 
			
		||||
#if !defined(MBEDTLS_DEPRECATED_REMOVED)
 | 
			
		||||
#if defined(MBEDTLS_DEPRECATED_WARNING)
 | 
			
		||||
#define MBEDTLS_DEPRECATED      __attribute__((deprecated))
 | 
			
		||||
#else
 | 
			
		||||
#define MBEDTLS_DEPRECATED
 | 
			
		||||
#endif
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          Checkup routine
 | 
			
		||||
 * \brief          This function calculates the SHA-512 or SHA-384
 | 
			
		||||
 *                 checksum of a buffer.
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful, or 1 if the test failed
 | 
			
		||||
 *                 The function allocates the context, performs the
 | 
			
		||||
 *                 calculation, and frees the context.
 | 
			
		||||
 *
 | 
			
		||||
 *                 The SHA-512 result is calculated as
 | 
			
		||||
 *                 output = SHA-512(input buffer).
 | 
			
		||||
 *
 | 
			
		||||
 * \deprecated     Superseded by mbedtls_sha512_ret() in 2.7.0
 | 
			
		||||
 *
 | 
			
		||||
 * \param input    The buffer holding the data.
 | 
			
		||||
 * \param ilen     The length of the input data.
 | 
			
		||||
 * \param output   The SHA-384 or SHA-512 checksum result.
 | 
			
		||||
 * \param is384    Determines which function to use.
 | 
			
		||||
 *                 <ul><li>0: Use SHA-512.</li>
 | 
			
		||||
 *                 <li>1: Use SHA-384.</li></ul>
 | 
			
		||||
 */
 | 
			
		||||
MBEDTLS_DEPRECATED static inline void mbedtls_sha512(
 | 
			
		||||
                                                    const unsigned char *input,
 | 
			
		||||
                                                    size_t ilen,
 | 
			
		||||
                                                    unsigned char output[64],
 | 
			
		||||
                                                    int is384 )
 | 
			
		||||
{
 | 
			
		||||
    mbedtls_sha512_ret( input, ilen, output, is384 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#undef MBEDTLS_DEPRECATED
 | 
			
		||||
#endif /* !MBEDTLS_DEPRECATED_REMOVED */
 | 
			
		||||
 /**
 | 
			
		||||
 * \brief          The SHA-384 or SHA-512 checkup routine.
 | 
			
		||||
 *
 | 
			
		||||
 * \return         \c 0 on success, or \c 1 on failure.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_sha512_self_test( int verbose );
 | 
			
		||||
 | 
			
		||||
/* Internal use */
 | 
			
		||||
void mbedtls_sha512_process( mbedtls_sha512_context *ctx, const unsigned char data[128] );
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,8 @@
 | 
			
		|||
 * \file ssl.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief SSL/TLS functions.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			@ -1699,18 +1700,50 @@ void mbedtls_ssl_conf_psk_cb( mbedtls_ssl_config *conf,
 | 
			
		|||
#endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C)
 | 
			
		||||
 | 
			
		||||
#if !defined(MBEDTLS_DEPRECATED_REMOVED)
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_DEPRECATED_WARNING)
 | 
			
		||||
#define MBEDTLS_DEPRECATED    __attribute__((deprecated))
 | 
			
		||||
#else
 | 
			
		||||
#define MBEDTLS_DEPRECATED
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          Set the Diffie-Hellman public P and G values,
 | 
			
		||||
 *                 read as hexadecimal strings (server-side only)
 | 
			
		||||
 *                 (Default: MBEDTLS_DHM_RFC5114_MODP_2048_[PG])
 | 
			
		||||
 *                 (Default values: MBEDTLS_DHM_RFC3526_MODP_2048_[PG])
 | 
			
		||||
 *
 | 
			
		||||
 * \param conf     SSL configuration
 | 
			
		||||
 * \param dhm_P    Diffie-Hellman-Merkle modulus
 | 
			
		||||
 * \param dhm_G    Diffie-Hellman-Merkle generator
 | 
			
		||||
 *
 | 
			
		||||
 * \deprecated     Superseded by \c mbedtls_ssl_conf_dh_param_bin.
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_ssl_conf_dh_param( mbedtls_ssl_config *conf, const char *dhm_P, const char *dhm_G );
 | 
			
		||||
MBEDTLS_DEPRECATED int mbedtls_ssl_conf_dh_param( mbedtls_ssl_config *conf,
 | 
			
		||||
                                                  const char *dhm_P,
 | 
			
		||||
                                                  const char *dhm_G );
 | 
			
		||||
 | 
			
		||||
#endif /* MBEDTLS_DEPRECATED_REMOVED */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          Set the Diffie-Hellman public P and G values
 | 
			
		||||
 *                 from big-endian binary presentations.
 | 
			
		||||
 *                 (Default values: MBEDTLS_DHM_RFC3526_MODP_2048_[PG]_BIN)
 | 
			
		||||
 *
 | 
			
		||||
 * \param conf     SSL configuration
 | 
			
		||||
 * \param dhm_P    Diffie-Hellman-Merkle modulus in big-endian binary form
 | 
			
		||||
 * \param P_len    Length of DHM modulus
 | 
			
		||||
 * \param dhm_G    Diffie-Hellman-Merkle generator in big-endian binary form
 | 
			
		||||
 * \param G_len    Length of DHM generator
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_ssl_conf_dh_param_bin( mbedtls_ssl_config *conf,
 | 
			
		||||
                                   const unsigned char *dhm_P, size_t P_len,
 | 
			
		||||
                                   const unsigned char *dhm_G,  size_t G_len );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          Set the Diffie-Hellman public P and G values,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,8 @@
 | 
			
		|||
 * \file ssl_cache.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief SSL session cache implementation
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,8 @@
 | 
			
		|||
 * \file ssl_ciphersuites.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief SSL Ciphersuites for mbed TLS
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,8 @@
 | 
			
		|||
 * \file ssl_cookie.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief DTLS cookie callbacks implementation
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,8 +1,9 @@
 | 
			
		|||
/**
 | 
			
		||||
 * \file ssl_ticket.h
 | 
			
		||||
 * \file ssl_internal.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief Internal functions shared by the SSL modules
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			@ -24,6 +25,7 @@
 | 
			
		|||
#define MBEDTLS_SSL_INTERNAL_H
 | 
			
		||||
 | 
			
		||||
#include "ssl.h"
 | 
			
		||||
#include "cipher.h"
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_MD5_C)
 | 
			
		||||
#include "md5.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -138,13 +140,33 @@
 | 
			
		|||
#define MBEDTLS_SSL_PADDING_ADD              0
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define MBEDTLS_SSL_BUFFER_LEN  ( MBEDTLS_SSL_MAX_CONTENT_LEN               \
 | 
			
		||||
                        + MBEDTLS_SSL_COMPRESSION_ADD               \
 | 
			
		||||
                        + 29 /* counter + header + IV */    \
 | 
			
		||||
                        + MBEDTLS_SSL_MAC_ADD                       \
 | 
			
		||||
                        + MBEDTLS_SSL_PADDING_ADD                   \
 | 
			
		||||
#define MBEDTLS_SSL_PAYLOAD_LEN ( MBEDTLS_SSL_MAX_CONTENT_LEN    \
 | 
			
		||||
                        + MBEDTLS_SSL_COMPRESSION_ADD            \
 | 
			
		||||
                        + MBEDTLS_MAX_IV_LENGTH                  \
 | 
			
		||||
                        + MBEDTLS_SSL_MAC_ADD                    \
 | 
			
		||||
                        + MBEDTLS_SSL_PADDING_ADD                \
 | 
			
		||||
                        )
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Check that we obey the standard's message size bounds
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#if MBEDTLS_SSL_MAX_CONTENT_LEN > 16384
 | 
			
		||||
#error Bad configuration - record content too large.
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if MBEDTLS_SSL_PAYLOAD_LEN > 16384 + 2048
 | 
			
		||||
#error Bad configuration - protected record payload too large.
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* Note: Even though the TLS record header is only 5 bytes
 | 
			
		||||
   long, we're internally using 8 bytes to store the
 | 
			
		||||
   implicit sequence number. */
 | 
			
		||||
#define MBEDTLS_SSL_HEADER_LEN 13
 | 
			
		||||
 | 
			
		||||
#define MBEDTLS_SSL_BUFFER_LEN  \
 | 
			
		||||
    ( ( MBEDTLS_SSL_HEADER_LEN ) + ( MBEDTLS_SSL_PAYLOAD_LEN ) )
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * TLS extension flags (for extensions with outgoing ServerHello content
 | 
			
		||||
 * that need it (e.g. for RENEGOTIATION_INFO the server already knows because
 | 
			
		||||
| 
						 | 
				
			
			@ -600,9 +622,9 @@ void mbedtls_ssl_dtls_replay_update( mbedtls_ssl_context *ssl );
 | 
			
		|||
static inline int mbedtls_ssl_safer_memcmp( const void *a, const void *b, size_t n )
 | 
			
		||||
{
 | 
			
		||||
    size_t i;
 | 
			
		||||
    const unsigned char *A = (const unsigned char *) a;
 | 
			
		||||
    const unsigned char *B = (const unsigned char *) b;
 | 
			
		||||
    unsigned char diff = 0;
 | 
			
		||||
    volatile const unsigned char *A = (volatile const unsigned char *) a;
 | 
			
		||||
    volatile const unsigned char *B = (volatile const unsigned char *) b;
 | 
			
		||||
    volatile unsigned char diff = 0;
 | 
			
		||||
 | 
			
		||||
    for( i = 0; i < n; i++ )
 | 
			
		||||
        diff |= A[i] ^ B[i];
 | 
			
		||||
| 
						 | 
				
			
			@ -610,6 +632,23 @@ static inline int mbedtls_ssl_safer_memcmp( const void *a, const void *b, size_t
 | 
			
		|||
    return( diff );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
 | 
			
		||||
    defined(MBEDTLS_SSL_PROTO_TLS1_1)
 | 
			
		||||
int mbedtls_ssl_get_key_exchange_md_ssl_tls( mbedtls_ssl_context *ssl,
 | 
			
		||||
                                        unsigned char *output,
 | 
			
		||||
                                        unsigned char *data, size_t data_len );
 | 
			
		||||
#endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \
 | 
			
		||||
          MBEDTLS_SSL_PROTO_TLS1_1 */
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
 | 
			
		||||
    defined(MBEDTLS_SSL_PROTO_TLS1_2)
 | 
			
		||||
int mbedtls_ssl_get_key_exchange_md_tls1_2( mbedtls_ssl_context *ssl,
 | 
			
		||||
                                        unsigned char *output,
 | 
			
		||||
                                        unsigned char *data, size_t data_len,
 | 
			
		||||
                                        mbedtls_md_type_t md_alg );
 | 
			
		||||
#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \
 | 
			
		||||
          MBEDTLS_SSL_PROTO_TLS1_2 */
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,8 @@
 | 
			
		|||
 * \file ssl_ticket.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief TLS server ticket callbacks implementation
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,8 @@
 | 
			
		|||
 * \file threading.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief Threading abstraction layer
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,8 @@
 | 
			
		|||
 * \file timing.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief Portable interface to timeouts and to the CPU cycle counter
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,8 @@
 | 
			
		|||
 * \file version.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief Run-time version information
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			@ -38,7 +39,7 @@
 | 
			
		|||
 * Major, Minor, Patchlevel
 | 
			
		||||
 */
 | 
			
		||||
#define MBEDTLS_VERSION_MAJOR  2
 | 
			
		||||
#define MBEDTLS_VERSION_MINOR  6
 | 
			
		||||
#define MBEDTLS_VERSION_MINOR  7
 | 
			
		||||
#define MBEDTLS_VERSION_PATCH  0
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
| 
						 | 
				
			
			@ -46,9 +47,9 @@
 | 
			
		|||
 *    MMNNPP00
 | 
			
		||||
 *    Major version | Minor version | Patch version
 | 
			
		||||
 */
 | 
			
		||||
#define MBEDTLS_VERSION_NUMBER         0x02060000
 | 
			
		||||
#define MBEDTLS_VERSION_STRING         "2.6.0"
 | 
			
		||||
#define MBEDTLS_VERSION_STRING_FULL    "mbed TLS 2.6.0"
 | 
			
		||||
#define MBEDTLS_VERSION_NUMBER         0x02070000
 | 
			
		||||
#define MBEDTLS_VERSION_STRING         "2.7.0"
 | 
			
		||||
#define MBEDTLS_VERSION_STRING_FULL    "mbed TLS 2.7.0"
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_VERSION_C)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,8 @@
 | 
			
		|||
 * \file x509.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief X.509 generic defines and structures
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,8 @@
 | 
			
		|||
 * \file x509_crl.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief X.509 certificate revocation list parsing
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,8 @@
 | 
			
		|||
 * \file x509_crt.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief X.509 certificate parsing and writing
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			@ -373,21 +374,22 @@ int mbedtls_x509_crt_check_key_usage( const mbedtls_x509_crt *crt,
 | 
			
		|||
 | 
			
		||||
#if defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE)
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          Check usage of certificate against extentedJeyUsage.
 | 
			
		||||
 * \brief           Check usage of certificate against extendedKeyUsage.
 | 
			
		||||
 *
 | 
			
		||||
 * \param crt      Leaf certificate used.
 | 
			
		||||
 * \param usage_oid Intended usage (eg MBEDTLS_OID_SERVER_AUTH or MBEDTLS_OID_CLIENT_AUTH).
 | 
			
		||||
 * \param crt       Leaf certificate used.
 | 
			
		||||
 * \param usage_oid Intended usage (eg MBEDTLS_OID_SERVER_AUTH or
 | 
			
		||||
 *                  MBEDTLS_OID_CLIENT_AUTH).
 | 
			
		||||
 * \param usage_len Length of usage_oid (eg given by MBEDTLS_OID_SIZE()).
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if this use of the certificate is allowed,
 | 
			
		||||
 *                 MBEDTLS_ERR_X509_BAD_INPUT_DATA if not.
 | 
			
		||||
 * \return          0 if this use of the certificate is allowed,
 | 
			
		||||
 *                  MBEDTLS_ERR_X509_BAD_INPUT_DATA if not.
 | 
			
		||||
 *
 | 
			
		||||
 * \note           Usually only makes sense on leaf certificates.
 | 
			
		||||
 * \note            Usually only makes sense on leaf certificates.
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_x509_crt_check_extended_key_usage( const mbedtls_x509_crt *crt,
 | 
			
		||||
                                       const char *usage_oid,
 | 
			
		||||
                                       size_t usage_len );
 | 
			
		||||
#endif /* MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE) */
 | 
			
		||||
                                               const char *usage_oid,
 | 
			
		||||
                                               size_t usage_len );
 | 
			
		||||
#endif /* MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE */
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_X509_CRL_PARSE_C)
 | 
			
		||||
/**
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,8 @@
 | 
			
		|||
 * \file x509_csr.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief X.509 certificate signing request parsing and writing
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,8 @@
 | 
			
		|||
 * \file xtea.h
 | 
			
		||||
 *
 | 
			
		||||
 * \brief XTEA block cipher (32-bit)
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			@ -36,6 +37,7 @@
 | 
			
		|||
#define MBEDTLS_XTEA_DECRYPT     0
 | 
			
		||||
 | 
			
		||||
#define MBEDTLS_ERR_XTEA_INVALID_INPUT_LENGTH             -0x0028  /**< The data input has an invalid length. */
 | 
			
		||||
#define MBEDTLS_ERR_XTEA_HW_ACCEL_FAILED                  -0x0029  /**< XTEA hardware accelerator failed. */
 | 
			
		||||
 | 
			
		||||
#if !defined(MBEDTLS_XTEA_ALT)
 | 
			
		||||
// Regular implementation
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -141,15 +141,15 @@ endif(USE_STATIC_MBEDTLS_LIBRARY)
 | 
			
		|||
 | 
			
		||||
if(USE_SHARED_MBEDTLS_LIBRARY)
 | 
			
		||||
    add_library(mbedcrypto SHARED ${src_crypto})
 | 
			
		||||
    set_target_properties(mbedcrypto PROPERTIES VERSION 2.6.0 SOVERSION 0)
 | 
			
		||||
    set_target_properties(mbedcrypto PROPERTIES VERSION 2.7.0 SOVERSION 1)
 | 
			
		||||
    target_link_libraries(mbedcrypto ${libs})
 | 
			
		||||
 | 
			
		||||
    add_library(mbedx509 SHARED ${src_x509})
 | 
			
		||||
    set_target_properties(mbedx509 PROPERTIES VERSION 2.6.0 SOVERSION 0)
 | 
			
		||||
    set_target_properties(mbedx509 PROPERTIES VERSION 2.7.0 SOVERSION 0)
 | 
			
		||||
    target_link_libraries(mbedx509 ${libs} mbedcrypto)
 | 
			
		||||
 | 
			
		||||
    add_library(mbedtls SHARED ${src_tls})
 | 
			
		||||
    set_target_properties(mbedtls PROPERTIES VERSION 2.6.0 SOVERSION 10)
 | 
			
		||||
    set_target_properties(mbedtls PROPERTIES VERSION 2.7.0 SOVERSION 10)
 | 
			
		||||
    target_link_libraries(mbedtls ${libs} mbedx509)
 | 
			
		||||
 | 
			
		||||
    install(TARGETS mbedtls mbedx509 mbedcrypto
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -33,7 +33,7 @@ endif
 | 
			
		|||
 | 
			
		||||
SOEXT_TLS=so.10
 | 
			
		||||
SOEXT_X509=so.0
 | 
			
		||||
SOEXT_CRYPTO=so.0
 | 
			
		||||
SOEXT_CRYPTO=so.1
 | 
			
		||||
 | 
			
		||||
DLEXT=so
 | 
			
		||||
# OSX shared library extension:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -63,6 +63,11 @@ static void mbedtls_mpi_zeroize( mbedtls_mpi_uint *v, size_t n ) {
 | 
			
		|||
    volatile mbedtls_mpi_uint *p = v; while( n-- ) *p++ = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Implementation that should never be optimized out by the compiler */
 | 
			
		||||
static void mbedtls_zeroize( void *v, size_t n ) {
 | 
			
		||||
    volatile unsigned char *p = v; while( n-- ) *p++ = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define ciL    (sizeof(mbedtls_mpi_uint))         /* chars in limb  */
 | 
			
		||||
#define biL    (ciL << 3)               /* bits  in limb  */
 | 
			
		||||
#define biH    (ciL << 2)               /* half limb size */
 | 
			
		||||
| 
						 | 
				
			
			@ -672,16 +677,20 @@ cleanup:
 | 
			
		|||
int mbedtls_mpi_read_binary( mbedtls_mpi *X, const unsigned char *buf, size_t buflen )
 | 
			
		||||
{
 | 
			
		||||
    int ret;
 | 
			
		||||
    size_t i, j, n;
 | 
			
		||||
    size_t i, j;
 | 
			
		||||
    size_t const limbs = CHARS_TO_LIMBS( buflen );
 | 
			
		||||
 | 
			
		||||
    for( n = 0; n < buflen; n++ )
 | 
			
		||||
        if( buf[n] != 0 )
 | 
			
		||||
            break;
 | 
			
		||||
    /* Ensure that target MPI has exactly the necessary number of limbs */
 | 
			
		||||
    if( X->n != limbs )
 | 
			
		||||
    {
 | 
			
		||||
        mbedtls_mpi_free( X );
 | 
			
		||||
        mbedtls_mpi_init( X );
 | 
			
		||||
        MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, limbs ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, CHARS_TO_LIMBS( buflen - n ) ) );
 | 
			
		||||
    MBEDTLS_MPI_CHK( mbedtls_mpi_lset( X, 0 ) );
 | 
			
		||||
 | 
			
		||||
    for( i = buflen, j = 0; i > n; i--, j++ )
 | 
			
		||||
    for( i = buflen, j = 0; i > 0; i--, j++ )
 | 
			
		||||
        X->p[j / ciL] |= ((mbedtls_mpi_uint) buf[i - 1]) << ((j % ciL) << 3);
 | 
			
		||||
 | 
			
		||||
cleanup:
 | 
			
		||||
| 
						 | 
				
			
			@ -1882,6 +1891,7 @@ int mbedtls_mpi_fill_random( mbedtls_mpi *X, size_t size,
 | 
			
		|||
    MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( X, buf, size ) );
 | 
			
		||||
 | 
			
		||||
cleanup:
 | 
			
		||||
    mbedtls_zeroize( buf, sizeof( buf ) );
 | 
			
		||||
    return( ret );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -516,14 +516,14 @@ static int get_one_and_zeros_padding( unsigned char *input, size_t input_len,
 | 
			
		|||
    if( NULL == input || NULL == data_len )
 | 
			
		||||
        return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
 | 
			
		||||
 | 
			
		||||
    bad = 0xFF;
 | 
			
		||||
    bad = 0x80;
 | 
			
		||||
    *data_len = 0;
 | 
			
		||||
    for( i = input_len; i > 0; i-- )
 | 
			
		||||
    {
 | 
			
		||||
        prev_done = done;
 | 
			
		||||
        done |= ( input[i-1] != 0 );
 | 
			
		||||
        done |= ( input[i - 1] != 0 );
 | 
			
		||||
        *data_len |= ( i - 1 ) * ( done != prev_done );
 | 
			
		||||
        bad &= ( input[i-1] ^ 0x80 ) | ( done == prev_done );
 | 
			
		||||
        bad ^= input[i - 1] * ( done != prev_done );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return( MBEDTLS_ERR_CIPHER_INVALID_PADDING * ( bad != 0 ) );
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -94,11 +94,15 @@ int mbedtls_ctr_drbg_seed_entropy_len(
 | 
			
		|||
    /*
 | 
			
		||||
     * Initialize with an empty key
 | 
			
		||||
     */
 | 
			
		||||
    mbedtls_aes_setkey_enc( &ctx->aes_ctx, key, MBEDTLS_CTR_DRBG_KEYBITS );
 | 
			
		||||
    if( ( ret = mbedtls_aes_setkey_enc( &ctx->aes_ctx, key, MBEDTLS_CTR_DRBG_KEYBITS ) ) != 0 )
 | 
			
		||||
    {
 | 
			
		||||
        return( ret );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if( ( ret = mbedtls_ctr_drbg_reseed( ctx, custom, len ) ) != 0 )
 | 
			
		||||
    {
 | 
			
		||||
        return( ret );
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
    return( 0 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -148,6 +152,7 @@ static int block_cipher_df( unsigned char *output,
 | 
			
		|||
    unsigned char chain[MBEDTLS_CTR_DRBG_BLOCKSIZE];
 | 
			
		||||
    unsigned char *p, *iv;
 | 
			
		||||
    mbedtls_aes_context aes_ctx;
 | 
			
		||||
    int ret = 0;
 | 
			
		||||
 | 
			
		||||
    int i, j;
 | 
			
		||||
    size_t buf_len, use_len;
 | 
			
		||||
| 
						 | 
				
			
			@ -180,7 +185,10 @@ static int block_cipher_df( unsigned char *output,
 | 
			
		|||
    for( i = 0; i < MBEDTLS_CTR_DRBG_KEYSIZE; i++ )
 | 
			
		||||
        key[i] = i;
 | 
			
		||||
 | 
			
		||||
    mbedtls_aes_setkey_enc( &aes_ctx, key, MBEDTLS_CTR_DRBG_KEYBITS );
 | 
			
		||||
    if( ( ret = mbedtls_aes_setkey_enc( &aes_ctx, key, MBEDTLS_CTR_DRBG_KEYBITS ) ) != 0 )
 | 
			
		||||
    {
 | 
			
		||||
        goto exit;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
     * Reduce data to MBEDTLS_CTR_DRBG_SEEDLEN bytes of data
 | 
			
		||||
| 
						 | 
				
			
			@ -199,7 +207,10 @@ static int block_cipher_df( unsigned char *output,
 | 
			
		|||
            use_len -= ( use_len >= MBEDTLS_CTR_DRBG_BLOCKSIZE ) ?
 | 
			
		||||
                       MBEDTLS_CTR_DRBG_BLOCKSIZE : use_len;
 | 
			
		||||
 | 
			
		||||
            mbedtls_aes_crypt_ecb( &aes_ctx, MBEDTLS_AES_ENCRYPT, chain, chain );
 | 
			
		||||
            if( ( ret = mbedtls_aes_crypt_ecb( &aes_ctx, MBEDTLS_AES_ENCRYPT, chain, chain ) ) != 0 )
 | 
			
		||||
            {
 | 
			
		||||
                goto exit;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        memcpy( tmp + j, chain, MBEDTLS_CTR_DRBG_BLOCKSIZE );
 | 
			
		||||
| 
						 | 
				
			
			@ -213,20 +224,40 @@ static int block_cipher_df( unsigned char *output,
 | 
			
		|||
    /*
 | 
			
		||||
     * Do final encryption with reduced data
 | 
			
		||||
     */
 | 
			
		||||
    mbedtls_aes_setkey_enc( &aes_ctx, tmp, MBEDTLS_CTR_DRBG_KEYBITS );
 | 
			
		||||
    if( ( ret = mbedtls_aes_setkey_enc( &aes_ctx, tmp, MBEDTLS_CTR_DRBG_KEYBITS ) ) != 0 )
 | 
			
		||||
    {
 | 
			
		||||
        goto exit;
 | 
			
		||||
    }
 | 
			
		||||
    iv = tmp + MBEDTLS_CTR_DRBG_KEYSIZE;
 | 
			
		||||
    p = output;
 | 
			
		||||
 | 
			
		||||
    for( j = 0; j < MBEDTLS_CTR_DRBG_SEEDLEN; j += MBEDTLS_CTR_DRBG_BLOCKSIZE )
 | 
			
		||||
    {
 | 
			
		||||
        mbedtls_aes_crypt_ecb( &aes_ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
 | 
			
		||||
        if( ( ret = mbedtls_aes_crypt_ecb( &aes_ctx, MBEDTLS_AES_ENCRYPT, iv, iv ) ) != 0 )
 | 
			
		||||
        {
 | 
			
		||||
            goto exit;
 | 
			
		||||
        }
 | 
			
		||||
        memcpy( p, iv, MBEDTLS_CTR_DRBG_BLOCKSIZE );
 | 
			
		||||
        p += MBEDTLS_CTR_DRBG_BLOCKSIZE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
exit:
 | 
			
		||||
    mbedtls_aes_free( &aes_ctx );
 | 
			
		||||
    /*
 | 
			
		||||
    * tidy up the stack
 | 
			
		||||
    */
 | 
			
		||||
    mbedtls_zeroize( buf, sizeof( buf ) );
 | 
			
		||||
    mbedtls_zeroize( tmp, sizeof( tmp ) );
 | 
			
		||||
    mbedtls_zeroize( key, sizeof( key ) );
 | 
			
		||||
    mbedtls_zeroize( chain, sizeof( chain ) );
 | 
			
		||||
    if( 0 != ret )
 | 
			
		||||
    {
 | 
			
		||||
        /*
 | 
			
		||||
        * wipe partial seed from memory
 | 
			
		||||
        */
 | 
			
		||||
        mbedtls_zeroize( output, MBEDTLS_CTR_DRBG_SEEDLEN );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return( 0 );
 | 
			
		||||
    return( ret );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int ctr_drbg_update_internal( mbedtls_ctr_drbg_context *ctx,
 | 
			
		||||
| 
						 | 
				
			
			@ -235,6 +266,7 @@ static int ctr_drbg_update_internal( mbedtls_ctr_drbg_context *ctx,
 | 
			
		|||
    unsigned char tmp[MBEDTLS_CTR_DRBG_SEEDLEN];
 | 
			
		||||
    unsigned char *p = tmp;
 | 
			
		||||
    int i, j;
 | 
			
		||||
    int ret = 0;
 | 
			
		||||
 | 
			
		||||
    memset( tmp, 0, MBEDTLS_CTR_DRBG_SEEDLEN );
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -250,7 +282,10 @@ static int ctr_drbg_update_internal( mbedtls_ctr_drbg_context *ctx,
 | 
			
		|||
        /*
 | 
			
		||||
         * Crypt counter block
 | 
			
		||||
         */
 | 
			
		||||
        mbedtls_aes_crypt_ecb( &ctx->aes_ctx, MBEDTLS_AES_ENCRYPT, ctx->counter, p );
 | 
			
		||||
        if( ( ret = mbedtls_aes_crypt_ecb( &ctx->aes_ctx, MBEDTLS_AES_ENCRYPT, ctx->counter, p ) ) != 0 )
 | 
			
		||||
        {
 | 
			
		||||
            return( ret );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        p += MBEDTLS_CTR_DRBG_BLOCKSIZE;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -261,7 +296,10 @@ static int ctr_drbg_update_internal( mbedtls_ctr_drbg_context *ctx,
 | 
			
		|||
    /*
 | 
			
		||||
     * Update key and counter
 | 
			
		||||
     */
 | 
			
		||||
    mbedtls_aes_setkey_enc( &ctx->aes_ctx, tmp, MBEDTLS_CTR_DRBG_KEYBITS );
 | 
			
		||||
    if( ( ret = mbedtls_aes_setkey_enc( &ctx->aes_ctx, tmp, MBEDTLS_CTR_DRBG_KEYBITS ) ) != 0 )
 | 
			
		||||
    {
 | 
			
		||||
        return( ret );
 | 
			
		||||
    }
 | 
			
		||||
    memcpy( ctx->counter, tmp + MBEDTLS_CTR_DRBG_KEYSIZE, MBEDTLS_CTR_DRBG_BLOCKSIZE );
 | 
			
		||||
 | 
			
		||||
    return( 0 );
 | 
			
		||||
| 
						 | 
				
			
			@ -289,6 +327,7 @@ int mbedtls_ctr_drbg_reseed( mbedtls_ctr_drbg_context *ctx,
 | 
			
		|||
{
 | 
			
		||||
    unsigned char seed[MBEDTLS_CTR_DRBG_MAX_SEED_INPUT];
 | 
			
		||||
    size_t seedlen = 0;
 | 
			
		||||
    int ret;
 | 
			
		||||
 | 
			
		||||
    if( ctx->entropy_len > MBEDTLS_CTR_DRBG_MAX_SEED_INPUT ||
 | 
			
		||||
        len > MBEDTLS_CTR_DRBG_MAX_SEED_INPUT - ctx->entropy_len )
 | 
			
		||||
| 
						 | 
				
			
			@ -319,12 +358,18 @@ int mbedtls_ctr_drbg_reseed( mbedtls_ctr_drbg_context *ctx,
 | 
			
		|||
    /*
 | 
			
		||||
     * Reduce to 384 bits
 | 
			
		||||
     */
 | 
			
		||||
    block_cipher_df( seed, seed, seedlen );
 | 
			
		||||
    if( ( ret = block_cipher_df( seed, seed, seedlen ) ) != 0 )
 | 
			
		||||
    {
 | 
			
		||||
        return( ret );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
     * Update state
 | 
			
		||||
     */
 | 
			
		||||
    ctr_drbg_update_internal( ctx, seed );
 | 
			
		||||
    if( ( ret = ctr_drbg_update_internal( ctx, seed ) ) != 0 )
 | 
			
		||||
    {
 | 
			
		||||
        return( ret );
 | 
			
		||||
    }
 | 
			
		||||
    ctx->reseed_counter = 1;
 | 
			
		||||
 | 
			
		||||
    return( 0 );
 | 
			
		||||
| 
						 | 
				
			
			@ -354,15 +399,22 @@ int mbedtls_ctr_drbg_random_with_add( void *p_rng,
 | 
			
		|||
        ctx->prediction_resistance )
 | 
			
		||||
    {
 | 
			
		||||
        if( ( ret = mbedtls_ctr_drbg_reseed( ctx, additional, add_len ) ) != 0 )
 | 
			
		||||
        {
 | 
			
		||||
            return( ret );
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
        add_len = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if( add_len > 0 )
 | 
			
		||||
    {
 | 
			
		||||
        block_cipher_df( add_input, additional, add_len );
 | 
			
		||||
        ctr_drbg_update_internal( ctx, add_input );
 | 
			
		||||
        if( ( ret = block_cipher_df( add_input, additional, add_len ) ) != 0 )
 | 
			
		||||
        {
 | 
			
		||||
            return( ret );
 | 
			
		||||
        }
 | 
			
		||||
        if( ( ret = ctr_drbg_update_internal( ctx, add_input ) ) != 0 )
 | 
			
		||||
        {
 | 
			
		||||
            return( ret );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    while( output_len > 0 )
 | 
			
		||||
| 
						 | 
				
			
			@ -377,7 +429,10 @@ int mbedtls_ctr_drbg_random_with_add( void *p_rng,
 | 
			
		|||
        /*
 | 
			
		||||
         * Crypt counter block
 | 
			
		||||
         */
 | 
			
		||||
        mbedtls_aes_crypt_ecb( &ctx->aes_ctx, MBEDTLS_AES_ENCRYPT, ctx->counter, tmp );
 | 
			
		||||
        if( ( ret = mbedtls_aes_crypt_ecb( &ctx->aes_ctx, MBEDTLS_AES_ENCRYPT, ctx->counter, tmp ) ) != 0 )
 | 
			
		||||
        {
 | 
			
		||||
            return( ret );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        use_len = ( output_len > MBEDTLS_CTR_DRBG_BLOCKSIZE ) ? MBEDTLS_CTR_DRBG_BLOCKSIZE :
 | 
			
		||||
                                                       output_len;
 | 
			
		||||
| 
						 | 
				
			
			@ -389,7 +444,10 @@ int mbedtls_ctr_drbg_random_with_add( void *p_rng,
 | 
			
		|||
        output_len -= use_len;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ctr_drbg_update_internal( ctx, add_input );
 | 
			
		||||
    if( ( ret = ctr_drbg_update_internal( ctx, add_input ) ) != 0 )
 | 
			
		||||
    {
 | 
			
		||||
        return( ret );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ctx->reseed_counter++;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -430,20 +488,20 @@ int mbedtls_ctr_drbg_write_seed_file( mbedtls_ctr_drbg_context *ctx, const char
 | 
			
		|||
        goto exit;
 | 
			
		||||
 | 
			
		||||
    if( fwrite( buf, 1, MBEDTLS_CTR_DRBG_MAX_INPUT, f ) != MBEDTLS_CTR_DRBG_MAX_INPUT )
 | 
			
		||||
    {
 | 
			
		||||
        ret = MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR;
 | 
			
		||||
        goto exit;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ret = 0;
 | 
			
		||||
    else
 | 
			
		||||
        ret = 0;
 | 
			
		||||
 | 
			
		||||
exit:
 | 
			
		||||
    mbedtls_zeroize( buf, sizeof( buf ) );
 | 
			
		||||
 | 
			
		||||
    fclose( f );
 | 
			
		||||
    return( ret );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int mbedtls_ctr_drbg_update_seed_file( mbedtls_ctr_drbg_context *ctx, const char *path )
 | 
			
		||||
{
 | 
			
		||||
    int ret = 0;
 | 
			
		||||
    FILE *f;
 | 
			
		||||
    size_t n;
 | 
			
		||||
    unsigned char buf[ MBEDTLS_CTR_DRBG_MAX_INPUT ];
 | 
			
		||||
| 
						 | 
				
			
			@ -462,14 +520,16 @@ int mbedtls_ctr_drbg_update_seed_file( mbedtls_ctr_drbg_context *ctx, const char
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    if( fread( buf, 1, n, f ) != n )
 | 
			
		||||
    {
 | 
			
		||||
        fclose( f );
 | 
			
		||||
        return( MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR );
 | 
			
		||||
    }
 | 
			
		||||
        ret = MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR;
 | 
			
		||||
    else
 | 
			
		||||
        mbedtls_ctr_drbg_update( ctx, buf, n );
 | 
			
		||||
 | 
			
		||||
    fclose( f );
 | 
			
		||||
 | 
			
		||||
    mbedtls_ctr_drbg_update( ctx, buf, n );
 | 
			
		||||
    mbedtls_zeroize( buf, sizeof( buf ) );
 | 
			
		||||
 | 
			
		||||
    if( ret != 0 )
 | 
			
		||||
        return( ret );
 | 
			
		||||
 | 
			
		||||
    return( mbedtls_ctr_drbg_write_seed_file( ctx, path ) );
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -57,6 +57,7 @@
 | 
			
		|||
#define mbedtls_free       free
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined(MBEDTLS_DHM_ALT)
 | 
			
		||||
/* Implementation that should never be optimized out by the compiler */
 | 
			
		||||
static void mbedtls_zeroize( void *v, size_t n ) {
 | 
			
		||||
    volatile unsigned char *p = v; while( n-- ) *p++ = 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -93,6 +94,9 @@ static int dhm_read_bignum( mbedtls_mpi *X,
 | 
			
		|||
 *
 | 
			
		||||
 * Parameter should be: 2 <= public_param <= P - 2
 | 
			
		||||
 *
 | 
			
		||||
 * This means that we need to return an error if
 | 
			
		||||
 *              public_param < 2 or public_param > P-2
 | 
			
		||||
 *
 | 
			
		||||
 * For more information on the attack, see:
 | 
			
		||||
 *  http://www.cl.cam.ac.uk/~rja14/Papers/psandqs.pdf
 | 
			
		||||
 *  http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2005-2643
 | 
			
		||||
| 
						 | 
				
			
			@ -100,17 +104,17 @@ static int dhm_read_bignum( mbedtls_mpi *X,
 | 
			
		|||
static int dhm_check_range( const mbedtls_mpi *param, const mbedtls_mpi *P )
 | 
			
		||||
{
 | 
			
		||||
    mbedtls_mpi L, U;
 | 
			
		||||
    int ret = MBEDTLS_ERR_DHM_BAD_INPUT_DATA;
 | 
			
		||||
    int ret = 0;
 | 
			
		||||
 | 
			
		||||
    mbedtls_mpi_init( &L ); mbedtls_mpi_init( &U );
 | 
			
		||||
 | 
			
		||||
    MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &L, 2 ) );
 | 
			
		||||
    MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &U, P, 2 ) );
 | 
			
		||||
 | 
			
		||||
    if( mbedtls_mpi_cmp_mpi( param, &L ) >= 0 &&
 | 
			
		||||
        mbedtls_mpi_cmp_mpi( param, &U ) <= 0 )
 | 
			
		||||
    if( mbedtls_mpi_cmp_mpi( param, &L ) < 0 ||
 | 
			
		||||
        mbedtls_mpi_cmp_mpi( param, &U ) > 0 )
 | 
			
		||||
    {
 | 
			
		||||
        ret = 0;
 | 
			
		||||
        ret = MBEDTLS_ERR_DHM_BAD_INPUT_DATA;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
cleanup:
 | 
			
		||||
| 
						 | 
				
			
			@ -187,10 +191,15 @@ int mbedtls_dhm_make_params( mbedtls_dhm_context *ctx, int x_size,
 | 
			
		|||
    /*
 | 
			
		||||
     * export P, G, GX
 | 
			
		||||
     */
 | 
			
		||||
#define DHM_MPI_EXPORT(X,n)                     \
 | 
			
		||||
    MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( X, p + 2, n ) ); \
 | 
			
		||||
    *p++ = (unsigned char)( n >> 8 );           \
 | 
			
		||||
    *p++ = (unsigned char)( n      ); p += n;
 | 
			
		||||
#define DHM_MPI_EXPORT( X, n )                                          \
 | 
			
		||||
    do {                                                                \
 | 
			
		||||
        MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( ( X ),               \
 | 
			
		||||
                                                   p + 2,               \
 | 
			
		||||
                                                   ( n ) ) );           \
 | 
			
		||||
        *p++ = (unsigned char)( ( n ) >> 8 );                           \
 | 
			
		||||
        *p++ = (unsigned char)( ( n )      );                           \
 | 
			
		||||
        p += ( n );                                                     \
 | 
			
		||||
    } while( 0 )
 | 
			
		||||
 | 
			
		||||
    n1 = mbedtls_mpi_size( &ctx->P  );
 | 
			
		||||
    n2 = mbedtls_mpi_size( &ctx->G  );
 | 
			
		||||
| 
						 | 
				
			
			@ -201,7 +210,7 @@ int mbedtls_dhm_make_params( mbedtls_dhm_context *ctx, int x_size,
 | 
			
		|||
    DHM_MPI_EXPORT( &ctx->G , n2 );
 | 
			
		||||
    DHM_MPI_EXPORT( &ctx->GX, n3 );
 | 
			
		||||
 | 
			
		||||
    *olen  = p - output;
 | 
			
		||||
    *olen = p - output;
 | 
			
		||||
 | 
			
		||||
    ctx->len = n1;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -213,6 +222,28 @@ cleanup:
 | 
			
		|||
    return( 0 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Set prime modulus and generator
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_dhm_set_group( mbedtls_dhm_context *ctx,
 | 
			
		||||
                           const mbedtls_mpi *P,
 | 
			
		||||
                           const mbedtls_mpi *G )
 | 
			
		||||
{
 | 
			
		||||
    int ret;
 | 
			
		||||
 | 
			
		||||
    if( ctx == NULL || P == NULL || G == NULL )
 | 
			
		||||
        return( MBEDTLS_ERR_DHM_BAD_INPUT_DATA );
 | 
			
		||||
 | 
			
		||||
    if( ( ret = mbedtls_mpi_copy( &ctx->P, P ) ) != 0 ||
 | 
			
		||||
        ( ret = mbedtls_mpi_copy( &ctx->G, G ) ) != 0 )
 | 
			
		||||
    {
 | 
			
		||||
        return( MBEDTLS_ERR_DHM_SET_GROUP_FAILED + ret );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ctx->len = mbedtls_mpi_size( &ctx->P );
 | 
			
		||||
    return( 0 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Import the peer's public value G^Y
 | 
			
		||||
 */
 | 
			
		||||
| 
						 | 
				
			
			@ -400,10 +431,11 @@ cleanup:
 | 
			
		|||
 */
 | 
			
		||||
void mbedtls_dhm_free( mbedtls_dhm_context *ctx )
 | 
			
		||||
{
 | 
			
		||||
    mbedtls_mpi_free( &ctx->pX); mbedtls_mpi_free( &ctx->Vf ); mbedtls_mpi_free( &ctx->Vi );
 | 
			
		||||
    mbedtls_mpi_free( &ctx->RP ); mbedtls_mpi_free( &ctx->K ); mbedtls_mpi_free( &ctx->GY );
 | 
			
		||||
    mbedtls_mpi_free( &ctx->GX ); mbedtls_mpi_free( &ctx->X ); mbedtls_mpi_free( &ctx->G );
 | 
			
		||||
    mbedtls_mpi_free( &ctx->P );
 | 
			
		||||
    mbedtls_mpi_free( &ctx->pX ); mbedtls_mpi_free( &ctx->Vf );
 | 
			
		||||
    mbedtls_mpi_free( &ctx->Vi ); mbedtls_mpi_free( &ctx->RP );
 | 
			
		||||
    mbedtls_mpi_free( &ctx->K  ); mbedtls_mpi_free( &ctx->GY );
 | 
			
		||||
    mbedtls_mpi_free( &ctx->GX ); mbedtls_mpi_free( &ctx->X  );
 | 
			
		||||
    mbedtls_mpi_free( &ctx->G  ); mbedtls_mpi_free( &ctx->P  );
 | 
			
		||||
 | 
			
		||||
    mbedtls_zeroize( ctx, sizeof( mbedtls_dhm_context ) );
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -542,7 +574,10 @@ static int load_file( const char *path, unsigned char **buf, size_t *n )
 | 
			
		|||
    if( fread( *buf, 1, *n, f ) != *n )
 | 
			
		||||
    {
 | 
			
		||||
        fclose( f );
 | 
			
		||||
 | 
			
		||||
        mbedtls_zeroize( *buf, *n + 1 );
 | 
			
		||||
        mbedtls_free( *buf );
 | 
			
		||||
 | 
			
		||||
        return( MBEDTLS_ERR_DHM_FILE_IO_ERROR );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -577,6 +612,7 @@ int mbedtls_dhm_parse_dhmfile( mbedtls_dhm_context *dhm, const char *path )
 | 
			
		|||
}
 | 
			
		||||
#endif /* MBEDTLS_FS_IO */
 | 
			
		||||
#endif /* MBEDTLS_ASN1_PARSE_C */
 | 
			
		||||
#endif /* MBEDTLS_DHM_ALT */
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_SELF_TEST)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -36,6 +36,8 @@
 | 
			
		|||
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#if !defined(MBEDTLS_ECJPAKE_ALT)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Convert a mbedtls_ecjpake_role to identifier string
 | 
			
		||||
 */
 | 
			
		||||
| 
						 | 
				
			
			@ -764,6 +766,7 @@ cleanup:
 | 
			
		|||
#undef ID_MINE
 | 
			
		||||
#undef ID_PEER
 | 
			
		||||
 | 
			
		||||
#endif /* ! MBEDTLS_ECJPAKE_ALT */
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_SELF_TEST)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1958,7 +1958,6 @@ int mbedtls_ecp_gen_keypair_base( mbedtls_ecp_group *grp,
 | 
			
		|||
    {
 | 
			
		||||
        /* SEC1 3.2.1: Generate d such that 1 <= n < N */
 | 
			
		||||
        int count = 0;
 | 
			
		||||
        unsigned char rnd[MBEDTLS_ECP_MAX_BYTES];
 | 
			
		||||
 | 
			
		||||
        /*
 | 
			
		||||
         * Match the procedure given in RFC 6979 (deterministic ECDSA):
 | 
			
		||||
| 
						 | 
				
			
			@ -1969,8 +1968,7 @@ int mbedtls_ecp_gen_keypair_base( mbedtls_ecp_group *grp,
 | 
			
		|||
         */
 | 
			
		||||
        do
 | 
			
		||||
        {
 | 
			
		||||
            MBEDTLS_MPI_CHK( f_rng( p_rng, rnd, n_size ) );
 | 
			
		||||
            MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( d, rnd, n_size ) );
 | 
			
		||||
            MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( d, n_size, f_rng, p_rng ) );
 | 
			
		||||
            MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( d, 8 * n_size - grp->nbits ) );
 | 
			
		||||
 | 
			
		||||
            /*
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -68,16 +68,18 @@ static void mbedtls_zeroize( void *v, size_t n ) {
 | 
			
		|||
 | 
			
		||||
void mbedtls_entropy_init( mbedtls_entropy_context *ctx )
 | 
			
		||||
{
 | 
			
		||||
    memset( ctx, 0, sizeof(mbedtls_entropy_context) );
 | 
			
		||||
    ctx->source_count = 0;
 | 
			
		||||
    memset( ctx->source, 0, sizeof( ctx->source ) );
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_THREADING_C)
 | 
			
		||||
    mbedtls_mutex_init( &ctx->mutex );
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    ctx->accumulator_started = 0;
 | 
			
		||||
#if defined(MBEDTLS_ENTROPY_SHA512_ACCUMULATOR)
 | 
			
		||||
    mbedtls_sha512_starts( &ctx->accumulator, 0 );
 | 
			
		||||
    mbedtls_sha512_init( &ctx->accumulator );
 | 
			
		||||
#else
 | 
			
		||||
    mbedtls_sha256_starts( &ctx->accumulator, 0 );
 | 
			
		||||
    mbedtls_sha256_init( &ctx->accumulator );
 | 
			
		||||
#endif
 | 
			
		||||
#if defined(MBEDTLS_HAVEGE_C)
 | 
			
		||||
    mbedtls_havege_init( &ctx->havege_data );
 | 
			
		||||
| 
						 | 
				
			
			@ -116,6 +118,7 @@ void mbedtls_entropy_init( mbedtls_entropy_context *ctx )
 | 
			
		|||
    mbedtls_entropy_add_source( ctx, mbedtls_nv_seed_poll, NULL,
 | 
			
		||||
                                MBEDTLS_ENTROPY_BLOCK_SIZE,
 | 
			
		||||
                                MBEDTLS_ENTROPY_SOURCE_STRONG );
 | 
			
		||||
    ctx->initial_entropy_run = 0;
 | 
			
		||||
#endif
 | 
			
		||||
#endif /* MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES */
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -128,7 +131,17 @@ void mbedtls_entropy_free( mbedtls_entropy_context *ctx )
 | 
			
		|||
#if defined(MBEDTLS_THREADING_C)
 | 
			
		||||
    mbedtls_mutex_free( &ctx->mutex );
 | 
			
		||||
#endif
 | 
			
		||||
    mbedtls_zeroize( ctx, sizeof( mbedtls_entropy_context ) );
 | 
			
		||||
#if defined(MBEDTLS_ENTROPY_SHA512_ACCUMULATOR)
 | 
			
		||||
    mbedtls_sha512_free( &ctx->accumulator );
 | 
			
		||||
#else
 | 
			
		||||
    mbedtls_sha256_free( &ctx->accumulator );
 | 
			
		||||
#endif
 | 
			
		||||
#if defined(MBEDTLS_ENTROPY_NV_SEED)
 | 
			
		||||
    ctx->initial_entropy_run = 0;
 | 
			
		||||
#endif
 | 
			
		||||
    ctx->source_count = 0;
 | 
			
		||||
    mbedtls_zeroize( ctx->source, sizeof( ctx->source ) );
 | 
			
		||||
    ctx->accumulator_started = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int mbedtls_entropy_add_source( mbedtls_entropy_context *ctx,
 | 
			
		||||
| 
						 | 
				
			
			@ -175,13 +188,16 @@ static int entropy_update( mbedtls_entropy_context *ctx, unsigned char source_id
 | 
			
		|||
    unsigned char tmp[MBEDTLS_ENTROPY_BLOCK_SIZE];
 | 
			
		||||
    size_t use_len = len;
 | 
			
		||||
    const unsigned char *p = data;
 | 
			
		||||
    int ret = 0;
 | 
			
		||||
 | 
			
		||||
    if( use_len > MBEDTLS_ENTROPY_BLOCK_SIZE )
 | 
			
		||||
    {
 | 
			
		||||
#if defined(MBEDTLS_ENTROPY_SHA512_ACCUMULATOR)
 | 
			
		||||
        mbedtls_sha512( data, len, tmp, 0 );
 | 
			
		||||
        if( ( ret = mbedtls_sha512_ret( data, len, tmp, 0 ) ) != 0 )
 | 
			
		||||
            goto cleanup;
 | 
			
		||||
#else
 | 
			
		||||
        mbedtls_sha256( data, len, tmp, 0 );
 | 
			
		||||
        if( ( ret = mbedtls_sha256_ret( data, len, tmp, 0 ) ) != 0 )
 | 
			
		||||
            goto cleanup;
 | 
			
		||||
#endif
 | 
			
		||||
        p = tmp;
 | 
			
		||||
        use_len = MBEDTLS_ENTROPY_BLOCK_SIZE;
 | 
			
		||||
| 
						 | 
				
			
			@ -190,15 +206,35 @@ static int entropy_update( mbedtls_entropy_context *ctx, unsigned char source_id
 | 
			
		|||
    header[0] = source_id;
 | 
			
		||||
    header[1] = use_len & 0xFF;
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
     * Start the accumulator if this has not already happened. Note that
 | 
			
		||||
     * it is sufficient to start the accumulator here only because all calls to
 | 
			
		||||
     * gather entropy eventually execute this code.
 | 
			
		||||
     */
 | 
			
		||||
#if defined(MBEDTLS_ENTROPY_SHA512_ACCUMULATOR)
 | 
			
		||||
    mbedtls_sha512_update( &ctx->accumulator, header, 2 );
 | 
			
		||||
    mbedtls_sha512_update( &ctx->accumulator, p, use_len );
 | 
			
		||||
    if( ctx->accumulator_started == 0 &&
 | 
			
		||||
        ( ret = mbedtls_sha512_starts_ret( &ctx->accumulator, 0 ) ) != 0 )
 | 
			
		||||
        goto cleanup;
 | 
			
		||||
    else
 | 
			
		||||
        ctx->accumulator_started = 1;
 | 
			
		||||
    if( ( ret = mbedtls_sha512_update_ret( &ctx->accumulator, header, 2 ) ) != 0 )
 | 
			
		||||
        goto cleanup;
 | 
			
		||||
    ret = mbedtls_sha512_update_ret( &ctx->accumulator, p, use_len );
 | 
			
		||||
#else
 | 
			
		||||
    mbedtls_sha256_update( &ctx->accumulator, header, 2 );
 | 
			
		||||
    mbedtls_sha256_update( &ctx->accumulator, p, use_len );
 | 
			
		||||
    if( ctx->accumulator_started == 0 &&
 | 
			
		||||
        ( ret = mbedtls_sha256_starts_ret( &ctx->accumulator, 0 ) ) != 0 )
 | 
			
		||||
        goto cleanup;
 | 
			
		||||
    else
 | 
			
		||||
        ctx->accumulator_started = 1;
 | 
			
		||||
    if( ( ret = mbedtls_sha256_update_ret( &ctx->accumulator, header, 2 ) ) != 0 )
 | 
			
		||||
        goto cleanup;
 | 
			
		||||
    ret = mbedtls_sha256_update_ret( &ctx->accumulator, p, use_len );
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    return( 0 );
 | 
			
		||||
cleanup:
 | 
			
		||||
    mbedtls_zeroize( tmp, sizeof( tmp ) );
 | 
			
		||||
 | 
			
		||||
    return( ret );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int mbedtls_entropy_update_manual( mbedtls_entropy_context *ctx,
 | 
			
		||||
| 
						 | 
				
			
			@ -245,7 +281,7 @@ static int entropy_gather_internal( mbedtls_entropy_context *ctx )
 | 
			
		|||
        if( ( ret = ctx->source[i].f_source( ctx->source[i].p_source,
 | 
			
		||||
                        buf, MBEDTLS_ENTROPY_MAX_GATHER, &olen ) ) != 0 )
 | 
			
		||||
        {
 | 
			
		||||
            return( ret );
 | 
			
		||||
            goto cleanup;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /*
 | 
			
		||||
| 
						 | 
				
			
			@ -253,15 +289,20 @@ static int entropy_gather_internal( mbedtls_entropy_context *ctx )
 | 
			
		|||
         */
 | 
			
		||||
        if( olen > 0 )
 | 
			
		||||
        {
 | 
			
		||||
            entropy_update( ctx, (unsigned char) i, buf, olen );
 | 
			
		||||
            if( ( ret = entropy_update( ctx, (unsigned char) i,
 | 
			
		||||
                                        buf, olen ) ) != 0 )
 | 
			
		||||
                return( ret );
 | 
			
		||||
            ctx->source[i].size += olen;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if( have_one_strong == 0 )
 | 
			
		||||
        return( MBEDTLS_ERR_ENTROPY_NO_STRONG_SOURCE );
 | 
			
		||||
        ret = MBEDTLS_ERR_ENTROPY_NO_STRONG_SOURCE;
 | 
			
		||||
 | 
			
		||||
    return( 0 );
 | 
			
		||||
cleanup:
 | 
			
		||||
    mbedtls_zeroize( buf, sizeof( buf ) );
 | 
			
		||||
 | 
			
		||||
    return( ret );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
| 
						 | 
				
			
			@ -336,33 +377,52 @@ int mbedtls_entropy_func( void *data, unsigned char *output, size_t len )
 | 
			
		|||
    memset( buf, 0, MBEDTLS_ENTROPY_BLOCK_SIZE );
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_ENTROPY_SHA512_ACCUMULATOR)
 | 
			
		||||
    mbedtls_sha512_finish( &ctx->accumulator, buf );
 | 
			
		||||
    /*
 | 
			
		||||
     * Note that at this stage it is assumed that the accumulator was started
 | 
			
		||||
     * in a previous call to entropy_update(). If this is not guaranteed, the
 | 
			
		||||
     * code below will fail.
 | 
			
		||||
     */
 | 
			
		||||
    if( ( ret = mbedtls_sha512_finish_ret( &ctx->accumulator, buf ) ) != 0 )
 | 
			
		||||
        goto exit;
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
     * Reset accumulator and counters and recycle existing entropy
 | 
			
		||||
     */
 | 
			
		||||
    memset( &ctx->accumulator, 0, sizeof( mbedtls_sha512_context ) );
 | 
			
		||||
    mbedtls_sha512_starts( &ctx->accumulator, 0 );
 | 
			
		||||
    mbedtls_sha512_update( &ctx->accumulator, buf, MBEDTLS_ENTROPY_BLOCK_SIZE );
 | 
			
		||||
    mbedtls_sha512_free( &ctx->accumulator );
 | 
			
		||||
    mbedtls_sha512_init( &ctx->accumulator );
 | 
			
		||||
    if( ( ret = mbedtls_sha512_starts_ret( &ctx->accumulator, 0 ) ) != 0 )
 | 
			
		||||
        goto exit;
 | 
			
		||||
    if( ( ret = mbedtls_sha512_update_ret( &ctx->accumulator, buf,
 | 
			
		||||
                                           MBEDTLS_ENTROPY_BLOCK_SIZE ) ) != 0 )
 | 
			
		||||
        goto exit;
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
     * Perform second SHA-512 on entropy
 | 
			
		||||
     */
 | 
			
		||||
    mbedtls_sha512( buf, MBEDTLS_ENTROPY_BLOCK_SIZE, buf, 0 );
 | 
			
		||||
    if( ( ret = mbedtls_sha512_ret( buf, MBEDTLS_ENTROPY_BLOCK_SIZE,
 | 
			
		||||
                                    buf, 0 ) ) != 0 )
 | 
			
		||||
        goto exit;
 | 
			
		||||
#else /* MBEDTLS_ENTROPY_SHA512_ACCUMULATOR */
 | 
			
		||||
    mbedtls_sha256_finish( &ctx->accumulator, buf );
 | 
			
		||||
    if( ( ret = mbedtls_sha256_finish_ret( &ctx->accumulator, buf ) ) != 0 )
 | 
			
		||||
        goto exit;
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
     * Reset accumulator and counters and recycle existing entropy
 | 
			
		||||
     */
 | 
			
		||||
    memset( &ctx->accumulator, 0, sizeof( mbedtls_sha256_context ) );
 | 
			
		||||
    mbedtls_sha256_starts( &ctx->accumulator, 0 );
 | 
			
		||||
    mbedtls_sha256_update( &ctx->accumulator, buf, MBEDTLS_ENTROPY_BLOCK_SIZE );
 | 
			
		||||
    mbedtls_sha256_free( &ctx->accumulator );
 | 
			
		||||
    mbedtls_sha256_init( &ctx->accumulator );
 | 
			
		||||
    if( ( ret = mbedtls_sha256_starts_ret( &ctx->accumulator, 0 ) ) != 0 )
 | 
			
		||||
        goto exit;
 | 
			
		||||
    if( ( ret = mbedtls_sha256_update_ret( &ctx->accumulator, buf,
 | 
			
		||||
                                           MBEDTLS_ENTROPY_BLOCK_SIZE ) ) != 0 )
 | 
			
		||||
        goto exit;
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
     * Perform second SHA-256 on entropy
 | 
			
		||||
     */
 | 
			
		||||
    mbedtls_sha256( buf, MBEDTLS_ENTROPY_BLOCK_SIZE, buf, 0 );
 | 
			
		||||
    if( ( ret = mbedtls_sha256_ret( buf, MBEDTLS_ENTROPY_BLOCK_SIZE,
 | 
			
		||||
                                    buf, 0 ) ) != 0 )
 | 
			
		||||
        goto exit;
 | 
			
		||||
#endif /* MBEDTLS_ENTROPY_SHA512_ACCUMULATOR */
 | 
			
		||||
 | 
			
		||||
    for( i = 0; i < ctx->source_count; i++ )
 | 
			
		||||
| 
						 | 
				
			
			@ -373,6 +433,8 @@ int mbedtls_entropy_func( void *data, unsigned char *output, size_t len )
 | 
			
		|||
    ret = 0;
 | 
			
		||||
 | 
			
		||||
exit:
 | 
			
		||||
    mbedtls_zeroize( buf, sizeof( buf ) );
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_THREADING_C)
 | 
			
		||||
    if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 )
 | 
			
		||||
        return( MBEDTLS_ERR_THREADING_MUTEX_ERROR );
 | 
			
		||||
| 
						 | 
				
			
			@ -385,7 +447,7 @@ exit:
 | 
			
		|||
int mbedtls_entropy_update_nv_seed( mbedtls_entropy_context *ctx )
 | 
			
		||||
{
 | 
			
		||||
    int ret = MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR;
 | 
			
		||||
    unsigned char buf[ MBEDTLS_ENTROPY_MAX_SEED_SIZE ];
 | 
			
		||||
    unsigned char buf[MBEDTLS_ENTROPY_BLOCK_SIZE];
 | 
			
		||||
 | 
			
		||||
    /* Read new seed  and write it to NV */
 | 
			
		||||
    if( ( ret = mbedtls_entropy_func( ctx, buf, MBEDTLS_ENTROPY_BLOCK_SIZE ) ) != 0 )
 | 
			
		||||
| 
						 | 
				
			
			@ -396,9 +458,9 @@ int mbedtls_entropy_update_nv_seed( mbedtls_entropy_context *ctx )
 | 
			
		|||
 | 
			
		||||
    /* Manually update the remaining stream with a separator value to diverge */
 | 
			
		||||
    memset( buf, 0, MBEDTLS_ENTROPY_BLOCK_SIZE );
 | 
			
		||||
    mbedtls_entropy_update_manual( ctx, buf, MBEDTLS_ENTROPY_BLOCK_SIZE );
 | 
			
		||||
    ret = mbedtls_entropy_update_manual( ctx, buf, MBEDTLS_ENTROPY_BLOCK_SIZE );
 | 
			
		||||
 | 
			
		||||
    return( 0 );
 | 
			
		||||
    return( ret );
 | 
			
		||||
}
 | 
			
		||||
#endif /* MBEDTLS_ENTROPY_NV_SEED */
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -424,12 +486,15 @@ int mbedtls_entropy_write_seed_file( mbedtls_entropy_context *ctx, const char *p
 | 
			
		|||
    ret = 0;
 | 
			
		||||
 | 
			
		||||
exit:
 | 
			
		||||
    mbedtls_zeroize( buf, sizeof( buf ) );
 | 
			
		||||
 | 
			
		||||
    fclose( f );
 | 
			
		||||
    return( ret );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int mbedtls_entropy_update_seed_file( mbedtls_entropy_context *ctx, const char *path )
 | 
			
		||||
{
 | 
			
		||||
    int ret = 0;
 | 
			
		||||
    FILE *f;
 | 
			
		||||
    size_t n;
 | 
			
		||||
    unsigned char buf[ MBEDTLS_ENTROPY_MAX_SEED_SIZE ];
 | 
			
		||||
| 
						 | 
				
			
			@ -445,14 +510,16 @@ int mbedtls_entropy_update_seed_file( mbedtls_entropy_context *ctx, const char *
 | 
			
		|||
        n = MBEDTLS_ENTROPY_MAX_SEED_SIZE;
 | 
			
		||||
 | 
			
		||||
    if( fread( buf, 1, n, f ) != n )
 | 
			
		||||
    {
 | 
			
		||||
        fclose( f );
 | 
			
		||||
        return( MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR );
 | 
			
		||||
    }
 | 
			
		||||
        ret = MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR;
 | 
			
		||||
    else
 | 
			
		||||
        ret = mbedtls_entropy_update_manual( ctx, buf, n );
 | 
			
		||||
 | 
			
		||||
    fclose( f );
 | 
			
		||||
 | 
			
		||||
    mbedtls_entropy_update_manual( ctx, buf, n );
 | 
			
		||||
    mbedtls_zeroize( buf, sizeof( buf ) );
 | 
			
		||||
 | 
			
		||||
    if( ret != 0 )
 | 
			
		||||
        return( ret );
 | 
			
		||||
 | 
			
		||||
    return( mbedtls_entropy_write_seed_file( ctx, path ) );
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										131
									
								
								library/error.c
									
									
									
									
									
								
							
							
						
						
									
										131
									
								
								library/error.c
									
									
									
									
									
								
							| 
						 | 
				
			
			@ -45,6 +45,10 @@
 | 
			
		|||
#include "mbedtls/aes.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_ARC4_C)
 | 
			
		||||
#include "mbedtls/arc4.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_BASE64_C)
 | 
			
		||||
#include "mbedtls/base64.h"
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -69,6 +73,10 @@
 | 
			
		|||
#include "mbedtls/cipher.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_CMAC_C)
 | 
			
		||||
#include "mbedtls/cmac.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_CTR_DRBG_C)
 | 
			
		||||
#include "mbedtls/ctr_drbg.h"
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -101,6 +109,18 @@
 | 
			
		|||
#include "mbedtls/md.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_MD2_C)
 | 
			
		||||
#include "mbedtls/md2.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_MD4_C)
 | 
			
		||||
#include "mbedtls/md4.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_MD5_C)
 | 
			
		||||
#include "mbedtls/md5.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_NET_C)
 | 
			
		||||
#include "mbedtls/net_sockets.h"
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -129,10 +149,26 @@
 | 
			
		|||
#include "mbedtls/pkcs5.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_RIPEMD160_C)
 | 
			
		||||
#include "mbedtls/ripemd160.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_RSA_C)
 | 
			
		||||
#include "mbedtls/rsa.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_SHA1_C)
 | 
			
		||||
#include "mbedtls/sha1.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_SHA256_C)
 | 
			
		||||
#include "mbedtls/sha256.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_SHA512_C)
 | 
			
		||||
#include "mbedtls/sha512.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_SSL_TLS_C)
 | 
			
		||||
#include "mbedtls/ssl.h"
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -174,7 +210,7 @@ void mbedtls_strerror( int ret, char *buf, size_t buflen )
 | 
			
		|||
        if( use_ret == -(MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE) )
 | 
			
		||||
            mbedtls_snprintf( buf, buflen, "CIPHER - The selected feature is not available" );
 | 
			
		||||
        if( use_ret == -(MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA) )
 | 
			
		||||
            mbedtls_snprintf( buf, buflen, "CIPHER - Bad input parameters to function" );
 | 
			
		||||
            mbedtls_snprintf( buf, buflen, "CIPHER - Bad input parameters" );
 | 
			
		||||
        if( use_ret == -(MBEDTLS_ERR_CIPHER_ALLOC_FAILED) )
 | 
			
		||||
            mbedtls_snprintf( buf, buflen, "CIPHER - Failed to allocate memory" );
 | 
			
		||||
        if( use_ret == -(MBEDTLS_ERR_CIPHER_INVALID_PADDING) )
 | 
			
		||||
| 
						 | 
				
			
			@ -184,12 +220,14 @@ void mbedtls_strerror( int ret, char *buf, size_t buflen )
 | 
			
		|||
        if( use_ret == -(MBEDTLS_ERR_CIPHER_AUTH_FAILED) )
 | 
			
		||||
            mbedtls_snprintf( buf, buflen, "CIPHER - Authentication failed (for AEAD modes)" );
 | 
			
		||||
        if( use_ret == -(MBEDTLS_ERR_CIPHER_INVALID_CONTEXT) )
 | 
			
		||||
            mbedtls_snprintf( buf, buflen, "CIPHER - The context is invalid, eg because it was free()ed" );
 | 
			
		||||
            mbedtls_snprintf( buf, buflen, "CIPHER - The context is invalid. For example, because it was freed" );
 | 
			
		||||
        if( use_ret == -(MBEDTLS_ERR_CIPHER_HW_ACCEL_FAILED) )
 | 
			
		||||
            mbedtls_snprintf( buf, buflen, "CIPHER - Cipher hardware accelerator failed" );
 | 
			
		||||
#endif /* MBEDTLS_CIPHER_C */
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_DHM_C)
 | 
			
		||||
        if( use_ret == -(MBEDTLS_ERR_DHM_BAD_INPUT_DATA) )
 | 
			
		||||
            mbedtls_snprintf( buf, buflen, "DHM - Bad input parameters to function" );
 | 
			
		||||
            mbedtls_snprintf( buf, buflen, "DHM - Bad input parameters" );
 | 
			
		||||
        if( use_ret == -(MBEDTLS_ERR_DHM_READ_PARAMS_FAILED) )
 | 
			
		||||
            mbedtls_snprintf( buf, buflen, "DHM - Reading of the DHM parameters failed" );
 | 
			
		||||
        if( use_ret == -(MBEDTLS_ERR_DHM_MAKE_PARAMS_FAILED) )
 | 
			
		||||
| 
						 | 
				
			
			@ -205,7 +243,11 @@ void mbedtls_strerror( int ret, char *buf, size_t buflen )
 | 
			
		|||
        if( use_ret == -(MBEDTLS_ERR_DHM_ALLOC_FAILED) )
 | 
			
		||||
            mbedtls_snprintf( buf, buflen, "DHM - Allocation of memory failed" );
 | 
			
		||||
        if( use_ret == -(MBEDTLS_ERR_DHM_FILE_IO_ERROR) )
 | 
			
		||||
            mbedtls_snprintf( buf, buflen, "DHM - Read/write of file failed" );
 | 
			
		||||
            mbedtls_snprintf( buf, buflen, "DHM - Read or write of file failed" );
 | 
			
		||||
        if( use_ret == -(MBEDTLS_ERR_DHM_HW_ACCEL_FAILED) )
 | 
			
		||||
            mbedtls_snprintf( buf, buflen, "DHM - DHM hardware accelerator failed" );
 | 
			
		||||
        if( use_ret == -(MBEDTLS_ERR_DHM_SET_GROUP_FAILED) )
 | 
			
		||||
            mbedtls_snprintf( buf, buflen, "DHM - Setting the modulus and generator failed" );
 | 
			
		||||
#endif /* MBEDTLS_DHM_C */
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_ECP_C)
 | 
			
		||||
| 
						 | 
				
			
			@ -225,6 +267,8 @@ void mbedtls_strerror( int ret, char *buf, size_t buflen )
 | 
			
		|||
            mbedtls_snprintf( buf, buflen, "ECP - Invalid private or public key" );
 | 
			
		||||
        if( use_ret == -(MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH) )
 | 
			
		||||
            mbedtls_snprintf( buf, buflen, "ECP - Signature is valid but shorter than the user-supplied length" );
 | 
			
		||||
        if( use_ret == -(MBEDTLS_ERR_ECP_HW_ACCEL_FAILED) )
 | 
			
		||||
            mbedtls_snprintf( buf, buflen, "ECP - ECP hardware accelerator failed" );
 | 
			
		||||
#endif /* MBEDTLS_ECP_C */
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_MD_C)
 | 
			
		||||
| 
						 | 
				
			
			@ -236,6 +280,8 @@ void mbedtls_strerror( int ret, char *buf, size_t buflen )
 | 
			
		|||
            mbedtls_snprintf( buf, buflen, "MD - Failed to allocate memory" );
 | 
			
		||||
        if( use_ret == -(MBEDTLS_ERR_MD_FILE_IO_ERROR) )
 | 
			
		||||
            mbedtls_snprintf( buf, buflen, "MD - Opening or reading of file failed" );
 | 
			
		||||
        if( use_ret == -(MBEDTLS_ERR_MD_HW_ACCEL_FAILED) )
 | 
			
		||||
            mbedtls_snprintf( buf, buflen, "MD - MD hardware accelerator failed" );
 | 
			
		||||
#endif /* MBEDTLS_MD_C */
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_PEM_PARSE_C) || defined(MBEDTLS_PEM_WRITE_C)
 | 
			
		||||
| 
						 | 
				
			
			@ -288,6 +334,8 @@ void mbedtls_strerror( int ret, char *buf, size_t buflen )
 | 
			
		|||
            mbedtls_snprintf( buf, buflen, "PK - Unavailable feature, e.g. RSA disabled for RSA key" );
 | 
			
		||||
        if( use_ret == -(MBEDTLS_ERR_PK_SIG_LEN_MISMATCH) )
 | 
			
		||||
            mbedtls_snprintf( buf, buflen, "PK - The signature is valid but its length is less than expected" );
 | 
			
		||||
        if( use_ret == -(MBEDTLS_ERR_PK_HW_ACCEL_FAILED) )
 | 
			
		||||
            mbedtls_snprintf( buf, buflen, "PK - PK hardware accelerator failed" );
 | 
			
		||||
        if( use_ret == -(MBEDTLS_ERR_PK_INVALID_SIGNATURE) )
 | 
			
		||||
            mbedtls_snprintf( buf, buflen, "PK - Invalid signature" );
 | 
			
		||||
        if( use_ret == -(MBEDTLS_ERR_PK_BUFFER_TOO_SMALL) )
 | 
			
		||||
| 
						 | 
				
			
			@ -326,7 +374,7 @@ void mbedtls_strerror( int ret, char *buf, size_t buflen )
 | 
			
		|||
        if( use_ret == -(MBEDTLS_ERR_RSA_KEY_GEN_FAILED) )
 | 
			
		||||
            mbedtls_snprintf( buf, buflen, "RSA - Something failed during generation of a key" );
 | 
			
		||||
        if( use_ret == -(MBEDTLS_ERR_RSA_KEY_CHECK_FAILED) )
 | 
			
		||||
            mbedtls_snprintf( buf, buflen, "RSA - Key failed to pass the library's validity check" );
 | 
			
		||||
            mbedtls_snprintf( buf, buflen, "RSA - Key failed to pass the validity check of the library" );
 | 
			
		||||
        if( use_ret == -(MBEDTLS_ERR_RSA_PUBLIC_FAILED) )
 | 
			
		||||
            mbedtls_snprintf( buf, buflen, "RSA - The public key operation failed" );
 | 
			
		||||
        if( use_ret == -(MBEDTLS_ERR_RSA_PRIVATE_FAILED) )
 | 
			
		||||
| 
						 | 
				
			
			@ -338,7 +386,9 @@ void mbedtls_strerror( int ret, char *buf, size_t buflen )
 | 
			
		|||
        if( use_ret == -(MBEDTLS_ERR_RSA_RNG_FAILED) )
 | 
			
		||||
            mbedtls_snprintf( buf, buflen, "RSA - The random generator failed to generate non-zeros" );
 | 
			
		||||
        if( use_ret == -(MBEDTLS_ERR_RSA_UNSUPPORTED_OPERATION) )
 | 
			
		||||
            mbedtls_snprintf( buf, buflen, "RSA - The implementation doesn't offer the requested operation, e.g. because of security violations or lack of functionality" );
 | 
			
		||||
            mbedtls_snprintf( buf, buflen, "RSA - The implementation does not offer the requested operation, for example, because of security violations or lack of functionality" );
 | 
			
		||||
        if( use_ret == -(MBEDTLS_ERR_RSA_HW_ACCEL_FAILED) )
 | 
			
		||||
            mbedtls_snprintf( buf, buflen, "RSA - RSA hardware accelerator failed" );
 | 
			
		||||
#endif /* MBEDTLS_RSA_C */
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_SSL_TLS_C)
 | 
			
		||||
| 
						 | 
				
			
			@ -527,9 +577,16 @@ void mbedtls_strerror( int ret, char *buf, size_t buflen )
 | 
			
		|||
    if( use_ret == -(MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH) )
 | 
			
		||||
        mbedtls_snprintf( buf, buflen, "AES - Invalid data input length" );
 | 
			
		||||
    if( use_ret == -(MBEDTLS_ERR_AES_FEATURE_UNAVAILABLE) )
 | 
			
		||||
        mbedtls_snprintf( buf, buflen, "AES - Feature not available, e.g. unsupported AES key size" );
 | 
			
		||||
        mbedtls_snprintf( buf, buflen, "AES - Feature not available. For example, an unsupported AES key size" );
 | 
			
		||||
    if( use_ret == -(MBEDTLS_ERR_AES_HW_ACCEL_FAILED) )
 | 
			
		||||
        mbedtls_snprintf( buf, buflen, "AES - AES hardware accelerator failed" );
 | 
			
		||||
#endif /* MBEDTLS_AES_C */
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_ARC4_C)
 | 
			
		||||
    if( use_ret == -(MBEDTLS_ERR_ARC4_HW_ACCEL_FAILED) )
 | 
			
		||||
        mbedtls_snprintf( buf, buflen, "ARC4 - ARC4 hardware accelerator failed" );
 | 
			
		||||
#endif /* MBEDTLS_ARC4_C */
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_ASN1_PARSE_C)
 | 
			
		||||
    if( use_ret == -(MBEDTLS_ERR_ASN1_OUT_OF_DATA) )
 | 
			
		||||
        mbedtls_snprintf( buf, buflen, "ASN1 - Out of data when parsing an ASN1 data structure" );
 | 
			
		||||
| 
						 | 
				
			
			@ -576,6 +633,8 @@ void mbedtls_strerror( int ret, char *buf, size_t buflen )
 | 
			
		|||
#if defined(MBEDTLS_BLOWFISH_C)
 | 
			
		||||
    if( use_ret == -(MBEDTLS_ERR_BLOWFISH_INVALID_KEY_LENGTH) )
 | 
			
		||||
        mbedtls_snprintf( buf, buflen, "BLOWFISH - Invalid key length" );
 | 
			
		||||
    if( use_ret == -(MBEDTLS_ERR_BLOWFISH_HW_ACCEL_FAILED) )
 | 
			
		||||
        mbedtls_snprintf( buf, buflen, "BLOWFISH - Blowfish hardware accelerator failed" );
 | 
			
		||||
    if( use_ret == -(MBEDTLS_ERR_BLOWFISH_INVALID_INPUT_LENGTH) )
 | 
			
		||||
        mbedtls_snprintf( buf, buflen, "BLOWFISH - Invalid data input length" );
 | 
			
		||||
#endif /* MBEDTLS_BLOWFISH_C */
 | 
			
		||||
| 
						 | 
				
			
			@ -585,29 +644,40 @@ void mbedtls_strerror( int ret, char *buf, size_t buflen )
 | 
			
		|||
        mbedtls_snprintf( buf, buflen, "CAMELLIA - Invalid key length" );
 | 
			
		||||
    if( use_ret == -(MBEDTLS_ERR_CAMELLIA_INVALID_INPUT_LENGTH) )
 | 
			
		||||
        mbedtls_snprintf( buf, buflen, "CAMELLIA - Invalid data input length" );
 | 
			
		||||
    if( use_ret == -(MBEDTLS_ERR_CAMELLIA_HW_ACCEL_FAILED) )
 | 
			
		||||
        mbedtls_snprintf( buf, buflen, "CAMELLIA - Camellia hardware accelerator failed" );
 | 
			
		||||
#endif /* MBEDTLS_CAMELLIA_C */
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_CCM_C)
 | 
			
		||||
    if( use_ret == -(MBEDTLS_ERR_CCM_BAD_INPUT) )
 | 
			
		||||
        mbedtls_snprintf( buf, buflen, "CCM - Bad input parameters to function" );
 | 
			
		||||
        mbedtls_snprintf( buf, buflen, "CCM - Bad input parameters to the function" );
 | 
			
		||||
    if( use_ret == -(MBEDTLS_ERR_CCM_AUTH_FAILED) )
 | 
			
		||||
        mbedtls_snprintf( buf, buflen, "CCM - Authenticated decryption failed" );
 | 
			
		||||
    if( use_ret == -(MBEDTLS_ERR_CCM_HW_ACCEL_FAILED) )
 | 
			
		||||
        mbedtls_snprintf( buf, buflen, "CCM - CCM hardware accelerator failed" );
 | 
			
		||||
#endif /* MBEDTLS_CCM_C */
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_CMAC_C)
 | 
			
		||||
    if( use_ret == -(MBEDTLS_ERR_CMAC_HW_ACCEL_FAILED) )
 | 
			
		||||
        mbedtls_snprintf( buf, buflen, "CMAC - CMAC hardware accelerator failed" );
 | 
			
		||||
#endif /* MBEDTLS_CMAC_C */
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_CTR_DRBG_C)
 | 
			
		||||
    if( use_ret == -(MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED) )
 | 
			
		||||
        mbedtls_snprintf( buf, buflen, "CTR_DRBG - The entropy source failed" );
 | 
			
		||||
    if( use_ret == -(MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG) )
 | 
			
		||||
        mbedtls_snprintf( buf, buflen, "CTR_DRBG - Too many random requested in single call" );
 | 
			
		||||
        mbedtls_snprintf( buf, buflen, "CTR_DRBG - The requested random buffer length is too big" );
 | 
			
		||||
    if( use_ret == -(MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG) )
 | 
			
		||||
        mbedtls_snprintf( buf, buflen, "CTR_DRBG - Input too large (Entropy + additional)" );
 | 
			
		||||
        mbedtls_snprintf( buf, buflen, "CTR_DRBG - The input (entropy + additional data) is too large" );
 | 
			
		||||
    if( use_ret == -(MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR) )
 | 
			
		||||
        mbedtls_snprintf( buf, buflen, "CTR_DRBG - Read/write error in file" );
 | 
			
		||||
        mbedtls_snprintf( buf, buflen, "CTR_DRBG - Read or write error in file" );
 | 
			
		||||
#endif /* MBEDTLS_CTR_DRBG_C */
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_DES_C)
 | 
			
		||||
    if( use_ret == -(MBEDTLS_ERR_DES_INVALID_INPUT_LENGTH) )
 | 
			
		||||
        mbedtls_snprintf( buf, buflen, "DES - The data input has an invalid length" );
 | 
			
		||||
    if( use_ret == -(MBEDTLS_ERR_DES_HW_ACCEL_FAILED) )
 | 
			
		||||
        mbedtls_snprintf( buf, buflen, "DES - DES hardware accelerator failed" );
 | 
			
		||||
#endif /* MBEDTLS_DES_C */
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_ENTROPY_C)
 | 
			
		||||
| 
						 | 
				
			
			@ -626,6 +696,8 @@ void mbedtls_strerror( int ret, char *buf, size_t buflen )
 | 
			
		|||
#if defined(MBEDTLS_GCM_C)
 | 
			
		||||
    if( use_ret == -(MBEDTLS_ERR_GCM_AUTH_FAILED) )
 | 
			
		||||
        mbedtls_snprintf( buf, buflen, "GCM - Authenticated decryption failed" );
 | 
			
		||||
    if( use_ret == -(MBEDTLS_ERR_GCM_HW_ACCEL_FAILED) )
 | 
			
		||||
        mbedtls_snprintf( buf, buflen, "GCM - GCM hardware accelerator failed" );
 | 
			
		||||
    if( use_ret == -(MBEDTLS_ERR_GCM_BAD_INPUT) )
 | 
			
		||||
        mbedtls_snprintf( buf, buflen, "GCM - Bad input parameters to function" );
 | 
			
		||||
#endif /* MBEDTLS_GCM_C */
 | 
			
		||||
| 
						 | 
				
			
			@ -641,6 +713,21 @@ void mbedtls_strerror( int ret, char *buf, size_t buflen )
 | 
			
		|||
        mbedtls_snprintf( buf, buflen, "HMAC_DRBG - The entropy source failed" );
 | 
			
		||||
#endif /* MBEDTLS_HMAC_DRBG_C */
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_MD2_C)
 | 
			
		||||
    if( use_ret == -(MBEDTLS_ERR_MD2_HW_ACCEL_FAILED) )
 | 
			
		||||
        mbedtls_snprintf( buf, buflen, "MD2 - MD2 hardware accelerator failed" );
 | 
			
		||||
#endif /* MBEDTLS_MD2_C */
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_MD4_C)
 | 
			
		||||
    if( use_ret == -(MBEDTLS_ERR_MD4_HW_ACCEL_FAILED) )
 | 
			
		||||
        mbedtls_snprintf( buf, buflen, "MD4 - MD4 hardware accelerator failed" );
 | 
			
		||||
#endif /* MBEDTLS_MD4_C */
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_MD5_C)
 | 
			
		||||
    if( use_ret == -(MBEDTLS_ERR_MD5_HW_ACCEL_FAILED) )
 | 
			
		||||
        mbedtls_snprintf( buf, buflen, "MD5 - MD5 hardware accelerator failed" );
 | 
			
		||||
#endif /* MBEDTLS_MD5_C */
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_NET_C)
 | 
			
		||||
    if( use_ret == -(MBEDTLS_ERR_NET_SOCKET_FAILED) )
 | 
			
		||||
        mbedtls_snprintf( buf, buflen, "NET - Failed to open a socket" );
 | 
			
		||||
| 
						 | 
				
			
			@ -678,6 +765,26 @@ void mbedtls_strerror( int ret, char *buf, size_t buflen )
 | 
			
		|||
        mbedtls_snprintf( buf, buflen, "PADLOCK - Input data should be aligned" );
 | 
			
		||||
#endif /* MBEDTLS_PADLOCK_C */
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_RIPEMD160_C)
 | 
			
		||||
    if( use_ret == -(MBEDTLS_ERR_RIPEMD160_HW_ACCEL_FAILED) )
 | 
			
		||||
        mbedtls_snprintf( buf, buflen, "RIPEMD160 - RIPEMD160 hardware accelerator failed" );
 | 
			
		||||
#endif /* MBEDTLS_RIPEMD160_C */
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_SHA1_C)
 | 
			
		||||
    if( use_ret == -(MBEDTLS_ERR_SHA1_HW_ACCEL_FAILED) )
 | 
			
		||||
        mbedtls_snprintf( buf, buflen, "SHA1 - SHA-1 hardware accelerator failed" );
 | 
			
		||||
#endif /* MBEDTLS_SHA1_C */
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_SHA256_C)
 | 
			
		||||
    if( use_ret == -(MBEDTLS_ERR_SHA256_HW_ACCEL_FAILED) )
 | 
			
		||||
        mbedtls_snprintf( buf, buflen, "SHA256 - SHA-256 hardware accelerator failed" );
 | 
			
		||||
#endif /* MBEDTLS_SHA256_C */
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_SHA512_C)
 | 
			
		||||
    if( use_ret == -(MBEDTLS_ERR_SHA512_HW_ACCEL_FAILED) )
 | 
			
		||||
        mbedtls_snprintf( buf, buflen, "SHA512 - SHA-512 hardware accelerator failed" );
 | 
			
		||||
#endif /* MBEDTLS_SHA512_C */
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_THREADING_C)
 | 
			
		||||
    if( use_ret == -(MBEDTLS_ERR_THREADING_FEATURE_UNAVAILABLE) )
 | 
			
		||||
        mbedtls_snprintf( buf, buflen, "THREADING - The selected feature is not available" );
 | 
			
		||||
| 
						 | 
				
			
			@ -690,6 +797,8 @@ void mbedtls_strerror( int ret, char *buf, size_t buflen )
 | 
			
		|||
#if defined(MBEDTLS_XTEA_C)
 | 
			
		||||
    if( use_ret == -(MBEDTLS_ERR_XTEA_INVALID_INPUT_LENGTH) )
 | 
			
		||||
        mbedtls_snprintf( buf, buflen, "XTEA - The data input has an invalid length" );
 | 
			
		||||
    if( use_ret == -(MBEDTLS_ERR_XTEA_HW_ACCEL_FAILED) )
 | 
			
		||||
        mbedtls_snprintf( buf, buflen, "XTEA - XTEA hardware accelerator failed" );
 | 
			
		||||
#endif /* MBEDTLS_XTEA_C */
 | 
			
		||||
    // END generated code
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -364,11 +364,14 @@ int mbedtls_hmac_drbg_write_seed_file( mbedtls_hmac_drbg_context *ctx, const cha
 | 
			
		|||
 | 
			
		||||
exit:
 | 
			
		||||
    fclose( f );
 | 
			
		||||
    mbedtls_zeroize( buf, sizeof( buf ) );
 | 
			
		||||
 | 
			
		||||
    return( ret );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int mbedtls_hmac_drbg_update_seed_file( mbedtls_hmac_drbg_context *ctx, const char *path )
 | 
			
		||||
{
 | 
			
		||||
    int ret = 0;
 | 
			
		||||
    FILE *f;
 | 
			
		||||
    size_t n;
 | 
			
		||||
    unsigned char buf[ MBEDTLS_HMAC_DRBG_MAX_INPUT ];
 | 
			
		||||
| 
						 | 
				
			
			@ -387,14 +390,16 @@ int mbedtls_hmac_drbg_update_seed_file( mbedtls_hmac_drbg_context *ctx, const ch
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    if( fread( buf, 1, n, f ) != n )
 | 
			
		||||
    {
 | 
			
		||||
        fclose( f );
 | 
			
		||||
        return( MBEDTLS_ERR_HMAC_DRBG_FILE_IO_ERROR );
 | 
			
		||||
    }
 | 
			
		||||
        ret = MBEDTLS_ERR_HMAC_DRBG_FILE_IO_ERROR;
 | 
			
		||||
    else
 | 
			
		||||
        mbedtls_hmac_drbg_update( ctx, buf, n );
 | 
			
		||||
 | 
			
		||||
    fclose( f );
 | 
			
		||||
 | 
			
		||||
    mbedtls_hmac_drbg_update( ctx, buf, n );
 | 
			
		||||
    mbedtls_zeroize( buf, sizeof( buf ) );
 | 
			
		||||
 | 
			
		||||
    if( ret != 0 )
 | 
			
		||||
        return( ret );
 | 
			
		||||
 | 
			
		||||
    return( mbedtls_hmac_drbg_write_seed_file( ctx, path ) );
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										109
									
								
								library/md.c
									
									
									
									
									
								
							
							
						
						
									
										109
									
								
								library/md.c
									
									
									
									
									
								
							| 
						 | 
				
			
			@ -250,9 +250,7 @@ int mbedtls_md_starts( mbedtls_md_context_t *ctx )
 | 
			
		|||
    if( ctx == NULL || ctx->md_info == NULL )
 | 
			
		||||
        return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
 | 
			
		||||
 | 
			
		||||
    ctx->md_info->starts_func( ctx->md_ctx );
 | 
			
		||||
 | 
			
		||||
    return( 0 );
 | 
			
		||||
    return( ctx->md_info->starts_func( ctx->md_ctx ) );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int mbedtls_md_update( mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen )
 | 
			
		||||
| 
						 | 
				
			
			@ -260,9 +258,7 @@ int mbedtls_md_update( mbedtls_md_context_t *ctx, const unsigned char *input, si
 | 
			
		|||
    if( ctx == NULL || ctx->md_info == NULL )
 | 
			
		||||
        return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
 | 
			
		||||
 | 
			
		||||
    ctx->md_info->update_func( ctx->md_ctx, input, ilen );
 | 
			
		||||
 | 
			
		||||
    return( 0 );
 | 
			
		||||
    return( ctx->md_info->update_func( ctx->md_ctx, input, ilen ) );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int mbedtls_md_finish( mbedtls_md_context_t *ctx, unsigned char *output )
 | 
			
		||||
| 
						 | 
				
			
			@ -270,9 +266,7 @@ int mbedtls_md_finish( mbedtls_md_context_t *ctx, unsigned char *output )
 | 
			
		|||
    if( ctx == NULL || ctx->md_info == NULL )
 | 
			
		||||
        return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
 | 
			
		||||
 | 
			
		||||
    ctx->md_info->finish_func( ctx->md_ctx, output );
 | 
			
		||||
 | 
			
		||||
    return( 0 );
 | 
			
		||||
    return( ctx->md_info->finish_func( ctx->md_ctx, output ) );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int mbedtls_md( const mbedtls_md_info_t *md_info, const unsigned char *input, size_t ilen,
 | 
			
		||||
| 
						 | 
				
			
			@ -281,9 +275,7 @@ int mbedtls_md( const mbedtls_md_info_t *md_info, const unsigned char *input, si
 | 
			
		|||
    if( md_info == NULL )
 | 
			
		||||
        return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
 | 
			
		||||
 | 
			
		||||
    md_info->digest_func( input, ilen, output );
 | 
			
		||||
 | 
			
		||||
    return( 0 );
 | 
			
		||||
    return( md_info->digest_func( input, ilen, output ) );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_FS_IO)
 | 
			
		||||
| 
						 | 
				
			
			@ -306,20 +298,20 @@ int mbedtls_md_file( const mbedtls_md_info_t *md_info, const char *path, unsigne
 | 
			
		|||
    if( ( ret = mbedtls_md_setup( &ctx, md_info, 0 ) ) != 0 )
 | 
			
		||||
        goto cleanup;
 | 
			
		||||
 | 
			
		||||
    md_info->starts_func( ctx.md_ctx );
 | 
			
		||||
    if( ( ret = md_info->starts_func( ctx.md_ctx ) ) != 0 )
 | 
			
		||||
        goto cleanup;
 | 
			
		||||
 | 
			
		||||
    while( ( n = fread( buf, 1, sizeof( buf ), f ) ) > 0 )
 | 
			
		||||
        md_info->update_func( ctx.md_ctx, buf, n );
 | 
			
		||||
        if( ( ret = md_info->update_func( ctx.md_ctx, buf, n ) ) != 0 )
 | 
			
		||||
            goto cleanup;
 | 
			
		||||
 | 
			
		||||
    if( ferror( f ) != 0 )
 | 
			
		||||
    {
 | 
			
		||||
        ret = MBEDTLS_ERR_MD_FILE_IO_ERROR;
 | 
			
		||||
        goto cleanup;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    md_info->finish_func( ctx.md_ctx, output );
 | 
			
		||||
    else
 | 
			
		||||
        ret = md_info->finish_func( ctx.md_ctx, output );
 | 
			
		||||
 | 
			
		||||
cleanup:
 | 
			
		||||
    mbedtls_zeroize( buf, sizeof( buf ) );
 | 
			
		||||
    fclose( f );
 | 
			
		||||
    mbedtls_md_free( &ctx );
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -329,6 +321,7 @@ cleanup:
 | 
			
		|||
 | 
			
		||||
int mbedtls_md_hmac_starts( mbedtls_md_context_t *ctx, const unsigned char *key, size_t keylen )
 | 
			
		||||
{
 | 
			
		||||
    int ret;
 | 
			
		||||
    unsigned char sum[MBEDTLS_MD_MAX_SIZE];
 | 
			
		||||
    unsigned char *ipad, *opad;
 | 
			
		||||
    size_t i;
 | 
			
		||||
| 
						 | 
				
			
			@ -338,9 +331,12 @@ int mbedtls_md_hmac_starts( mbedtls_md_context_t *ctx, const unsigned char *key,
 | 
			
		|||
 | 
			
		||||
    if( keylen > (size_t) ctx->md_info->block_size )
 | 
			
		||||
    {
 | 
			
		||||
        ctx->md_info->starts_func( ctx->md_ctx );
 | 
			
		||||
        ctx->md_info->update_func( ctx->md_ctx, key, keylen );
 | 
			
		||||
        ctx->md_info->finish_func( ctx->md_ctx, sum );
 | 
			
		||||
        if( ( ret = ctx->md_info->starts_func( ctx->md_ctx ) ) != 0 )
 | 
			
		||||
            goto cleanup;
 | 
			
		||||
        if( ( ret = ctx->md_info->update_func( ctx->md_ctx, key, keylen ) ) != 0 )
 | 
			
		||||
            goto cleanup;
 | 
			
		||||
        if( ( ret = ctx->md_info->finish_func( ctx->md_ctx, sum ) ) != 0 )
 | 
			
		||||
            goto cleanup;
 | 
			
		||||
 | 
			
		||||
        keylen = ctx->md_info->size;
 | 
			
		||||
        key = sum;
 | 
			
		||||
| 
						 | 
				
			
			@ -358,12 +354,16 @@ int mbedtls_md_hmac_starts( mbedtls_md_context_t *ctx, const unsigned char *key,
 | 
			
		|||
        opad[i] = (unsigned char)( opad[i] ^ key[i] );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if( ( ret = ctx->md_info->starts_func( ctx->md_ctx ) ) != 0 )
 | 
			
		||||
        goto cleanup;
 | 
			
		||||
    if( ( ret = ctx->md_info->update_func( ctx->md_ctx, ipad,
 | 
			
		||||
                                           ctx->md_info->block_size ) ) != 0 )
 | 
			
		||||
        goto cleanup;
 | 
			
		||||
 | 
			
		||||
cleanup:
 | 
			
		||||
    mbedtls_zeroize( sum, sizeof( sum ) );
 | 
			
		||||
 | 
			
		||||
    ctx->md_info->starts_func( ctx->md_ctx );
 | 
			
		||||
    ctx->md_info->update_func( ctx->md_ctx, ipad, ctx->md_info->block_size );
 | 
			
		||||
 | 
			
		||||
    return( 0 );
 | 
			
		||||
    return( ret );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int mbedtls_md_hmac_update( mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen )
 | 
			
		||||
| 
						 | 
				
			
			@ -371,13 +371,12 @@ int mbedtls_md_hmac_update( mbedtls_md_context_t *ctx, const unsigned char *inpu
 | 
			
		|||
    if( ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL )
 | 
			
		||||
        return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
 | 
			
		||||
 | 
			
		||||
    ctx->md_info->update_func( ctx->md_ctx, input, ilen );
 | 
			
		||||
 | 
			
		||||
    return( 0 );
 | 
			
		||||
    return( ctx->md_info->update_func( ctx->md_ctx, input, ilen ) );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int mbedtls_md_hmac_finish( mbedtls_md_context_t *ctx, unsigned char *output )
 | 
			
		||||
{
 | 
			
		||||
    int ret;
 | 
			
		||||
    unsigned char tmp[MBEDTLS_MD_MAX_SIZE];
 | 
			
		||||
    unsigned char *opad;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -386,17 +385,22 @@ int mbedtls_md_hmac_finish( mbedtls_md_context_t *ctx, unsigned char *output )
 | 
			
		|||
 | 
			
		||||
    opad = (unsigned char *) ctx->hmac_ctx + ctx->md_info->block_size;
 | 
			
		||||
 | 
			
		||||
    ctx->md_info->finish_func( ctx->md_ctx, tmp );
 | 
			
		||||
    ctx->md_info->starts_func( ctx->md_ctx );
 | 
			
		||||
    ctx->md_info->update_func( ctx->md_ctx, opad, ctx->md_info->block_size );
 | 
			
		||||
    ctx->md_info->update_func( ctx->md_ctx, tmp, ctx->md_info->size );
 | 
			
		||||
    ctx->md_info->finish_func( ctx->md_ctx, output );
 | 
			
		||||
 | 
			
		||||
    return( 0 );
 | 
			
		||||
    if( ( ret = ctx->md_info->finish_func( ctx->md_ctx, tmp ) ) != 0 )
 | 
			
		||||
        return( ret );
 | 
			
		||||
    if( ( ret = ctx->md_info->starts_func( ctx->md_ctx ) ) != 0 )
 | 
			
		||||
        return( ret );
 | 
			
		||||
    if( ( ret = ctx->md_info->update_func( ctx->md_ctx, opad,
 | 
			
		||||
                                           ctx->md_info->block_size ) ) != 0 )
 | 
			
		||||
        return( ret );
 | 
			
		||||
    if( ( ret = ctx->md_info->update_func( ctx->md_ctx, tmp,
 | 
			
		||||
                                           ctx->md_info->size ) ) != 0 )
 | 
			
		||||
        return( ret );
 | 
			
		||||
    return( ctx->md_info->finish_func( ctx->md_ctx, output ) );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int mbedtls_md_hmac_reset( mbedtls_md_context_t *ctx )
 | 
			
		||||
{
 | 
			
		||||
    int ret;
 | 
			
		||||
    unsigned char *ipad;
 | 
			
		||||
 | 
			
		||||
    if( ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL )
 | 
			
		||||
| 
						 | 
				
			
			@ -404,15 +408,16 @@ int mbedtls_md_hmac_reset( mbedtls_md_context_t *ctx )
 | 
			
		|||
 | 
			
		||||
    ipad = (unsigned char *) ctx->hmac_ctx;
 | 
			
		||||
 | 
			
		||||
    ctx->md_info->starts_func( ctx->md_ctx );
 | 
			
		||||
    ctx->md_info->update_func( ctx->md_ctx, ipad, ctx->md_info->block_size );
 | 
			
		||||
 | 
			
		||||
    return( 0 );
 | 
			
		||||
    if( ( ret = ctx->md_info->starts_func( ctx->md_ctx ) ) != 0 )
 | 
			
		||||
        return( ret );
 | 
			
		||||
    return( ctx->md_info->update_func( ctx->md_ctx, ipad,
 | 
			
		||||
                                       ctx->md_info->block_size ) );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int mbedtls_md_hmac( const mbedtls_md_info_t *md_info, const unsigned char *key, size_t keylen,
 | 
			
		||||
                const unsigned char *input, size_t ilen,
 | 
			
		||||
                unsigned char *output )
 | 
			
		||||
int mbedtls_md_hmac( const mbedtls_md_info_t *md_info,
 | 
			
		||||
                     const unsigned char *key, size_t keylen,
 | 
			
		||||
                     const unsigned char *input, size_t ilen,
 | 
			
		||||
                     unsigned char *output )
 | 
			
		||||
{
 | 
			
		||||
    mbedtls_md_context_t ctx;
 | 
			
		||||
    int ret;
 | 
			
		||||
| 
						 | 
				
			
			@ -423,15 +428,19 @@ int mbedtls_md_hmac( const mbedtls_md_info_t *md_info, const unsigned char *key,
 | 
			
		|||
    mbedtls_md_init( &ctx );
 | 
			
		||||
 | 
			
		||||
    if( ( ret = mbedtls_md_setup( &ctx, md_info, 1 ) ) != 0 )
 | 
			
		||||
        return( ret );
 | 
			
		||||
        goto cleanup;
 | 
			
		||||
 | 
			
		||||
    mbedtls_md_hmac_starts( &ctx, key, keylen );
 | 
			
		||||
    mbedtls_md_hmac_update( &ctx, input, ilen );
 | 
			
		||||
    mbedtls_md_hmac_finish( &ctx, output );
 | 
			
		||||
    if( ( ret = mbedtls_md_hmac_starts( &ctx, key, keylen ) ) != 0 )
 | 
			
		||||
        goto cleanup;
 | 
			
		||||
    if( ( ret = mbedtls_md_hmac_update( &ctx, input, ilen ) ) != 0 )
 | 
			
		||||
        goto cleanup;
 | 
			
		||||
    if( ( ret = mbedtls_md_hmac_finish( &ctx, output ) ) != 0 )
 | 
			
		||||
        goto cleanup;
 | 
			
		||||
 | 
			
		||||
cleanup:
 | 
			
		||||
    mbedtls_md_free( &ctx );
 | 
			
		||||
 | 
			
		||||
    return( 0 );
 | 
			
		||||
    return( ret );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int mbedtls_md_process( mbedtls_md_context_t *ctx, const unsigned char *data )
 | 
			
		||||
| 
						 | 
				
			
			@ -439,9 +448,7 @@ int mbedtls_md_process( mbedtls_md_context_t *ctx, const unsigned char *data )
 | 
			
		|||
    if( ctx == NULL || ctx->md_info == NULL )
 | 
			
		||||
        return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
 | 
			
		||||
 | 
			
		||||
    ctx->md_info->process_func( ctx->md_ctx, data );
 | 
			
		||||
 | 
			
		||||
    return( 0 );
 | 
			
		||||
    return( ctx->md_info->process_func( ctx->md_ctx, data ) );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
unsigned char mbedtls_md_get_size( const mbedtls_md_info_t *md_info )
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -105,16 +105,18 @@ void mbedtls_md2_clone( mbedtls_md2_context *dst,
 | 
			
		|||
/*
 | 
			
		||||
 * MD2 context setup
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_md2_starts( mbedtls_md2_context *ctx )
 | 
			
		||||
int mbedtls_md2_starts_ret( mbedtls_md2_context *ctx )
 | 
			
		||||
{
 | 
			
		||||
    memset( ctx->cksum, 0, 16 );
 | 
			
		||||
    memset( ctx->state, 0, 46 );
 | 
			
		||||
    memset( ctx->buffer, 0, 16 );
 | 
			
		||||
    ctx->left = 0;
 | 
			
		||||
 | 
			
		||||
    return( 0 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if !defined(MBEDTLS_MD2_PROCESS_ALT)
 | 
			
		||||
void mbedtls_md2_process( mbedtls_md2_context *ctx )
 | 
			
		||||
int mbedtls_internal_md2_process( mbedtls_md2_context *ctx )
 | 
			
		||||
{
 | 
			
		||||
    int i, j;
 | 
			
		||||
    unsigned char t = 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -146,14 +148,19 @@ void mbedtls_md2_process( mbedtls_md2_context *ctx )
 | 
			
		|||
           ( ctx->cksum[i] ^ PI_SUBST[ctx->buffer[i] ^ t] );
 | 
			
		||||
        t  = ctx->cksum[i];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return( 0 );
 | 
			
		||||
}
 | 
			
		||||
#endif /* !MBEDTLS_MD2_PROCESS_ALT */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * MD2 process buffer
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_md2_update( mbedtls_md2_context *ctx, const unsigned char *input, size_t ilen )
 | 
			
		||||
int mbedtls_md2_update_ret( mbedtls_md2_context *ctx,
 | 
			
		||||
                            const unsigned char *input,
 | 
			
		||||
                            size_t ilen )
 | 
			
		||||
{
 | 
			
		||||
    int ret;
 | 
			
		||||
    size_t fill;
 | 
			
		||||
 | 
			
		||||
    while( ilen > 0 )
 | 
			
		||||
| 
						 | 
				
			
			@ -172,16 +179,21 @@ void mbedtls_md2_update( mbedtls_md2_context *ctx, const unsigned char *input, s
 | 
			
		|||
        if( ctx->left == 16 )
 | 
			
		||||
        {
 | 
			
		||||
            ctx->left = 0;
 | 
			
		||||
            mbedtls_md2_process( ctx );
 | 
			
		||||
            if( ( ret = mbedtls_internal_md2_process( ctx ) ) != 0 )
 | 
			
		||||
                return( ret );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return( 0 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * MD2 final digest
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_md2_finish( mbedtls_md2_context *ctx, unsigned char output[16] )
 | 
			
		||||
int mbedtls_md2_finish_ret( mbedtls_md2_context *ctx,
 | 
			
		||||
                            unsigned char output[16] )
 | 
			
		||||
{
 | 
			
		||||
    int ret;
 | 
			
		||||
    size_t i;
 | 
			
		||||
    unsigned char x;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -190,12 +202,16 @@ void mbedtls_md2_finish( mbedtls_md2_context *ctx, unsigned char output[16] )
 | 
			
		|||
    for( i = ctx->left; i < 16; i++ )
 | 
			
		||||
        ctx->buffer[i] = x;
 | 
			
		||||
 | 
			
		||||
    mbedtls_md2_process( ctx );
 | 
			
		||||
    if( ( ret = mbedtls_internal_md2_process( ctx ) ) != 0 )
 | 
			
		||||
        return( ret );
 | 
			
		||||
 | 
			
		||||
    memcpy( ctx->buffer, ctx->cksum, 16 );
 | 
			
		||||
    mbedtls_md2_process( ctx );
 | 
			
		||||
    if( ( ret = mbedtls_internal_md2_process( ctx ) ) != 0 )
 | 
			
		||||
        return( ret );
 | 
			
		||||
 | 
			
		||||
    memcpy( output, ctx->state, 16 );
 | 
			
		||||
 | 
			
		||||
    return( 0 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* !MBEDTLS_MD2_ALT */
 | 
			
		||||
| 
						 | 
				
			
			@ -203,15 +219,28 @@ void mbedtls_md2_finish( mbedtls_md2_context *ctx, unsigned char output[16] )
 | 
			
		|||
/*
 | 
			
		||||
 * output = MD2( input buffer )
 | 
			
		||||
 */
 | 
			
		||||
void mbedtls_md2( const unsigned char *input, size_t ilen, unsigned char output[16] )
 | 
			
		||||
int mbedtls_md2_ret( const unsigned char *input,
 | 
			
		||||
                     size_t ilen,
 | 
			
		||||
                     unsigned char output[16] )
 | 
			
		||||
{
 | 
			
		||||
    int ret;
 | 
			
		||||
    mbedtls_md2_context ctx;
 | 
			
		||||
 | 
			
		||||
    mbedtls_md2_init( &ctx );
 | 
			
		||||
    mbedtls_md2_starts( &ctx );
 | 
			
		||||
    mbedtls_md2_update( &ctx, input, ilen );
 | 
			
		||||
    mbedtls_md2_finish( &ctx, output );
 | 
			
		||||
 | 
			
		||||
    if( ( ret = mbedtls_md2_starts_ret( &ctx ) ) != 0 )
 | 
			
		||||
        goto exit;
 | 
			
		||||
 | 
			
		||||
    if( ( ret = mbedtls_md2_update_ret( &ctx, input, ilen ) ) != 0 )
 | 
			
		||||
        goto exit;
 | 
			
		||||
 | 
			
		||||
    if( ( ret = mbedtls_md2_finish_ret( &ctx, output ) ) != 0 )
 | 
			
		||||
        goto exit;
 | 
			
		||||
 | 
			
		||||
exit:
 | 
			
		||||
    mbedtls_md2_free( &ctx );
 | 
			
		||||
 | 
			
		||||
    return( ret );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_SELF_TEST)
 | 
			
		||||
| 
						 | 
				
			
			@ -219,7 +248,7 @@ void mbedtls_md2( const unsigned char *input, size_t ilen, unsigned char output[
 | 
			
		|||
/*
 | 
			
		||||
 * RFC 1319 test vectors
 | 
			
		||||
 */
 | 
			
		||||
static const char md2_test_str[7][81] =
 | 
			
		||||
static const unsigned char md2_test_str[7][81] =
 | 
			
		||||
{
 | 
			
		||||
    { "" },
 | 
			
		||||
    { "a" },
 | 
			
		||||
| 
						 | 
				
			
			@ -227,10 +256,15 @@ static const char md2_test_str[7][81] =
 | 
			
		|||
    { "message digest" },
 | 
			
		||||
    { "abcdefghijklmnopqrstuvwxyz" },
 | 
			
		||||
    { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" },
 | 
			
		||||
    { "12345678901234567890123456789012345678901234567890123456789012" \
 | 
			
		||||
    { "12345678901234567890123456789012345678901234567890123456789012"
 | 
			
		||||
      "345678901234567890" }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const size_t md2_test_strlen[7] =
 | 
			
		||||
{
 | 
			
		||||
    0, 1, 3, 14, 26, 62, 80
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const unsigned char md2_test_sum[7][16] =
 | 
			
		||||
{
 | 
			
		||||
    { 0x83, 0x50, 0xE5, 0xA3, 0xE2, 0x4C, 0x15, 0x3D,
 | 
			
		||||
| 
						 | 
				
			
			@ -254,7 +288,7 @@ static const unsigned char md2_test_sum[7][16] =
 | 
			
		|||
 */
 | 
			
		||||
int mbedtls_md2_self_test( int verbose )
 | 
			
		||||
{
 | 
			
		||||
    int i;
 | 
			
		||||
    int i, ret = 0;
 | 
			
		||||
    unsigned char md2sum[16];
 | 
			
		||||
 | 
			
		||||
    for( i = 0; i < 7; i++ )
 | 
			
		||||
| 
						 | 
				
			
			@ -262,15 +296,14 @@ int mbedtls_md2_self_test( int verbose )
 | 
			
		|||
        if( verbose != 0 )
 | 
			
		||||
            mbedtls_printf( "  MD2 test #%d: ", i + 1 );
 | 
			
		||||
 | 
			
		||||
        mbedtls_md2( (unsigned char *) md2_test_str[i],
 | 
			
		||||
             strlen( md2_test_str[i] ), md2sum );
 | 
			
		||||
        ret = mbedtls_md2_ret( md2_test_str[i], md2_test_strlen[i], md2sum );
 | 
			
		||||
        if( ret != 0 )
 | 
			
		||||
            goto fail;
 | 
			
		||||
 | 
			
		||||
        if( memcmp( md2sum, md2_test_sum[i], 16 ) != 0 )
 | 
			
		||||
        {
 | 
			
		||||
            if( verbose != 0 )
 | 
			
		||||
                mbedtls_printf( "failed\n" );
 | 
			
		||||
 | 
			
		||||
            return( 1 );
 | 
			
		||||
            ret = 1;
 | 
			
		||||
            goto fail;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if( verbose != 0 )
 | 
			
		||||
| 
						 | 
				
			
			@ -281,6 +314,12 @@ int mbedtls_md2_self_test( int verbose )
 | 
			
		|||
        mbedtls_printf( "\n" );
 | 
			
		||||
 | 
			
		||||
    return( 0 );
 | 
			
		||||
 | 
			
		||||
fail:
 | 
			
		||||
    if( verbose != 0 )
 | 
			
		||||
        mbedtls_printf( "failed\n" );
 | 
			
		||||
 | 
			
		||||
    return( ret );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* MBEDTLS_SELF_TEST */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
Some files were not shown because too many files have changed in this diff Show more
		Loading…
	
		Reference in a new issue