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