1 // Copyright 2007,2008 Segher Boessenkool <segher@kernel.crashing.org>
2 // Licensed under the terms of the GNU GPL, version 2
3 // http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
10 static void bn_print(char *name
, u8
*a
, u32 n
)
14 printf("%s = ", name
);
16 for (i
= 0; i
< n
; i
++)
22 static void bn_zero(u8
*d
, u32 n
)
27 static void bn_copy(u8
*d
, u8
*a
, u32 n
)
32 static int bn_compare(u8
*a
, u8
*b
, u32 n
)
36 for (i
= 0; i
< n
; i
++) {
46 static void bn_sub_raw(u8
*a
, u8
*N
, u32 n
)
53 for (i
= n
- 1; i
< n
; i
--) {
60 static void bn_add(u8
*d
, u8
*a
, u8
*b
, u8
*N
, u32 n
)
67 for (i
= n
- 1; i
< n
; i
--) {
68 dig
= a
[i
] + b
[i
] + c
;
76 if (bn_compare(d
, N
, n
) >= 0)
80 static void bn_mul(u8
*d
, u8
*a
, u8
*b
, u8
*N
, u32 n
)
87 for (i
= 0; i
< n
; i
++)
88 for (mask
= 0x80; mask
!= 0; mask
>>= 1) {
89 bn_add(d
, d
, d
, N
, n
);
90 if ((a
[i
] & mask
) != 0)
91 bn_add(d
, d
, b
, N
, n
);
95 void bn_exp(u8
*d
, u8
*a
, u8
*N
, u32 n
, u8
*e
, u32 en
)
103 for (i
= 0; i
< en
; i
++)
104 for (mask
= 0x80; mask
!= 0; mask
>>= 1) {
105 bn_mul(t
, d
, d
, N
, n
);
106 if ((e
[i
] & mask
) != 0)
107 bn_mul(d
, t
, a
, N
, n
);
113 // only for prime N -- stupid but lazy, see if I care
114 static void bn_inv(u8
*d
, u8
*a
, u8
*N
, u32 n
)
122 bn_exp(d
, a
, N
, n
, t
, n
);