diff --git a/include/cryb/mpi.h b/include/cryb/mpi.h index 84c7bf3..863e413 100644 --- a/include/cryb/mpi.h +++ b/include/cryb/mpi.h @@ -49,7 +49,9 @@ const char *cryb_mpi_version(void); #define mpi_grow cryb_mpi_grow #define mpi_init cryb_mpi_init #define mpi_load cryb_mpi_load +#define mpi_lsb cryb_mpi_lsb #define mpi_lshift cryb_mpi_lshift +#define mpi_msb cryb_mpi_msb #define mpi_negate cryb_mpi_negate #define mpi_rshift cryb_mpi_rshift #define mpi_set cryb_mpi_set @@ -80,6 +82,8 @@ int mpi_copy(cryb_mpi *, const cryb_mpi *); void mpi_swap(cryb_mpi *, cryb_mpi *); int mpi_load(cryb_mpi *, const uint8_t *, size_t); int mpi_set(cryb_mpi *, int32_t); +unsigned int mpi_lsb(const cryb_mpi *); +unsigned int mpi_msb(const cryb_mpi *); int mpi_lshift(cryb_mpi *, unsigned int); int mpi_rshift(cryb_mpi *, unsigned int); int mpi_add_abs(cryb_mpi *, const cryb_mpi *, const cryb_mpi *); diff --git a/lib/mpi/Makefile.am b/lib/mpi/Makefile.am index d6dfb13..c645d86 100644 --- a/lib/mpi/Makefile.am +++ b/lib/mpi/Makefile.am @@ -14,7 +14,9 @@ libcryb_mpi_la_SOURCES = \ cryb_mpi_grow.c \ cryb_mpi_init.c \ cryb_mpi_load.c \ + cryb_mpi_lsb.c \ cryb_mpi_lshift.c \ + cryb_mpi_msb.c \ cryb_mpi_negate.c \ cryb_mpi_rshift.c \ cryb_mpi_set.c \ diff --git a/lib/mpi/cryb_mpi_lsb.c b/lib/mpi/cryb_mpi_lsb.c new file mode 100644 index 0000000..13f94e4 --- /dev/null +++ b/lib/mpi/cryb_mpi_lsb.c @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2017 Dag-Erling Smørgrav + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "cryb/impl.h" + +#include +#include + +#include + +#include "cryb_mpi_impl.h" + +/* + * Return the 1-based index of the least significant bit of X + */ +unsigned int +mpi_lsb(const cryb_mpi *X) +{ + unsigned int lsw, lsb; + + if (X->msb == 0) + return (0); + for (lsw = 0; X->words[lsw] == 0; ++lsw) + /* nothing */ ; + for (lsb = 0; (X->words[lsw] & (1 << lsb)) == 0; ++lsb) + /* nothing */ ; + return (lsw * 32 + lsb + 1); +} diff --git a/lib/mpi/cryb_mpi_msb.c b/lib/mpi/cryb_mpi_msb.c new file mode 100644 index 0000000..72a91e4 --- /dev/null +++ b/lib/mpi/cryb_mpi_msb.c @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2017 Dag-Erling Smørgrav + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "cryb/impl.h" + +#include +#include + +#include + +#include "cryb_mpi_impl.h" + +/* + * Return the 1-based index of the most significant bit of X + */ +unsigned int +mpi_msb(const cryb_mpi *X) +{ + + return (X->msb); +}