44#include < cryptopp/sha3.h>
55#include < openssl/evp.h>
66#include < secp256k1_recovery.h>
7+ #include < vector>
78
89#include < libff/algebra/curves/alt_bn128/alt_bn128_pp.hpp>
910#include < libff/common/profiling.hpp>
@@ -408,6 +409,18 @@ void blst_p2_affine_set_infinity(blst_p2_affine *blstp) {
408409 memset (blstp, 0 , sizeof (*blstp));
409410}
410411
412+ g1point* g1point_inf () {
413+ struct g1point *result = (struct g1point *)kore_alloc (sizeof (struct g1point ));
414+
415+ blockheader g1pointhdr =
416+ get_block_header_for_symbol ((uint64_t )get_tag_for_symbol_name (" Lblg1Point{}" ));
417+ result->h = g1pointhdr;
418+
419+ result->x = zero_mpz_ptr ();
420+ result->y = zero_mpz_ptr ();
421+ return result;
422+ }
423+
411424g1point* blst_p1_to_g1point (const blst_p1 *p) {
412425 struct g1point *result = (struct g1point *)kore_alloc (sizeof (struct g1point ));
413426
@@ -430,6 +443,20 @@ g1point* blst_p1_to_g1point(const blst_p1 *p) {
430443 return result;
431444}
432445
446+ g2point* g2point_inf () {
447+ struct g2point *result = (struct g2point *)kore_alloc (sizeof (struct g2point ));
448+
449+ blockheader g2pointhdr =
450+ get_block_header_for_symbol ((uint64_t )get_tag_for_symbol_name (" Lblg2Point{}" ));
451+ result->h = g2pointhdr;
452+
453+ result->x0 = zero_mpz_ptr ();
454+ result->y0 = zero_mpz_ptr ();
455+ result->x1 = zero_mpz_ptr ();
456+ result->y1 = zero_mpz_ptr ();
457+ return result;
458+ }
459+
433460g2point* blst_p2_to_g2point (const blst_p2 *p) {
434461 struct g2point *result = (struct g2point *)kore_alloc (sizeof (struct g2point ));
435462
@@ -556,6 +583,71 @@ struct g1point *hook_KRYPTO_bls12G1Mul(g1point *point, mpz_t scalar) {
556583 return blst_p1_to_g1point (&result);
557584}
558585
586+ struct g1point *hook_KRYPTO_bls12G1Msm (list* scalars, list* g1) {
587+ mpz_ptr scalars_size = hook_LIST_size (scalars);
588+ mpz_ptr g1size = hook_LIST_size (g1);
589+ unsigned long scalars_size_long = mpz_get_ui (scalars_size);
590+ unsigned long g1size_long = mpz_get_ui (g1size);
591+ mpz_clear (scalars_size);
592+ mpz_clear (g1size);
593+
594+ if (scalars_size_long != g1size_long) {
595+ throw std::invalid_argument (" mismatched list sizes" );
596+ }
597+
598+ std::vector<blst_p1_affine> points (g1size_long);
599+ std::vector<blst_scalar> blst_scalars (g1size_long);
600+
601+ int valid_point_count = 0 ;
602+ int first_nbits = 0 ;
603+ for (unsigned long i = 0 ; i < g1size_long; i++) {
604+ inj *injg1 = (inj *)hook_LIST_get_long (g1, i);
605+ g1point* g1pt = (g1point *)injg1->data ;
606+
607+ if (!g1point_to_blst_p1_affine (&points[valid_point_count], g1pt)) {
608+ throw std::invalid_argument (" Invalid point" );
609+ }
610+ if (blst_p1_affine_is_inf (&points[valid_point_count])) {
611+ continue ;
612+ }
613+
614+ inj *injs1 = (inj *)hook_LIST_get_long (scalars, i);
615+ mpz_ptr scalar = (mpz_ptr)injs1->data ;
616+ if (valid_point_count == 0 ) {
617+ first_nbits = mpz_cmp_ui (scalar, 0 ) == 0 ? 0 : mpz_sizeinbase (scalar, 2 );
618+ }
619+ if (!mpz_ptr_to_blst_scalar (&blst_scalars[valid_point_count], scalar)) {
620+ throw std::invalid_argument (" Invalid scalar" );
621+ }
622+ valid_point_count++;
623+ }
624+
625+ if (valid_point_count == 0 ) {
626+ return g1point_inf ();
627+ }
628+ if (valid_point_count == 1 ) {
629+ blst_p1 blstp;
630+ blst_p1_from_affine (&blstp, &points[0 ]);
631+ blst_p1 result;
632+ blst_p1_mult (&result, &blstp, blst_scalars[0 ].b , first_nbits);
633+ return blst_p1_to_g1point (&result);
634+ }
635+
636+ size_t scratch_size = blst_p1s_mult_pippenger_scratch_sizeof (valid_point_count);
637+ std::vector<limb_t > scratch (scratch_size / sizeof (limb_t ) + 1 );
638+
639+ const byte *scalars_arg[2 ] = {(byte *)blst_scalars.data (), NULL };
640+ const blst_p1_affine *points_arg[2 ] = {points.data (), NULL };
641+ blst_p1 result;
642+ blst_p1s_mult_pippenger
643+ ( &result
644+ , points_arg, valid_point_count
645+ , scalars_arg, sizeof (blst_scalars[0 ]) * 8
646+ , scratch.data ()
647+ );
648+ return blst_p1_to_g1point (&result);
649+ }
650+
559651struct g2point *hook_KRYPTO_bls12G2Mul (g2point *point, mpz_t scalar) {
560652 blst_scalar blstscalar;
561653 blst_p2 blstp;
@@ -572,6 +664,71 @@ struct g2point *hook_KRYPTO_bls12G2Mul(g2point *point, mpz_t scalar) {
572664 return blst_p2_to_g2point (&result);
573665}
574666
667+ struct g2point *hook_KRYPTO_bls12G2Msm (list* scalars, list* g2) {
668+ mpz_ptr scalars_size = hook_LIST_size (scalars);
669+ mpz_ptr g2size = hook_LIST_size (g2);
670+ unsigned long scalars_size_long = mpz_get_ui (scalars_size);
671+ unsigned long g2size_long = mpz_get_ui (g2size);
672+ mpz_clear (scalars_size);
673+ mpz_clear (g2size);
674+
675+ if (scalars_size_long != g2size_long) {
676+ throw std::invalid_argument (" mismatched list sizes" );
677+ }
678+
679+ std::vector<blst_p2_affine> points (g2size_long);
680+ std::vector<blst_scalar> blst_scalars (g2size_long);
681+
682+ int valid_point_count = 0 ;
683+ int first_nbits = 0 ;
684+ for (unsigned long i = 0 ; i < g2size_long; i++) {
685+ inj *injg2 = (inj *)hook_LIST_get_long (g2, i);
686+ g2point* g2pt = (g2point *)injg2->data ;
687+
688+ if (!g2point_to_blst_p2_affine (&points[valid_point_count], g2pt)) {
689+ throw std::invalid_argument (" Invalid point" );
690+ }
691+ if (blst_p2_affine_is_inf (&points[valid_point_count])) {
692+ continue ;
693+ }
694+
695+ inj *injs = (inj *)hook_LIST_get_long (scalars, i);
696+ mpz_ptr scalar = (mpz_ptr)injs->data ;
697+ if (valid_point_count == 0 ) {
698+ first_nbits = mpz_cmp_ui (scalar, 0 ) == 0 ? 0 : mpz_sizeinbase (scalar, 2 );
699+ }
700+ if (!mpz_ptr_to_blst_scalar (&blst_scalars[valid_point_count], scalar)) {
701+ throw std::invalid_argument (" Invalid scalar" );
702+ }
703+ valid_point_count++;
704+ }
705+
706+ if (valid_point_count == 0 ) {
707+ return g2point_inf ();
708+ }
709+ if (valid_point_count == 1 ) {
710+ blst_p2 blstp;
711+ blst_p2_from_affine (&blstp, &points[0 ]);
712+ blst_p2 result;
713+ blst_p2_mult (&result, &blstp, blst_scalars[0 ].b , first_nbits);
714+ return blst_p2_to_g2point (&result);
715+ }
716+
717+ size_t scratch_size = blst_p2s_mult_pippenger_scratch_sizeof (valid_point_count);
718+ std::vector<limb_t > scratch (scratch_size / sizeof (limb_t ) + 1 );
719+
720+ const byte *scalars_arg[2 ] = {(byte *)blst_scalars.data (), NULL };
721+ const blst_p2_affine *points_arg[2 ] = {points.data (), NULL };
722+ blst_p2 result;
723+ blst_p2s_mult_pippenger
724+ ( &result
725+ , points_arg, valid_point_count
726+ , scalars_arg, sizeof (blst_scalars[0 ]) * 8
727+ , scratch.data ()
728+ );
729+ return blst_p2_to_g2point (&result);
730+ }
731+
575732bool hook_KRYPTO_bls12G1InSubgroup (g1point *point) {
576733 blst_p1 blstp;
577734
0 commit comments