diff --git a/include/arm9/hardware/crypto.h b/include/arm9/hardware/crypto.h index 564f28a..51f474c 100644 --- a/include/arm9/hardware/crypto.h +++ b/include/arm9/hardware/crypto.h @@ -130,14 +130,6 @@ void AES_addCounter(u32 ctr[4], u32 val); /** - * @brief Decrements the internal counter with the given value (CTR mode). - * - * @param ctr Pointer to the counter data. - * @param[in] val Value to decrement the counter with. - */ -void AES_subCounter(u32 ctr[4], u32 val); - -/** * @brief Sets params in the AES context for all following crypto operations. * * @param ctx Pointer to AES_ctx (AES context). diff --git a/source/arm9/hardware/crypto.c b/source/arm9/hardware/crypto.c index a3101d5..67fdfc6 100644 --- a/source/arm9/hardware/crypto.c +++ b/source/arm9/hardware/crypto.c @@ -282,46 +282,20 @@ } // TODO: Handle endianess! -void AES_addCounter(u32 ctr[4], u32 val) +NAKED void AES_addCounter(u32 ctr[4], u32 val) { - fb_assert(ctr != NULL); - - u32 carry, i = 1; - u64 sum; - - sum = ctr[0]; - sum += (val >> 4); - carry = sum >> 32; - ctr[0] = sum & 0xFFFFFFFFu; - - while(carry) - { - sum = ctr[i]; - sum += carry; - carry = sum >> 32; - ctr[i] = sum & 0xFFFFFFFFu; - i++; - } -} - -void AES_subCounter(u32 ctr[4], u32 val) -{ - fb_assert(ctr != NULL); - - u32 carry, i = 1; - u32 sum; - - sum = ctr[0] - (val >> 4); - carry = (sum > ctr[0]); - ctr[0] = sum; - - while(carry && i < 4) - { - sum = ctr[i] - carry; - carry = (sum > ctr[i]); - ctr[i] = sum; - i++; - } + __asm__ + ( + "stmfd sp!, {r4, lr}\n\t" + "ldm r0, {r2-r4, lr}\n\t" + "adds r2, r1, lsr #4\n\t" + "addcss r3, r3, #1\n\t" + "addcss r4, r4, #1\n\t" + "addcs lr, lr, #1\n\t" + "stm r0, {r2-r4, lr}\n\t" + "ldmfd sp!, {r4, pc}\n\t" + : : "r" (ctr), "r" (val) : + ); } void AES_setCryptParams(AES_ctx *const ctx, u8 inEndianessOrder, u8 outEndianessOrder)