use primitives::{
algebra::elliptic_curve::{Curve, Point, Scalar},
types::PeerNumber,
};
use serde::Deserialize;
use crate::circuit::{
v1::{
constants::{
BaseFieldPlaintext,
BaseFieldPlaintextBatch,
BitPlaintext,
BitPlaintextBatch,
Mersenne107Plaintext,
Mersenne107PlaintextBatch,
PointPlaintext,
PointPlaintextBatch,
ScalarPlaintext,
ScalarPlaintextBatch,
},
errors::OpsConversionError,
AlgebraicType,
},
v2,
};
pub type FieldPlaintextUnaryOp = v2::FieldPlaintextUnaryOp;
pub type FieldPlaintextBinaryOp = v2::FieldPlaintextBinaryOp;
pub type FieldShareUnaryOp = v2::FieldShareUnaryOp;
pub type FieldShareBinaryOp = v2::FieldShareBinaryOp;
pub type BitShareUnaryOp = v2::BitShareUnaryOp;
pub type BitShareBinaryOp = v2::BitShareBinaryOp;
pub type PointPlaintextUnaryOp = v2::PointPlaintextUnaryOp;
pub type PointPlaintextBinaryOp = v2::PointPlaintextBinaryOp;
pub type PointShareUnaryOp = v2::PointShareUnaryOp;
pub type PointShareBinaryOp = v2::PointShareBinaryOp;
impl TryFrom<FieldPlaintextUnaryOp> for v2::BitPlaintextUnaryOp {
type Error = OpsConversionError;
fn try_from(value: FieldPlaintextUnaryOp) -> Result<Self, Self::Error> {
match value {
FieldPlaintextUnaryOp::Neg => Ok(Self::Not),
_ => Err(OpsConversionError::PlaintextUnaryOpFieldToBit(value)),
}
}
}
impl TryFrom<FieldPlaintextBinaryOp> for v2::BitPlaintextBinaryOp {
type Error = OpsConversionError;
fn try_from(value: FieldPlaintextBinaryOp) -> Result<Self, Self::Error> {
match value {
FieldPlaintextBinaryOp::Mul => Ok(Self::And),
FieldPlaintextBinaryOp::Xor => Ok(Self::Xor),
FieldPlaintextBinaryOp::Or => Ok(Self::Or),
_ => Err(OpsConversionError::PlaintextBinaryOpFieldToBit(value)),
}
}
}
#[derive(Deserialize)]
#[serde(bound(deserialize = "Scalar<C>: Deserialize<'de>, Point<C>: Deserialize<'de>"))]
#[repr(C)]
pub enum Input<C: Curve> {
SecretPlaintext {
inputer: PeerNumber,
algebraic_type: AlgebraicType,
batched: Batched,
},
Share {
algebraic_type: AlgebraicType,
batched: Batched,
},
RandomShare {
algebraic_type: AlgebraicType,
batched: Batched,
},
Scalar(ScalarPlaintext<C>),
ScalarBatch(ScalarPlaintextBatch<C>),
BaseField(BaseFieldPlaintext<C>),
BaseFieldBatch(BaseFieldPlaintextBatch<C>),
Mersenne107(Mersenne107Plaintext),
Mersenne107Batch(Mersenne107PlaintextBatch),
Bit(BitPlaintext),
BitBatch(BitPlaintextBatch),
Point(PointPlaintext<C>),
PointBatch(PointPlaintextBatch<C>),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Deserialize)]
#[repr(C)]
pub enum Batched {
Yes(usize),
No,
}
impl Batched {
pub fn count(&self) -> usize {
match self {
Batched::Yes(count) => *count,
Batched::No => 1,
}
}
}