diff --git a/src/lib_bls12_381_signature/bls12_381_signature.ml b/src/lib_bls12_381_signature/bls12_381_signature.ml index 75406dedc41a95826af31a06d6c5327767f5aa3b..f2868af844121429fbdf39bf135a8f6d72861642 100644 --- a/src/lib_bls12_381_signature/bls12_381_signature.ml +++ b/src/lib_bls12_381_signature/bls12_381_signature.ml @@ -241,10 +241,10 @@ module MinPk = struct else false else false) - let aggregate_signature_opt signatures = + let aggregate_signature_opt ?(subgroup_check = true) signatures = let signatures = Bls12_381.G2.affine_array_of_compressed_bytes_opt - ~subgroup_check:true + ~subgroup_check (Array.of_list signatures) in Option.map @@ -570,10 +570,10 @@ module MinSig = struct else false else false) - let aggregate_signature_opt signatures = + let aggregate_signature_opt ?(subgroup_check = true) signatures = let signatures = Bls12_381.G1.affine_array_of_compressed_bytes_opt - ~subgroup_check:true + ~subgroup_check (Array.of_list signatures) in Option.map diff --git a/src/lib_bls12_381_signature/bls12_381_signature.mli b/src/lib_bls12_381_signature/bls12_381_signature.mli index a81130d79fd35cf25ec489da05b1fbb77b463a2c..05601b2660f7d89be3cd18b6331c96971408d6ca 100644 --- a/src/lib_bls12_381_signature/bls12_381_signature.mli +++ b/src/lib_bls12_381_signature/bls12_381_signature.mli @@ -114,8 +114,11 @@ module MinPk : sig [signatures], following {{: https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-bls-signature-04#section-2.8 } section 2.8}. - Return [None] if [INVALID] is expected in the specification *) - val aggregate_signature_opt : signature list -> signature option + Return [None] if [INVALID] is expected in the specification. If + [subgroup_check] is set, the function also checks if the points are in G2. + (set by default) *) + val aggregate_signature_opt : + ?subgroup_check:bool -> signature list -> signature option (** [aggregate_public_key_opt ?subgroup_check pks] aggregates the public keys [pks]. If [subgroup_check] is set, the function also checks if the @@ -305,8 +308,11 @@ module MinSig : sig [signatures], following {{: https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-bls-signature-04#section-2.8 } section 2.8 }. - Return [None] if [INVALID] is expected in the specification *) - val aggregate_signature_opt : signature list -> signature option + Return [None] if [INVALID] is expected in the specification. If + [subgroup_check] is set, the function also checks if the points are in G1. + (set by default) *) + val aggregate_signature_opt : + ?subgroup_check:bool -> signature list -> signature option (** [aggregate_public_key_opt ?subgroup_check pks] aggregates the public keys [pks]. If [subgroup_check] is set, the function also checks if the diff --git a/src/lib_crypto/aggregate_signature.ml b/src/lib_crypto/aggregate_signature.ml index 6af35fdbba07d3a1233acaa267515c1c3d50b473..74a93319763c7dea482e662a6562485910c266c5 100644 --- a/src/lib_crypto/aggregate_signature.ml +++ b/src/lib_crypto/aggregate_signature.ml @@ -499,7 +499,7 @@ let aggregate_check pks signature = |> Option.map (Bls.aggregate_check pks) |> Option.value ~default:false -let aggregate_signature_opt signatures = +let aggregate_signature_opt ?subgroup_check signatures = let open Result_syntax in let aux acc s = match s with @@ -510,7 +510,7 @@ let aggregate_signature_opt signatures = in match List.fold_left_e aux [] signatures with | Ok signatures -> - Bls.aggregate_signature_opt signatures + Bls.aggregate_signature_opt ?subgroup_check signatures |> Option.map (fun s -> Bls12_381 s) | Error _ -> None diff --git a/src/lib_crypto/s.ml b/src/lib_crypto/s.ml index 49caeb494d030d6bd289b4c95f9dc3d4c9bd4693..9a8acebb6c82b388fb67a9b3366620699c8b3709 100644 --- a/src/lib_crypto/s.ml +++ b/src/lib_crypto/s.ml @@ -448,8 +448,9 @@ module type AGGREGATE_SIGNATURE = sig (Public_key.t * watermark option * bytes) list -> t -> bool (** [aggregate_signature_opt sig_list] creates an aggregated signature using - the list of signatures [sig_list]. *) - val aggregate_signature_opt : t list -> t option + the list of signatures [sig_list]. If [subgroup_check] is set, the + function also checks if the points are in the prime subgroup. *) + val aggregate_signature_opt : ?subgroup_check:bool -> t list -> t option (** [aggregate_public_key_opt pk_list] creates an aggregated public key using the list of public_keys [pk_list]. If [subgroup_check] is set, the function diff --git a/src/lib_protocol_environment/environment_V10.ml b/src/lib_protocol_environment/environment_V10.ml index 120d968900a74fa65e86fa4af666347a7596b817..1a917bcd6bb0c08be008a4819632a88111e82eb9 100644 --- a/src/lib_protocol_environment/environment_V10.ml +++ b/src/lib_protocol_environment/environment_V10.ml @@ -319,7 +319,12 @@ struct module Ed25519 = Tezos_crypto.Signature.Ed25519 module Secp256k1 = Tezos_crypto.Signature.Secp256k1 module P256 = Tezos_crypto.Signature.P256 - module Bls = Tezos_crypto.Signature.Bls + + module Bls = struct + include Tezos_crypto.Signature.Bls + + let aggregate_signature_opt = aggregate_signature_opt ~subgroup_check:true + end module Signature = struct include Tezos_crypto.Signature.V1 diff --git a/src/lib_protocol_environment/environment_V11.ml b/src/lib_protocol_environment/environment_V11.ml index 8849bb66fdff9d3f0602912a1ca2de5306e6492e..fb2daabfe8c5d174cc6ebfebdf07beadc813c53b 100644 --- a/src/lib_protocol_environment/environment_V11.ml +++ b/src/lib_protocol_environment/environment_V11.ml @@ -330,7 +330,12 @@ struct module Ed25519 = Tezos_crypto.Signature.Ed25519 module Secp256k1 = Tezos_crypto.Signature.Secp256k1 module P256 = Tezos_crypto.Signature.P256 - module Bls = Tezos_crypto.Signature.Bls + + module Bls = struct + include Tezos_crypto.Signature.Bls + + let aggregate_signature_opt = aggregate_signature_opt ~subgroup_check:true + end module Signature = struct include Tezos_crypto.Signature.V1 diff --git a/src/lib_protocol_environment/environment_V12.ml b/src/lib_protocol_environment/environment_V12.ml index f9b7148342b00365cd39d07db9c0c4197d6a12cc..cc0c61db5a49427a41164d1cf422e6e706acae4f 100644 --- a/src/lib_protocol_environment/environment_V12.ml +++ b/src/lib_protocol_environment/environment_V12.ml @@ -330,7 +330,12 @@ struct module Ed25519 = Tezos_crypto.Signature.Ed25519 module Secp256k1 = Tezos_crypto.Signature.Secp256k1 module P256 = Tezos_crypto.Signature.P256 - module Bls = Tezos_crypto.Signature.Bls + + module Bls = struct + include Tezos_crypto.Signature.Bls + + let aggregate_signature_opt = aggregate_signature_opt ~subgroup_check:true + end module Signature = struct include Tezos_crypto.Signature.V1 diff --git a/src/lib_protocol_environment/environment_V13.ml b/src/lib_protocol_environment/environment_V13.ml index a7c3daf2b9fb569aa4313fb70baaa803f55f1e45..43051c59c113489dda2214f1b5833112a60461e8 100644 --- a/src/lib_protocol_environment/environment_V13.ml +++ b/src/lib_protocol_environment/environment_V13.ml @@ -330,7 +330,12 @@ struct module Ed25519 = Tezos_crypto.Signature.Ed25519 module Secp256k1 = Tezos_crypto.Signature.Secp256k1 module P256 = Tezos_crypto.Signature.P256 - module Bls = Tezos_crypto.Signature.Bls + + module Bls = struct + include Tezos_crypto.Signature.Bls + + let aggregate_signature_opt = aggregate_signature_opt ~subgroup_check:true + end module Signature = struct include Tezos_crypto.Signature.V1 diff --git a/src/lib_protocol_environment/environment_V14.ml b/src/lib_protocol_environment/environment_V14.ml index 6ac9746abda461f3b7c2c09f88f24f437318669e..aceec0f8f6904eca6d32819b50dc865317ec04c3 100644 --- a/src/lib_protocol_environment/environment_V14.ml +++ b/src/lib_protocol_environment/environment_V14.ml @@ -335,7 +335,12 @@ struct module Ed25519 = Tezos_crypto.Signature.Ed25519 module Secp256k1 = Tezos_crypto.Signature.Secp256k1 module P256 = Tezos_crypto.Signature.P256 - module Bls = Tezos_crypto.Signature.Bls + + module Bls = struct + include Tezos_crypto.Signature.Bls + + let aggregate_signature_opt = aggregate_signature_opt ~subgroup_check:true + end module Signature = struct include Tezos_crypto.Signature.V1 diff --git a/src/lib_protocol_environment/environment_V15.ml b/src/lib_protocol_environment/environment_V15.ml index b733e12a683eb5990fe38bf8b7e87da973949a57..6b1f1a70069eb545ec3a9b31964b90d66c2a9360 100644 --- a/src/lib_protocol_environment/environment_V15.ml +++ b/src/lib_protocol_environment/environment_V15.ml @@ -527,7 +527,7 @@ struct val aggregate_check : (Public_key.t * watermark option * bytes) list -> t -> bool - val aggregate_signature_opt : t list -> t option + val aggregate_signature_opt : ?subgroup_check:bool -> t list -> t option val aggregate_public_key_opt : ?subgroup_check:bool -> Public_key.t list -> Public_key.t option diff --git a/src/lib_protocol_environment/environment_V5.ml b/src/lib_protocol_environment/environment_V5.ml index b0d6ab4daa9aa6a4c6d703e0bd24ff63f7fe1e69..a2e524b98c352f8fc1f45842e69cf302c9e03862 100644 --- a/src/lib_protocol_environment/environment_V5.ml +++ b/src/lib_protocol_environment/environment_V5.ml @@ -270,6 +270,8 @@ struct let verify = Aug.verify let aggregate_verify = Aug.aggregate_verify + + let aggregate_signature_opt = aggregate_signature_opt ~subgroup_check:true end module Ed25519 = Signature.Ed25519 diff --git a/src/lib_protocol_environment/environment_V6.ml b/src/lib_protocol_environment/environment_V6.ml index c5cf9ac814e9e54c84d0da5692b5501213ec1e5f..d52e53d238b01875ca9318e48dc42e102db14dca 100644 --- a/src/lib_protocol_environment/environment_V6.ml +++ b/src/lib_protocol_environment/environment_V6.ml @@ -271,6 +271,8 @@ struct let verify = Aug.verify let aggregate_verify = Aug.aggregate_verify + + let aggregate_signature_opt = aggregate_signature_opt ~subgroup_check:true end module Ed25519 = Signature.Ed25519 diff --git a/src/lib_protocol_environment/environment_V7.ml b/src/lib_protocol_environment/environment_V7.ml index 2c63f1ae1256702d52948fd7745f7597d6286b0f..5ad0d4b7327029212ec107904e56d20bdb5158f4 100644 --- a/src/lib_protocol_environment/environment_V7.ml +++ b/src/lib_protocol_environment/environment_V7.ml @@ -275,7 +275,13 @@ struct module Ed25519 = Signature.Ed25519 module Secp256k1 = Signature.Secp256k1 module P256 = Signature.P256 - module Bls = Signature.Bls + + module Bls = struct + include Tezos_crypto.Signature.Bls + + let aggregate_signature_opt = aggregate_signature_opt ~subgroup_check:true + end + module Signature = Signature.V0 module Timelock = Tezos_crypto.Timelock_legacy module Vdf = Class_group_vdf.Vdf_self_contained diff --git a/src/lib_protocol_environment/environment_V8.ml b/src/lib_protocol_environment/environment_V8.ml index 86cd8a5ab81bef0d553fabb616ca708e3b9cdbbf..47f60c2c10ab79d3dea497f22b61ef0d04a3cfc7 100644 --- a/src/lib_protocol_environment/environment_V8.ml +++ b/src/lib_protocol_environment/environment_V8.ml @@ -308,7 +308,13 @@ struct module Ed25519 = Signature.Ed25519 module Secp256k1 = Signature.Secp256k1 module P256 = Signature.P256 - module Bls = Signature.Bls + + module Bls = struct + include Tezos_crypto.Signature.Bls + + let aggregate_signature_opt = aggregate_signature_opt ~subgroup_check:true + end + module Signature = Signature.V1 module Timelock = Tezos_crypto.Timelock_legacy module Vdf = Class_group_vdf.Vdf_self_contained diff --git a/src/lib_protocol_environment/environment_V9.ml b/src/lib_protocol_environment/environment_V9.ml index c15c642c026bd5380810cc96058e2741124c7531..f5f1a06b34bcdfdc629deae5eb4340fef4f47e26 100644 --- a/src/lib_protocol_environment/environment_V9.ml +++ b/src/lib_protocol_environment/environment_V9.ml @@ -307,7 +307,12 @@ struct module Ed25519 = Tezos_crypto.Signature.Ed25519 module Secp256k1 = Tezos_crypto.Signature.Secp256k1 module P256 = Tezos_crypto.Signature.P256 - module Bls = Tezos_crypto.Signature.Bls + + module Bls = struct + include Tezos_crypto.Signature.Bls + + let aggregate_signature_opt = aggregate_signature_opt ~subgroup_check:true + end module Signature = struct include Tezos_crypto.Signature.V1 diff --git a/src/lib_protocol_environment/sigs/v15.ml b/src/lib_protocol_environment/sigs/v15.ml index cb71c6779675a624ee76a9e09f006be273dd6c09..3bc76847015b74eb7a48dadac0935e1ffda561e8 100644 --- a/src/lib_protocol_environment/sigs/v15.ml +++ b/src/lib_protocol_environment/sigs/v15.ml @@ -9471,7 +9471,7 @@ module type AGGREGATE_SIGNATURE = sig val aggregate_check : (Public_key.t * watermark option * bytes) list -> t -> bool - val aggregate_signature_opt : t list -> t option + val aggregate_signature_opt : ?subgroup_check:bool -> t list -> t option val aggregate_public_key_opt : ?subgroup_check:bool -> Public_key.t list -> Public_key.t option diff --git a/src/lib_protocol_environment/sigs/v15/s.mli b/src/lib_protocol_environment/sigs/v15/s.mli index 5c4b2bff7c23d7fecc1d36043024183105058792..4e18e982dd808e220b8a52f067db285e5607f9ee 100644 --- a/src/lib_protocol_environment/sigs/v15/s.mli +++ b/src/lib_protocol_environment/sigs/v15/s.mli @@ -240,7 +240,7 @@ module type AGGREGATE_SIGNATURE = sig val aggregate_check : (Public_key.t * watermark option * bytes) list -> t -> bool - val aggregate_signature_opt : t list -> t option + val aggregate_signature_opt : ?subgroup_check:bool -> t list -> t option val aggregate_public_key_opt : ?subgroup_check:bool -> Public_key.t list -> Public_key.t option