snarkvm_console_program/data/plaintext/
to_bits.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 super::*;
17
18impl<N: Network> ToBits for Plaintext<N> {
19    /// Returns this plaintext as a list of **little-endian** bits.
20    fn write_bits_le(&self, vec: &mut Vec<bool>) {
21        match self {
22            Self::Literal(literal, bits_le) => {
23                // Compute the bits.
24                let bits = bits_le.get_or_init(|| {
25                    let mut bits_le = vec![false, false]; // Variant bits.
26                    literal.variant().write_bits_le(&mut bits_le);
27                    literal.size_in_bits().write_bits_le(&mut bits_le);
28                    literal.write_bits_le(&mut bits_le);
29                    bits_le
30                });
31                // Extend the vector with the bits.
32                vec.extend_from_slice(bits)
33            }
34            Self::Struct(struct_, bits_le) => {
35                // Compute the bits.
36                let bits = bits_le.get_or_init(|| {
37                    let mut bits_le = vec![false, true]; // Variant bits.
38
39                    // Write the length of the struct.
40                    u8::try_from(struct_.len())
41                        .or_halt_with::<N>("Plaintext struct length exceeds u8::MAX")
42                        .write_bits_le(&mut bits_le);
43
44                    // Write each member of the struct.
45                    for (identifier, value) in struct_ {
46                        // Write the identifier of the member.
47                        identifier.size_in_bits().write_bits_le(&mut bits_le);
48                        identifier.write_bits_le(&mut bits_le);
49
50                        // Write the value of the member.
51                        let value_bits = value.to_bits_le();
52                        u16::try_from(value_bits.len())
53                            .or_halt_with::<N>("Plaintext member exceeds u16::MAX bits")
54                            .write_bits_le(&mut bits_le);
55                        bits_le.extend_from_slice(&value_bits);
56                    }
57                    bits_le
58                });
59                // Extend the vector with the bits.
60                vec.extend_from_slice(bits)
61            }
62            Self::Array(array, bits_le) => {
63                // Compute the bits.
64                let bits = bits_le.get_or_init(|| {
65                    let mut bits_le = vec![true, false]; // Variant bits.
66
67                    // Write the length of the array.
68                    u32::try_from(array.len())
69                        .or_halt_with::<N>("Plaintext array length exceeds u32::MAX")
70                        .write_bits_le(&mut bits_le);
71
72                    // Write each element of the array.
73                    for element in array {
74                        let element_bits = element.to_bits_le();
75
76                        // Write the size of the element.
77                        u16::try_from(element_bits.len())
78                            .or_halt_with::<N>("Plaintext element exceeds u16::MAX bits")
79                            .write_bits_le(&mut bits_le);
80
81                        // Write the element.
82                        bits_le.extend(element_bits);
83                    }
84                    bits_le
85                });
86                // Extend the vector with the bits.
87                vec.extend_from_slice(bits)
88            }
89        }
90    }
91
92    /// Returns this plaintext as a list of **big-endian** bits.
93    fn write_bits_be(&self, vec: &mut Vec<bool>) {
94        match self {
95            Self::Literal(literal, bits_be) => {
96                // Compute the bits.
97                let bits = bits_be.get_or_init(|| {
98                    let mut bits_be = vec![false, false]; // Variant bits.
99                    literal.variant().write_bits_be(&mut bits_be);
100                    literal.size_in_bits().write_bits_be(&mut bits_be);
101                    literal.write_bits_be(&mut bits_be);
102                    bits_be
103                });
104                // Extend the vector with the bits.
105                vec.extend_from_slice(bits)
106            }
107            Self::Struct(struct_, bits_be) => {
108                // Compute the bits.
109                let bits = bits_be.get_or_init(|| {
110                    let mut bits_be = vec![false, true]; // Variant bits.
111
112                    // Write the length of the struct.
113                    u8::try_from(struct_.len())
114                        .or_halt_with::<N>("Plaintext struct length exceeds u8::MAX")
115                        .write_bits_be(&mut bits_be);
116
117                    // Write each member of the struct.
118                    for (identifier, value) in struct_ {
119                        // Write the identifier of the member.
120                        identifier.size_in_bits().write_bits_be(&mut bits_be);
121                        identifier.write_bits_be(&mut bits_be);
122
123                        // Write the value of the member.
124                        let value_bits = value.to_bits_be();
125                        u16::try_from(value_bits.len())
126                            .or_halt_with::<N>("Plaintext member exceeds u16::MAX bits")
127                            .write_bits_be(&mut bits_be);
128                        bits_be.extend_from_slice(&value_bits);
129                    }
130
131                    bits_be
132                });
133                // Extend the vector with the bits.
134                vec.extend_from_slice(bits)
135            }
136            Self::Array(array, bits_be) => {
137                // Compute the bits.
138                let bits = bits_be.get_or_init(|| {
139                    let mut bits_be = vec![true, false]; // Variant bits.
140
141                    // Write the length of the array.
142                    u32::try_from(array.len())
143                        .or_halt_with::<N>("Plaintext array length exceeds u32::MAX")
144                        .write_bits_be(&mut bits_be);
145
146                    // Write each element of the array.
147                    for element in array {
148                        let element_bits = element.to_bits_be();
149
150                        // Write the size of the element.
151                        u16::try_from(element_bits.len())
152                            .or_halt_with::<N>("Plaintext element exceeds u16::MAX bits")
153                            .write_bits_be(&mut bits_be);
154
155                        // Write the element.
156                        bits_be.extend(element_bits);
157                    }
158                    bits_be
159                });
160                // Extend the vector with the bits.
161                vec.extend_from_slice(bits)
162            }
163        }
164    }
165}