Commit manual pages after running 'man-update' and add new manual pages.
[dragonfly.git] / secure / lib / libcrypto / man / bn_internal.3
CommitLineData
74dab6c2
JR
1.rn '' }`
2''' $RCSfile$$Revision$$Date$
3'''
4''' $Log$
5'''
6.de Sh
984263bc
MD
7.br
8.if t .Sp
9.ne 5
10.PP
11\fB\\$1\fR
12.PP
13..
74dab6c2 14.de Sp
984263bc
MD
15.if t .sp .5v
16.if n .sp
17..
74dab6c2 18.de Ip
984263bc
MD
19.br
20.ie \\n(.$>=3 .ne \\$3
21.el .ne 3
22.IP "\\$1" \\$2
23..
74dab6c2 24.de Vb
984263bc
MD
25.ft CW
26.nf
27.ne \\$1
28..
74dab6c2 29.de Ve
984263bc
MD
30.ft R
31
32.fi
33..
74dab6c2
JR
34'''
35'''
36''' Set up \*(-- to give an unbreakable dash;
37''' string Tr holds user defined translation string.
38''' Bell System Logo is used as a dummy character.
39'''
984263bc 40.tr \(*W-|\(bv\*(Tr
984263bc 41.ie n \{\
74dab6c2
JR
42.ds -- \(*W-
43.ds PI pi
44.if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
45.if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
46.ds L" ""
47.ds R" ""
48''' \*(M", \*(S", \*(N" and \*(T" are the equivalent of
49''' \*(L" and \*(R", except that they are used on ".xx" lines,
50''' such as .IP and .SH, which do another additional levels of
51''' double-quote interpretation
52.ds M" """
53.ds S" """
54.ds N" """""
55.ds T" """""
56.ds L' '
57.ds R' '
58.ds M' '
59.ds S' '
60.ds N' '
61.ds T' '
984263bc
MD
62'br\}
63.el\{\
74dab6c2
JR
64.ds -- \(em\|
65.tr \*(Tr
66.ds L" ``
67.ds R" ''
68.ds M" ``
69.ds S" ''
70.ds N" ``
71.ds T" ''
72.ds L' `
73.ds R' '
74.ds M' `
75.ds S' '
76.ds N' `
77.ds T' '
78.ds PI \(*p
984263bc 79'br\}
74dab6c2
JR
80.\" If the F register is turned on, we'll generate
81.\" index entries out stderr for the following things:
82.\" TH Title
83.\" SH Header
84.\" Sh Subsection
85.\" Ip Item
86.\" X<> Xref (embedded
87.\" Of course, you have to process the output yourself
88.\" in some meaninful fashion.
89.if \nF \{
90.de IX
91.tm Index:\\$1\t\\n%\t"\\$2"
984263bc 92..
74dab6c2
JR
93.nr % 0
94.rr F
984263bc 95.\}
74dab6c2
JR
96.TH bn_internal 3 "0.9.7d" "2/Sep/2004" "OpenSSL"
97.UC
98.if n .hy 0
984263bc 99.if n .na
74dab6c2
JR
100.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
101.de CQ \" put $1 in typewriter font
102.ft CW
103'if n "\c
104'if t \\&\\$1\c
105'if n \\&\\$1\c
106'if n \&"
107\\&\\$2 \\$3 \\$4 \\$5 \\$6 \\$7
108'.ft R
109..
110.\" @(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2
111. \" AM - accent mark definitions
984263bc 112.bd B 3
74dab6c2 113. \" fudge factors for nroff and troff
984263bc 114.if n \{\
74dab6c2
JR
115. ds #H 0
116. ds #V .8m
117. ds #F .3m
118. ds #[ \f1
119. ds #] \fP
984263bc
MD
120.\}
121.if t \{\
74dab6c2
JR
122. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
123. ds #V .6m
124. ds #F 0
125. ds #[ \&
126. ds #] \&
984263bc 127.\}
74dab6c2 128. \" simple accents for nroff and troff
984263bc 129.if n \{\
74dab6c2
JR
130. ds ' \&
131. ds ` \&
132. ds ^ \&
133. ds , \&
134. ds ~ ~
135. ds ? ?
136. ds ! !
137. ds /
138. ds q
984263bc
MD
139.\}
140.if t \{\
74dab6c2
JR
141. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
142. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
143. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
144. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
145. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
146. ds ? \s-2c\h'-\w'c'u*7/10'\u\h'\*(#H'\zi\d\s+2\h'\w'c'u*8/10'
147. ds ! \s-2\(or\s+2\h'-\w'\(or'u'\v'-.8m'.\v'.8m'
148. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
149. ds q o\h'-\w'o'u*8/10'\s-4\v'.4m'\z\(*i\v'-.4m'\s+4\h'\w'o'u*8/10'
984263bc 150.\}
74dab6c2 151. \" troff and (daisy-wheel) nroff accents
984263bc
MD
152.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
153.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
74dab6c2
JR
154.ds v \\k:\h'-(\\n(.wu*9/10-\*(#H)'\v'-\*(#V'\*(#[\s-4v\s0\v'\*(#V'\h'|\\n:u'\*(#]
155.ds _ \\k:\h'-(\\n(.wu*9/10-\*(#H+(\*(#F*2/3))'\v'-.4m'\z\(hy\v'.4m'\h'|\\n:u'
156.ds . \\k:\h'-(\\n(.wu*8/10)'\v'\*(#V*4/10'\z.\v'-\*(#V*4/10'\h'|\\n:u'
157.ds 3 \*(#[\v'.2m'\s-2\&3\s0\v'-.2m'\*(#]
984263bc
MD
158.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
159.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
160.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
161.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
162.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
163.ds ae a\h'-(\w'a'u*4/10)'e
164.ds Ae A\h'-(\w'A'u*4/10)'E
74dab6c2
JR
165.ds oe o\h'-(\w'o'u*4/10)'e
166.ds Oe O\h'-(\w'O'u*4/10)'E
167. \" corrections for vroff
984263bc
MD
168.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
169.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
74dab6c2 170. \" for low resolution devices (crt and lpr)
984263bc
MD
171.if \n(.H>23 .if \n(.V>19 \
172\{\
74dab6c2
JR
173. ds : e
174. ds 8 ss
175. ds v \h'-1'\o'\(aa\(ga'
176. ds _ \h'-1'^
177. ds . \h'-1'.
178. ds 3 3
179. ds o a
180. ds d- d\h'-1'\(ga
181. ds D- D\h'-1'\(hy
182. ds th \o'bp'
183. ds Th \o'LP'
184. ds ae ae
185. ds Ae AE
186. ds oe oe
187. ds Oe OE
984263bc
MD
188.\}
189.rm #[ #] #H #V #F C
984263bc
MD
190.SH "NAME"
191bn_mul_words, bn_mul_add_words, bn_sqr_words, bn_div_words,
192bn_add_words, bn_sub_words, bn_mul_comba4, bn_mul_comba8,
193bn_sqr_comba4, bn_sqr_comba8, bn_cmp_words, bn_mul_normal,
194bn_mul_low_normal, bn_mul_recursive, bn_mul_part_recursive,
195bn_mul_low_recursive, bn_mul_high, bn_sqr_normal, bn_sqr_recursive,
196bn_expand, bn_wexpand, bn_expand2, bn_fix_top, bn_check_top,
74dab6c2 197bn_print, bn_dump, bn_set_max, bn_set_high, bn_set_low \- BIGNUM
984263bc
MD
198library internal functions
199.SH "SYNOPSIS"
74dab6c2 200.PP
984263bc
MD
201.Vb 9
202\& BN_ULONG bn_mul_words(BN_ULONG *rp, BN_ULONG *ap, int num, BN_ULONG w);
203\& BN_ULONG bn_mul_add_words(BN_ULONG *rp, BN_ULONG *ap, int num,
204\& BN_ULONG w);
205\& void bn_sqr_words(BN_ULONG *rp, BN_ULONG *ap, int num);
206\& BN_ULONG bn_div_words(BN_ULONG h, BN_ULONG l, BN_ULONG d);
207\& BN_ULONG bn_add_words(BN_ULONG *rp, BN_ULONG *ap, BN_ULONG *bp,
208\& int num);
209\& BN_ULONG bn_sub_words(BN_ULONG *rp, BN_ULONG *ap, BN_ULONG *bp,
210\& int num);
211.Ve
212.Vb 4
213\& void bn_mul_comba4(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b);
214\& void bn_mul_comba8(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b);
215\& void bn_sqr_comba4(BN_ULONG *r, BN_ULONG *a);
216\& void bn_sqr_comba8(BN_ULONG *r, BN_ULONG *a);
217.Ve
218.Vb 1
219\& int bn_cmp_words(BN_ULONG *a, BN_ULONG *b, int n);
220.Ve
221.Vb 11
222\& void bn_mul_normal(BN_ULONG *r, BN_ULONG *a, int na, BN_ULONG *b,
223\& int nb);
224\& void bn_mul_low_normal(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n);
225\& void bn_mul_recursive(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n2,
226\& int dna,int dnb,BN_ULONG *tmp);
227\& void bn_mul_part_recursive(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b,
228\& int n, int tna,int tnb, BN_ULONG *tmp);
229\& void bn_mul_low_recursive(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b,
230\& int n2, BN_ULONG *tmp);
231\& void bn_mul_high(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, BN_ULONG *l,
232\& int n2, BN_ULONG *tmp);
233.Ve
234.Vb 2
235\& void bn_sqr_normal(BN_ULONG *r, BN_ULONG *a, int n, BN_ULONG *tmp);
236\& void bn_sqr_recursive(BN_ULONG *r, BN_ULONG *a, int n2, BN_ULONG *tmp);
237.Ve
238.Vb 3
239\& void mul(BN_ULONG r, BN_ULONG a, BN_ULONG w, BN_ULONG c);
240\& void mul_add(BN_ULONG r, BN_ULONG a, BN_ULONG w, BN_ULONG c);
241\& void sqr(BN_ULONG r0, BN_ULONG r1, BN_ULONG a);
242.Ve
243.Vb 4
244\& BIGNUM *bn_expand(BIGNUM *a, int bits);
245\& BIGNUM *bn_wexpand(BIGNUM *a, int n);
246\& BIGNUM *bn_expand2(BIGNUM *a, int n);
247\& void bn_fix_top(BIGNUM *a);
248.Ve
249.Vb 6
250\& void bn_check_top(BIGNUM *a);
251\& void bn_print(BIGNUM *a);
252\& void bn_dump(BN_ULONG *d, int n);
253\& void bn_set_max(BIGNUM *a);
254\& void bn_set_high(BIGNUM *r, BIGNUM *a, int n);
255\& void bn_set_low(BIGNUM *r, BIGNUM *a, int n);
256.Ve
257.SH "DESCRIPTION"
984263bc 258This page documents the internal functions used by the OpenSSL
74dab6c2 259\fBBIGNUM\fR implementation. They are described here to facilitate
984263bc
MD
260debugging and extending the library. They are \fInot\fR to be used by
261applications.
262.Sh "The \s-1BIGNUM\s0 structure"
74dab6c2 263.PP
984263bc
MD
264.Vb 7
265\& typedef struct bignum_st
266\& {
267\& int top; /* index of last used d (most significant word) */
268\& BN_ULONG *d; /* pointer to an array of 'BITS2' bit chunks */
269\& int max; /* size of the d array */
270\& int neg; /* sign */
271\& } BIGNUM;
272.Ve
273The big number is stored in \fBd\fR, a \fImalloc()\fRed array of \fB\s-1BN_ULONG\s0\fRs,
274least significant first. A \fB\s-1BN_ULONG\s0\fR can be either 16, 32 or 64 bits
74dab6c2
JR
275in size (\fB\s-1BITS2\s0\fR), depending on the \*(L'number of bits\*(R' specified in
276\f(CWopenssl/bn.h\fR.
984263bc 277.PP
74dab6c2
JR
278\fBmax\fR is the size of the \fBd\fR array that has been allocated. \fBtop\fR
279is the \*(L'last\*(R' entry being used, so for a value of 4, bn.d[0]=4 and
984263bc 280bn.top=1. \fBneg\fR is 1 if the number is negative. When a \fB\s-1BIGNUM\s0\fR is
74dab6c2 281\fB0\fR, the \fBd\fR field can be \fB\s-1NULL\s0\fR and \fBtop\fR == \fB0\fR.
984263bc
MD
282.PP
283Various routines in this library require the use of temporary
74dab6c2 284\fB\s-1BIGNUM\s0\fR variables during their execution. Since dynamic memory
984263bc
MD
285allocation to create \fB\s-1BIGNUM\s0\fRs is rather expensive when used in
286conjunction with repeated subroutine calls, the \fB\s-1BN_CTX\s0\fR structure is
287used. This structure contains \fB\s-1BN_CTX_NUM\s0\fR \fB\s-1BIGNUM\s0\fRs, see
288BN_CTX_start(3).
289.Sh "Low-level arithmetic operations"
984263bc
MD
290These functions are implemented in C and for several platforms in
291assembly language:
292.PP
74dab6c2 293\fIbn_mul_words\fR\|(\fBrp\fR, \fBap\fR, \fBnum\fR, \fBw\fR) operates on the \fBnum\fR word
984263bc
MD
294arrays \fBrp\fR and \fBap\fR. It computes \fBap\fR * \fBw\fR, places the result
295in \fBrp\fR, and returns the high word (carry).
296.PP
74dab6c2 297\fIbn_mul_add_words\fR\|(\fBrp\fR, \fBap\fR, \fBnum\fR, \fBw\fR) operates on the \fBnum\fR
984263bc
MD
298word arrays \fBrp\fR and \fBap\fR. It computes \fBap\fR * \fBw\fR + \fBrp\fR, places
299the result in \fBrp\fR, and returns the high word (carry).
300.PP
74dab6c2
JR
301\fIbn_sqr_words\fR\|(\fBrp\fR, \fBap\fR, \fBn\fR) operates on the \fBnum\fR word array
302\fBap\fR and the 2*\fBnum\fR word array \fBap\fR. It computes \fBap\fR * \fBap\fR
984263bc
MD
303word-wise, and places the low and high bytes of the result in \fBrp\fR.
304.PP
74dab6c2 305\fIbn_div_words\fR\|(\fBh\fR, \fBl\fR, \fBd\fR) divides the two word number (\fBh\fR,\fBl\fR)
984263bc
MD
306by \fBd\fR and returns the result.
307.PP
74dab6c2 308\fIbn_add_words\fR\|(\fBrp\fR, \fBap\fR, \fBbp\fR, \fBnum\fR) operates on the \fBnum\fR word
984263bc
MD
309arrays \fBap\fR, \fBbp\fR and \fBrp\fR. It computes \fBap\fR + \fBbp\fR, places the
310result in \fBrp\fR, and returns the high word (carry).
311.PP
74dab6c2 312\fIbn_sub_words\fR\|(\fBrp\fR, \fBap\fR, \fBbp\fR, \fBnum\fR) operates on the \fBnum\fR word
984263bc
MD
313arrays \fBap\fR, \fBbp\fR and \fBrp\fR. It computes \fBap\fR \- \fBbp\fR, places the
314result in \fBrp\fR, and returns the carry (1 if \fBbp\fR > \fBap\fR, 0
315otherwise).
316.PP
74dab6c2
JR
317\fIbn_mul_comba4\fR\|(\fBr\fR, \fBa\fR, \fBb\fR) operates on the 4 word arrays \fBa\fR and
318\fBb\fR and the 8 word array \fBr\fR. It computes \fBa\fR*\fBb\fR and places the
984263bc
MD
319result in \fBr\fR.
320.PP
74dab6c2
JR
321\fIbn_mul_comba8\fR\|(\fBr\fR, \fBa\fR, \fBb\fR) operates on the 8 word arrays \fBa\fR and
322\fBb\fR and the 16 word array \fBr\fR. It computes \fBa\fR*\fBb\fR and places the
984263bc
MD
323result in \fBr\fR.
324.PP
74dab6c2
JR
325\fIbn_sqr_comba4\fR\|(\fBr\fR, \fBa\fR, \fBb\fR) operates on the 4 word arrays \fBa\fR and
326\fBb\fR and the 8 word array \fBr\fR.
984263bc 327.PP
74dab6c2
JR
328\fIbn_sqr_comba8\fR\|(\fBr\fR, \fBa\fR, \fBb\fR) operates on the 8 word arrays \fBa\fR and
329\fBb\fR and the 16 word array \fBr\fR.
984263bc
MD
330.PP
331The following functions are implemented in C:
332.PP
74dab6c2 333\fIbn_cmp_words\fR\|(\fBa\fR, \fBb\fR, \fBn\fR) operates on the \fBn\fR word arrays \fBa\fR
984263bc
MD
334and \fBb\fR. It returns 1, 0 and \-1 if \fBa\fR is greater than, equal and
335less than \fBb\fR.
336.PP
74dab6c2 337\fIbn_mul_normal\fR\|(\fBr\fR, \fBa\fR, \fBna\fR, \fBb\fR, \fBnb\fR) operates on the \fBna\fR
984263bc
MD
338word array \fBa\fR, the \fBnb\fR word array \fBb\fR and the \fBna\fR+\fBnb\fR word
339array \fBr\fR. It computes \fBa\fR*\fBb\fR and places the result in \fBr\fR.
340.PP
74dab6c2 341\fIbn_mul_low_normal\fR\|(\fBr\fR, \fBa\fR, \fBb\fR, \fBn\fR) operates on the \fBn\fR word
984263bc 342arrays \fBr\fR, \fBa\fR and \fBb\fR. It computes the \fBn\fR low words of
74dab6c2 343\fBa\fR*\fBb\fR and places the result in \fBr\fR.
984263bc 344.PP
74dab6c2 345\fIbn_mul_recursive\fR\|(\fBr\fR, \fBa\fR, \fBb\fR, \fBn2\fR, \fBdna\fR, \fBdnb\fR, \fBt\fR) operates
984263bc
MD
346on the word arrays \fBa\fR and \fBb\fR of length \fBn2\fR+\fBdna\fR and \fBn2\fR+\fBdnb\fR
347(\fBdna\fR and \fBdnb\fR are currently allowed to be 0 or negative) and the 2*\fBn2\fR
348word arrays \fBr\fR and \fBt\fR. \fBn2\fR must be a power of 2. It computes
74dab6c2 349\fBa\fR*\fBb\fR and places the result in \fBr\fR.
984263bc 350.PP
74dab6c2 351\fIbn_mul_part_recursive\fR\|(\fBr\fR, \fBa\fR, \fBb\fR, \fBn\fR, \fBtna\fR, \fBtnb\fR, \fBtmp\fR)
984263bc 352operates on the word arrays \fBa\fR and \fBb\fR of length \fBn\fR+\fBtna\fR and
74dab6c2 353\fBn\fR+\fBtnb\fR and the 4*\fBn\fR word arrays \fBr\fR and \fBtmp\fR.
984263bc 354.PP
74dab6c2
JR
355\fIbn_mul_low_recursive\fR\|(\fBr\fR, \fBa\fR, \fBb\fR, \fBn2\fR, \fBtmp\fR) operates on the
356\fBn2\fR word arrays \fBr\fR and \fBtmp\fR and the \fBn2\fR/2 word arrays \fBa\fR
984263bc
MD
357and \fBb\fR.
358.PP
74dab6c2
JR
359\fIbn_mul_high\fR\|(\fBr\fR, \fBa\fR, \fBb\fR, \fBl\fR, \fBn2\fR, \fBtmp\fR) operates on the
360\fBn2\fR word arrays \fBr\fR, \fBa\fR, \fBb\fR and \fBl\fR (?) and the 3*\fBn2\fR word
984263bc
MD
361array \fBtmp\fR.
362.PP
74dab6c2 363\fIBN_mul()\fR calls \fIbn_mul_normal()\fR, or an optimized implementation if the
984263bc
MD
364factors have the same size: \fIbn_mul_comba8()\fR is used if they are 8
365words long, \fIbn_mul_recursive()\fR if they are larger than
74dab6c2 366\fB\s-1BN_MULL_SIZE_NORMAL\s0\fR and the size is an exact multiple of the word
984263bc 367size, and \fIbn_mul_part_recursive()\fR for others that are larger than
74dab6c2 368\fB\s-1BN_MULL_SIZE_NORMAL\s0\fR.
984263bc 369.PP
74dab6c2
JR
370\fIbn_sqr_normal\fR\|(\fBr\fR, \fBa\fR, \fBn\fR, \fBtmp\fR) operates on the \fBn\fR word array
371\fBa\fR and the 2*\fBn\fR word arrays \fBtmp\fR and \fBr\fR.
984263bc
MD
372.PP
373The implementations use the following macros which, depending on the
374architecture, may use \*(L"long long\*(R" C operations or inline assembler.
74dab6c2 375They are defined in \f(CWbn_lcl.h\fR.
984263bc 376.PP
74dab6c2 377\fImul\fR\|(\fBr\fR, \fBa\fR, \fBw\fR, \fBc\fR) computes \fBw\fR*\fBa\fR+\fBc\fR and places the
984263bc
MD
378low word of the result in \fBr\fR and the high word in \fBc\fR.
379.PP
74dab6c2 380\fImul_add\fR\|(\fBr\fR, \fBa\fR, \fBw\fR, \fBc\fR) computes \fBw\fR*\fBa\fR+\fBr\fR+\fBc\fR and
984263bc
MD
381places the low word of the result in \fBr\fR and the high word in \fBc\fR.
382.PP
74dab6c2 383\fIsqr\fR\|(\fBr0\fR, \fBr1\fR, \fBa\fR) computes \fBa\fR*\fBa\fR and places the low word
984263bc
MD
384of the result in \fBr0\fR and the high word in \fBr1\fR.
385.Sh "Size changes"
74dab6c2 386\fIbn_expand()\fR ensures that \fBb\fR has enough space for a \fBbits\fR bit
984263bc 387number. \fIbn_wexpand()\fR ensures that \fBb\fR has enough space for an
74dab6c2 388\fBn\fR word number. If the number has to be expanded, both macros
984263bc
MD
389call \fIbn_expand2()\fR, which allocates a new \fBd\fR array and copies the
390data. They return \fB\s-1NULL\s0\fR on error, \fBb\fR otherwise.
391.PP
392The \fIbn_fix_top()\fR macro reduces \fBa->top\fR to point to the most
393significant non-zero word when \fBa\fR has shrunk.
394.Sh "Debugging"
74dab6c2
JR
395\fIbn_check_top()\fR verifies that \f(CW((a)->top >= 0 && (a)->top
396<= (a)->max)\fR. A violation will cause the program to abort.
984263bc 397.PP
74dab6c2 398\fIbn_print()\fR prints \fBa\fR to stderr. \fIbn_dump()\fR prints \fBn\fR words at \fBd\fR
984263bc
MD
399(in reverse order, i.e. most significant word first) to stderr.
400.PP
74dab6c2 401\fIbn_set_max()\fR makes \fBa\fR a static number with a \fBmax\fR of its current size.
984263bc 402This is used by \fIbn_set_low()\fR and \fIbn_set_high()\fR to make \fBr\fR a read-only
74dab6c2 403\fB\s-1BIGNUM\s0\fR that contains the \fBn\fR low or high words of \fBa\fR.
984263bc
MD
404.PP
405If \fB\s-1BN_DEBUG\s0\fR is not defined, \fIbn_check_top()\fR, \fIbn_print()\fR, \fIbn_dump()\fR
406and \fIbn_set_max()\fR are defined as empty macros.
407.SH "SEE ALSO"
984263bc 408bn(3)
74dab6c2
JR
409
410.rn }` ''
411.IX Title "bn_internal 3"
412.IX Name "bn_mul_words, bn_mul_add_words, bn_sqr_words, bn_div_words,
413bn_add_words, bn_sub_words, bn_mul_comba4, bn_mul_comba8,
414bn_sqr_comba4, bn_sqr_comba8, bn_cmp_words, bn_mul_normal,
415bn_mul_low_normal, bn_mul_recursive, bn_mul_part_recursive,
416bn_mul_low_recursive, bn_mul_high, bn_sqr_normal, bn_sqr_recursive,
417bn_expand, bn_wexpand, bn_expand2, bn_fix_top, bn_check_top,
418bn_print, bn_dump, bn_set_max, bn_set_high, bn_set_low - BIGNUM
419library internal functions"
420
421.IX Header "NAME"
422
423.IX Header "SYNOPSIS"
424
425.IX Header "DESCRIPTION"
426
427.IX Subsection "The \s-1BIGNUM\s0 structure"
428
429.IX Subsection "Low-level arithmetic operations"
430
431.IX Subsection "Size changes"
432
433.IX Subsection "Debugging"
434
435.IX Header "SEE ALSO"
436