Changes to support IAR with position independent code (ROPI). Updated example wolfSSL IAR project to use "ropi" (Position indipendance for code and read-only data).

This commit is contained in:
David Garske
2020-03-31 08:17:09 -07:00
parent 3bd52b166b
commit 47d1cb8415
9 changed files with 80 additions and 50 deletions

View File

@ -343,7 +343,7 @@
</option>
<option>
<name>CCPosIndRopi</name>
<state>0</state>
<state>1</state>
</option>
<option>
<name>CCPosIndRwpi</name>

View File

@ -3124,7 +3124,7 @@ int wolfSSL_want_write(WOLFSSL* ssl)
char* wolfSSL_ERR_error_string(unsigned long errNumber, char* data)
{
static const char* const msg = "Please supply a buffer for error string";
static wcchar msg = "Please supply a buffer for error string";
WOLFSSL_ENTER("ERR_error_string");
if (data) {

View File

@ -2309,8 +2309,6 @@ static void wc_AesDecrypt(Aes* aes, const byte* inBlock, byte* outBlock)
#endif
#ifdef NEED_AES_TABLES
(void)temp;
switch (keylen) {
#if defined(AES_MAX_KEY_SIZE) && AES_MAX_KEY_SIZE >= 128 && \
defined(WOLFSSL_AES_128)
@ -2436,6 +2434,7 @@ static void wc_AesDecrypt(Aes* aes, const byte* inBlock, byte* outBlock)
#else
(void)dir;
#endif /* HAVE_AES_DECRYPT */
(void)temp;
#endif /* NEED_AES_TABLES */
#if defined(WOLFSSL_SCE) && !defined(WOLFSSL_SCE_NO_AES)

View File

@ -9794,51 +9794,51 @@ void wc_FreeDer(DerBuffer** pDer)
/* Max X509 header length indicates the max length + 2 ('\n', '\0') */
#define MAX_X509_HEADER_SZ (37 + 2)
const char* const BEGIN_CERT = "-----BEGIN CERTIFICATE-----";
const char* const END_CERT = "-----END CERTIFICATE-----";
wcchar BEGIN_CERT = "-----BEGIN CERTIFICATE-----";
wcchar END_CERT = "-----END CERTIFICATE-----";
#ifdef WOLFSSL_CERT_REQ
const char* const BEGIN_CERT_REQ = "-----BEGIN CERTIFICATE REQUEST-----";
const char* const END_CERT_REQ = "-----END CERTIFICATE REQUEST-----";
wcchar BEGIN_CERT_REQ = "-----BEGIN CERTIFICATE REQUEST-----";
wcchar END_CERT_REQ = "-----END CERTIFICATE REQUEST-----";
#endif
#ifndef NO_DH
const char* const BEGIN_DH_PARAM = "-----BEGIN DH PARAMETERS-----";
const char* const END_DH_PARAM = "-----END DH PARAMETERS-----";
wcchar BEGIN_DH_PARAM = "-----BEGIN DH PARAMETERS-----";
wcchar END_DH_PARAM = "-----END DH PARAMETERS-----";
#endif
#ifndef NO_DSA
const char* const BEGIN_DSA_PARAM = "-----BEGIN DSA PARAMETERS-----";
const char* const END_DSA_PARAM = "-----END DSA PARAMETERS-----";
wcchar BEGIN_DSA_PARAM = "-----BEGIN DSA PARAMETERS-----";
wcchar END_DSA_PARAM = "-----END DSA PARAMETERS-----";
#endif
const char* const BEGIN_X509_CRL = "-----BEGIN X509 CRL-----";
const char* const END_X509_CRL = "-----END X509 CRL-----";
const char* const BEGIN_RSA_PRIV = "-----BEGIN RSA PRIVATE KEY-----";
const char* const END_RSA_PRIV = "-----END RSA PRIVATE KEY-----";
const char* const BEGIN_PRIV_KEY = "-----BEGIN PRIVATE KEY-----";
const char* const END_PRIV_KEY = "-----END PRIVATE KEY-----";
const char* const BEGIN_ENC_PRIV_KEY = "-----BEGIN ENCRYPTED PRIVATE KEY-----";
const char* const END_ENC_PRIV_KEY = "-----END ENCRYPTED PRIVATE KEY-----";
wcchar BEGIN_X509_CRL = "-----BEGIN X509 CRL-----";
wcchar END_X509_CRL = "-----END X509 CRL-----";
wcchar BEGIN_RSA_PRIV = "-----BEGIN RSA PRIVATE KEY-----";
wcchar END_RSA_PRIV = "-----END RSA PRIVATE KEY-----";
wcchar BEGIN_PRIV_KEY = "-----BEGIN PRIVATE KEY-----";
wcchar END_PRIV_KEY = "-----END PRIVATE KEY-----";
wcchar BEGIN_ENC_PRIV_KEY = "-----BEGIN ENCRYPTED PRIVATE KEY-----";
wcchar END_ENC_PRIV_KEY = "-----END ENCRYPTED PRIVATE KEY-----";
#ifdef HAVE_ECC
const char* const BEGIN_EC_PRIV = "-----BEGIN EC PRIVATE KEY-----";
const char* const END_EC_PRIV = "-----END EC PRIVATE KEY-----";
wcchar BEGIN_EC_PRIV = "-----BEGIN EC PRIVATE KEY-----";
wcchar END_EC_PRIV = "-----END EC PRIVATE KEY-----";
#endif
#if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
!defined(NO_DSA)
const char* const BEGIN_DSA_PRIV = "-----BEGIN DSA PRIVATE KEY-----";
const char* const END_DSA_PRIV = "-----END DSA PRIVATE KEY-----";
wcchar BEGIN_DSA_PRIV = "-----BEGIN DSA PRIVATE KEY-----";
wcchar END_DSA_PRIV = "-----END DSA PRIVATE KEY-----";
#endif
#ifdef OPENSSL_EXTRA
const char BEGIN_PRIV_KEY_PREFIX[] = "-----BEGIN";
const char PRIV_KEY_SUFFIX[] = "PRIVATE KEY-----";
const char END_PRIV_KEY_PREFIX[] = "-----END";
#endif
const char* const BEGIN_PUB_KEY = "-----BEGIN PUBLIC KEY-----";
const char* const END_PUB_KEY = "-----END PUBLIC KEY-----";
wcchar BEGIN_PUB_KEY = "-----BEGIN PUBLIC KEY-----";
wcchar END_PUB_KEY = "-----END PUBLIC KEY-----";
#if defined(HAVE_ED25519) || defined(HAVE_ED448)
const char* const BEGIN_EDDSA_PRIV = "-----BEGIN EDDSA PRIVATE KEY-----";
const char* const END_EDDSA_PRIV = "-----END EDDSA PRIVATE KEY-----";
wcchar BEGIN_EDDSA_PRIV = "-----BEGIN EDDSA PRIVATE KEY-----";
wcchar END_EDDSA_PRIV = "-----END EDDSA PRIVATE KEY-----";
#endif
#ifdef HAVE_CRL
const char *const BEGIN_CRL = "-----BEGIN X509 CRL-----";
const char* const END_CRL = "-----END X509 CRL-----";
wcchar END_CRL = "-----END X509 CRL-----";
#endif
@ -9953,22 +9953,22 @@ int wc_PemGetHeaderFooter(int type, const char** header, const char** footer)
#ifdef WOLFSSL_ENCRYPTED_KEYS
static const char* const kProcTypeHeader = "Proc-Type";
static const char* const kDecInfoHeader = "DEK-Info";
static wcchar kProcTypeHeader = "Proc-Type";
static wcchar kDecInfoHeader = "DEK-Info";
#ifdef WOLFSSL_PEM_TO_DER
#ifndef NO_DES3
static const char* const kEncTypeDes = "DES-CBC";
static const char* const kEncTypeDes3 = "DES-EDE3-CBC";
static wcchar kEncTypeDes = "DES-CBC";
static wcchar kEncTypeDes3 = "DES-EDE3-CBC";
#endif
#if !defined(NO_AES) && defined(HAVE_AES_CBC) && defined(WOLFSSL_AES_128)
static const char* const kEncTypeAesCbc128 = "AES-128-CBC";
static wcchar kEncTypeAesCbc128 = "AES-128-CBC";
#endif
#if !defined(NO_AES) && defined(HAVE_AES_CBC) && defined(WOLFSSL_AES_192)
static const char* const kEncTypeAesCbc192 = "AES-192-CBC";
static wcchar kEncTypeAesCbc192 = "AES-192-CBC";
#endif
#if !defined(NO_AES) && defined(HAVE_AES_CBC) && defined(WOLFSSL_AES_256)
static const char* const kEncTypeAesCbc256 = "AES-256-CBC";
static wcchar kEncTypeAesCbc256 = "AES-256-CBC";
#endif
int wc_EncryptedInfoGet(EncryptedInfo* info, const char* cipherInfo)

View File

@ -529,9 +529,6 @@ int fp_mul_comba(fp_int *A, fp_int *B, fp_int *C)
fp_int *tmp;
#endif
/* Variables used but not seen by cppcheck. */
(void)c0; (void)c1; (void)c2;
IF_HAVE_INTEL_MULX(ret = fp_mul_comba_mulx(A, B, C), return ret) ;
#ifdef WOLFSSL_SMALL_STACK
@ -587,6 +584,9 @@ int fp_mul_comba(fp_int *A, fp_int *B, fp_int *C)
dst->sign = A->sign ^ B->sign;
fp_clamp(dst);
fp_copy(dst, C);
/* Variables used but not seen by cppcheck. */
(void)c0; (void)c1; (void)c2;
#ifdef WOLFSSL_SMALL_STACK
XFREE(tmp, NULL, DYNAMIC_TYPE_BIGINT);
@ -2624,12 +2624,6 @@ int fp_sqr_comba(fp_int *A, fp_int *B)
fp_int *tmp;
#endif
/* Variables used but not seen by cppcheck. */
(void)c0; (void)c1; (void)c2;
#ifdef TFM_ISO
(void)tt;
#endif
#ifdef WOLFSSL_SMALL_STACK
tmp = (fp_int*)XMALLOC(sizeof(fp_int), NULL, DYNAMIC_TYPE_BIGINT);
if (tmp == NULL)
@ -2705,6 +2699,12 @@ int fp_sqr_comba(fp_int *A, fp_int *B)
fp_copy(dst, B);
}
/* Variables used but not seen by cppcheck. */
(void)c0; (void)c1; (void)c2;
#ifdef TFM_ISO
(void)tt;
#endif
#ifdef WOLFSSL_SMALL_STACK
XFREE(tmp, NULL, DYNAMIC_TYPE_BIGINT);
#endif
@ -4704,7 +4704,7 @@ int mp_add_d(fp_int *a, fp_digit b, fp_int *c)
defined(DEBUG_WOLFSSL) || defined(OPENSSL_EXTRA) || defined(WC_MP_TO_RADIX)
/* chars used in radix conversions */
static const char* const fp_s_rmap = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
static wcchar fp_s_rmap = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz+/";
#endif

View File

@ -4499,10 +4499,20 @@ WOLFSSL_LOCAL word32 LowResTimer(void);
WOLFSSL_LOCAL int CopyDecodedToX509(WOLFSSL_X509*, DecodedCert*);
#endif
#ifndef MAX_CIPHER_NAME
#define MAX_CIPHER_NAME 50
#endif
#ifdef WOLFSSL_NAMES_STATIC
typedef char cipher_name[MAX_CIPHER_NAME];
#else
typedef const char* cipher_name;
#endif
typedef struct CipherSuiteInfo {
const char* name;
cipher_name name;
#ifndef NO_ERROR_STRINGS
const char* name_iana;
cipher_name name_iana;
#endif
byte cipherSuite0;
byte cipherSuite;

View File

@ -44,10 +44,16 @@
#define CURVE25519_KEYSIZE 32
#ifdef WOLFSSL_NAMES_STATIC
typedef char curve25519_str[12];
#else
typedef const char* curve25519_str;
#endif
/* curve25519 set type */
typedef struct {
int size; /* The size of the curve in octets */
const char* name; /* name of this curve */
int size; /* The size of the curve in octets */
curve25519_str name; /* name of this curve */
} curve25519_set_type;

View File

@ -2173,6 +2173,13 @@ extern void uITRON4_free(void *p) ;
#define NO_SESSION_CACHE
#endif
/* Use static ECC structs for Position Independant Code (PIC) */
#if defined(__IAR_SYSTEMS_ICC__) && defined(__ROPI__)
#define WOLFSSL_ECC_CURVE_STATIC
#define WOLFSSL_NAMES_STATIC
#define WOLFSSL_NO_CONSTCHARCONST
#endif
#ifdef __cplusplus
} /* extern "C" */

View File

@ -71,6 +71,14 @@
#endif
/* constant pointer to a constant char */
#ifdef WOLFSSL_NO_CONSTCHARCONST
typedef const char* wcchar;
#else
typedef const char* const wcchar;
#endif
/* try to set SIZEOF_LONG or SIZEOF_LONG_LONG if user didn't */
#if defined(_MSC_VER) || defined(HAVE_LIMITS_H)
#if !defined(SIZEOF_LONG_LONG) && !defined(SIZEOF_LONG)