X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=sys%2Fman%2F2%2Fmp;h=ed757d8f9f5cb58b8143b5ae56d7b2aa750355f5;hb=d74fdfc022acde11b522fcc77beed10880784cbc;hp=d2ebe342af5026c51bd06b90f2f6f230a0596530;hpb=aac6784fce5f1814150ea501c24f1fefce1fce12;p=plan9front.git diff --git a/sys/man/2/mp b/sys/man/2/mp index d2ebe342a..ed757d8f9 100644 --- a/sys/man/2/mp +++ b/sys/man/2/mp @@ -1,6 +1,6 @@ .TH MP 2 .SH NAME -mpsetminbits, mpnew, mpfree, mpbits, mpnorm, mpcopy, mpassign, mprand, strtomp, mpfmt,mptoa, betomp, mptobe, letomp, mptole, mptoui, uitomp, mptoi, itomp, uvtomp, mptouv, vtomp, mptov, mpdigdiv, mpadd, mpsub, mpleft, mpright, mpmul, mpexp, mpmod, mpdiv, mpcmp, mpextendedgcd, mpinvert, mpsignif, mplowbits0, mpvecdigmuladd, mpvecdigmulsub, mpvecadd, mpvecsub, mpveccmp, mpvecmul, mpmagcmp, mpmagadd, mpmagsub, crtpre, crtin, crtout, crtprefree, crtresfree \- extended precision arithmetic +mpsetminbits, mpnew, mpfree, mpbits, mpnorm, mpcopy, mpassign, mprand, mpnrand, strtomp, mpfmt,mptoa, betomp, mptobe, mptober, letomp, mptole, mptolel, mptoui, uitomp, mptoi, itomp, uvtomp, mptouv, vtomp, mptov, mptod, dtomp, mpdigdiv, mpadd, mpsub, mpleft, mpright, mpmul, mpexp, mpmod, mpmodadd, mpmodsub, mpmodmul, mpdiv, mpcmp, mpsel, mpextendedgcd, mpinvert, mpsignif, mplowbits0, mpvecdigmuladd, mpvecdigmulsub, mpvecadd, mpvecsub, mpveccmp, mpvecmul, mpmagcmp, mpmagadd, mpmagsub, crtpre, crtin, crtout, crtprefree, crtresfree \- extended precision arithmetic .SH SYNOPSIS .B #include .br @@ -22,7 +22,7 @@ void mpsetminbits(int n) void mpbits(mpint *b, int n) .PP .B -void mpnorm(mpint *b) +mpint* mpnorm(mpint *b) .PP .B mpint* mpcopy(mpint *b) @@ -34,6 +34,9 @@ void mpassign(mpint *old, mpint *new) mpint* mprand(int bits, void (*gen)(uchar*, int), mpint *b) .PP .B +mpint* mpnrand(mpint *n, void (*gen)(uchar*, int), mpint *b) +.PP +.B mpint* strtomp(char *buf, char **rptr, int base, mpint *b) .PP .B @@ -49,12 +52,18 @@ mpint* betomp(uchar *buf, uint blen, mpint *b) int mptobe(mpint *b, uchar *buf, uint blen, uchar **bufp) .PP .B +void mptober(mpint *b, uchar *buf, int blen) +.PP +.B mpint* letomp(uchar *buf, uint blen, mpint *b) .PP .B int mptole(mpint *b, uchar *buf, uint blen, uchar **bufp) .PP .B +void mptolel(mpint *b, uchar *buf, int blen) +.PP +.B uint mptoui(mpint*) .PP .B @@ -79,6 +88,12 @@ mpint* uvtomp(uvlong, mpint*) uvlong mptouv(mpint*) .PP .B +mpint* dtomp(double, mpint*) +.PP +.B +double mptod(mpint*) +.PP +.B void mpadd(mpint *b1, mpint *b2, mpint *sum) .PP .B @@ -97,6 +112,30 @@ void mpleft(mpint *b, int shift, mpint *res) void mpright(mpint *b, int shift, mpint *res) .PP .B +void mpand(mpint *b1, mpint *b2, mpint *res) +.PP +.B +void mpbic(mpint *b1, mpint *b2, mpint *res) +.PP +.B +void mpor(mpint *b1, mpint *b2, mpint *res) +.PP +.B +void mpnot(mpint *b, mpint *res) +.PP +.B +void mpxor(mpint *b1, mpint *b2, mpint *res) +.PP +.B +void mptrunc(mpint *b, int n, mpint *res) +.PP +.B +void mpxtend(mpint *b, int n, mpint *res) +.PP +.B +void mpasr(mpint *b, int n, mpint *res) +.PP +.B void mpmul(mpint *b1, mpint *b2, mpint *prod) .PP .B @@ -112,12 +151,24 @@ void mpdiv(mpint *dividend, mpint *divisor, mpint *quotient, mpint *remainder) .PP .B +void mpmodadd(mpint *b1, mpint *b2, mpint *m, mpint *sum) +.PP +.B +void mpmodsub(mpint *b1, mpint *b2, mpint *m, mpint *diff) +.PP +.B +void mpmodmul(mpint *b1, mpint *b2, mpint *m, mpint *prod) +.PP +.B int mpcmp(mpint *b1, mpint *b2) .PP .B int mpmagcmp(mpint *b1, mpint *b2) .PP .B +void mpsel(int s, mpint *b1, mpint *b2, mpint *res) +.PP +.B void mpextendedgcd(mpint *a, mpint *b, mpint *d, mpint *x, .br .B @@ -226,8 +277,9 @@ This includes .IR strtomp , .IR itomp , .IR uitomp , +.IR btomp , and -.IR btomp . +.IR dtomp . These functions, in addition to .I mpnew and @@ -300,6 +352,14 @@ bit random number using the generator takes a pointer to a string of uchar's and the number to fill in. .PP +.I Mpnrand +uses +.I gen +to generate a uniform random number +.IR x , +.if t 0 ≤ \fIx\fR < \fIn\fR. +.if n 0 ≤ x < n. +.PP .I Strtomp and .I mptoa @@ -308,13 +368,22 @@ convert between and .B mpint representations using the base indicated. -Only the bases 10, 16, 32, and 64 are -supported. Anything else defaults to 16. +Only the bases 2, 4, 8, 10, 16, 32, and 64 are +supported. Base 0 defaults to 16. .IR Strtomp skips any leading spaces or tabs. .IR Strtomp 's scan stops when encountering a digit not valid in the base. If +.I base +is zero then C-style prefixes are interpreted to +find the base: +.B 0x +for hexadecimal, +.B 0b +for binary and +.B 0 +for octal. Otherwise decimal is assumed. .I rptr is not zero, .I *rptr @@ -372,6 +441,24 @@ deposited in the location pointed to by Sign is ignored in these conversions, i.e., the byte array version is always positive. .PP +.I Mptober +and +.I mptolel +fill +.I blen +lower bytes of an +.I mpint +into a fixed length byte array. +.I Mptober +fills the bytes right adjusted in big endian order so that the least +significant byte is at +.I buf[blen-1] +while +.I mptolel +fills in little endian order; left adjusted; so that the least +significat byte is filled into +.IR buf[0] . +.PP .IR Betomp , and .I letomp @@ -394,7 +481,7 @@ is .BR nil , a new integer is allocated and returned as the result. .PP -The integer conversions are: +The integer (and floating point) conversions are: .TF Mptouv .TP .I mptoui @@ -420,12 +507,23 @@ The integer conversions are: .TP .I vtomp .BR "vlong" -> mpint +.TP +.I mptod +.BR mpint -> "double" +.TP +.I dtomp +.BR "double" -> mpint .PD .PP When converting to the base integer types, if the integer is too large, the largest integer of the appropriate sign and size is returned. .PP +When converting to and from floating point, results are rounded using IEEE 754 "round to nearest". +If the integer is too large in magnitude, +.I mptod +returns infinity of the appropriate sign. +.PP The mathematical functions are: .TF mpmagadd .TP @@ -475,6 +573,73 @@ is less than, equal to, or greater than the same as .I mpcmp but ignores the sign and just compares magnitudes. +.TP +.I mpsel +assigns +.I b1 +to +.I res +when +.I s +is not zero, otherwise +.I b2 +is assigned to +.IR res . +.PD +.PP +Logical operations (treating negative numbers using two's complement): +.TF mpxtend_ +.TP +.I mpand +.BR "res = b1 & b2" . +.TP +.I mpbic +.BR "res = b1 & ~b2" . +.TP +.I mpor +.BR "res = b1 | b2" . +.TP +.I mpxor +.BR "res = b1 ^ b2" . +.TP +.I mpnot +.BR "res = ~b1" . +.TP +.I mpasr +.BR "res = b>>shift" +(\fImpasr\fR, unlike +.IR mpright , +uses two's complement). +.TP +.I mptrunc +truncates +.I b +to +.I n +bits and stores the result in +.IR res . +The result is never negative. +.TP +.I mpxtend +truncates +.I b +to +.I n +bits, sign extends the MSB and stores the result in +.IR res . +.PD +.PP +Modular arithmetic: +.TF mpmodmul_ +.TP +.I mpmodadd +.BR "sum = b1+b2 mod m" . +.TP +.I mpmodsub +.BR "diff = b1-b2 mod m" . +.TP +.I mpmodmul +.BR "prod = b1*b2 mod m" . .PD .PP .I Mpextendedgcd @@ -553,8 +718,8 @@ We assume p has room for n+1 digits. It returns +1 is the result is positive an -1 if negative. .TP .I mpvecmul -.BR "p[0:alen*blen] = a[0:alen-1] * b[0:blen-1]" . -We assume that p has room for alen*blen+1 digits. +.BR "p[0:alen+blen] = a[0:alen-1] * b[0:blen-1]" . +We assume that p has room for alen+blen+1 digits. .TP .I mpveccmp This returns -1, 0, or +1 as a - b is negative, 0, or positive. @@ -565,6 +730,17 @@ This returns -1, 0, or +1 as a - b is negative, 0, or positive. and .I mpzero are the constants 2, 1 and 0. These cannot be freed. +.SS "Time invariant computation" +.PP +In the field of cryptography, it is sometimes neccesary to implement +algorithms such that the runtime of the algorithm is not depdenent on +the input data. This library provides partial support for time +invariant computation with the +.I MPtimesafe +flag that can be set on input or destination operands to request timing +safe operation. The result of a timing safe operation will also have the +.I MPtimesafe +flag set and is not normalized. .SS "Chinese remainder theorem .PP When computing in a non-prime modulus,