123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167(*****************************************************************************)(* *)(* Copyright (c) 2020-2021 Danny Willems <be.danny.willems@gmail.com> *)(* *)(* Permission is hereby granted, free of charge, to any person obtaining a *)(* copy of this software and associated documentation files (the "Software"),*)(* to deal in the Software without restriction, including without limitation *)(* the rights to use, copy, modify, merge, publish, distribute, sublicense, *)(* and/or sell copies of the Software, and to permit persons to whom the *)(* Software is furnished to do so, subject to the following conditions: *)(* *)(* The above copyright notice and this permission notice shall be included *)(* in all copies or substantial portions of the Software. *)(* *)(* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR*)(* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *)(* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *)(* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER*)(* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *)(* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *)(* DEALINGS IN THE SOFTWARE. *)(* *)(*****************************************************************************)moduletypeT=sigincludeFf_sig.BASE(** Construct an element of Fq12 based on the following pattern:
Fq12 =
Fq6 (
Fq2(x: x0, y: x1))
Fq2(x: x2, y: x3))
Fq2(x: x4, y: x5)),
Fq6 (
Fq2(x: x6, y: x7))
Fq2(x: x8, y: x9))
Fq2(x: x10, y: x11))
x0, ..., x11 are the parameters of the function.
No check is applied.
Example of usage (pairing result of the multiplicative neutre elements):
Fq12.of_string
"2819105605953691245277803056322684086884703000473961065716485506033588504203831029066448642358042597501014294104502"
"1323968232986996742571315206151405965104242542339680722164220900812303524334628370163366153839984196298685227734799"
"2987335049721312504428602988447616328830341722376962214011674875969052835043875658579425548512925634040144704192135"
"3879723582452552452538684314479081967502111497413076598816163759028842927668327542875108457755966417881797966271311"
"261508182517997003171385743374653339186059518494239543139839025878870012614975302676296704930880982238308326681253"
"231488992246460459663813598342448669854473942105054381511346786719005883340876032043606739070883099647773793170614"
"3993582095516422658773669068931361134188738159766715576187490305611759126554796569868053818105850661142222948198557"
"1074773511698422344502264006159859710502164045911412750831641680783012525555872467108249271286757399121183508900634"
"2727588299083545686739024317998512740561167011046940249988557419323068809019137624943703910267790601287073339193943"
"493643299814437640914745677854369670041080344349607504656543355799077485536288866009245028091988146107059514546594"
"734401332196641441839439105942623141234148957972407782257355060229193854324927417865401895596108124443575283868655"
"2348330098288556420918672502923664952620152483128593484301759394583320358354186482723629999370241674973832318248497"
(* source for the test vectors: https://docs.rs/crate/pairing/0.16.0/source/src/bls12_381/tests/mod.rs *)
Undefined behaviours if the given elements are not in the field or any other
representation than decimal is used. Use this function carefully.
See https://docs.rs/crate/pairing/0.16.0/source/src/bls12_381/README.md for
more information on the instances used by the library.
FIXME: the function is not memory efficient because the elements are copied multiple times
*)valof_string:String.t->String.t->String.t->String.t->String.t->String.t->String.t->String.t->String.t->String.t->String.t->String.t->t(** Same than [of_string], using Z.t elements
FIXME: the function is not memory efficient because the elements are
copied multiple times
*)valof_z:Z.t->Z.t->Z.t->Z.t->Z.t->Z.t->Z.t->Z.t->Z.t->Z.t->Z.t->Z.t->tendmoduleMakeFq12(Stubs:S.RAW_BASE):T=structincludeS.Make(Stubs)letempty()=Bytes.makesize_in_bytes'\000'letof_zx0x1x2x3x4x5x6x7x8x9x10x11=letx0=Bytes.of_string(Z.to_bitsx0)inletx1=Bytes.of_string(Z.to_bitsx1)inletx2=Bytes.of_string(Z.to_bitsx2)inletx3=Bytes.of_string(Z.to_bitsx3)inletx4=Bytes.of_string(Z.to_bitsx4)inletx5=Bytes.of_string(Z.to_bitsx5)inletx6=Bytes.of_string(Z.to_bitsx6)inletx7=Bytes.of_string(Z.to_bitsx7)inletx8=Bytes.of_string(Z.to_bitsx8)inletx9=Bytes.of_string(Z.to_bitsx9)inletx10=Bytes.of_string(Z.to_bitsx10)inletx11=Bytes.of_string(Z.to_bitsx11)inletg=empty()inBytes.blitx00g0(min(Bytes.lengthx0)48);Bytes.blitx10g48(min(Bytes.lengthx1)48);Bytes.blitx20g96(min(Bytes.lengthx2)48);Bytes.blitx30g144(min(Bytes.lengthx3)48);Bytes.blitx40g192(min(Bytes.lengthx4)48);Bytes.blitx50g240(min(Bytes.lengthx5)48);Bytes.blitx60g288(min(Bytes.lengthx6)48);Bytes.blitx70g336(min(Bytes.lengthx7)48);Bytes.blitx80g384(min(Bytes.lengthx8)48);Bytes.blitx90g432(min(Bytes.lengthx9)48);Bytes.blitx100g480(min(Bytes.lengthx10)48);Bytes.blitx110g528(min(Bytes.lengthx11)48);of_bytes_exngletof_stringx0x1x2x3x4x5x6x7x8x9x10x11=letx0=Bytes.of_string(Z.to_bits(Z.of_stringx0))inletx1=Bytes.of_string(Z.to_bits(Z.of_stringx1))inletx2=Bytes.of_string(Z.to_bits(Z.of_stringx2))inletx3=Bytes.of_string(Z.to_bits(Z.of_stringx3))inletx4=Bytes.of_string(Z.to_bits(Z.of_stringx4))inletx5=Bytes.of_string(Z.to_bits(Z.of_stringx5))inletx6=Bytes.of_string(Z.to_bits(Z.of_stringx6))inletx7=Bytes.of_string(Z.to_bits(Z.of_stringx7))inletx8=Bytes.of_string(Z.to_bits(Z.of_stringx8))inletx9=Bytes.of_string(Z.to_bits(Z.of_stringx9))inletx10=Bytes.of_string(Z.to_bits(Z.of_stringx10))inletx11=Bytes.of_string(Z.to_bits(Z.of_stringx11))inletg=empty()inBytes.blitx00g0(min(Bytes.lengthx0)48);Bytes.blitx10g48(min(Bytes.lengthx1)48);Bytes.blitx20g96(min(Bytes.lengthx2)48);Bytes.blitx30g144(min(Bytes.lengthx3)48);Bytes.blitx40g192(min(Bytes.lengthx4)48);Bytes.blitx50g240(min(Bytes.lengthx5)48);Bytes.blitx60g288(min(Bytes.lengthx6)48);Bytes.blitx70g336(min(Bytes.lengthx7)48);Bytes.blitx80g384(min(Bytes.lengthx8)48);Bytes.blitx90g432(min(Bytes.lengthx9)48);Bytes.blitx100g480(min(Bytes.lengthx10)48);Bytes.blitx110g528(min(Bytes.lengthx11)48);of_bytes_exngletdiv_exnab=ifb=zerothenraiseDivision_by_zeroelsemula(inverse_exnb)letdiv_optab=ifb=zerothenNoneelseSome(mula(inverse_exnb))let(/)=div_exnend