github.com/platonnetwork/platon-go@v0.7.6/crypto/bls/mcl.go (about)

     1  package bls
     2  
     3  /*
     4  #cgo !windows LDFLAGS:-L${SRCDIR}/bls_linux_darwin/lib
     5  #cgo windows CFLAGS: -I${SRCDIR}/bls_win/include
     6  #cgo windows LDFLAGS: -L${SRCDIR}/bls_win/lib
     7  #cgo windows LDFLAGS: -lbls384 -lmclbn384
     8  #cgo !windows CFLAGS: -I${SRCDIR}/bls_linux_darwin/include
     9  #cgo windows CFLAGS:-DMCLBN_FP_UNIT_SIZE=6
    10  #cgo !windows CFLAGS:-DMCLBN_FP_UNIT_SIZE=6
    11  #cgo !windows LDFLAGS: -lbls384 -lmclbn384 -lmcl -lgmp -lgmpxx -lstdc++ -lcrypto
    12  #include <mcl/bn.h>
    13  */
    14  import "C"
    15  import "fmt"
    16  import "unsafe"
    17  
    18  // CurveFp254BNb -- 254 bit curve
    19  const CurveFp254BNb = C.mclBn_CurveFp254BNb
    20  
    21  // CurveFp382_1 -- 382 bit curve 1
    22  const CurveFp382_1 = C.mclBn_CurveFp382_1
    23  
    24  // CurveFp382_2 -- 382 bit curve 2
    25  const CurveFp382_2 = C.mclBn_CurveFp382_2
    26  
    27  // BLS12_381
    28  const BLS12_381 = C.MCL_BLS12_381
    29  
    30  // IoSerializeHexStr
    31  const IoSerializeHexStr = C.MCLBN_IO_SERIALIZE_HEX_STR
    32  
    33  // GetFrUnitSize() --
    34  func GetFrUnitSize() int {
    35  	return int(C.MCLBN_FR_UNIT_SIZE)
    36  }
    37  
    38  // GetFpUnitSize() --
    39  // same as GetMaxOpUnitSize()
    40  func GetFpUnitSize() int {
    41  	return int(C.MCLBN_FP_UNIT_SIZE)
    42  }
    43  
    44  // GetMaxOpUnitSize --
    45  func GetMaxOpUnitSize() int {
    46  	return int(C.MCLBN_FP_UNIT_SIZE)
    47  }
    48  
    49  // GetOpUnitSize --
    50  // the length of Fr is GetOpUnitSize() * 8 bytes
    51  func GetOpUnitSize() int {
    52  	return int(C.mclBn_getOpUnitSize())
    53  }
    54  
    55  // GetCurveOrder --
    56  // return the order of G1
    57  func GetCurveOrder() string {
    58  	buf := make([]byte, 1024)
    59  	// #nosec
    60  	n := C.mclBn_getCurveOrder((*C.char)(unsafe.Pointer(&buf[0])), C.size_t(len(buf)))
    61  	if n == 0 {
    62  		panic("implementation err. size of buf is small")
    63  	}
    64  	return string(buf[:n])
    65  }
    66  
    67  // GetFieldOrder --
    68  // return the characteristic of the field where a curve is defined
    69  func GetFieldOrder() string {
    70  	buf := make([]byte, 1024)
    71  	// #nosec
    72  	n := C.mclBn_getFieldOrder((*C.char)(unsafe.Pointer(&buf[0])), C.size_t(len(buf)))
    73  	if n == 0 {
    74  		panic("implementation err. size of buf is small")
    75  	}
    76  	return string(buf[:n])
    77  }
    78  
    79  // Fr --
    80  type Fr struct {
    81  	v C.mclBnFr
    82  }
    83  
    84  // getPointer --
    85  func (x *Fr) getPointer() (p *C.mclBnFr) {
    86  	// #nosec
    87  	return (*C.mclBnFr)(unsafe.Pointer(x))
    88  }
    89  
    90  // Clear --
    91  func (x *Fr) Clear() {
    92  	// #nosec
    93  	C.mclBnFr_clear(x.getPointer())
    94  }
    95  
    96  // SetInt64 --
    97  func (x *Fr) SetInt64(v int64) {
    98  	// #nosec
    99  	C.mclBnFr_setInt(x.getPointer(), C.int64_t(v))
   100  }
   101  
   102  // SetString --
   103  func (x *Fr) SetString(s string, base int) error {
   104  	buf := []byte(s)
   105  	// #nosec
   106  	err := C.mclBnFr_setStr(x.getPointer(), (*C.char)(unsafe.Pointer(&buf[0])), C.size_t(len(buf)), C.int(base))
   107  	if err != 0 {
   108  		return fmt.Errorf("err mclBnFr_setStr %x", err)
   109  	}
   110  	return nil
   111  }
   112  
   113  // Deserialize --
   114  func (x *Fr) Deserialize(buf []byte) error {
   115  	// #nosec
   116  	err := C.mclBnFr_deserialize(x.getPointer(), unsafe.Pointer(&buf[0]), C.size_t(len(buf)))
   117  	if err == 0 {
   118  		return fmt.Errorf("err mclBnFr_deserialize %x", buf)
   119  	}
   120  	return nil
   121  }
   122  
   123  // SetLittleEndian --
   124  func (x *Fr) SetLittleEndian(buf []byte) error {
   125  	// #nosec
   126  	err := C.mclBnFr_setLittleEndian(x.getPointer(), unsafe.Pointer(&buf[0]), C.size_t(len(buf)))
   127  	if err != 0 {
   128  		return fmt.Errorf("err mclBnFr_setLittleEndian %x", err)
   129  	}
   130  	return nil
   131  }
   132  
   133  // IsEqual --
   134  func (x *Fr) IsEqual(rhs *Fr) bool {
   135  	return C.mclBnFr_isEqual(x.getPointer(), rhs.getPointer()) == 1
   136  }
   137  
   138  // IsZero --
   139  func (x *Fr) IsZero() bool {
   140  	return C.mclBnFr_isZero(x.getPointer()) == 1
   141  }
   142  
   143  // IsOne --
   144  func (x *Fr) IsOne() bool {
   145  	return C.mclBnFr_isOne(x.getPointer()) == 1
   146  }
   147  
   148  // SetByCSPRNG --
   149  func (x *Fr) SetByCSPRNG() {
   150  	err := C.mclBnFr_setByCSPRNG(x.getPointer())
   151  	if err != 0 {
   152  		panic("err mclBnFr_setByCSPRNG")
   153  	}
   154  }
   155  
   156  // SetHashOf --
   157  func (x *Fr) SetHashOf(buf []byte) bool {
   158  	// #nosec
   159  	return C.mclBnFr_setHashOf(x.getPointer(), unsafe.Pointer(&buf[0]), C.size_t(len(buf))) == 1
   160  }
   161  
   162  // GetString --
   163  func (x *Fr) GetString(base int) string {
   164  	buf := make([]byte, 2048)
   165  	// #nosec
   166  	n := C.mclBnFr_getStr((*C.char)(unsafe.Pointer(&buf[0])), C.size_t(len(buf)), x.getPointer(), C.int(base))
   167  	if n == 0 {
   168  		panic("err mclBnFr_getStr")
   169  	}
   170  	return string(buf[:n])
   171  }
   172  
   173  // Serialize --
   174  func (x *Fr) Serialize() []byte {
   175  	buf := make([]byte, 2048)
   176  	// #nosec
   177  	n := C.mclBnFr_serialize(unsafe.Pointer(&buf[0]), C.size_t(len(buf)), x.getPointer())
   178  	if n == 0 {
   179  		panic("err mclBnFr_serialize")
   180  	}
   181  	return buf[:n]
   182  }
   183  
   184  // FrNeg --
   185  func FrNeg(out *Fr, x *Fr) {
   186  	C.mclBnFr_neg(out.getPointer(), x.getPointer())
   187  }
   188  
   189  // FrInv --
   190  func FrInv(out *Fr, x *Fr) {
   191  	C.mclBnFr_inv(out.getPointer(), x.getPointer())
   192  }
   193  
   194  // FrAdd --
   195  func FrAdd(out *Fr, x *Fr, y *Fr) {
   196  	C.mclBnFr_add(out.getPointer(), x.getPointer(), y.getPointer())
   197  }
   198  
   199  // FrSub --
   200  func FrSub(out *Fr, x *Fr, y *Fr) {
   201  	C.mclBnFr_sub(out.getPointer(), x.getPointer(), y.getPointer())
   202  }
   203  
   204  // FrMul --
   205  func FrMul(out *Fr, x *Fr, y *Fr) {
   206  	C.mclBnFr_mul(out.getPointer(), x.getPointer(), y.getPointer())
   207  }
   208  
   209  // FrDiv --
   210  func FrDiv(out *Fr, x *Fr, y *Fr) {
   211  	C.mclBnFr_div(out.getPointer(), x.getPointer(), y.getPointer())
   212  }
   213  
   214  // G1 --
   215  type G1 struct {
   216  	v C.mclBnG1
   217  }
   218  
   219  // getPointer --
   220  func (x *G1) getPointer() (p *C.mclBnG1) {
   221  	// #nosec
   222  	return (*C.mclBnG1)(unsafe.Pointer(x))
   223  }
   224  
   225  // Clear --
   226  func (x *G1) Clear() {
   227  	// #nosec
   228  	C.mclBnG1_clear(x.getPointer())
   229  }
   230  
   231  // SetString --
   232  func (x *G1) SetString(s string, base int) error {
   233  	buf := []byte(s)
   234  	// #nosec
   235  	err := C.mclBnG1_setStr(x.getPointer(), (*C.char)(unsafe.Pointer(&buf[0])), C.size_t(len(buf)), C.int(base))
   236  	if err != 0 {
   237  		return fmt.Errorf("err mclBnG1_setStr %x", err)
   238  	}
   239  	return nil
   240  }
   241  
   242  // Deserialize --
   243  func (x *G1) Deserialize(buf []byte) error {
   244  	// #nosec
   245  	err := C.mclBnG1_deserialize(x.getPointer(), unsafe.Pointer(&buf[0]), C.size_t(len(buf)))
   246  	if err == 0 {
   247  		return fmt.Errorf("err mclBnG1_deserialize %x", buf)
   248  	}
   249  	return nil
   250  }
   251  
   252  // IsEqual --
   253  func (x *G1) IsEqual(rhs *G1) bool {
   254  	return C.mclBnG1_isEqual(x.getPointer(), rhs.getPointer()) == 1
   255  }
   256  
   257  // IsZero --
   258  func (x *G1) IsZero() bool {
   259  	return C.mclBnG1_isZero(x.getPointer()) == 1
   260  }
   261  
   262  // HashAndMapTo --
   263  func (x *G1) HashAndMapTo(buf []byte) error {
   264  	// #nosec
   265  	err := C.mclBnG1_hashAndMapTo(x.getPointer(), unsafe.Pointer(&buf[0]), C.size_t(len(buf)))
   266  	if err != 0 {
   267  		return fmt.Errorf("err mclBnG1_hashAndMapTo %x", err)
   268  	}
   269  	return nil
   270  }
   271  
   272  // GetString --
   273  func (x *G1) GetString(base int) string {
   274  	buf := make([]byte, 2048)
   275  	// #nosec
   276  	n := C.mclBnG1_getStr((*C.char)(unsafe.Pointer(&buf[0])), C.size_t(len(buf)), x.getPointer(), C.int(base))
   277  	if n == 0 {
   278  		panic("err mclBnG1_getStr")
   279  	}
   280  	return string(buf[:n])
   281  }
   282  
   283  // Serialize --
   284  func (x *G1) Serialize() []byte {
   285  	buf := make([]byte, 2048)
   286  	// #nosec
   287  	n := C.mclBnG1_serialize(unsafe.Pointer(&buf[0]), C.size_t(len(buf)), x.getPointer())
   288  	if n == 0 {
   289  		panic("err mclBnG1_serialize")
   290  	}
   291  	return buf[:n]
   292  }
   293  
   294  // G1Neg --
   295  func G1Neg(out *G1, x *G1) {
   296  	C.mclBnG1_neg(out.getPointer(), x.getPointer())
   297  }
   298  
   299  // G1Dbl --
   300  func G1Dbl(out *G1, x *G1) {
   301  	C.mclBnG1_dbl(out.getPointer(), x.getPointer())
   302  }
   303  
   304  // G1Add --
   305  func G1Add(out *G1, x *G1, y *G1) {
   306  	C.mclBnG1_add(out.getPointer(), x.getPointer(), y.getPointer())
   307  }
   308  
   309  // G1Sub --
   310  func G1Sub(out *G1, x *G1, y *G1) {
   311  	C.mclBnG1_sub(out.getPointer(), x.getPointer(), y.getPointer())
   312  }
   313  
   314  // G1Mul --
   315  func G1Mul(out *G1, x *G1, y *Fr) {
   316  	C.mclBnG1_mul(out.getPointer(), x.getPointer(), y.getPointer())
   317  }
   318  
   319  // G1MulCT -- constant time (depending on bit lengh of y)
   320  func G1MulCT(out *G1, x *G1, y *Fr) {
   321  	C.mclBnG1_mulCT(out.getPointer(), x.getPointer(), y.getPointer())
   322  }
   323  
   324  // G2 --
   325  type G2 struct {
   326  	v C.mclBnG2
   327  }
   328  
   329  // getPointer --
   330  func (x *G2) getPointer() (p *C.mclBnG2) {
   331  	// #nosec
   332  	return (*C.mclBnG2)(unsafe.Pointer(x))
   333  }
   334  
   335  
   336  // Clear --
   337  func (x *G2) Clear() {
   338  	// #nosec
   339  	C.mclBnG2_clear(x.getPointer())
   340  }
   341  
   342  // SetString --
   343  func (x *G2) SetString(s string, base int) error {
   344  	buf := []byte(s)
   345  	// #nosec
   346  	err := C.mclBnG2_setStr(x.getPointer(), (*C.char)(unsafe.Pointer(&buf[0])), C.size_t(len(buf)), C.int(base))
   347  	if err != 0 {
   348  		return fmt.Errorf("err mclBnG2_setStr %x", err)
   349  	}
   350  	return nil
   351  }
   352  
   353  // Deserialize --
   354  func (x *G2) Deserialize(buf []byte) error {
   355  	// #nosec
   356  	err := C.mclBnG2_deserialize(x.getPointer(), unsafe.Pointer(&buf[0]), C.size_t(len(buf)))
   357  	if err == 0 {
   358  		return fmt.Errorf("err mclBnG2_deserialize %x", buf)
   359  	}
   360  	return nil
   361  }
   362  
   363  // IsEqual --
   364  func (x *G2) IsEqual(rhs *G2) bool {
   365  	return C.mclBnG2_isEqual(x.getPointer(), rhs.getPointer()) == 1
   366  }
   367  
   368  // IsZero --
   369  func (x *G2) IsZero() bool {
   370  	return C.mclBnG2_isZero(x.getPointer()) == 1
   371  }
   372  
   373  // HashAndMapTo --
   374  func (x *G2) HashAndMapTo(buf []byte) error {
   375  	// #nosec
   376  	err := C.mclBnG2_hashAndMapTo(x.getPointer(), unsafe.Pointer(&buf[0]), C.size_t(len(buf)))
   377  	if err != 0 {
   378  		return fmt.Errorf("err mclBnG2_hashAndMapTo %x", err)
   379  	}
   380  	return nil
   381  }
   382  
   383  // GetString --
   384  func (x *G2) GetString(base int) string {
   385  	buf := make([]byte, 2048)
   386  	// #nosec
   387  	n := C.mclBnG2_getStr((*C.char)(unsafe.Pointer(&buf[0])), C.size_t(len(buf)), x.getPointer(), C.int(base))
   388  	if n == 0 {
   389  		panic("err mclBnG2_getStr")
   390  	}
   391  	return string(buf[:n])
   392  }
   393  
   394  // Serialize --
   395  func (x *G2) Serialize() []byte {
   396  	buf := make([]byte, 2048)
   397  	// #nosec
   398  	n := C.mclBnG2_serialize(unsafe.Pointer(&buf[0]), C.size_t(len(buf)), x.getPointer())
   399  	if n == 0 {
   400  		panic("err mclBnG2_serialize")
   401  	}
   402  	return buf[:n]
   403  }
   404  
   405  // G2Neg --
   406  func G2Neg(out *G2, x *G2) {
   407  	C.mclBnG2_neg(out.getPointer(), x.getPointer())
   408  }
   409  
   410  // G2Dbl --
   411  func G2Dbl(out *G2, x *G2) {
   412  	C.mclBnG2_dbl(out.getPointer(), x.getPointer())
   413  }
   414  
   415  // G2Add --
   416  func G2Add(out *G2, x *G2, y *G2) {
   417  	C.mclBnG2_add(out.getPointer(), x.getPointer(), y.getPointer())
   418  }
   419  
   420  // G2Sub --
   421  func G2Sub(out *G2, x *G2, y *G2) {
   422  	C.mclBnG2_sub(out.getPointer(), x.getPointer(), y.getPointer())
   423  }
   424  
   425  // G2Mul --
   426  func G2Mul(out *G2, x *G2, y *Fr) {
   427  	C.mclBnG2_mul(out.getPointer(), x.getPointer(), y.getPointer())
   428  }
   429  
   430  // GT --
   431  type GT struct {
   432  	v C.mclBnGT
   433  }
   434  
   435  // getPointer --
   436  func (x *GT) getPointer() (p *C.mclBnGT) {
   437  	// #nosec
   438  	return (*C.mclBnGT)(unsafe.Pointer(x))
   439  }
   440  
   441  // Clear --
   442  func (x *GT) Clear() {
   443  	// #nosec
   444  	C.mclBnGT_clear(x.getPointer())
   445  }
   446  
   447  // SetInt64 --
   448  func (x *GT) SetInt64(v int64) {
   449  	// #nosec
   450  	C.mclBnGT_setInt(x.getPointer(), C.int64_t(v))
   451  }
   452  
   453  // SetString --
   454  func (x *GT) SetString(s string, base int) error {
   455  	buf := []byte(s)
   456  	// #nosec
   457  	err := C.mclBnGT_setStr(x.getPointer(), (*C.char)(unsafe.Pointer(&buf[0])), C.size_t(len(buf)), C.int(base))
   458  	if err != 0 {
   459  		return fmt.Errorf("err mclBnGT_setStr %x", err)
   460  	}
   461  	return nil
   462  }
   463  
   464  // Deserialize --
   465  func (x *GT) Deserialize(buf []byte) error {
   466  	// #nosec
   467  	err := C.mclBnGT_deserialize(x.getPointer(), unsafe.Pointer(&buf[0]), C.size_t(len(buf)))
   468  	if err == 0 {
   469  		return fmt.Errorf("err mclBnGT_deserialize %x", buf)
   470  	}
   471  	return nil
   472  }
   473  
   474  // IsEqual --
   475  func (x *GT) IsEqual(rhs *GT) bool {
   476  	return C.mclBnGT_isEqual(x.getPointer(), rhs.getPointer()) == 1
   477  }
   478  
   479  // IsZero --
   480  func (x *GT) IsZero() bool {
   481  	return C.mclBnGT_isZero(x.getPointer()) == 1
   482  }
   483  
   484  // IsOne --
   485  func (x *GT) IsOne() bool {
   486  	return C.mclBnGT_isOne(x.getPointer()) == 1
   487  }
   488  
   489  // GetString --
   490  func (x *GT) GetString(base int) string {
   491  	buf := make([]byte, 2048)
   492  	// #nosec
   493  	n := C.mclBnGT_getStr((*C.char)(unsafe.Pointer(&buf[0])), C.size_t(len(buf)), x.getPointer(), C.int(base))
   494  	if n == 0 {
   495  		panic("err mclBnGT_getStr")
   496  	}
   497  	return string(buf[:n])
   498  }
   499  
   500  // Serialize --
   501  func (x *GT) Serialize() []byte {
   502  	buf := make([]byte, 2048)
   503  	// #nosec
   504  	n := C.mclBnGT_serialize(unsafe.Pointer(&buf[0]), C.size_t(len(buf)), x.getPointer())
   505  	if n == 0 {
   506  		panic("err mclBnGT_serialize")
   507  	}
   508  	return buf[:n]
   509  }
   510  
   511  // GTNeg --
   512  func GTNeg(out *GT, x *GT) {
   513  	C.mclBnGT_neg(out.getPointer(), x.getPointer())
   514  }
   515  
   516  // GTInv --
   517  func GTInv(out *GT, x *GT) {
   518  	C.mclBnGT_inv(out.getPointer(), x.getPointer())
   519  }
   520  
   521  // GTAdd --
   522  func GTAdd(out *GT, x *GT, y *GT) {
   523  	C.mclBnGT_add(out.getPointer(), x.getPointer(), y.getPointer())
   524  }
   525  
   526  // GTSub --
   527  func GTSub(out *GT, x *GT, y *GT) {
   528  	C.mclBnGT_sub(out.getPointer(), x.getPointer(), y.getPointer())
   529  }
   530  
   531  // GTMul --
   532  func GTMul(out *GT, x *GT, y *GT) {
   533  	C.mclBnGT_mul(out.getPointer(), x.getPointer(), y.getPointer())
   534  }
   535  
   536  // GTDiv --
   537  func GTDiv(out *GT, x *GT, y *GT) {
   538  	C.mclBnGT_div(out.getPointer(), x.getPointer(), y.getPointer())
   539  }
   540  
   541  // GTPow --
   542  func GTPow(out *GT, x *GT, y *Fr) {
   543  	C.mclBnGT_pow(out.getPointer(), x.getPointer(), y.getPointer())
   544  }
   545  
   546  // Pairing --
   547  func Pairing(out *GT, x *G1, y *G2) {
   548  	C.mclBn_pairing(out.getPointer(), x.getPointer(), y.getPointer())
   549  }
   550  
   551  // FinalExp --
   552  func FinalExp(out *GT, x *GT) {
   553  	C.mclBn_finalExp(out.getPointer(), x.getPointer())
   554  }
   555  
   556  // MillerLoop --
   557  func MillerLoop(out *GT, x *G1, y *G2) {
   558  	C.mclBn_millerLoop(out.getPointer(), x.getPointer(), y.getPointer())
   559  }
   560  
   561  // GetUint64NumToPrecompute --
   562  func GetUint64NumToPrecompute() int {
   563  	return int(C.mclBn_getUint64NumToPrecompute())
   564  }
   565  
   566  // PrecomputeG2 --
   567  func PrecomputeG2(Qbuf []uint64, Q *G2) {
   568  	// #nosec
   569  	C.mclBn_precomputeG2((*C.uint64_t)(unsafe.Pointer(&Qbuf[0])), Q.getPointer())
   570  }
   571  
   572  // PrecomputedMillerLoop --
   573  func PrecomputedMillerLoop(out *GT, P *G1, Qbuf []uint64) {
   574  	// #nosec
   575  	C.mclBn_precomputedMillerLoop(out.getPointer(), P.getPointer(), (*C.uint64_t)(unsafe.Pointer(&Qbuf[0])))
   576  }
   577  
   578  // PrecomputedMillerLoop2 --
   579  func PrecomputedMillerLoop2(out *GT, P1 *G1, Q1buf []uint64, P2 *G1, Q2buf []uint64) {
   580  	// #nosec
   581  	C.mclBn_precomputedMillerLoop2(out.getPointer(), P1.getPointer(), (*C.uint64_t)(unsafe.Pointer(&Q1buf[0])), P1.getPointer(), (*C.uint64_t)(unsafe.Pointer(&Q1buf[0])))
   582  }
   583  
   584  // FrEvaluatePolynomial -- y = c[0] + c[1] * x + c[2] * x^2 + ...
   585  func FrEvaluatePolynomial(y *Fr, c []Fr, x *Fr) error {
   586  	// #nosec
   587  	err := C.mclBn_FrEvaluatePolynomial(y.getPointer(), (*C.mclBnFr)(unsafe.Pointer(&c[0])), (C.size_t)(len(c)), x.getPointer())
   588  	if err != 0 {
   589  		return fmt.Errorf("err mclBn_FrEvaluatePolynomial")
   590  	}
   591  	return nil
   592  }
   593  
   594  // G1EvaluatePolynomial -- y = c[0] + c[1] * x + c[2] * x^2 + ...
   595  func G1EvaluatePolynomial(y *G1, c []G1, x *Fr) error {
   596  	// #nosec
   597  	err := C.mclBn_G1EvaluatePolynomial(y.getPointer(), (*C.mclBnG1)(unsafe.Pointer(&c[0])), (C.size_t)(len(c)), x.getPointer())
   598  	if err != 0 {
   599  		return fmt.Errorf("err mclBn_G1EvaluatePolynomial")
   600  	}
   601  	return nil
   602  }
   603  
   604  // G2EvaluatePolynomial -- y = c[0] + c[1] * x + c[2] * x^2 + ...
   605  func G2EvaluatePolynomial(y *G2, c []G2, x *Fr) error {
   606  	// #nosec
   607  	err := C.mclBn_G2EvaluatePolynomial(y.getPointer(), (*C.mclBnG2)(unsafe.Pointer(&c[0])), (C.size_t)(len(c)), x.getPointer())
   608  	if err != 0 {
   609  		return fmt.Errorf("err mclBn_G2EvaluatePolynomial")
   610  	}
   611  	return nil
   612  }
   613  
   614  // FrLagrangeInterpolation --
   615  func FrLagrangeInterpolation(out *Fr, xVec []Fr, yVec []Fr) error {
   616  	if len(xVec) != len(yVec) {
   617  		return fmt.Errorf("err FrLagrangeInterpolation:bad size")
   618  	}
   619  	// #nosec
   620  	err := C.mclBn_FrLagrangeInterpolation(out.getPointer(), (*C.mclBnFr)(unsafe.Pointer(&xVec[0])), (*C.mclBnFr)(unsafe.Pointer(&yVec[0])), (C.size_t)(len(xVec)))
   621  	if err != 0 {
   622  		return fmt.Errorf("err FrLagrangeInterpolation")
   623  	}
   624  	return nil
   625  }
   626  
   627  // G1LagrangeInterpolation --
   628  func G1LagrangeInterpolation(out *G1, xVec []Fr, yVec []G1) error {
   629  	if len(xVec) != len(yVec) {
   630  		return fmt.Errorf("err G1LagrangeInterpolation:bad size")
   631  	}
   632  	// #nosec
   633  	err := C.mclBn_G1LagrangeInterpolation(out.getPointer(), (*C.mclBnFr)(unsafe.Pointer(&xVec[0])), (*C.mclBnG1)(unsafe.Pointer(&yVec[0])), (C.size_t)(len(xVec)))
   634  	if err != 0 {
   635  		return fmt.Errorf("err G1LagrangeInterpolation")
   636  	}
   637  	return nil
   638  }
   639  
   640  // G2LagrangeInterpolation --
   641  func G2LagrangeInterpolation(out *G2, xVec []Fr, yVec []G2) error {
   642  	if len(xVec) != len(yVec) {
   643  		return fmt.Errorf("err G2LagrangeInterpolation:bad size")
   644  	}
   645  	// #nosec
   646  	err := C.mclBn_G2LagrangeInterpolation(out.getPointer(), (*C.mclBnFr)(unsafe.Pointer(&xVec[0])), (*C.mclBnG2)(unsafe.Pointer(&yVec[0])), (C.size_t)(len(xVec)))
   647  	if err != 0 {
   648  		return fmt.Errorf("err G2LagrangeInterpolation")
   649  	}
   650  	return nil
   651  }
   652