| # 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() |