FreeRTOS-Plus/ThirdParty/WolfSSL-FIPS-Ready/wolfcrypt/src/asn.c
/* Write a public RSA key to output */
Write a public RSA key to output
Write a public RSA key to output
static int SetRsaPublicKey(byte* output, RsaKey* key,
                           int outLen, int with_header)
{
#ifdef WOLFSSL_SMALL_STACK
    byte* n = NULL;
    byte* e = NULL;
#else
    byte n[MAX_RSA_INT_SZ];
    byte e[MAX_RSA_E_SZ];
#endif
    byte seq[MAX_SEQ_SZ];
    byte bitString[1 + MAX_LENGTH_SZ + 1];
    int  nSz;
    int  eSz;
    int  seqSz;
    int  bitStringSz;
    int  idx;
    if (output == NULL || key == NULL || outLen < MAX_SEQ_SZ)
        return BAD_FUNC_ARG;
#ifdef WOLFSSL_SMALL_STACK
    n = (byte*)XMALLOC(MAX_RSA_INT_SZ, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
    if (n == NULL)
        return MEMORY_E;
#endif
#ifdef HAVE_USER_RSA
    nSz = SetASNIntRSA(key->n, n);
#else
    nSz = SetASNIntMP(&key->n, MAX_RSA_INT_SZ, n);
#endif
    if (nSz < 0) {
#ifdef WOLFSSL_SMALL_STACK
        XFREE(n, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
#endif
        return nSz;
    }
#ifdef WOLFSSL_SMALL_STACK
    e = (byte*)XMALLOC(MAX_RSA_E_SZ, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
    if (e == NULL) {
#ifdef WOLFSSL_SMALL_STACK
        XFREE(n, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
#endif
        return MEMORY_E;
    }
#endif
#ifdef HAVE_USER_RSA
    eSz = SetASNIntRSA(key->e, e);
#else
    eSz = SetASNIntMP(&key->e, MAX_RSA_INT_SZ, e);
#endif
    if (eSz < 0) {
#ifdef WOLFSSL_SMALL_STACK
        XFREE(n, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
        XFREE(e, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
#endif
        return eSz;
    }
    seqSz  = SetSequence(nSz + eSz, seq);
    if ( (seqSz + nSz + eSz) > outLen) {
#ifdef WOLFSSL_SMALL_STACK
        XFREE(n,    key->heap, DYNAMIC_TYPE_TMP_BUFFER);
        XFREE(e,    key->heap, DYNAMIC_TYPE_TMP_BUFFER);
#endif
        return BUFFER_E;
    }
    if (with_header) {
        int  algoSz;
#ifdef WOLFSSL_SMALL_STACK
        byte* algo;
        algo = (byte*)XMALLOC(MAX_ALGO_SZ, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
        if (algo == NULL) {
            XFREE(n, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
            XFREE(e, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
            return MEMORY_E;
        }
#else
        byte algo[MAX_ALGO_SZ];
#endif
        algoSz = SetAlgoID(RSAk, algo, oidKeyType, 0);
        bitStringSz  = SetBitString(seqSz + nSz + eSz, 0, bitString);
        idx = SetSequence(nSz + eSz + seqSz + bitStringSz + algoSz, output);
        if ( (idx + algoSz + bitStringSz + seqSz + nSz + eSz) > outLen) {
            #ifdef WOLFSSL_SMALL_STACK
                XFREE(n,    key->heap, DYNAMIC_TYPE_TMP_BUFFER);
                XFREE(e,    key->heap, DYNAMIC_TYPE_TMP_BUFFER);
                XFREE(algo, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
            #endif
            return BUFFER_E;
        }
        XMEMCPY(output + idx, algo, algoSz);
        idx += algoSz;
        XMEMCPY(output + idx, bitString, bitStringSz);
        idx += bitStringSz;
#ifdef WOLFSSL_SMALL_STACK
        XFREE(algo, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
#endif
    }
    else
        idx = 0;
    XMEMCPY(output + idx, seq, seqSz);
    idx += seqSz;
    XMEMCPY(output + idx, n, nSz);
    idx += nSz;
    XMEMCPY(output + idx, e, eSz);
    idx += eSz;
#ifdef WOLFSSL_SMALL_STACK
    XFREE(n,    key->heap, DYNAMIC_TYPE_TMP_BUFFER);
    XFREE(e,    key->heap, DYNAMIC_TYPE_TMP_BUFFER);
#endif
    return idx;
}
static int SetRsaPublicKey ( byte * output , RsaKey * key , int outLen , int with_header ) { #ifdef WOLFSSL_SMALL_STACK byte * n = NULL ; byte * e = NULL ; #else byte n [ MAX_RSA_INT_SZ ] ; byte e [ MAX_RSA_E_SZ ] ; #endif byte seq [ MAX_SEQ_SZ ] ; byte bitString [ 1 + MAX_LENGTH_SZ + 1 ] ; int nSz ; int eSz ; int seqSz ; int bitStringSz ; int idx ; if ( output == NULL || key == NULL || outLen < MAX_SEQ_SZ ) return BAD_FUNC_ARG ; #ifdef WOLFSSL_SMALL_STACK n = ( byte * ) XMALLOC ( MAX_RSA_INT_SZ , key -> heap , DYNAMIC_TYPE_TMP_BUFFER ) ; if ( n == NULL ) return MEMORY_E ; #endif #ifdef HAVE_USER_RSA nSz = SetASNIntRSA ( key -> n , n ) ; #else nSz = SetASNIntMP ( & key -> n , MAX_RSA_INT_SZ , n ) ; #endif if ( nSz < 0 ) { #ifdef WOLFSSL_SMALL_STACK XFREE ( n , key -> heap , DYNAMIC_TYPE_TMP_BUFFER ) ; #endif return nSz ; } #ifdef WOLFSSL_SMALL_STACK e = ( byte * ) XMALLOC ( MAX_RSA_E_SZ , key -> heap , DYNAMIC_TYPE_TMP_BUFFER ) ; if ( e == NULL ) { #ifdef WOLFSSL_SMALL_STACK XFREE ( n , key -> heap , DYNAMIC_TYPE_TMP_BUFFER ) ; #endif return MEMORY_E ; } #endif #ifdef HAVE_USER_RSA eSz = SetASNIntRSA ( key -> e , e ) ; #else eSz = SetASNIntMP ( & key -> e , MAX_RSA_INT_SZ , e ) ; #endif if ( eSz < 0 ) { #ifdef WOLFSSL_SMALL_STACK XFREE ( n , key -> heap , DYNAMIC_TYPE_TMP_BUFFER ) ; XFREE ( e , key -> heap , DYNAMIC_TYPE_TMP_BUFFER ) ; #endif return eSz ; } seqSz = SetSequence ( nSz + eSz , seq ) ; if ( ( seqSz + nSz + eSz ) > outLen ) { #ifdef WOLFSSL_SMALL_STACK XFREE ( n , key -> heap , DYNAMIC_TYPE_TMP_BUFFER ) ; XFREE ( e , key -> heap , DYNAMIC_TYPE_TMP_BUFFER ) ; #endif return BUFFER_E ; } if ( with_header ) { int algoSz ; #ifdef WOLFSSL_SMALL_STACK byte * algo ; algo = ( byte * ) XMALLOC ( MAX_ALGO_SZ , key -> heap , DYNAMIC_TYPE_TMP_BUFFER ) ; if ( algo == NULL ) { XFREE ( n , key -> heap , DYNAMIC_TYPE_TMP_BUFFER ) ; XFREE ( e , key -> heap , DYNAMIC_TYPE_TMP_BUFFER ) ; return MEMORY_E ; } #else byte algo [ MAX_ALGO_SZ ] ; #endif algoSz = SetAlgoID ( RSAk , algo , oidKeyType , 0 ) ; bitStringSz = SetBitString ( seqSz + nSz + eSz , 0 , bitString ) ; idx = SetSequence ( nSz + eSz + seqSz + bitStringSz + algoSz , output ) ; if ( ( idx + algoSz + bitStringSz + seqSz + nSz + eSz ) > outLen ) { #ifdef WOLFSSL_SMALL_STACK XFREE ( n , key -> heap , DYNAMIC_TYPE_TMP_BUFFER ) ; XFREE ( e , key -> heap , DYNAMIC_TYPE_TMP_BUFFER ) ; XFREE ( algo , key -> heap , DYNAMIC_TYPE_TMP_BUFFER ) ; #endif return BUFFER_E ; } XMEMCPY ( output + idx , algo , algoSz ) ; idx += algoSz ; XMEMCPY ( output + idx , bitString , bitStringSz ) ; idx += bitStringSz ; #ifdef WOLFSSL_SMALL_STACK XFREE ( algo , key -> heap , DYNAMIC_TYPE_TMP_BUFFER ) ; #endif } else idx = 0 ; XMEMCPY ( output + idx , seq , seqSz ) ; idx += seqSz ; XMEMCPY ( output + idx , n , nSz ) ; idx += nSz ; XMEMCPY ( output + idx , e , eSz ) ; idx += eSz ; #ifdef WOLFSSL_SMALL_STACK XFREE ( n , key -> heap , DYNAMIC_TYPE_TMP_BUFFER ) ; XFREE ( e , key -> heap , DYNAMIC_TYPE_TMP_BUFFER ) ; #endif return idx ; }
Write a public RSA key to output
Write a public RSA key to output
/* n */ /* e */ /* check output size */ /* headers */ /* check output size */ /* algo */ /* bit string */ /* seq */ /* n */ /* e */