http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto-c/blob/8d28d2c3/Makefile.docker ---------------------------------------------------------------------- diff --git a/Makefile.docker b/Makefile.docker new file mode 100644 index 0000000..4ffebbd --- /dev/null +++ b/Makefile.docker @@ -0,0 +1,43 @@ +# The name for the docker builder image +BUILDER_CONTAINER_NAME="milagro-crypto/amcl-builder" + +# Coverage info +COVERAGE_INFO=target/LINUX_64BIT_COVERAGE/coverage/amcl.info + +define make + rm -rf target + docker create \ + --env WINEPREFIX=/tmp/.wine \ + --name builder \ + --workdir /src \ + $(BUILDER_CONTAINER_NAME) sh -c "mkdir -p /tmp/.wine && make $1" + docker cp . builder:/src + -docker start -ai builder; \ + echo $$? > buildall.exit + docker cp builder:/src/target . + docker stop builder + docker rm builder + @# Workaround: Correct path for coverage src files + ls ${COVERAGE_INFO} && sed -i -e "s#^SF:/src\(.*\)#SF:${PWD}\1#g" ${COVERAGE_INFO} || echo "Skipping coverage info" + @mv buildall.exit target + @exit `cat target/buildall.exit` +endef + +all: builder + +builder: + docker build -t $(BUILDER_CONTAINER_NAME) . + + +# --- MAKE TARGETS DOCKER WRAPPERS --- + +default: + $(call make,default) +qa: + $(call make,qa) +build: + $(call make,build TYPE=$(TYPE)) +buildall: + $(call make,buildall) + +.PHONY: all builder default qa build buildall
http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto-c/blob/8d28d2c3/README.md ---------------------------------------------------------------------- diff --git a/README.md b/README.md index 3e3fa48..37215a4 100644 --- a/README.md +++ b/README.md @@ -1 +1,210 @@ # AMCL - *Apache Milagro Crypto Library* + +[](https://github.com/milagro-crypto/milagro-crypto-c/tree/master) +[](https://travis-ci.org/milagro-crypto/milagro-crypto-c) +[](https://coveralls.io/github/milagro-crypto/milagro-crypto-c?branch=master) + +* **category**: Library +* **copyright**: 2018 The Apache Software Foundation +* **license**: ASL 2.0 ([Apache License Version 2.0, January 2004](http://www.apache.org/licenses/LICENSE-2.0)) +* **link**: https://github.com/milagro-crypto/milagro-crypto-c +* **introduction**: [AMCL.pdf](doc/AMCL.pdf) + + +## Description + +*AMCL - Apache Milagro Crypto Library* + +AMCL is a standards compliant C cryptographic library with no external dependencies, specifically designed to support the Internet of Things (IoT). + +For a detailed explanation about this library please read: [doc/AMCL.pdf](doc/AMCL.pdf) + +AMCL is provided in *C* language but includes a *[Python](https://www.python.org)* wrapper for some modules to aid development work. + +NOTE: This product includes software developed at *[The Apache Software Foundation](http://www.apache.org/)*. + +## Software Dependencies + +In order to build this library, the following packages are required: + +* [CMake](https://cmake.org/) is required to build the source code. +* [CFFI](https://cffi.readthedocs.org/en/release-0.8/), the C Foreign Function Interface for Python is required in order to execute tests. +* [Doxygen](http://doxygen.org) is required to build the source code documentation. +* [Python](https://www.python.org/) language is required to build the Python language wrapper. + + +The above packages can be installed in different ways, depending on the Operating System used: + +* **Debian/Ubuntu Linux** + + + sudo apt-get install -y git cmake build-essential python python-dev python-pip libffi-dev doxygen doxygen-latex parallel + sudo pip install cffi + + +* **RedHat/CentOS/Fedora Linux** + + + sudo yum groupinstall "Development Tools" "Development Libraries" + sudo yum install -y git cmake python libpython-devel python-pip libffi-devel doxygen doxygen-latex parallel + sudo pip install cffi + + +* **MacOS** + + + ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" + brew install cmake + brew install pkg-config libffi + sudo pip install cffi + brew install doxygen + brew install parallel + + +* **Windows** + * Minimalist GNU for Windows [MinGW](http://www.mingw.org) provides the tool set used to build the library and should be installed + * When the MinGW installer starts select the **mingw32-base** and **mingw32-gcc-g++** components + * From the menu select *"Installation"* → *"Apply Changes"*, then click *"Apply"* + * Finally add *C:\MinGW\bin* to the PATH variable + * pip install cffi + * install CMake following the instructions on http://www.cmake.org + * install Doxygen following the instructions on http://www.doxygen.org + + +## Build Instructions + +#### Linux and Mac + +##### Quick start + +A Makefile is present at the project root that reads the options defined in +config.mk. Change these options and then type the following to build and test +the library. + + make + +##### Multiple curves and RSA security levels + +The default build (see config.mk) uses multiple curves and RSA security +levels. There is an example called testall.c in the examples directory that +shows how to write a program to use the different curves etc in a single +program. To build and run the example use this script; + + buildMulti.sh + +##### Manual build + +NOTE: The default build is for 64 bit machines + + git clone https://github.com/milagro-crypto/milagro-crypto-c + cd milagro-crypto-c + mkdir -p target/build + cd target/build + cmake -D CMAKE_INSTALL_PREFIX=/opt/amcl ../.. + export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./ + make + make test + make doc + sudo make install + +On Debian/Ubuntu machine instead of executing the *"sudo make install"* command it is possible to execute *"sudo checkinstall"* to build and install a DEB package. + +Now you can set the path to where libs and python package are installed: + + export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./:/opt/amcl/lib + export PYTHONPATH=/usr/lib/python2.7/dist-packages + +NOTE: The build can be configured by setting flags on the command line, for example: + + cmake -DAMCL_CHUNK=64 ../.. + cmake -D CMAKE_INSTALL_PREFIX=/opt/amcl -D AMCL_CHUNK=64 -D BUILD_WCC=on ../.. + +It is possible also to build the library supporting more than one elliptic curve and more than one RSA security level, for example + + cmake -DAMCL_CURVE=BN254CX,NIST254 -DAMCL_RSA=2048,3072 ../.. + +To list other available CMake options, use: + + cmake -LH + +##### Uninstall software + + sudo make uninstall + +##### Building an installer + +After having built the libraries you can build a binary installer and a source distribution by running this command + + make package + + +#### Windows + +Start a command prompt as an administrator + + git clone https://github.com/milagro-crypto/milagro-crypto-c + cd milagro-crypto-c + mkdir target\build + cd target\build + cmake -G "MinGW Makefiles" ..\.. + mingw32-make + mingw32-make test + mingw32-make doc + mingw32-make install + +Post install append the PATH system variable to point to the install ./lib: + +*My Computer -> Properties -> Advanced > Environment Variables* + +The build can be configured using by setting flags on the command line i.e. + + cmake -G "MinGW Makefiles" -D BUILD_PYTHON=on .. + +##### Uninstall software + + mingw32-make uninstall + +##### Building an installer + +After having built the libraries you can build a Windows installer using this command + + sudo mingw32-make package + +In order for this to work NSSI has to have been installed + +## Contributions + +This project includes a Makefile that allows you to test and build the project in a Linux-compatible system with simple commands. +All the artifacts and reports produced using this Makefile are stored in the *target* folder. + +All the packages listed in the *Dockerfile* are required in order to build and test all the library options in the current environment. Alternatively, everything can be built inside a [Docker](https://www.docker.com) container using the command "make -f Makefile.docker buildall". + +To see all available options: +``` +make help +``` + +To build the builder Docker image: +``` +make -f Makefile.docker +``` + +To build the project inside a Docker container (requires Docker) you need to build a builder image (once), and then build the project in its context: +``` +make -f Makefile.docker buildall +``` + +To build a particular set of predefined makefile options inside a Docker container: +``` +make -f Makefile.docker build TYPE=LINUX_64BIT_NIST256_RSA2048 +``` + +To execute all the test builds and generate reports in the current environment: +``` +make qa +``` + +To format the code (please use this command before submitting any pull request): +``` +make format +``` http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto-c/blob/8d28d2c3/RELEASE ---------------------------------------------------------------------- diff --git a/RELEASE b/RELEASE new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/RELEASE @@ -0,0 +1 @@ +1 http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto-c/blob/8d28d2c3/VERSION ---------------------------------------------------------------------- diff --git a/VERSION b/VERSION new file mode 100644 index 0000000..f1cd7de --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +4.12.2 http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto-c/blob/8d28d2c3/amcl.pc.in ---------------------------------------------------------------------- diff --git a/amcl.pc.in b/amcl.pc.in new file mode 100644 index 0000000..7b17086 --- /dev/null +++ b/amcl.pc.in @@ -0,0 +1,10 @@ +prefix="@CMAKE_INSTALL_PREFIX@" +exec_prefix=${prefix} +libdir=${exec_prefix}/@CMAKE_INSTALL_LIBDIR@ +includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@ + +Name: amcl +Description: AMCL is a standards compliant C cryptographic library designed to support the Internet of Things (IoT). +Version: @AMCL_VERSION@ +Libs: -L${libdir} @AMCL_PRIVATE_LIBS@ +Cflags: -I${includedir} http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto-c/blob/8d28d2c3/benchmark/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/benchmark/CMakeLists.txt b/benchmark/CMakeLists.txt new file mode 100644 index 0000000..b1e7c37 --- /dev/null +++ b/benchmark/CMakeLists.txt @@ -0,0 +1,52 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +cmake_minimum_required(VERSION 3.1 FATAL_ERROR) + +foreach(curve ${AMCL_CURVE}) + amcl_curve_field(PF "${curve}") + amcl_curve_field(TC "${curve}") + amcl_curve_field(CS "${curve}") + + # Curve Benchmark + amcl_configure_file_curve(benchtest_ec_ZZZ.c.in benchtest_ec_${TC}.c "${curve}" benchtest_ec_${TC}_GEN_SRCS) + add_executable(benchtest_ec_${TC} ${benchtest_ec_${TC}_GEN_SRCS}) + target_link_libraries(benchtest_ec_${TC} PRIVATE amcl_curve_${TC}) + + # Pairing Benchmark + if(TARGET amcl_pairing_${TC}) + amcl_configure_file_curve(benchtest_pair_ZZZ.c.in benchtest_pair_${TC}.c "${curve}" benchtest_pair_${TC}_GEN_SRCS) + add_executable(benchtest_pair_${TC} ${benchtest_pair_${TC}_GEN_SRCS}) + target_link_libraries(benchtest_pair_${TC} PRIVATE amcl_pairing_${TC}) + endif() + + # MPIN Benchmark + if(TARGET amcl_mpin_${TC}) + amcl_configure_file_curve(benchtest_mpin_ZZZ.c.in benchtest_mpin_${TC}.c "${curve}" benchtest_mpin_${TC}_GEN_SRCS) + add_executable(benchtest_mpin_${TC} ${benchtest_mpin_${TC}_GEN_SRCS}) + target_link_libraries(benchtest_mpin_${TC} PRIVATE amcl_mpin_${TC}) + endif() + +endforeach() + +foreach(level ${AMCL_RSA}) + amcl_rsa_field(TFF "${level}") + + amcl_configure_file_rsa(benchtest_rsa_WWW.c.in benchtest_rsa_${TFF}.c "${level}" benchtest_rsa_${TFF}_GEN_SRCS) + add_executable(benchtest_rsa_${TFF} ${benchtest_rsa_${TFF}_GEN_SRCS}) + target_link_libraries(benchtest_rsa_${TFF} PRIVATE amcl_rsa_${TFF}) +endforeach() http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto-c/blob/8d28d2c3/benchmark/benchtest_ec_ZZZ.c.in ---------------------------------------------------------------------- diff --git a/benchmark/benchtest_ec_ZZZ.c.in b/benchmark/benchtest_ec_ZZZ.c.in new file mode 100644 index 0000000..acb3945 --- /dev/null +++ b/benchmark/benchtest_ec_ZZZ.c.in @@ -0,0 +1,116 @@ +/** + * @file test_mpin_sign.c + * @author Mike Scott + * @brief Test and benchmark elliptic curve + * + * LICENSE + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <time.h> +#include "ecp_ZZZ.h" + +#define MIN_TIME 10.0 +#define MIN_ITERS 10 + +int main() +{ + csprng RNG; +#if CURVETYPE_ZZZ!=MONTGOMERY + BIG_XXX y; +#endif + BIG_XXX s,r,x; + ECP_ZZZ P,G; + int i,iterations; + clock_t start; + double elapsed; + char pr[10]; + unsigned long ran; + + printf("\nBechmark test EC - "); + + printf("ZZZ Curve\n"); + +#if CURVETYPE_ZZZ==WEIERSTRASS + printf("Weierstrass parameterization\n"); +#endif +#if CURVETYPE_ZZZ==EDWARDS + printf("Edwards parameterization\n"); +#endif +#if CURVETYPE_ZZZ==MONTGOMERY + printf("Montgomery parameterization\n"); +#endif + +#if CHUNK==16 + printf("16-bit Build\n\n"); +#endif +#if CHUNK==32 + printf("32-bit Build\n\n"); +#endif +#if CHUNK==64 + printf("64-bit Build\n\n"); +#endif + + time((time_t *)&ran); + pr[0]=ran; + pr[1]=ran>>8; + pr[2]=ran>>16; + pr[3]=ran>>24; + for (i=4; i<10; i++) pr[i]=i; + RAND_seed(&RNG,10,pr); + + BIG_XXX_rcopy(x,CURVE_Gx_ZZZ); +#if CURVETYPE_ZZZ!=MONTGOMERY + BIG_XXX_rcopy(y,CURVE_Gy_ZZZ); + ECP_ZZZ_set(&G,x,y); +#else + ECP_ZZZ_set(&G,x); +#endif + + BIG_XXX_rcopy(r,CURVE_Order_ZZZ); + BIG_XXX_randomnum(s,r,&RNG); + ECP_ZZZ_copy(&P,&G); + ECP_ZZZ_mul(&P,r); + + if (!ECP_ZZZ_isinf(&P)) + { + printf("FAILURE - rG!=O\n"); + exit(EXIT_FAILURE); + } + + iterations=0; + start=clock(); + do + { + ECP_ZZZ_copy(&P,&G); + ECP_ZZZ_mul(&P,s); + + iterations++; + elapsed=(clock()-start)/(double)CLOCKS_PER_SEC; + } + while (elapsed<MIN_TIME || iterations<MIN_ITERS); + elapsed=1000.0*elapsed/iterations; + printf("EC mul - %8d iterations ",iterations); + printf(" %8.2lf ms per iteration\n",elapsed); + + printf("\nSUCCESS BENCHMARK TEST OF EC FUNCTIONS PASSED\n\n"); + exit(EXIT_SUCCESS); +} http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto-c/blob/8d28d2c3/benchmark/benchtest_mpin_ZZZ.c.in ---------------------------------------------------------------------- diff --git a/benchmark/benchtest_mpin_ZZZ.c.in b/benchmark/benchtest_mpin_ZZZ.c.in new file mode 100644 index 0000000..3d16459 --- /dev/null +++ b/benchmark/benchtest_mpin_ZZZ.c.in @@ -0,0 +1,255 @@ +/* +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +*/ + +/* Time MPIN Protocol */ + +#include <stdlib.h> +#include <string.h> +#include <time.h> +#include "config_curve_ZZZ.h" +#include "randapi.h" +#if CURVE_SECURITY_ZZZ == 128 +#include "mpin_ZZZ.h" +#elif CURVE_SECURITY_ZZZ == 192 +#include "mpin192_ZZZ.h" +#elif CURVE_SECURITY_ZZZ == 256 +#include "mpin256_ZZZ.h" +#endif + +#if CURVE_SECURITY_ZZZ == 128 +#define G2LEN 4*PFS_ZZZ +#elif CURVE_SECURITY_ZZZ == 192 +#define G2LEN 8*PFS_ZZZ +#elif CURVE_SECURITY_ZZZ == 256 +#define G2LEN 16*PFS_ZZZ +#endif +#define GTLEN 3*G2LEN + +#define MIN_TIME 10.0 +#define MIN_ITERS 10 + +int mpin(csprng *RNG) +{ + int pin,rtn; + int date=0; + char x[PGS_ZZZ],s[PGS_ZZZ],y[PGS_ZZZ],client_id[100],sst[G2LEN],token[2*PFS_ZZZ+1],sec[2*PFS_ZZZ+1],permit[2*PFS_ZZZ+1],xcid[2*PFS_ZZZ+1],xid[2*PFS_ZZZ+1],e[GTLEN],f[GTLEN]; + char hcid[PFS_ZZZ],hsid[PFS_ZZZ],hid[2*PFS_ZZZ+1],htid[2*PFS_ZZZ+1],h[PGS_ZZZ]; + char r[PGS_ZZZ],z[2*PFS_ZZZ+1],w[PGS_ZZZ],t[2*PFS_ZZZ+1]; + char g1[GTLEN],g2[GTLEN]; + char ck[AESKEY_ZZZ],sk[AESKEY_ZZZ]; + octet S= {0,sizeof(s),s}; + octet X= {0,sizeof(x),x}; + octet Y= {0,sizeof(y),y}; + octet H= {0,sizeof(h),h}; + octet CLIENT_ID= {0,sizeof(client_id),client_id}; + octet SST= {0,sizeof(sst),sst}; + octet TOKEN= {0,sizeof(token),token}; + octet SEC= {0,sizeof(sec),sec}; + octet PERMIT= {0,sizeof(permit),permit}; + octet xCID= {0,sizeof(xcid),xcid}; + octet xID= {0,sizeof(xid),xid}; + octet HCID= {0,sizeof(hcid),hcid}; + octet HSID= {0,sizeof(hsid),hsid}; + octet HID= {0,sizeof(hid),hid}; + octet HTID= {0,sizeof(htid),htid}; + octet E= {0,sizeof(e),e}; + octet F= {0,sizeof(f),f}; + octet R= {0,sizeof(r),r}; + octet Z= {0,sizeof(z),z}; + octet W= {0,sizeof(w),w}; + octet T= {0,sizeof(t),t}; + octet G1= {0,sizeof(g1),g1}; + octet G2= {0,sizeof(g2),g2}; + octet SK= {0,sizeof(sk),sk}; + octet CK= {0,sizeof(ck),ck}; + octet *pxID,*pxCID,*pHID,*pHTID,*pE,*pF,*pPERMIT,*prHID; + char idhex[100]; + + int iterations; + clock_t start; + double elapsed; + + /* Trusted Authority set-up */ + MPIN_ZZZ_RANDOM_GENERATE(RNG,&S); + printf("Master Secret= "); + OCT_output(&S); + + /* Create Client Identity */ + OCT_jstring(&CLIENT_ID,"[email protected]"); + HASH_ID(HASH_TYPE_ZZZ,&CLIENT_ID,&HCID); /* Either Client or TA calculates Hash(ID) - you decide! */ + + printf("Client ID Hash= "); + OCT_output(&HCID); + printf("\n"); + + OCT_toHex(&CLIENT_ID,idhex); + printf("Client ID= %s\n",idhex);// OCT_toHex(&CLIENT_ID); printf("\n"); + + /* Client and Server are issued secrets by DTA */ + MPIN_ZZZ_GET_SERVER_SECRET(&S,&SST); + printf("Server Secret= "); + OCT_output(&SST); + + MPIN_ZZZ_GET_CLIENT_SECRET(&S,&HCID,&TOKEN); + printf("Client Secret= "); + OCT_output(&TOKEN); + + /* Client extracts PIN from secret to create Token */ + pin=1234; + printf("Client extracts PIN= %d\n",pin); + MPIN_ZZZ_EXTRACT_PIN(HASH_TYPE_ZZZ,&CLIENT_ID,pin,&TOKEN); + printf("Client Token= "); + OCT_output(&TOKEN); + + MPIN_ZZZ_PRECOMPUTE(&TOKEN,&HCID,NULL,&G1,&G2); + + /* MPin Protocol */ + pxID=&xID; + pxCID=&xCID; + pHID=&HID; + pHTID=&HTID; + pE=&E; + pF=&F; + pPERMIT=&PERMIT; + + prHID=pHID; + pPERMIT=NULL; + pxCID=NULL; + pHTID=NULL; + pE=NULL; + pF=NULL; + + int timeValue; + printf("MPIN Single Pass\n"); + timeValue = GET_TIME(); + + iterations=0; + start=clock(); + do + { + MPIN_ZZZ_CLIENT(HASH_TYPE_ZZZ,date,&CLIENT_ID,RNG,&X,pin,&TOKEN,&SEC,pxID,pxCID,pPERMIT,NULL,timeValue,&Y); + + iterations++; + elapsed=(clock()-start)/(double)CLOCKS_PER_SEC; + } + while (elapsed<MIN_TIME || iterations<MIN_ITERS); + elapsed=1000.0*elapsed/iterations; + printf("MPIN Client - %8d iterations ",iterations); + printf(" %8.2lf ms per iteration\n",elapsed); + + + MPIN_ZZZ_GET_G1_MULTIPLE(RNG,1,&R,&HCID,&Z); /* Also Send Z=r.ID to Server, remember random r */ + + iterations=0; + start=clock(); + do + { + rtn = MPIN_ZZZ_SERVER(HASH_TYPE_ZZZ,date,pHID,pHTID,&Y,&SST,pxID,pxCID,&SEC,pE,pF,&CLIENT_ID,NULL,timeValue,NULL); + + iterations++; + elapsed=(clock()-start)/(double)CLOCKS_PER_SEC; + } + while (elapsed<MIN_TIME || iterations<MIN_ITERS); + elapsed=1000.0*elapsed/iterations; + printf("MPIN Server - %8d iterations ",iterations); + printf(" %8.2lf ms per iteration\n",elapsed); + + HASH_ID(HASH_TYPE_ZZZ,&CLIENT_ID,&HSID); // new + MPIN_ZZZ_GET_G1_MULTIPLE(RNG,0,&W,prHID,&T); /* Also send T=w.ID to client, remember random w */ + + if (rtn!=0) + { + printf("Server says - Bad Pin.\n"); + return 1; + } + else + { + printf("Server says - PIN is good! You really are "); + OCT_output_string(&CLIENT_ID); + printf(".\n"); + } + + HASH_ALL(HASH_TYPE_ZZZ,&HCID,pxID,pxCID,&SEC,&Y,&Z,&T,&H); // new + MPIN_ZZZ_CLIENT_KEY(HASH_TYPE_ZZZ,&G1,&G2,pin,&R,&X,&H,&T,&CK); // new H + printf("Client Key = "); + OCT_output(&CK); + + HASH_ALL(HASH_TYPE_ZZZ,&HSID,pxID,pxCID,&SEC,&Y,&Z,&T,&H); + MPIN_ZZZ_SERVER_KEY(HASH_TYPE_ZZZ,&Z,&SST,&W,&H,pHID,pxID,pxCID,&SK); // new H,pHID + printf("Server Key = "); + OCT_output(&SK); + + /* clear memory */ + OCT_clear(&S); + OCT_clear(&X); + OCT_clear(&Y); + OCT_clear(&H); + OCT_clear(&CLIENT_ID); + OCT_clear(&SST); + OCT_clear(&TOKEN); + OCT_clear(&SEC); + OCT_clear(&PERMIT); + OCT_clear(&xCID); + OCT_clear(&xID); + OCT_clear(&HCID); + OCT_clear(&HSID); + OCT_clear(&HID); + OCT_clear(&HTID); + OCT_clear(&E); + OCT_clear(&F); + OCT_clear(&R); + OCT_clear(&Z); + OCT_clear(&W); + OCT_clear(&T); + OCT_clear(&G1); + OCT_clear(&G2); + OCT_clear(&SK); + OCT_clear(&CK); + + return 0; +} + +int main() +{ + int i; + unsigned long ran; + + char raw[100]; + octet RAW= {0,sizeof(raw),raw}; + /* Crypto Strong RNG */ + csprng RNG; + + time((time_t *)&ran); + + /* fake random seed source */ + RAW.len=100; + RAW.val[0]=ran; + RAW.val[1]=ran>>8; + RAW.val[2]=ran>>16; + RAW.val[3]=ran>>24; + for (i=0; i<100; i++) RAW.val[i]=i+1; + + /* initialise strong RNG */ + CREATE_CSPRNG(&RNG,&RAW); + + mpin(&RNG); + + KILL_CSPRNG(&RNG); +} + http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto-c/blob/8d28d2c3/benchmark/benchtest_pair_ZZZ.c.in ---------------------------------------------------------------------- diff --git a/benchmark/benchtest_pair_ZZZ.c.in b/benchmark/benchtest_pair_ZZZ.c.in new file mode 100644 index 0000000..60eafd8 --- /dev/null +++ b/benchmark/benchtest_pair_ZZZ.c.in @@ -0,0 +1,281 @@ +/** + * @file test_mpin_sign.c + * @author Mike Scott + * @brief Test and benchmark pairing functions + * + * LICENSE + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <time.h> +#include "config_curve_ZZZ.h" +#if CURVE_SECURITY_ZZZ == 128 +#include "pair_ZZZ.h" +#elif CURVE_SECURITY_ZZZ == 192 +#include "pair192_ZZZ.h" +#elif CURVE_SECURITY_ZZZ == 256 +#include "pair256_ZZZ.h" +#endif + +#define N_ITER 16 + +// Renamings for multiple security level support +#if CURVE_SECURITY_ZZZ == 128 +#define ECPG2_ZZZ_generator ECP2_ZZZ_generator +#define ECPG2_ZZZ_set ECP2_ZZZ_set +#define ECPG2_ZZZ_copy ECP2_ZZZ_copy +#define ECPG2_ZZZ_mul ECP2_ZZZ_mul +#define ECPG2_ZZZ_isinf ECP2_ZZZ_isinf +#define GT_ZZZ_copy FP12_YYY_copy +#define GT_ZZZ_isunity FP12_YYY_isunity +#define GT_ZZZ_equals FP12_YYY_equals +#define GT_ZZZ_compow FP12_YYY_compow +#elif CURVE_SECURITY_ZZZ == 192 +#define ECPG2_ZZZ_generator ECP4_ZZZ_generator +#define ECPG2_ZZZ_set ECP4_ZZZ_set +#define ECPG2_ZZZ_copy ECP4_ZZZ_copy +#define ECPG2_ZZZ_mul ECP4_ZZZ_mul +#define ECPG2_ZZZ_isinf ECP4_ZZZ_isinf +#define GT_ZZZ_copy FP24_YYY_copy +#define GT_ZZZ_isunity FP24_YYY_isunity +#define GT_ZZZ_equals FP24_YYY_equals +#define GT_ZZZ_compow FP24_YYY_compow +#elif CURVE_SECURITY_ZZZ == 256 +#define ECPG2_ZZZ_generator ECP8_ZZZ_generator +#define ECPG2_ZZZ_set ECP8_ZZZ_set +#define ECPG2_ZZZ_copy ECP8_ZZZ_copy +#define ECPG2_ZZZ_mul ECP8_ZZZ_mul +#define ECPG2_ZZZ_isinf ECP8_ZZZ_isinf +#define GT_ZZZ_copy FP48_YYY_copy +#define GT_ZZZ_isunity FP48_YYY_isunity +#define GT_ZZZ_equals FP48_YYY_equals +#define GT_ZZZ_compow FP48_YYY_compow +#endif + +#define MIN_TIME 10.0 +#define MIN_ITERS 10 + +int main() +{ + csprng RNG; + unsigned long ran; + char pr[10]; + + printf("Bechmark test PAIR - ZZZ Curve\n"); + +#if CHUNK==16 + printf("16-bit Build\n\n"); +#endif +#if CHUNK==32 + printf("32-bit Build\n\n"); +#endif +#if CHUNK==64 + printf("64-bit Build\n\n"); +#endif + + time((time_t *)&ran); + pr[0]=ran; + pr[1]=ran>>8; + pr[2]=ran>>16; + pr[3]=ran>>24; + for (int i=4; i<10; i++) pr[i]=i; + + RAND_seed(&RNG,10,pr); + + int iterations; + clock_t start; + double elapsed; + + ECP_ZZZ P,G; +#if CURVE_SECURITY_ZZZ == 128 + ECP2_ZZZ Q,W; + FP12_YYY g,w; + FP4_YYY cm; +#elif CURVE_SECURITY_ZZZ == 192 + ECP4_ZZZ Q,W; + FP24_YYY g,w; + FP8_YYY cm; +#elif CURVE_SECURITY_ZZZ == 256 + ECP8_ZZZ Q,W; + FP48_YYY g,w; + FP16_YYY cm; +#endif + + BIG_XXX s,r; + printf("\nTesting/Timing ZZZ Pairings\n"); + + ECP_ZZZ_generator(&G); + + BIG_XXX_rcopy(r,CURVE_Order_ZZZ); + BIG_XXX_randomnum(s,r,&RNG); + ECP_ZZZ_copy(&P,&G); + PAIR_ZZZ_G1mul(&P,r); + + if (!ECP_ZZZ_isinf(&P)) + { + printf("FAILURE - rG!=O\n"); + return 0; + } + + iterations=0; + start=clock(); + do + { + ECP_ZZZ_copy(&P,&G); + PAIR_ZZZ_G1mul(&P,s); + + iterations++; + elapsed=(clock()-start)/(double)CLOCKS_PER_SEC; + } + while (elapsed<MIN_TIME || iterations<MIN_ITERS); + elapsed=1000.0*elapsed/iterations; + printf("G1 mul - %8d iterations ",iterations); + printf(" %8.2lf ms per iteration\n",elapsed); + + ECPG2_ZZZ_generator(&W); + + ECPG2_ZZZ_copy(&Q,&W); + ECPG2_ZZZ_mul(&Q,r); + + if (!ECPG2_ZZZ_isinf(&Q)) + { + printf("FAILURE - rQ!=O\n"); + return 0; + } + + iterations=0; + start=clock(); + do + { + ECPG2_ZZZ_copy(&Q,&W); + PAIR_ZZZ_G2mul(&Q,s); + + iterations++; + elapsed=(clock()-start)/(double)CLOCKS_PER_SEC; + } + while (elapsed<MIN_TIME || iterations<MIN_ITERS); + elapsed=1000.0*elapsed/iterations; + printf("G2 mul - %8d iterations ",iterations); + printf(" %8.2lf ms per iteration\n",elapsed); + + PAIR_ZZZ_ate(&w,&Q,&P); + PAIR_ZZZ_fexp(&w); + + GT_ZZZ_copy(&g,&w); + + PAIR_ZZZ_GTpow(&g,r); + + if (!GT_ZZZ_isunity(&g)) + { + printf("FAILURE - g^r!=1\n"); + return 0; + } + + iterations=0; + start=clock(); + do + { + GT_ZZZ_copy(&g,&w); + PAIR_ZZZ_GTpow(&g,s); + + iterations++; + elapsed=(clock()-start)/(double)CLOCKS_PER_SEC; + } + while (elapsed<MIN_TIME || iterations<MIN_ITERS); + elapsed=1000.0*elapsed/iterations; + printf("GT pow - %8d iterations ",iterations); + printf(" %8.2lf ms per iteration\n",elapsed); + + GT_ZZZ_copy(&g,&w); + + iterations=0; + start=clock(); + do + { + GT_ZZZ_compow(&cm,&g,s,r); + iterations++; + elapsed=(clock()-start)/(double)CLOCKS_PER_SEC; + } + while (elapsed<MIN_TIME || iterations<MIN_ITERS); + elapsed=1000.0*elapsed/iterations; + printf("GT pow (compressed) - %8d iterations ",iterations); + printf(" %8.2lf ms per iteration\n",elapsed); + + iterations=0; + start=clock(); + do + { + PAIR_ZZZ_ate(&w,&Q,&P); + iterations++; + elapsed=(clock()-start)/(double)CLOCKS_PER_SEC; + } + while (elapsed<MIN_TIME || iterations<MIN_ITERS); + elapsed=1000.0*elapsed/iterations; + printf("PAIRing ATE - %8d iterations ",iterations); + printf(" %8.2lf ms per iteration\n",elapsed); + + iterations=0; + start=clock(); + do + { + GT_ZZZ_copy(&g,&w); + PAIR_ZZZ_fexp(&g); + iterations++; + elapsed=(clock()-start)/(double)CLOCKS_PER_SEC; + } + while (elapsed<MIN_TIME || iterations<MIN_ITERS); + elapsed=1000.0*elapsed/iterations; + printf("PAIRing FEXP - %8d iterations ",iterations); + printf(" %8.2lf ms per iteration\n",elapsed); + + ECP_ZZZ_copy(&P,&G); + ECPG2_ZZZ_copy(&Q,&W); + + PAIR_ZZZ_G1mul(&P,s); + PAIR_ZZZ_ate(&g,&Q,&P); + PAIR_ZZZ_fexp(&g); + + ECP_ZZZ_copy(&P,&G); + + PAIR_ZZZ_G2mul(&Q,s); + PAIR_ZZZ_ate(&w,&Q,&P); + PAIR_ZZZ_fexp(&w); + + if (!GT_ZZZ_equals(&g,&w)) + { + printf("FAILURE - e(sQ,p)!=e(Q,sP) \n"); + return 1; + } + + ECPG2_ZZZ_copy(&Q,&W); + PAIR_ZZZ_ate(&g,&Q,&P); + PAIR_ZZZ_fexp(&g); + + PAIR_ZZZ_GTpow(&g,s); + + if (!GT_ZZZ_equals(&g,&w)) + { + printf("FAILURE - e(sQ,p)!=e(Q,P)^s \n"); + return 1; + } + printf("SUCCESS BENCHMARK TEST OF PAIRING FUNCTIONS PASSED\n"); + return 0; +} http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto-c/blob/8d28d2c3/benchmark/benchtest_rsa_WWW.c.in ---------------------------------------------------------------------- diff --git a/benchmark/benchtest_rsa_WWW.c.in b/benchmark/benchtest_rsa_WWW.c.in new file mode 100644 index 0000000..f04345e --- /dev/null +++ b/benchmark/benchtest_rsa_WWW.c.in @@ -0,0 +1,127 @@ +/** + * @file test_mpin_sign.c + * @author Mike Scott + * @brief est and benchmark and RSA functions + * + * LICENSE + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <time.h> + +#include "rsa_WWW.h" + +#define MIN_TIME 10.0 +#define MIN_ITERS 10 + +int main() +{ + csprng RNG; + int i,iterations; + clock_t start; + double elapsed; + char pr[10]; + unsigned long ran; + rsa_public_key_WWW pub; + rsa_private_key_WWW priv; + char m[RFS_WWW],d[RFS_WWW],c[RFS_WWW]; + octet M= {0,sizeof(m),m}; + octet D= {0,sizeof(d),d}; + octet C= {0,sizeof(c),c}; + + printf("\nBechmark test RSA - "); + +#if CHUNK==16 + printf("16-bit Build\n\n"); +#endif +#if CHUNK==32 + printf("32-bit Build\n\n"); +#endif +#if CHUNK==64 + printf("64-bit Build\n\n"); +#endif + + time((time_t *)&ran); + pr[0]=ran; + pr[1]=ran>>8; + pr[2]=ran>>16; + pr[3]=ran>>24; + for (i=4; i<10; i++) pr[i]=i; + RAND_seed(&RNG,10,pr); + + printf("Generating %d-bit RSA public/private key pair\n",FFLEN_WWW*BIGBITS_XXX); + + iterations=0; + start=clock(); + do + { + RSA_WWW_KEY_PAIR(&RNG,65537,&priv,&pub,NULL,NULL); + iterations++; + elapsed=(clock()-start)/(double)CLOCKS_PER_SEC; + } + while (elapsed<MIN_TIME || iterations<MIN_ITERS); + elapsed=1000.0*elapsed/iterations; + printf("RSA gen - %8d iterations ",iterations); + printf(" %8.2lf ms per iteration\n",elapsed); + + //FF_randomnum(plain,pub.n,&RNG,FFLEN); + + M.len=RFS_WWW; + for (i=0; i<RFS_WWW; i++) M.val[i]=i%128; + + iterations=0; + start=clock(); + do + { + RSA_WWW_ENCRYPT(&pub,&M,&C); + iterations++; + elapsed=(clock()-start)/(double)CLOCKS_PER_SEC; + } + while (elapsed<MIN_TIME || iterations<MIN_ITERS); + elapsed=1000.0*elapsed/iterations; + printf("RSA enc - %8d iterations ",iterations); + printf(" %8.2lf ms per iteration\n",elapsed); + + iterations=0; + start=clock(); + do + { + RSA_WWW_DECRYPT(&priv,&C,&D); + iterations++; + elapsed=(clock()-start)/(double)CLOCKS_PER_SEC; + } + while (elapsed<MIN_TIME || iterations<MIN_ITERS); + elapsed=1000.0*elapsed/iterations; + printf("RSA dec - %8d iterations ",iterations); + printf(" %8.2lf ms per iteration\n",elapsed); + + for (i=0; i<RFS_WWW; i++) + { + if (M.val[i]!=D.val[i]) + { + printf("FAILURE - RSA decryption\n"); + exit(EXIT_FAILURE); + } + } + + printf("\nSUCCESS BENCHMARK TEST OF RSA FUNCTIONS PASSED\n\n"); + exit(EXIT_SUCCESS); +} http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto-c/blob/8d28d2c3/buildMulti.sh ---------------------------------------------------------------------- diff --git a/buildMulti.sh b/buildMulti.sh new file mode 100755 index 0000000..cf359f8 --- /dev/null +++ b/buildMulti.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash +# +# buildMulti.sh +# +# Build test with multiple curves and RSA security levels + +# @author Kealan McCusker <[email protected]> + +set -e + +# Build default - see config.mk +make clean +make + +# Build example with multiple curves and RSA security level +gcc -O2 -std=c99 ./examples/testall.c -I./include/ -I./target/default/include/ -L./target/default/lib/ -lamcl_core -lamcl_curve_BN254CX -lamcl_curve_ED25519 -lamcl_curve_GOLDILOCKS -lamcl_curve_NIST256 -lamcl_mpin_BN254CX -lamcl_pairing_BN254CX -lamcl_rsa_2048 -lamcl_rsa_3072 -lamcl_wcc_BN254CX -lamcl_x509 -o testall + +# Run code +export LD_LIBRARY_PATH=./target/default/lib +./testall + + http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto-c/blob/8d28d2c3/cmake/AMCLExpand.cmake ---------------------------------------------------------------------- diff --git a/cmake/AMCLExpand.cmake b/cmake/AMCLExpand.cmake new file mode 100644 index 0000000..69fe76e --- /dev/null +++ b/cmake/AMCLExpand.cmake @@ -0,0 +1,104 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +cmake_minimum_required(VERSION 3.1) + +list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}) +include(AMCLParameters) + +# Copies a file <source> to file <target> and substitutes variable +# values referenced as @VAR@, WWW, XXX, YYY, and ZZZ in the file +# content. These variables must be set in the caller's scope. +# +# If <source> is a relative path it is evaluated with respect to the +# current source directory. If <target> is a relative path it is +# evaluated with respect to the current binary directory. +# +# The full path of the target file is appended to <targets_list>. +# +macro(__amcl_configure_file source target targets_list) + get_filename_component(target_full "${target}" ABSOLUTE + BASE_DIR "${CMAKE_CURRENT_BINARY_DIR}") + set(AMCL_CHUNK ${WORD_SIZE}) + set(WL ${WORD_SIZE}) + + configure_file("${source}" "${target_full}" @ONLY) + file(READ "${target_full}" temp) + string(REPLACE WWW "${TFF}" temp "${temp}") + string(REPLACE XXX "${BD}" temp "${temp}") + string(REPLACE YYY "${TF}" temp "${temp}") + string(REPLACE ZZZ "${TC}" temp "${temp}") + file(WRITE "${target_full}" "${temp}") + + list(APPEND "${targets_list}" "${target_full}") + set("${targets_list}" "${${targets_list}}" PARENT_SCOPE) +endmacro() + +###################################################################### +# Expands an AMCL template file. No RSA or curve params are set. +function(amcl_configure_file_core source target targets_list) + __amcl_configure_file("${source}" "${target}" "${targets_list}") +endfunction() + +# Expands an AMCL template file, including the RSA params for the +# specified level. +function(amcl_configure_file_rsa source target level targets_list) + amcl_load_rsa(${level}) + __amcl_configure_file("${source}" "${target}" "${targets_list}") +endfunction() + +# Expands an AMCL template file, including the curve params for the +# specified curve. +function(amcl_configure_file_curve source target curve targets_list) + amcl_load_curve(${curve}) + __amcl_configure_file("${source}" "${target}" "${targets_list}") +endfunction() + +# Expands an AMCL template file, including the rsa and curve params +# for the specified level and curve. +function(amcl_configure_file_rsa_curve source target level curve targets_list) + amcl_load_rsa(${level}) + amcl_load_curve(${curve}) + __amcl_configure_file("${source}" "${target}" "${targets_list}") +endfunction() + +###################################################################### +# Generates the SC variable (#defined of supported curves) for +# version.h.in +function(amcl_generate_SC SC) + set(text "") + + foreach(curve ${AMCL_CURVE}) + amcl_curve_field(TC ${curve}) + set(text "${text}#define ${TC}_VER\n") + endforeach() + + set("${SC}" "${text}" PARENT_SCOPE) +endfunction() + +# Generates the RSL variable (#defines of supported RSA security +# level) for version.h.in +function(amcl_generate_RSL RSL) + set(${text} "") + + foreach(level ${AMCL_RSA}) + amcl_rsa_field(TFF ${level}) + set(text "${text}#define RSA_SECURITY_LEVEL_${TFF}_VER\n") + endforeach() + + set("${RSL}" "${text}" PARENT_SCOPE) +endfunction() http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto-c/blob/8d28d2c3/cmake/AMCLParameters.cmake ---------------------------------------------------------------------- diff --git a/cmake/AMCLParameters.cmake b/cmake/AMCLParameters.cmake new file mode 100644 index 0000000..b9f8a93 --- /dev/null +++ b/cmake/AMCLParameters.cmake @@ -0,0 +1,205 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +cmake_minimum_required(VERSION 3.1) + +# This file defines the parameters for the various curves and RSA +# levels supported by AMCL. +# +# The parameters can be accessed individually by name using the +# `amcl_curve_field(<field> <curve>)` and `amcl_rsa_field(<field> +# <level>)` functions in this file. +# +# The parameters can be loaded into the variables using the +# `amcl_load_curve(<curve>)` and `amcl_load_rsa(<level>)` macros in +# this file. +# +# The sister module `AMCLExpand.cmake` contains helper functions to +# expand template sources with the parameters defined here. + +####################################### +# AMCL Curve parameters +####################################### +set(AMCL_CURVE_FIELDS TB TF TC NB BASE NBT M8 MT CT PF ST SX CS ) +set(AMCL_CURVE_64_ED25519 256 25519 ED25519 32 56 255 5 PSEUDO_MERSENNE EDWARDS NOT . . 128) +set(AMCL_CURVE_64_C25519 256 25519 C25519 32 56 255 5 PSEUDO_MERSENNE MONTGOMERY NOT . . 128) +set(AMCL_CURVE_64_NIST256 256 NIST256 NIST256 32 56 256 7 NOT_SPECIAL WEIERSTRASS NOT . . 128) +set(AMCL_CURVE_64_BRAINPOOL 256 BRAINPOOL BRAINPOOL 32 56 256 7 NOT_SPECIAL WEIERSTRASS NOT . . 128) +set(AMCL_CURVE_64_ANSSI 256 ANSSI ANSSI 32 56 256 7 NOT_SPECIAL WEIERSTRASS NOT . . 128) +set(AMCL_CURVE_64_HIFIVE 336 HIFIVE HIFIVE 42 60 336 5 PSEUDO_MERSENNE EDWARDS NOT . . 128) +set(AMCL_CURVE_64_GOLDILOCKS 448 GOLDILOCKS GOLDILOCKS 56 58 448 7 GENERALISED_MERSENNE EDWARDS NOT . . 128) +set(AMCL_CURVE_64_NIST384 384 NIST384 NIST384 48 56 384 7 NOT_SPECIAL WEIERSTRASS NOT . . 128) +set(AMCL_CURVE_64_C41417 416 C41417 C41417 52 60 414 7 PSEUDO_MERSENNE EDWARDS NOT . . 128) +set(AMCL_CURVE_64_NIST521 528 NIST521 NIST521 66 60 521 7 PSEUDO_MERSENNE WEIERSTRASS NOT . . 128) +set(AMCL_CURVE_64_NUMS256W 256 256PMW NUMS256W 32 56 256 3 PSEUDO_MERSENNE WEIERSTRASS NOT . . 128) +set(AMCL_CURVE_64_NUMS256E 256 256PME NUMS256E 32 56 256 3 PSEUDO_MERSENNE EDWARDS NOT . . 128) +set(AMCL_CURVE_64_NUMS384W 384 384PM NUMS384W 48 56 384 3 PSEUDO_MERSENNE WEIERSTRASS NOT . . 128) +set(AMCL_CURVE_64_NUMS384E 384 384PM NUMS384E 48 56 384 3 PSEUDO_MERSENNE EDWARDS NOT . . 128) +set(AMCL_CURVE_64_NUMS512W 512 512PM NUMS512W 64 56 512 7 PSEUDO_MERSENNE WEIERSTRASS NOT . . 128) +set(AMCL_CURVE_64_NUMS512E 512 512PM NUMS512E 64 56 512 7 PSEUDO_MERSENNE EDWARDS NOT . . 128) +set(AMCL_CURVE_64_SECP256K1 256 SECP256K1 SECP256K1 32 56 256 7 NOT_SPECIAL WEIERSTRASS NOT . . 128) +set(AMCL_CURVE_64_BN254 256 BN254 BN254 32 56 254 3 NOT_SPECIAL WEIERSTRASS BN D_TYPE NEGATIVEX 128) +set(AMCL_CURVE_64_BN254CX 256 BN254CX BN254CX 32 56 254 3 NOT_SPECIAL WEIERSTRASS BN D_TYPE NEGATIVEX 128) +set(AMCL_CURVE_64_BLS381 384 BLS381 BLS381 48 58 381 3 NOT_SPECIAL WEIERSTRASS BLS M_TYPE NEGATIVEX 128) +set(AMCL_CURVE_64_BLS383 384 BLS383 BLS383 48 58 383 3 NOT_SPECIAL WEIERSTRASS BLS M_TYPE POSITIVEX 128) +set(AMCL_CURVE_64_BLS24 480 BLS24 BLS24 60 56 479 3 NOT_SPECIAL WEIERSTRASS BLS M_TYPE POSITIVEX 192) +set(AMCL_CURVE_64_BLS48 560 BLS48 BLS48 70 58 556 3 NOT_SPECIAL WEIERSTRASS BLS M_TYPE POSITIVEX 256) +set(AMCL_CURVE_64_FP256BN 256 FP256BN FP256BN 32 56 256 3 NOT_SPECIAL WEIERSTRASS BN M_TYPE NEGATIVEX 128) +set(AMCL_CURVE_64_FP512BN 512 FP512BN FP512BN 64 60 512 3 NOT_SPECIAL WEIERSTRASS BN M_TYPE POSITIVEX 128) +set(AMCL_CURVE_64_BLS461 464 BLS461 BLS461 58 60 461 3 NOT_SPECIAL WEIERSTRASS BLS M_TYPE NEGATIVEX 128) +# ( TB TF TC NB BASE NBT M8 MT CT PF ST SX CS ) +set(AMCL_CURVE_32_ED25519 256 25519 ED25519 32 29 255 5 PSEUDO_MERSENNE EDWARDS NOT . . 128) +set(AMCL_CURVE_32_C25519 256 25519 C25519 32 29 255 5 PSEUDO_MERSENNE MONTGOMERY NOT . . 128) +set(AMCL_CURVE_32_NIST256 256 NIST256 NIST256 32 28 256 7 NOT_SPECIAL WEIERSTRASS NOT . . 128) +set(AMCL_CURVE_32_BRAINPOOL 256 BRAINPOOL BRAINPOOL 32 28 256 7 NOT_SPECIAL WEIERSTRASS NOT . . 128) +set(AMCL_CURVE_32_ANSSI 256 ANSSI ANSSI 32 28 256 7 NOT_SPECIAL WEIERSTRASS NOT . . 128) +set(AMCL_CURVE_32_HIFIVE 336 HIFIVE HIFIVE 42 29 336 5 PSEUDO_MERSENNE EDWARDS NOT . . 128) +set(AMCL_CURVE_32_GOLDILOCKS 448 GOLDILOCKS GOLDILOCKS 56 29 448 7 GENERALISED_MERSENNE EDWARDS NOT . . 128) +set(AMCL_CURVE_32_NIST384 384 NIST384 NIST384 48 29 384 7 NOT_SPECIAL WEIERSTRASS NOT . . 128) +set(AMCL_CURVE_32_C41417 416 C41417 C41417 52 29 414 7 PSEUDO_MERSENNE EDWARDS NOT . . 128) +set(AMCL_CURVE_32_NIST521 528 NIST521 NIST521 66 28 521 7 PSEUDO_MERSENNE WEIERSTRASS NOT . . 128) +set(AMCL_CURVE_32_NUMS256W 256 256PMW NUMS256W 32 28 256 3 PSEUDO_MERSENNE WEIERSTRASS NOT . . 128) +set(AMCL_CURVE_32_NUMS256E 256 256PME NUMS256E 32 29 256 3 PSEUDO_MERSENNE EDWARDS NOT . . 128) +set(AMCL_CURVE_32_NUMS384W 384 384PM NUMS384W 48 29 384 3 PSEUDO_MERSENNE WEIERSTRASS NOT . . 128) +set(AMCL_CURVE_32_NUMS384E 384 384PM NUMS384E 48 29 384 3 PSEUDO_MERSENNE EDWARDS NOT . . 128) +set(AMCL_CURVE_32_NUMS512W 512 512PM NUMS512W 64 29 512 7 PSEUDO_MERSENNE WEIERSTRASS NOT . . 128) +set(AMCL_CURVE_32_NUMS512E 512 512PM NUMS512E 64 29 512 7 PSEUDO_MERSENNE EDWARDS NOT . . 128) +set(AMCL_CURVE_32_SECP256K1 256 SECP256K1 SECP256K1 32 28 256 7 NOT_SPECIAL WEIERSTRASS NOT . . 128) +set(AMCL_CURVE_32_BN254 256 BN254 BN254 32 28 254 3 NOT_SPECIAL WEIERSTRASS BN D_TYPE NEGATIVEX 128) +set(AMCL_CURVE_32_BN254CX 256 BN254CX BN254CX 32 28 254 3 NOT_SPECIAL WEIERSTRASS BN D_TYPE NEGATIVEX 128) +set(AMCL_CURVE_32_BLS381 384 BLS381 BLS381 48 29 381 3 NOT_SPECIAL WEIERSTRASS BLS M_TYPE NEGATIVEX 128) +set(AMCL_CURVE_32_BLS383 384 BLS383 BLS383 48 29 383 3 NOT_SPECIAL WEIERSTRASS BLS M_TYPE POSITIVEX 128) +set(AMCL_CURVE_32_BLS24 480 BLS24 BLS24 60 29 479 3 NOT_SPECIAL WEIERSTRASS BLS M_TYPE POSITIVEX 192) +set(AMCL_CURVE_32_BLS48 560 BLS48 BLS48 70 29 556 3 NOT_SPECIAL WEIERSTRASS BLS M_TYPE POSITIVEX 256) +set(AMCL_CURVE_32_FP256BN 256 FP256BN FP256BN 32 28 256 3 NOT_SPECIAL WEIERSTRASS BN M_TYPE NEGATIVEX 128) +set(AMCL_CURVE_32_FP512BN 512 FP512BN FP512BN 64 29 512 3 NOT_SPECIAL WEIERSTRASS BN M_TYPE POSITIVEX 128) +set(AMCL_CURVE_32_BLS461 464 BLS461 BLS461 58 28 461 3 NOT_SPECIAL WEIERSTRASS BLS M_TYPE NEGATIVEX 128) +# ( TB TF TC NB BASE NBT M8 MT CT PF ST SX CS ) +set(AMCL_CURVE_16_ED25519 256 25519 ED25519 32 13 255 5 PSEUDO_MERSENNE EDWARDS NOT . . 128) +set(AMCL_CURVE_16_NUMS256E 256 256PME NUMS256E 32 13 256 3 PSEUDO_MERSENNE EDWARDS NOT . . 128) +set(AMCL_CURVE_16_BN254 256 BN254 BN254 32 13 254 3 NOT_SPECIAL WEIERSTRASS BN D_TYPE NEGATIVEX 128) +set(AMCL_CURVE_16_BN254CX 256 BN254CX BN254CX 32 13 254 3 NOT_SPECIAL WEIERSTRASS BN D_TYPE NEGATIVEX 128) + +####################################### +# AMCL RSA parameters +####################################### +set(AMCL_RSA_FIELDS TB TFF NB BASE ML) +set(AMCL_RSA_64_2048 1024 2048 128 58 2 ) +set(AMCL_RSA_64_3072 384 3072 48 56 8 ) +set(AMCL_RSA_64_4096 512 4096 64 60 8 ) +# ( TB TFF NB BASE ML) +set(AMCL_RSA_32_2048 1024 2048 128 28 2 ) +set(AMCL_RSA_32_3072 384 3072 48 28 8 ) +set(AMCL_RSA_32_4096 512 4096 64 29 8 ) +# ( TB TFF NB BASE ML) +set(AMCL_RSA_16_2048 256 2048 32 13 8 ) + +######################################## +# Get supported curves and RSA levels +######################################## +function(amcl_supported_curves output word_size) + get_cmake_property(_allvars VARIABLES) + string(REGEX MATCHALL "AMCL_CURVE_${word_size}_[a-zA-Z0-9]*" _amcl_curve_vars "${_allvars}") + string(REGEX REPLACE "AMCL_CURVE_[0-9][0-9]_" "" _names "${_amcl_curve_vars}") + list(REMOVE_DUPLICATES _names) + set("${output}" "${_names}" PARENT_SCOPE) +endfunction() + +function(amcl_supported_rsa_levels output word_size) + get_cmake_property(_allvars VARIABLES) + string(REGEX MATCHALL "AMCL_RSA_${word_size}_[0-9]*" _amcl_rsa_vars "${_allvars}") + string(REGEX REPLACE "AMCL_RSA_[0-9][0-9]_" "" _names "${_amcl_rsa_vars}") + list(REMOVE_DUPLICATES _names) + set("${output}" "${_names}" PARENT_SCOPE) +endfunction() + +####################################### +# AMCL parameters accessors +####################################### + +# Loads the parameters for <curve> into variables in the calling +# scope. +macro(amcl_load_curve curve) + if(NOT AMCL_CURVE_${WORD_SIZE}_${curve}) + message(FATAL_ERROR "Invalid curve: ${curve} for word size ${WORD_SIZE}") + endif() + + # Export all predefined fields + foreach(field ${AMCL_CURVE_FIELDS}) + list(FIND AMCL_CURVE_FIELDS "${field}" index) + list(GET AMCL_CURVE_${WORD_SIZE}_${curve} ${index} ${field}) + endforeach() + + # Export computed fields + # - BD + set(BD "${TB}_${BASE}") + + # - SH + math(EXPR SH "${BASE} * (1 + ((8 * ${NB} - 1) / ${BASE})) - ${NBT}") + if (SH GREATER "30") + set(SH "30") + endif() +endmacro() + +# Loads the parameters for RSA <level> into variables in the calling +# scope. +macro(amcl_load_rsa level) + if(NOT AMCL_RSA_${WORD_SIZE}_${level}) + message(FATAL_ERROR "Invalid RSA level: ${level} for word size ${WORD_SIZE}") + endif() + + # Export all predefined fields + foreach(field ${AMCL_RSA_FIELDS}) + list(FIND AMCL_RSA_FIELDS "${field}" index) + list(GET AMCL_RSA_${WORD_SIZE}_${level} ${index} ${field}) + endforeach() + + # Export computed fields + # - BD + set(BD "${TB}_${BASE}") + +endmacro() + +# Retrieves the value of <field> for <curve>. +# +# If the optional `DEST <name>` argument is supplied, the value is +# saved to <name> in the calling scope. Otherwise, it is saved to +# <field> in the calling scope. +function(amcl_curve_field field curve) + cmake_parse_arguments(amcl_curve_field "" "DEST" "" ${ARGN}) + if(NOT amcl_curve_field_DEST) + set(amcl_curve_field_DEST ${field}) + endif() + + amcl_load_curve(${curve}) + set("${amcl_curve_field_DEST}" "${${field}}" PARENT_SCOPE) +endfunction() + +# Retrieves the value of <field> for RSA <level>. +# +# If the optional `DEST <name>` argument is supplied, the value is +# saved to <name> in the calling scope. Otherwise, it is saved to +# <field> in the calling scope. +function(amcl_rsa_field field level) + cmake_parse_arguments(amcl_rsa_field "" "DEST" "" ${ARGN}) + if(NOT amcl_rsa_field_DEST) + set(amcl_rsa_field_DEST ${field}) + endif() + + amcl_load_rsa(${level}) + set("${amcl_rsa_field_DEST}" "${${field}}" PARENT_SCOPE) +endfunction() http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto-c/blob/8d28d2c3/cmake/DetermineWordSize.cmake ---------------------------------------------------------------------- diff --git a/cmake/DetermineWordSize.cmake b/cmake/DetermineWordSize.cmake new file mode 100644 index 0000000..8d90a4c --- /dev/null +++ b/cmake/DetermineWordSize.cmake @@ -0,0 +1,47 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +function(DETERMINE_WORD_SIZE word_size) + +# Check if 64-bit + try_compile(COMPILE_SUCCESS "${CMAKE_CURRENT_BINARY_DIR}" + "${CMAKE_CURRENT_SOURCE_DIR}/cmake/determine_word_size/check_64.c") + + if(COMPILE_SUCCESS) + set(${word_size} 64 PARENT_SCOPE) + return() + endif() + +# Check if 32-bit + try_compile(COMPILE_SUCCESS "${CMAKE_CURRENT_BINARY_DIR}" + "${CMAKE_CURRENT_SOURCE_DIR}/cmake/determine_word_size/check_32.c") + + if(COMPILE_SUCCESS) + set(${word_size} 32 PARENT_SCOPE) + return() + endif() + +# Check if 16-bit + try_compile(COMPILE_SUCCESS "${CMAKE_CURRENT_BINARY_DIR}" + "${CMAKE_CURRENT_SOURCE_DIR}/cmake/determine_word_size/check_16.c") + + if(COMPILE_SUCCESS) + set(${word_size} 16 PARENT_SCOPE) + return() + endif() + +endfunction() http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto-c/blob/8d28d2c3/cmake/PythonSiteDirs.cmake ---------------------------------------------------------------------- diff --git a/cmake/PythonSiteDirs.cmake b/cmake/PythonSiteDirs.cmake new file mode 100644 index 0000000..ea57c06 --- /dev/null +++ b/cmake/PythonSiteDirs.cmake @@ -0,0 +1,29 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +cmake_minimum_required(VERSION 3.1) + +execute_process(COMMAND + python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()" + OUTPUT_VARIABLE PYTHON_SITE_PACKAGES + OUTPUT_STRIP_TRAILING_WHITESPACE +) + +execute_process(COMMAND + python -c "from distutils.sysconfig import get_python_lib; from os.path import dirname; print dirname(get_python_lib())" + OUTPUT_VARIABLE PYTHON_SITE_LIB +) http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto-c/blob/8d28d2c3/cmake/SetOSVariable.cmake ---------------------------------------------------------------------- diff --git a/cmake/SetOSVariable.cmake b/cmake/SetOSVariable.cmake new file mode 100644 index 0000000..9ea835b --- /dev/null +++ b/cmake/SetOSVariable.cmake @@ -0,0 +1,28 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +cmake_minimum_required(VERSION 3.1) + +if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + set(OS "Mac OS X") +elseif(${CMAKE_SYSTEM_NAME} MATCHES "Linux") + set(OS "Linux") +elseif(${CMAKE_SYSTEM_NAME} MATCHES "Windows") + set(OS "Windows") +else() + set(OS "Unknown") +endif() http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto-c/blob/8d28d2c3/cmake/determine_word_size/check_16.c ---------------------------------------------------------------------- diff --git a/cmake/determine_word_size/check_16.c b/cmake/determine_word_size/check_16.c new file mode 100644 index 0000000..1651b48 --- /dev/null +++ b/cmake/determine_word_size/check_16.c @@ -0,0 +1,9 @@ +#include <stdint.h> + +int main() { +#if (__WORDSIZE == 16) + return 0; +#else +#error "Wordsize is not 16" +#endif +} http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto-c/blob/8d28d2c3/cmake/determine_word_size/check_32.c ---------------------------------------------------------------------- diff --git a/cmake/determine_word_size/check_32.c b/cmake/determine_word_size/check_32.c new file mode 100644 index 0000000..d980b1d --- /dev/null +++ b/cmake/determine_word_size/check_32.c @@ -0,0 +1,11 @@ +#include <stdint.h> + +int main() { +#if (__WORDSIZE == 32) + return 0; +#elif (defined(_WIN32) && !defined(_WIN64)) + return 0; +#else +#error "Wordsize is not 32" +#endif +} http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto-c/blob/8d28d2c3/cmake/determine_word_size/check_64.c ---------------------------------------------------------------------- diff --git a/cmake/determine_word_size/check_64.c b/cmake/determine_word_size/check_64.c new file mode 100644 index 0000000..41fc86e --- /dev/null +++ b/cmake/determine_word_size/check_64.c @@ -0,0 +1,11 @@ +#include <stdint.h> + +int main() { +#if (__WORDSIZE == 64) + return 0; +#elif defined(_WIN64) + return 0; +#else +#error "Wordsize is not 64" +#endif +} http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto-c/blob/8d28d2c3/cmake_uninstall.cmake.in ---------------------------------------------------------------------- diff --git a/cmake_uninstall.cmake.in b/cmake_uninstall.cmake.in new file mode 100644 index 0000000..2037e36 --- /dev/null +++ b/cmake_uninstall.cmake.in @@ -0,0 +1,21 @@ +if(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") + message(FATAL_ERROR "Cannot find install manifest: @CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") +endif(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") + +file(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files) +string(REGEX REPLACE "\n" ";" files "${files}") +foreach(file ${files}) + message(STATUS "Uninstalling $ENV{DESTDIR}${file}") + if(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}") + exec_program( + "@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\"" + OUTPUT_VARIABLE rm_out + RETURN_VALUE rm_retval + ) + if(NOT "${rm_retval}" STREQUAL 0) + message(FATAL_ERROR "Problem when removing $ENV{DESTDIR}${file}") + endif(NOT "${rm_retval}" STREQUAL 0) + else(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}") + message(STATUS "File $ENV{DESTDIR}${file} does not exist.") + endif(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}") +endforeach(file) http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto-c/blob/8d28d2c3/config.mk ---------------------------------------------------------------------- diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..494ab6b --- /dev/null +++ b/config.mk @@ -0,0 +1,52 @@ +# This file sets the default build of the library and is run by typing "make" + +# size of chunk in bits which is wordlength of computer = 16, 32 or 64. (see arch.h) +WORD_SIZE:=64 + +# Current choice of Elliptic Curve NIST256 C25519 ED25519 BRAINPOOL ANSSI NUMS256E NUMS256W NUMS384E NUMS384W NUMS512E NUMS512W HIFIVE GOLDILOCKS NIST384 C41417 NIST521 BN254 BN254CX BLS383 FP256BN FP512BN BLS461 +AMCL_CURVE:=ED25519,NIST256,GOLDILOCKS,BN254CX + +# RSA security level: 2048 3072 4096 +AMCL_RSA:=2048,3072 + +# Build type Debug Release Coverage ASan Check CheckFull +CMAKE_BUILD_TYPE:=Release + +# Install path +CMAKE_INSTALL_PATH:=/opt/amcl + +# Run tests +AMCL_TEST:=ON + +# Build Shared Libraries ON/OFF +AMCL_BUILD_SHARED_LIBS:=ON + +# Build Python wrapper ON/OFF +AMCL_BUILD_PYTHON:=OFF + +# Build MPIN ON/OFF +AMCL_BUILD_MPIN:=ON + +# Build WCC ON/OFF +AMCL_BUILD_WCC:=ON + +# Build Doxygen ON/OFF +AMCL_BUILD_DOCS:=ON + +# Configure PIN +AMCL_MAXPIN:=10000 +AMCL_PBLEN:=14 + +# Print debug message for field reduction ON/OFF +DEBUG_REDUCE:=OFF + +# Detect digit overflow ON/OFF +DEBUG_NORM:=OFF + +# Architecture +CMAKE_C_FLAGS= + +# Tool chain +# options: ../../resources/cmake/mingw64-cross.cmake +# ../../resources/cmake/mingw32-cross.cmake +CMAKE_TOOLCHAIN_FILE= http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto-c/blob/8d28d2c3/doc/AMCL.dox ---------------------------------------------------------------------- diff --git a/doc/AMCL.dox b/doc/AMCL.dox new file mode 100644 index 0000000..be30a98 --- /dev/null +++ b/doc/AMCL.dox @@ -0,0 +1,278 @@ +/* + This file contains NO source code, just some documentation for doxygen to parse. +*/ + +/*! + \mainpage Apache Milagro Crypto Library (AMCL) + + AMCL is a standards compliant C cryptographic library with no external dependencies, specifically designed to support the Internet of Things (IoT). + + For a detailed explanation about this library please read: <a href="AMCL.pdf">AMCL.pdf</a> + + AMCL is provided in *C* language but includes a <a href="https://www.python.org">Python</a> wrapper.for some components as an aid for development work. + + \section homepage Project page + The official project page is hosted at + <a href="http://milagro.apache.org/">Apache Milagro (incubating)</a> + + \section license License + +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. + + \section platforms Platforms + + The software can be compiled and installed for these operating systems; + +<ul type="disc"> + <li>Linux</li> + <li>Windows</li> + <li>Mac OS</li> +</ul> + + + + \section downloads Downloads + + The source code is available from here; + + git clone https://github.com/milagro-crypto/milagro-crypto-c + + \section installonmainpage Installation + + There are instructions for building for \ref linux, \ref mac and \ref windows. + +*/ + + +/*! + \page linux Linux + +<h2>Software dependencies</h2> + +CMake is required to build the library and can usually be installed from +the operating system package manager. + +<ul type="disc"> + <li>sudo apt-get install cmake</li> +</ul> + +If not, then you can download it from www.cmake.org + +In order to use the Python language wrapper install <a href="https://www.python.org">Python</a> + +The C Foreign Function Interface for Python <a href="https://cffi.readthedocs.org/en/latest/">CFFI</a> module +is also required if you wish to use the Python module. + +<ul type="disc"> + <li>sudo pip install cffi</li> +</ul> + +In order to build the documentation <a href="http://www.stack.nl/~dimitri/doxygen/">doxygen</a> is required. + +<h2>Quick Start</h2> + +<p>A Makefile is present at the project root that reads the options defined in +config.mk. Change these options and then type ```make``` to build and test +the library.</p> + +<p>If <a href="https://www.docker.com/">docker</a> is installed then type ```make dbuild``` to build and test +the library in a docker container.</p> + +<h2>Manual build</h2> + +<p>The default build is for 64 bit machines, Elliptic curve BN254CX and curve type Weierstrass</p> + +<ol type="disc"> + <li>mkdir target/build</li> + <li>cd target/build</li> + <li>cmake -D CMAKE_INSTALL_PREFIX=/opt/amcl ../.. + <li>export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./ + <li>make</li> + <li>make test</li> + <li>make doc</li> + <li>sudo make install</li> +</ol> + +<p>The build can be configured using by setting flags on the command line i.e.</p> + +<ol type="disc"> + <li>cmake -D CMAKE_INSTALL_PREFIX=/opt/amcl -D WORD_LENGTH=32 ../..</li> +</ol> + +<p>list available CMake options</p> + +<ol type="disc"> + <li>cmake -LH</li> +</ol> + +<h2>Uninstall software</h2> + +<ul type="disc"> + <li>sudo make uninstall</li> +</ul> + +<h2>Building an installer</h2> + +<p>After having built the libraries you can build a binary installer and a source distribution by running this command</p> + +<ul type="disc"> + <li>make package</li> +</ul> + +*/ + + + + +/*! + \page mac Mac OS + +<h2>Software dependencies</h2> + +Install <a href="http://brew.sh/">Homebrew</a> + +<ul type="disc"> + <li>ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"</li> +</ul> + +Install <a href="http://www.cmake.org/download/">cmake</a> + +<ul type="disc"> + <li>brew install cmake</li> +</ul> + +In order to use the Python language wrapper install <a href="https://www.python.org">Python</a> + +The C Foreign Function Interface for Python <a href="https://cffi.readthedocs.org/en/latest/">CFFI</a> module +is also required if you wish to use the Python module. + +<ul type="disc"> + <li>brew install pkg-config libffi</li> + <li>sudo pip install cffi</li> +</ul> + +In order to build the documentation <a href="http://www.stack.nl/~dimitri/doxygen/">doxygen</a> is required. + +<ul type="disc"> + <li>brew install doxygen</li> +</ul> + +<h2>Build Instructions</h2> + +<p>The default build is for 64 bit machines, Elliptic curve BN254CX and curve type Weierstrass</p> + +<ol type="disc"> + <li>mkdir -p target/build</li> + <li>cd target/build</li> + <li>cmake ../..</li> + <li>make</li> + <li>make test</li> + <li>make doc</li> + <li>sudo make install</li> +</ol> + +<p>The build can be configured using by setting flags on the command line i.e.</p> + +<ol type="disc"> + <li>cmake -DWORD_LENGTH=32 ../..</li> +</ol> + +<h2>Uninstall software</h2> + +<ul type="disc"> + <li>sudo make uninstall</li> +</ul> + +*/ + +/*! + \page windows Windows + +<h2>Software dependencies</h2> + +<p>Minimalist GNU for Windows <a href="http://www.mingw.org/">MinGW</a> provides the +tool set used to build the library and should be installed. When the MinGW installer +starts select the mingw32-base and mingw32-gcc-g++ components. From the menu select +"Installation" -> "Apply Changes", then click "Apply". Finally add C:\\MinGW\\bin +to the PATH variable.</p> + +<p>CMake is required to build the library and can be downloaded from www.cmake.org</p> + +In order to use the Python language wrapper install <a href="https://www.python.org">Python</a> + +<p>The C Foreign Function Interface for Python <a href="https://cffi.readthedocs.org/en/latest/">CFFI</a> module +is also required, if you wish to use the Python module.</p> + +<ul type="disc"> + <li>pip install cffi</li> +</ul> + +In order to build the documentation <a href="http://www.stack.nl/~dimitri/doxygen/">doxygen</a> is required. + +<h2>Build Instructions</h2> + +<p>Start a command prompt as an administrator</p> + +<p>The default build is for 64 bit machines, Elliptic curve BN254CX and curve type Weierstrass</p> + +<ol type="disc"> + <li>mkdir target\\build</li> + <li>cd target\\build</li> + <li>cmake -G "MinGW Makefiles" ..\\..</li> + <li>mingw32-make</li> + <li>mingw32-make test</li> + <li>mingw32-make doc</li> + <li>mingw32-make install</li> +</ol> + +<p> + +Post install append the PATH system variable to point to the install ./lib. + +My Computer -> Properties -> Advanced > Environment Variables + +</p> + + +<p>The build can be configured using by setting flags on the command line i.e.</p> + +<ol type="disc"> + <li>cmake -G "MinGW Makefiles" -DWORD_LENGTH=32 ../..</li> +</ol> + +<h2>Uninstall software</h2> + +<ul type="disc"> + <li>mingw32-make uninstall</li> +</ul> + +<h2>Building an installer</h2> + +<p>After having built the libraries you can build a Windows installer using this command</p> + +<ul type="disc"> + <li>sudo mingw32-make package</li> +</ul> + +<p>In order for this to work <a href="http://nsis.sourceforge.net/Download">NSSI</a> has +to have been installed</p> + +*/ + + + http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto-c/blob/8d28d2c3/doc/AMCL.pdf ---------------------------------------------------------------------- diff --git a/doc/AMCL.pdf b/doc/AMCL.pdf new file mode 100644 index 0000000..e4fa685 Binary files /dev/null and b/doc/AMCL.pdf differ http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto-c/blob/8d28d2c3/doc/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt new file mode 100644 index 0000000..4a99c21 --- /dev/null +++ b/doc/CMakeLists.txt @@ -0,0 +1,19 @@ +# Build Documentation + +find_package(Doxygen QUIET) +if(NOT DOXYGEN_FOUND) + message(STATUS "Doxygen not found. Documentation will not be built.") +else() + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile @ONLY) + + add_custom_target(doc + ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + COMMENT "Generating documentation with Doxygen" VERBATIM) + + file(COPY ${PROJECT_SOURCE_DIR}/doc/AMCL.pdf DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/html/") +endif() + + + +
