snarkvm_curves/templates/
to_field_vec.rs

1// Copyright (c) 2019-2025 Provable Inc.
2// This file is part of the snarkVM library.
3
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at:
7
8// http://www.apache.org/licenses/LICENSE-2.0
9
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15
16use crate::{
17    templates::{
18        short_weierstrass_jacobian::{Affine as SWAffine, Projective as SWProjective},
19        twisted_edwards_extended::{Affine as TEAffine, Projective as TEProjective},
20    },
21    traits::{ProjectiveCurve, ShortWeierstrassParameters, TwistedEdwardsParameters},
22};
23use snarkvm_fields::{ConstraintFieldError, Field, ToConstraintField};
24
25impl<M: TwistedEdwardsParameters, F: Field> ToConstraintField<F> for TEAffine<M>
26where
27    M::BaseField: ToConstraintField<F>,
28{
29    #[inline]
30    fn to_field_elements(&self) -> Result<Vec<F>, ConstraintFieldError> {
31        let mut x_fe = self.x.to_field_elements()?;
32        let y_fe = self.y.to_field_elements()?;
33        x_fe.extend_from_slice(&y_fe);
34        Ok(x_fe)
35    }
36}
37
38impl<M: TwistedEdwardsParameters, F: Field> ToConstraintField<F> for TEProjective<M>
39where
40    M::BaseField: ToConstraintField<F>,
41{
42    #[inline]
43    fn to_field_elements(&self) -> Result<Vec<F>, ConstraintFieldError> {
44        let affine = self.to_affine();
45        let mut x_fe = affine.x.to_field_elements()?;
46        let y_fe = affine.y.to_field_elements()?;
47        x_fe.extend_from_slice(&y_fe);
48        Ok(x_fe)
49    }
50}
51
52impl<M: ShortWeierstrassParameters, F: Field> ToConstraintField<F> for SWAffine<M>
53where
54    M::BaseField: ToConstraintField<F>,
55{
56    #[inline]
57    fn to_field_elements(&self) -> Result<Vec<F>, ConstraintFieldError> {
58        let mut x_fe = self.x.to_field_elements()?;
59        let y_fe = self.y.to_field_elements()?;
60        let infinity_fe = self.infinity.to_field_elements()?;
61        x_fe.extend_from_slice(&y_fe);
62        x_fe.extend_from_slice(&infinity_fe);
63        Ok(x_fe)
64    }
65}
66
67impl<M: ShortWeierstrassParameters, F: Field> ToConstraintField<F> for SWProjective<M>
68where
69    M::BaseField: ToConstraintField<F>,
70{
71    #[inline]
72    fn to_field_elements(&self) -> Result<Vec<F>, ConstraintFieldError> {
73        let affine = self.to_affine();
74        let mut x_fe = affine.x.to_field_elements()?;
75        let y_fe = affine.y.to_field_elements()?;
76        x_fe.extend_from_slice(&y_fe);
77        Ok(x_fe)
78    }
79}