111 lines
2.0 KiB
ArmAsm
111 lines
2.0 KiB
ArmAsm
/* bigint_adjust.S */
|
|
/*
|
|
This file is part of the ARM-Crypto-Lib.
|
|
Copyright (C) 2006-2010 Daniel Otte (daniel.otte@rub.de)
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
void bigint_adjust(bigint_t *a){
|
|
while(a->length_B!=0 && a->wordv[a->length_B-1]==0){
|
|
a->length_B--;
|
|
}
|
|
if(a->length_B==0){
|
|
a->info=0;
|
|
return;
|
|
}
|
|
uint8_t t;
|
|
uint8_t i = 0x07;
|
|
t = a->wordv[a->length_B-1];
|
|
while((t&0x80)==0 && i){
|
|
t<<=1;
|
|
i--;
|
|
}
|
|
SET_FBS(a, i);
|
|
}
|
|
*/
|
|
.global bigint_adjust
|
|
bigint_adjust:
|
|
movw r30, r24
|
|
ldd r24, Z+0
|
|
ldd r25, Z+1
|
|
ldd r26, Z+3
|
|
ldd r27, Z+4
|
|
add r26, r24
|
|
adc r27, r25
|
|
20:
|
|
sbiw r24, 1
|
|
brmi 30f
|
|
ld r23, -X
|
|
tst r23
|
|
brne 40f
|
|
rjmp 20b
|
|
30:
|
|
std Z+0, r1
|
|
std Z+0, r1
|
|
std Z+2, r1
|
|
ret
|
|
40:
|
|
adiw r24, 1
|
|
std Z+0, r24
|
|
std Z+1, r25
|
|
clr r24
|
|
50:
|
|
sbrc r23, 0
|
|
mov r25, r24
|
|
lsr r23
|
|
inc r24
|
|
brpl 50b
|
|
ldd r23, Z+2
|
|
andi r23, 0xF8
|
|
or r23, r25
|
|
std Z+2, r23
|
|
bigint_adjust_ret:
|
|
ret
|
|
|
|
/*
|
|
void bigint_copy(bigint_t *dest, const bigint_t *src){
|
|
memcpy(dest->wordv, src->wordv, src->length_B);
|
|
dest->length_B = src->length_B;
|
|
dest->info = src->info;
|
|
}
|
|
*/
|
|
.global bigint_copy
|
|
bigint_copy:
|
|
movw r26, r24
|
|
movw r30, r22
|
|
/* copy length */
|
|
ld r24, Z+
|
|
st X+, r24
|
|
ld r25, Z+
|
|
st X+, r25
|
|
/* copy info */
|
|
ld r22, Z+
|
|
st X+, r22
|
|
/* load wordv pointers */
|
|
ld r22, Z+
|
|
ld r23, Z
|
|
movw r30, r22
|
|
ld r22, X+
|
|
ld r23, X
|
|
movw r26, r22
|
|
10:
|
|
sbiw r24, 1
|
|
brmi bigint_adjust_ret
|
|
ld r22, Z+
|
|
st X+, r22
|
|
rjmp 10b
|
|
|