示例#1
0
static int32 RoundUpForPixelSize (uint32 x, uint32 pixelSize)
	{
	
	switch (pixelSize)
		{
		
		case 1:
			return RoundUp16 (x);
			
		case 2:
			return RoundUp8 (x);
			
		case 4:
			return RoundUp4 (x);
			
		case 8:
			return RoundUp2 (x);
			
		default:
			return RoundUp16 (x);
					
		}
	
	}
示例#2
0
static int AesAuthDecrypt(Aes* aes, byte* out, const byte* in, word32 inSz,
                          const byte* nonce, word32 nonceSz,
                          const byte* authTag, word32 authTagSz,
                          const byte* authIn, word32 authInSz, int mode)
{
    word32 M, L ;
    byte *in_a,     *in_save ;
    byte *out_a,    *out_save ;
    byte *authIn_a, *authIn_save ;
    byte *nonce_a,    *nonce_save ;
    word32 tmpTag[4] ;
    bool ret ;

    if(AesAuthArgCheck(aes, out, in, inSz, nonce, nonceSz, authTag, authTagSz, authIn, authInSz, &M, &L)
            == BAD_FUNC_ARG)return  BAD_FUNC_ARG ;

    /* 16 byte padding */
    in_save = NULL ;
    out_save = NULL ;
    authIn_save = NULL ;
    nonce_save = NULL ;
    if((inSz%16)==0) {
        in_save = NULL ;
        in_a = (byte *)in ;
        out_save = NULL ;
        out_a = out ;
    } else {
        if((in_save = XMALLOC(RoundUp16(inSz), NULL, DYNAMIC_TYPE_TMP_BUFFER)) == NULL) {
            FREE_ALL;
            return MEMORY_E;
        }
        in_a = in_save ;
        XMEMSET(in_a, 0, RoundUp16(inSz)) ;
        XMEMCPY(in_a, in, inSz) ;

        if((out_save = XMALLOC(RoundUp16(inSz), NULL, DYNAMIC_TYPE_TMP_BUFFER)) == NULL) {
            FREE_ALL;
            return MEMORY_E;
        }
        out_a = out_save ;
    }

    if((authInSz%16)==0) {
        authIn_save = NULL ;
        authIn_a = (byte *)authIn ;
    } else {
        if((authIn_save = XMALLOC(RoundUp16(authInSz), NULL, DYNAMIC_TYPE_TMP_BUFFER)) == NULL) {
            FREE_ALL;
            return MEMORY_E;
        }
        authIn_a = authIn_save ;
        XMEMSET(authIn_a, 0, RoundUp16(authInSz)) ;
        XMEMCPY(authIn_a, authIn, authInSz) ;
    }

    if((nonceSz%16)==0) {
        nonce_save = NULL ;
        nonce_a = (byte *)nonce ;
    } else {
        if((nonce_save = XMALLOC(RoundUp16(nonceSz), NULL, DYNAMIC_TYPE_TMP_BUFFER)) == NULL) {
            FREE_ALL;
            return MEMORY_E;
        }
        nonce_a = nonce_save ;
        XMEMSET(nonce_a, 0, RoundUp16(nonceSz)) ;
        XMEMCPY(nonce_a, nonce, nonceSz) ;
    }

    /* do aes-ccm */
    AesAuthSetIv(aes, nonce, nonceSz, L, mode) ;
    ROM_AESReset(AES_BASE);
    ROM_AESConfigSet(AES_BASE, (aes->keylen | AES_CFG_DIR_DECRYPT |
                                AES_CFG_CTR_WIDTH_128 |
                                mode | ((mode== AES_CFG_MODE_CCM) ? (L | M) : 0 ))) ;
    ROM_AESIVSet(AES_BASE, aes->reg);
    ROM_AESKey1Set(AES_BASE, aes->key, aes->keylen);
    ret = ROM_AESDataProcessAuth(AES_BASE, (unsigned int*)in_a, (unsigned int *)out_a, inSz,
                                 (unsigned int*)authIn_a, authInSz, (unsigned int *)tmpTag);
    if((ret == false) || (XMEMCMP(authTag, tmpTag, authTagSz) != 0)) {
        XMEMSET(out, 0, inSz) ;
        ret = false ;
    } else {
        XMEMCPY(out, out_a, inSz) ;
    }

    FREE_ALL ;
    return ret==true ? 0 : 1 ;
}