FreeRTOS-Plus/ThirdParty/WolfSSL-FIPS-Ready/wolfcrypt/src/asn.c
/* Convert RsaKey key to DER format, write to output (inLen), return bytes
   written */
Convert RsaKey key to DER format, write to output (inLen), return bytes
written
Convert RsaKey key to DER format write to output ( inLen ) return bytes written
int wc_RsaKeyToDer(RsaKey* key, byte* output, word32 inLen)
{
    word32 seqSz, verSz, rawLen, intTotalLen = 0;
    word32 sizes[RSA_INTS];
    int    i, j, outLen, ret = 0, mpSz;
    byte  seq[MAX_SEQ_SZ];
    byte  ver[MAX_VERSION_SZ];
    byte* tmps[RSA_INTS];
    if (!key)
        return BAD_FUNC_ARG;
    if (key->type != RSA_PRIVATE)
        return BAD_FUNC_ARG;
    for (i = 0; i < RSA_INTS; i++)
        tmps[i] = NULL;
    for (i = 0; i < RSA_INTS; i++) {
        mp_int* keyInt = GetRsaInt(key, i);
        rawLen = mp_unsigned_bin_size(keyInt) + 1;
        tmps[i] = (byte*)XMALLOC(rawLen + MAX_SEQ_SZ, key->heap,
                                 DYNAMIC_TYPE_RSA);
        if (tmps[i] == NULL) {
            ret = MEMORY_E;
            break;
        }
        mpSz = SetASNIntMP(keyInt, MAX_RSA_INT_SZ, tmps[i]);
        if (mpSz < 0) {
            ret = mpSz;
            break;
        }
        intTotalLen += (sizes[i] = mpSz);
    }
    if (ret != 0) {
        FreeTmpRsas(tmps, key->heap);
        return ret;
    }
    verSz = SetMyVersion(0, ver, FALSE);
    seqSz = SetSequence(verSz + intTotalLen, seq);
    outLen = seqSz + verSz + intTotalLen;
    if (output) {
        if (outLen > (int)inLen) {
            FreeTmpRsas(tmps, key->heap);
            return BAD_FUNC_ARG;
        }
        XMEMCPY(output, seq, seqSz);
        j = seqSz;
        XMEMCPY(output + j, ver, verSz);
        j += verSz;
        for (i = 0; i < RSA_INTS; i++) {
            XMEMCPY(output + j, tmps[i], sizes[i]);
            j += sizes[i];
        }
    }
    FreeTmpRsas(tmps, key->heap);
    return outLen;
}
int wc_RsaKeyToDer ( RsaKey * key , byte * output , word32 inLen ) { word32 seqSz , verSz , rawLen , intTotalLen = 0 ; word32 sizes [ RSA_INTS ] ; int i , j , outLen , ret = 0 , mpSz ; byte seq [ MAX_SEQ_SZ ] ; byte ver [ MAX_VERSION_SZ ] ; byte * tmps [ RSA_INTS ] ; if ( ! key ) return BAD_FUNC_ARG ; if ( key -> type != RSA_PRIVATE ) return BAD_FUNC_ARG ; for ( i = 0 ; i < RSA_INTS ; i ++ ) tmps [ i ] = NULL ; for ( i = 0 ; i < RSA_INTS ; i ++ ) { mp_int * keyInt = GetRsaInt ( key , i ) ; rawLen = mp_unsigned_bin_size ( keyInt ) + 1 ; tmps [ i ] = ( byte * ) XMALLOC ( rawLen + MAX_SEQ_SZ , key -> heap , DYNAMIC_TYPE_RSA ) ; if ( tmps [ i ] == NULL ) { ret = MEMORY_E ; break ; } mpSz = SetASNIntMP ( keyInt , MAX_RSA_INT_SZ , tmps [ i ] ) ; if ( mpSz < 0 ) { ret = mpSz ; break ; } intTotalLen += ( sizes [ i ] = mpSz ) ; } if ( ret != 0 ) { FreeTmpRsas ( tmps , key -> heap ) ; return ret ; } verSz = SetMyVersion ( 0 , ver , FALSE ) ; seqSz = SetSequence ( verSz + intTotalLen , seq ) ; outLen = seqSz + verSz + intTotalLen ; if ( output ) { if ( outLen > ( int ) inLen ) { FreeTmpRsas ( tmps , key -> heap ) ; return BAD_FUNC_ARG ; } XMEMCPY ( output , seq , seqSz ) ; j = seqSz ; XMEMCPY ( output + j , ver , verSz ) ; j += verSz ; for ( i = 0 ; i < RSA_INTS ; i ++ ) { XMEMCPY ( output + j , tmps [ i ] , sizes [ i ] ) ; j += sizes [ i ] ; } } FreeTmpRsas ( tmps , key -> heap ) ; return outLen ; }
Convert RsaKey key to DER format, write to output (inLen), return bytes
written
Convert RsaKey key to DER format write to output ( inLen ) return bytes written
/* write all big ints from key to DER tmps */ /* make headers */ /* write to output */