mirror of
https://github.com/tlsnotary/tlsn.git
synced 2026-01-09 21:38:00 -05:00
deploy: f8a67bc8e7
This commit is contained in:
@@ -3,7 +3,7 @@
|
||||
<a href=#3 id=3 data-nosnippet>3</a></span><span class="kw">use </span>std::collections::HashMap;
|
||||
<a href=#4 id=4 data-nosnippet>4</a>
|
||||
<a href=#5 id=5 data-nosnippet>5</a><span class="kw">use </span>mpz_core::bitvec::BitVec;
|
||||
<a href=#6 id=6 data-nosnippet>6</a><span class="kw">use </span>mpz_hash::{blake3::Blake3, sha256::Sha256};
|
||||
<a href=#6 id=6 data-nosnippet>6</a><span class="kw">use </span>mpz_hash::{blake3::Blake3, keccak256::Keccak256, sha256::Sha256};
|
||||
<a href=#7 id=7 data-nosnippet>7</a><span class="kw">use </span>mpz_memory_core::{
|
||||
<a href=#8 id=8 data-nosnippet>8</a> DecodeFutureTyped, MemoryExt, Vector,
|
||||
<a href=#9 id=9 data-nosnippet>9</a> binary::{Binary, U8},
|
||||
@@ -111,135 +111,162 @@
|
||||
<a href=#111 id=111 data-nosnippet>111</a></span><span class="kw">enum </span>Hasher {
|
||||
<a href=#112 id=112 data-nosnippet>112</a> Sha256(Sha256),
|
||||
<a href=#113 id=113 data-nosnippet>113</a> Blake3(Blake3),
|
||||
<a href=#114 id=114 data-nosnippet>114</a>}
|
||||
<a href=#115 id=115 data-nosnippet>115</a>
|
||||
<a href=#116 id=116 data-nosnippet>116</a><span class="doccomment">/// Commit plaintext hashes of the transcript.
|
||||
<a href=#117 id=117 data-nosnippet>117</a></span><span class="attr">#[allow(clippy::type_complexity)]
|
||||
<a href=#118 id=118 data-nosnippet>118</a></span><span class="kw">fn </span>hash_commit_inner(
|
||||
<a href=#119 id=119 data-nosnippet>119</a> vm: <span class="kw-2">&mut </span><span class="kw">dyn </span>Vm<Binary>,
|
||||
<a href=#120 id=120 data-nosnippet>120</a> role: Role,
|
||||
<a href=#121 id=121 data-nosnippet>121</a> refs: <span class="kw-2">&</span>TranscriptRefs,
|
||||
<a href=#122 id=122 data-nosnippet>122</a> idxs: <span class="kw">impl </span>IntoIterator<Item = (Direction, RangeSet<usize>, HashAlgId)>,
|
||||
<a href=#123 id=123 data-nosnippet>123</a>) -> <span class="prelude-ty">Result</span><
|
||||
<a href=#124 id=124 data-nosnippet>124</a> Vec<(
|
||||
<a href=#125 id=125 data-nosnippet>125</a> Direction,
|
||||
<a href=#126 id=126 data-nosnippet>126</a> RangeSet<usize>,
|
||||
<a href=#127 id=127 data-nosnippet>127</a> HashAlgId,
|
||||
<a href=#128 id=128 data-nosnippet>128</a> Array<U8, <span class="number">32</span>>,
|
||||
<a href=#129 id=129 data-nosnippet>129</a> Vector<U8>,
|
||||
<a href=#130 id=130 data-nosnippet>130</a> )>,
|
||||
<a href=#131 id=131 data-nosnippet>131</a> HashCommitError,
|
||||
<a href=#132 id=132 data-nosnippet>132</a>> {
|
||||
<a href=#133 id=133 data-nosnippet>133</a> <span class="kw">let </span><span class="kw-2">mut </span>output = Vec::new();
|
||||
<a href=#134 id=134 data-nosnippet>134</a> <span class="kw">let </span><span class="kw-2">mut </span>hashers = HashMap::new();
|
||||
<a href=#135 id=135 data-nosnippet>135</a> <span class="kw">for </span>(direction, idx, alg) <span class="kw">in </span>idxs {
|
||||
<a href=#136 id=136 data-nosnippet>136</a> <span class="kw">let </span>blinder = vm.alloc_vec::<U8>(<span class="number">16</span>)<span class="question-mark">?</span>;
|
||||
<a href=#137 id=137 data-nosnippet>137</a> <span class="kw">match </span>role {
|
||||
<a href=#138 id=138 data-nosnippet>138</a> Role::Prover => vm.mark_private(blinder)<span class="question-mark">?</span>,
|
||||
<a href=#139 id=139 data-nosnippet>139</a> Role::Verifier => vm.mark_blind(blinder)<span class="question-mark">?</span>,
|
||||
<a href=#140 id=140 data-nosnippet>140</a> }
|
||||
<a href=#141 id=141 data-nosnippet>141</a>
|
||||
<a href=#142 id=142 data-nosnippet>142</a> <span class="kw">let </span>hash = <span class="kw">match </span>alg {
|
||||
<a href=#143 id=143 data-nosnippet>143</a> HashAlgId::SHA256 => {
|
||||
<a href=#144 id=144 data-nosnippet>144</a> <span class="kw">let </span><span class="kw-2">mut </span>hasher = <span class="kw">if let </span><span class="prelude-val">Some</span>(Hasher::Sha256(hasher)) = hashers.get(<span class="kw-2">&</span>alg).cloned() {
|
||||
<a href=#145 id=145 data-nosnippet>145</a> hasher
|
||||
<a href=#146 id=146 data-nosnippet>146</a> } <span class="kw">else </span>{
|
||||
<a href=#147 id=147 data-nosnippet>147</a> <span class="kw">let </span>hasher = Sha256::new_with_init(vm).map_err(HashCommitError::hasher)<span class="question-mark">?</span>;
|
||||
<a href=#148 id=148 data-nosnippet>148</a> hashers.insert(alg, Hasher::Sha256(hasher.clone()));
|
||||
<a href=#149 id=149 data-nosnippet>149</a> hasher
|
||||
<a href=#150 id=150 data-nosnippet>150</a> };
|
||||
<a href=#151 id=151 data-nosnippet>151</a>
|
||||
<a href=#152 id=152 data-nosnippet>152</a> <span class="kw">let </span>refs = <span class="kw">match </span>direction {
|
||||
<a href=#153 id=153 data-nosnippet>153</a> Direction::Sent => <span class="kw-2">&</span>refs.sent,
|
||||
<a href=#154 id=154 data-nosnippet>154</a> Direction::Received => <span class="kw-2">&</span>refs.recv,
|
||||
<a href=#155 id=155 data-nosnippet>155</a> };
|
||||
<a href=#156 id=156 data-nosnippet>156</a>
|
||||
<a href=#157 id=157 data-nosnippet>157</a> <span class="kw">for </span>range <span class="kw">in </span>idx.iter_ranges() {
|
||||
<a href=#158 id=158 data-nosnippet>158</a> hasher.update(<span class="kw-2">&</span>refs.get(range).expect(<span class="string">"plaintext refs are valid"</span>));
|
||||
<a href=#159 id=159 data-nosnippet>159</a> }
|
||||
<a href=#160 id=160 data-nosnippet>160</a>
|
||||
<a href=#161 id=161 data-nosnippet>161</a> hasher.update(<span class="kw-2">&</span>blinder);
|
||||
<a href=#162 id=162 data-nosnippet>162</a> hasher.finalize(vm).map_err(HashCommitError::hasher)<span class="question-mark">?
|
||||
<a href=#163 id=163 data-nosnippet>163</a> </span>}
|
||||
<a href=#164 id=164 data-nosnippet>164</a> HashAlgId::BLAKE3 => {
|
||||
<a href=#165 id=165 data-nosnippet>165</a> <span class="kw">let </span><span class="kw-2">mut </span>hasher = <span class="kw">if let </span><span class="prelude-val">Some</span>(Hasher::Blake3(hasher)) = hashers.get(<span class="kw-2">&</span>alg).cloned() {
|
||||
<a href=#166 id=166 data-nosnippet>166</a> hasher
|
||||
<a href=#167 id=167 data-nosnippet>167</a> } <span class="kw">else </span>{
|
||||
<a href=#168 id=168 data-nosnippet>168</a> <span class="kw">let </span>hasher = Blake3::new(vm).map_err(HashCommitError::hasher)<span class="question-mark">?</span>;
|
||||
<a href=#169 id=169 data-nosnippet>169</a> hashers.insert(alg, Hasher::Blake3(hasher.clone()));
|
||||
<a href=#170 id=170 data-nosnippet>170</a> hasher
|
||||
<a href=#171 id=171 data-nosnippet>171</a> };
|
||||
<a href=#172 id=172 data-nosnippet>172</a>
|
||||
<a href=#173 id=173 data-nosnippet>173</a> <span class="kw">let </span>refs = <span class="kw">match </span>direction {
|
||||
<a href=#174 id=174 data-nosnippet>174</a> Direction::Sent => <span class="kw-2">&</span>refs.sent,
|
||||
<a href=#175 id=175 data-nosnippet>175</a> Direction::Received => <span class="kw-2">&</span>refs.recv,
|
||||
<a href=#176 id=176 data-nosnippet>176</a> };
|
||||
<a href=#177 id=177 data-nosnippet>177</a>
|
||||
<a href=#178 id=178 data-nosnippet>178</a> <span class="kw">for </span>range <span class="kw">in </span>idx.iter_ranges() {
|
||||
<a href=#179 id=179 data-nosnippet>179</a> hasher
|
||||
<a href=#180 id=180 data-nosnippet>180</a> .update(vm, <span class="kw-2">&</span>refs.get(range).expect(<span class="string">"plaintext refs are valid"</span>))
|
||||
<a href=#181 id=181 data-nosnippet>181</a> .map_err(HashCommitError::hasher)<span class="question-mark">?</span>;
|
||||
<a href=#182 id=182 data-nosnippet>182</a> }
|
||||
<a href=#183 id=183 data-nosnippet>183</a> hasher
|
||||
<a href=#184 id=184 data-nosnippet>184</a> .update(vm, <span class="kw-2">&</span>blinder)
|
||||
<a href=#185 id=185 data-nosnippet>185</a> .map_err(HashCommitError::hasher)<span class="question-mark">?</span>;
|
||||
<a href=#186 id=186 data-nosnippet>186</a> hasher.finalize(vm).map_err(HashCommitError::hasher)<span class="question-mark">?
|
||||
<a href=#187 id=187 data-nosnippet>187</a> </span>}
|
||||
<a href=#188 id=188 data-nosnippet>188</a> alg => {
|
||||
<a href=#189 id=189 data-nosnippet>189</a> <span class="kw">return </span><span class="prelude-val">Err</span>(HashCommitError::unsupported_alg(alg));
|
||||
<a href=#190 id=190 data-nosnippet>190</a> }
|
||||
<a href=#191 id=191 data-nosnippet>191</a> };
|
||||
<a href=#192 id=192 data-nosnippet>192</a>
|
||||
<a href=#193 id=193 data-nosnippet>193</a> output.push((direction, idx, alg, hash, blinder));
|
||||
<a href=#194 id=194 data-nosnippet>194</a> }
|
||||
<a href=#195 id=195 data-nosnippet>195</a>
|
||||
<a href=#196 id=196 data-nosnippet>196</a> <span class="prelude-val">Ok</span>(output)
|
||||
<a href=#197 id=197 data-nosnippet>197</a>}
|
||||
<a href=#114 id=114 data-nosnippet>114</a> Keccak256(Keccak256),
|
||||
<a href=#115 id=115 data-nosnippet>115</a>}
|
||||
<a href=#116 id=116 data-nosnippet>116</a>
|
||||
<a href=#117 id=117 data-nosnippet>117</a><span class="doccomment">/// Commit plaintext hashes of the transcript.
|
||||
<a href=#118 id=118 data-nosnippet>118</a></span><span class="attr">#[allow(clippy::type_complexity)]
|
||||
<a href=#119 id=119 data-nosnippet>119</a></span><span class="kw">fn </span>hash_commit_inner(
|
||||
<a href=#120 id=120 data-nosnippet>120</a> vm: <span class="kw-2">&mut </span><span class="kw">dyn </span>Vm<Binary>,
|
||||
<a href=#121 id=121 data-nosnippet>121</a> role: Role,
|
||||
<a href=#122 id=122 data-nosnippet>122</a> refs: <span class="kw-2">&</span>TranscriptRefs,
|
||||
<a href=#123 id=123 data-nosnippet>123</a> idxs: <span class="kw">impl </span>IntoIterator<Item = (Direction, RangeSet<usize>, HashAlgId)>,
|
||||
<a href=#124 id=124 data-nosnippet>124</a>) -> <span class="prelude-ty">Result</span><
|
||||
<a href=#125 id=125 data-nosnippet>125</a> Vec<(
|
||||
<a href=#126 id=126 data-nosnippet>126</a> Direction,
|
||||
<a href=#127 id=127 data-nosnippet>127</a> RangeSet<usize>,
|
||||
<a href=#128 id=128 data-nosnippet>128</a> HashAlgId,
|
||||
<a href=#129 id=129 data-nosnippet>129</a> Array<U8, <span class="number">32</span>>,
|
||||
<a href=#130 id=130 data-nosnippet>130</a> Vector<U8>,
|
||||
<a href=#131 id=131 data-nosnippet>131</a> )>,
|
||||
<a href=#132 id=132 data-nosnippet>132</a> HashCommitError,
|
||||
<a href=#133 id=133 data-nosnippet>133</a>> {
|
||||
<a href=#134 id=134 data-nosnippet>134</a> <span class="kw">let </span><span class="kw-2">mut </span>output = Vec::new();
|
||||
<a href=#135 id=135 data-nosnippet>135</a> <span class="kw">let </span><span class="kw-2">mut </span>hashers = HashMap::new();
|
||||
<a href=#136 id=136 data-nosnippet>136</a> <span class="kw">for </span>(direction, idx, alg) <span class="kw">in </span>idxs {
|
||||
<a href=#137 id=137 data-nosnippet>137</a> <span class="kw">let </span>blinder = vm.alloc_vec::<U8>(<span class="number">16</span>)<span class="question-mark">?</span>;
|
||||
<a href=#138 id=138 data-nosnippet>138</a> <span class="kw">match </span>role {
|
||||
<a href=#139 id=139 data-nosnippet>139</a> Role::Prover => vm.mark_private(blinder)<span class="question-mark">?</span>,
|
||||
<a href=#140 id=140 data-nosnippet>140</a> Role::Verifier => vm.mark_blind(blinder)<span class="question-mark">?</span>,
|
||||
<a href=#141 id=141 data-nosnippet>141</a> }
|
||||
<a href=#142 id=142 data-nosnippet>142</a>
|
||||
<a href=#143 id=143 data-nosnippet>143</a> <span class="kw">let </span>hash = <span class="kw">match </span>alg {
|
||||
<a href=#144 id=144 data-nosnippet>144</a> HashAlgId::SHA256 => {
|
||||
<a href=#145 id=145 data-nosnippet>145</a> <span class="kw">let </span><span class="kw-2">mut </span>hasher = <span class="kw">if let </span><span class="prelude-val">Some</span>(Hasher::Sha256(hasher)) = hashers.get(<span class="kw-2">&</span>alg).cloned() {
|
||||
<a href=#146 id=146 data-nosnippet>146</a> hasher
|
||||
<a href=#147 id=147 data-nosnippet>147</a> } <span class="kw">else </span>{
|
||||
<a href=#148 id=148 data-nosnippet>148</a> <span class="kw">let </span>hasher = Sha256::new_with_init(vm).map_err(HashCommitError::hasher)<span class="question-mark">?</span>;
|
||||
<a href=#149 id=149 data-nosnippet>149</a> hashers.insert(alg, Hasher::Sha256(hasher.clone()));
|
||||
<a href=#150 id=150 data-nosnippet>150</a> hasher
|
||||
<a href=#151 id=151 data-nosnippet>151</a> };
|
||||
<a href=#152 id=152 data-nosnippet>152</a>
|
||||
<a href=#153 id=153 data-nosnippet>153</a> <span class="kw">let </span>refs = <span class="kw">match </span>direction {
|
||||
<a href=#154 id=154 data-nosnippet>154</a> Direction::Sent => <span class="kw-2">&</span>refs.sent,
|
||||
<a href=#155 id=155 data-nosnippet>155</a> Direction::Received => <span class="kw-2">&</span>refs.recv,
|
||||
<a href=#156 id=156 data-nosnippet>156</a> };
|
||||
<a href=#157 id=157 data-nosnippet>157</a>
|
||||
<a href=#158 id=158 data-nosnippet>158</a> <span class="kw">for </span>range <span class="kw">in </span>idx.iter_ranges() {
|
||||
<a href=#159 id=159 data-nosnippet>159</a> hasher.update(<span class="kw-2">&</span>refs.get(range).expect(<span class="string">"plaintext refs are valid"</span>));
|
||||
<a href=#160 id=160 data-nosnippet>160</a> }
|
||||
<a href=#161 id=161 data-nosnippet>161</a>
|
||||
<a href=#162 id=162 data-nosnippet>162</a> hasher.update(<span class="kw-2">&</span>blinder);
|
||||
<a href=#163 id=163 data-nosnippet>163</a> hasher.finalize(vm).map_err(HashCommitError::hasher)<span class="question-mark">?
|
||||
<a href=#164 id=164 data-nosnippet>164</a> </span>}
|
||||
<a href=#165 id=165 data-nosnippet>165</a> HashAlgId::BLAKE3 => {
|
||||
<a href=#166 id=166 data-nosnippet>166</a> <span class="kw">let </span><span class="kw-2">mut </span>hasher = <span class="kw">if let </span><span class="prelude-val">Some</span>(Hasher::Blake3(hasher)) = hashers.get(<span class="kw-2">&</span>alg).cloned() {
|
||||
<a href=#167 id=167 data-nosnippet>167</a> hasher
|
||||
<a href=#168 id=168 data-nosnippet>168</a> } <span class="kw">else </span>{
|
||||
<a href=#169 id=169 data-nosnippet>169</a> <span class="kw">let </span>hasher = Blake3::new(vm).map_err(HashCommitError::hasher)<span class="question-mark">?</span>;
|
||||
<a href=#170 id=170 data-nosnippet>170</a> hashers.insert(alg, Hasher::Blake3(hasher.clone()));
|
||||
<a href=#171 id=171 data-nosnippet>171</a> hasher
|
||||
<a href=#172 id=172 data-nosnippet>172</a> };
|
||||
<a href=#173 id=173 data-nosnippet>173</a>
|
||||
<a href=#174 id=174 data-nosnippet>174</a> <span class="kw">let </span>refs = <span class="kw">match </span>direction {
|
||||
<a href=#175 id=175 data-nosnippet>175</a> Direction::Sent => <span class="kw-2">&</span>refs.sent,
|
||||
<a href=#176 id=176 data-nosnippet>176</a> Direction::Received => <span class="kw-2">&</span>refs.recv,
|
||||
<a href=#177 id=177 data-nosnippet>177</a> };
|
||||
<a href=#178 id=178 data-nosnippet>178</a>
|
||||
<a href=#179 id=179 data-nosnippet>179</a> <span class="kw">for </span>range <span class="kw">in </span>idx.iter_ranges() {
|
||||
<a href=#180 id=180 data-nosnippet>180</a> hasher
|
||||
<a href=#181 id=181 data-nosnippet>181</a> .update(vm, <span class="kw-2">&</span>refs.get(range).expect(<span class="string">"plaintext refs are valid"</span>))
|
||||
<a href=#182 id=182 data-nosnippet>182</a> .map_err(HashCommitError::hasher)<span class="question-mark">?</span>;
|
||||
<a href=#183 id=183 data-nosnippet>183</a> }
|
||||
<a href=#184 id=184 data-nosnippet>184</a> hasher
|
||||
<a href=#185 id=185 data-nosnippet>185</a> .update(vm, <span class="kw-2">&</span>blinder)
|
||||
<a href=#186 id=186 data-nosnippet>186</a> .map_err(HashCommitError::hasher)<span class="question-mark">?</span>;
|
||||
<a href=#187 id=187 data-nosnippet>187</a> hasher.finalize(vm).map_err(HashCommitError::hasher)<span class="question-mark">?
|
||||
<a href=#188 id=188 data-nosnippet>188</a> </span>}
|
||||
<a href=#189 id=189 data-nosnippet>189</a> HashAlgId::KECCAK256 => {
|
||||
<a href=#190 id=190 data-nosnippet>190</a> <span class="kw">let </span><span class="kw-2">mut </span>hasher = <span class="kw">if let </span><span class="prelude-val">Some</span>(Hasher::Keccak256(hasher)) = hashers.get(<span class="kw-2">&</span>alg).cloned()
|
||||
<a href=#191 id=191 data-nosnippet>191</a> {
|
||||
<a href=#192 id=192 data-nosnippet>192</a> hasher
|
||||
<a href=#193 id=193 data-nosnippet>193</a> } <span class="kw">else </span>{
|
||||
<a href=#194 id=194 data-nosnippet>194</a> <span class="kw">let </span>hasher = Keccak256::new_with_init(vm).map_err(HashCommitError::hasher)<span class="question-mark">?</span>;
|
||||
<a href=#195 id=195 data-nosnippet>195</a> hashers.insert(alg, Hasher::Keccak256(hasher.clone()));
|
||||
<a href=#196 id=196 data-nosnippet>196</a> hasher
|
||||
<a href=#197 id=197 data-nosnippet>197</a> };
|
||||
<a href=#198 id=198 data-nosnippet>198</a>
|
||||
<a href=#199 id=199 data-nosnippet>199</a><span class="doccomment">/// Error type for hash commitments.
|
||||
<a href=#200 id=200 data-nosnippet>200</a></span><span class="attr">#[derive(Debug, thiserror::Error)]
|
||||
<a href=#201 id=201 data-nosnippet>201</a>#[error(transparent)]
|
||||
<a href=#202 id=202 data-nosnippet>202</a></span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">struct </span>HashCommitError(<span class="attr">#[from] </span>ErrorRepr);
|
||||
<a href=#199 id=199 data-nosnippet>199</a> <span class="kw">let </span>refs = <span class="kw">match </span>direction {
|
||||
<a href=#200 id=200 data-nosnippet>200</a> Direction::Sent => <span class="kw-2">&</span>refs.sent,
|
||||
<a href=#201 id=201 data-nosnippet>201</a> Direction::Received => <span class="kw-2">&</span>refs.recv,
|
||||
<a href=#202 id=202 data-nosnippet>202</a> };
|
||||
<a href=#203 id=203 data-nosnippet>203</a>
|
||||
<a href=#204 id=204 data-nosnippet>204</a><span class="kw">impl </span>HashCommitError {
|
||||
<a href=#205 id=205 data-nosnippet>205</a> <span class="kw">fn </span>decode() -> <span class="self">Self </span>{
|
||||
<a href=#206 id=206 data-nosnippet>206</a> <span class="self">Self</span>(ErrorRepr::Decode)
|
||||
<a href=#207 id=207 data-nosnippet>207</a> }
|
||||
<a href=#208 id=208 data-nosnippet>208</a>
|
||||
<a href=#209 id=209 data-nosnippet>209</a> <span class="kw">fn </span>convert(e: <span class="kw-2">&</span><span class="lifetime">'static </span>str) -> <span class="self">Self </span>{
|
||||
<a href=#210 id=210 data-nosnippet>210</a> <span class="self">Self</span>(ErrorRepr::Convert(e))
|
||||
<a href=#211 id=211 data-nosnippet>211</a> }
|
||||
<a href=#212 id=212 data-nosnippet>212</a>
|
||||
<a href=#213 id=213 data-nosnippet>213</a> <span class="kw">fn </span>hasher<E>(e: E) -> <span class="self">Self
|
||||
<a href=#214 id=214 data-nosnippet>214</a> </span><span class="kw">where
|
||||
<a href=#215 id=215 data-nosnippet>215</a> </span>E: Into<Box<<span class="kw">dyn </span>std::error::Error + Send + Sync>>,
|
||||
<a href=#216 id=216 data-nosnippet>216</a> {
|
||||
<a href=#217 id=217 data-nosnippet>217</a> <span class="self">Self</span>(ErrorRepr::Hasher(e.into()))
|
||||
<a href=#218 id=218 data-nosnippet>218</a> }
|
||||
<a href=#204 id=204 data-nosnippet>204</a> <span class="kw">for </span>range <span class="kw">in </span>idx.iter_ranges() {
|
||||
<a href=#205 id=205 data-nosnippet>205</a> hasher
|
||||
<a href=#206 id=206 data-nosnippet>206</a> .update(vm, <span class="kw-2">&</span>refs.get(range).expect(<span class="string">"plaintext refs are valid"</span>))
|
||||
<a href=#207 id=207 data-nosnippet>207</a> .map_err(HashCommitError::hasher)<span class="question-mark">?</span>;
|
||||
<a href=#208 id=208 data-nosnippet>208</a> }
|
||||
<a href=#209 id=209 data-nosnippet>209</a>
|
||||
<a href=#210 id=210 data-nosnippet>210</a> hasher
|
||||
<a href=#211 id=211 data-nosnippet>211</a> .update(vm, <span class="kw-2">&</span>blinder)
|
||||
<a href=#212 id=212 data-nosnippet>212</a> .map_err(HashCommitError::hasher)<span class="question-mark">?</span>;
|
||||
<a href=#213 id=213 data-nosnippet>213</a> hasher.finalize(vm).map_err(HashCommitError::hasher)<span class="question-mark">?
|
||||
<a href=#214 id=214 data-nosnippet>214</a> </span>}
|
||||
<a href=#215 id=215 data-nosnippet>215</a> alg => {
|
||||
<a href=#216 id=216 data-nosnippet>216</a> <span class="kw">return </span><span class="prelude-val">Err</span>(HashCommitError::unsupported_alg(alg));
|
||||
<a href=#217 id=217 data-nosnippet>217</a> }
|
||||
<a href=#218 id=218 data-nosnippet>218</a> };
|
||||
<a href=#219 id=219 data-nosnippet>219</a>
|
||||
<a href=#220 id=220 data-nosnippet>220</a> <span class="kw">fn </span>unsupported_alg(alg: HashAlgId) -> <span class="self">Self </span>{
|
||||
<a href=#221 id=221 data-nosnippet>221</a> <span class="self">Self</span>(ErrorRepr::UnsupportedAlg { alg })
|
||||
<a href=#222 id=222 data-nosnippet>222</a> }
|
||||
<a href=#223 id=223 data-nosnippet>223</a>}
|
||||
<a href=#224 id=224 data-nosnippet>224</a>
|
||||
<a href=#225 id=225 data-nosnippet>225</a><span class="attr">#[derive(Debug, thiserror::Error)]
|
||||
<a href=#226 id=226 data-nosnippet>226</a>#[error(<span class="string">"hash commit error: {0}"</span>)]
|
||||
<a href=#227 id=227 data-nosnippet>227</a></span><span class="kw">enum </span>ErrorRepr {
|
||||
<a href=#228 id=228 data-nosnippet>228</a> <span class="attr">#[error(<span class="string">"VM error: {0}"</span>)]
|
||||
<a href=#229 id=229 data-nosnippet>229</a> </span>Vm(VmError),
|
||||
<a href=#230 id=230 data-nosnippet>230</a> <span class="attr">#[error(<span class="string">"failed to decode hash"</span>)]
|
||||
<a href=#231 id=231 data-nosnippet>231</a> </span>Decode,
|
||||
<a href=#232 id=232 data-nosnippet>232</a> <span class="attr">#[error(<span class="string">"failed to convert hash: {0}"</span>)]
|
||||
<a href=#233 id=233 data-nosnippet>233</a> </span>Convert(<span class="kw-2">&</span><span class="lifetime">'static </span>str),
|
||||
<a href=#234 id=234 data-nosnippet>234</a> <span class="attr">#[error(<span class="string">"unsupported hash algorithm: {alg}"</span>)]
|
||||
<a href=#235 id=235 data-nosnippet>235</a> </span>UnsupportedAlg { alg: HashAlgId },
|
||||
<a href=#236 id=236 data-nosnippet>236</a> <span class="attr">#[error(<span class="string">"hasher error: {0}"</span>)]
|
||||
<a href=#237 id=237 data-nosnippet>237</a> </span>Hasher(Box<<span class="kw">dyn </span>std::error::Error + Send + Sync>),
|
||||
<a href=#238 id=238 data-nosnippet>238</a>}
|
||||
<a href=#220 id=220 data-nosnippet>220</a> output.push((direction, idx, alg, hash, blinder));
|
||||
<a href=#221 id=221 data-nosnippet>221</a> }
|
||||
<a href=#222 id=222 data-nosnippet>222</a>
|
||||
<a href=#223 id=223 data-nosnippet>223</a> <span class="prelude-val">Ok</span>(output)
|
||||
<a href=#224 id=224 data-nosnippet>224</a>}
|
||||
<a href=#225 id=225 data-nosnippet>225</a>
|
||||
<a href=#226 id=226 data-nosnippet>226</a><span class="doccomment">/// Error type for hash commitments.
|
||||
<a href=#227 id=227 data-nosnippet>227</a></span><span class="attr">#[derive(Debug, thiserror::Error)]
|
||||
<a href=#228 id=228 data-nosnippet>228</a>#[error(transparent)]
|
||||
<a href=#229 id=229 data-nosnippet>229</a></span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">struct </span>HashCommitError(<span class="attr">#[from] </span>ErrorRepr);
|
||||
<a href=#230 id=230 data-nosnippet>230</a>
|
||||
<a href=#231 id=231 data-nosnippet>231</a><span class="kw">impl </span>HashCommitError {
|
||||
<a href=#232 id=232 data-nosnippet>232</a> <span class="kw">fn </span>decode() -> <span class="self">Self </span>{
|
||||
<a href=#233 id=233 data-nosnippet>233</a> <span class="self">Self</span>(ErrorRepr::Decode)
|
||||
<a href=#234 id=234 data-nosnippet>234</a> }
|
||||
<a href=#235 id=235 data-nosnippet>235</a>
|
||||
<a href=#236 id=236 data-nosnippet>236</a> <span class="kw">fn </span>convert(e: <span class="kw-2">&</span><span class="lifetime">'static </span>str) -> <span class="self">Self </span>{
|
||||
<a href=#237 id=237 data-nosnippet>237</a> <span class="self">Self</span>(ErrorRepr::Convert(e))
|
||||
<a href=#238 id=238 data-nosnippet>238</a> }
|
||||
<a href=#239 id=239 data-nosnippet>239</a>
|
||||
<a href=#240 id=240 data-nosnippet>240</a><span class="kw">impl </span>From<VmError> <span class="kw">for </span>HashCommitError {
|
||||
<a href=#241 id=241 data-nosnippet>241</a> <span class="kw">fn </span>from(value: VmError) -> <span class="self">Self </span>{
|
||||
<a href=#242 id=242 data-nosnippet>242</a> <span class="self">Self</span>(ErrorRepr::Vm(value))
|
||||
<a href=#243 id=243 data-nosnippet>243</a> }
|
||||
<a href=#244 id=244 data-nosnippet>244</a>}
|
||||
<a href=#240 id=240 data-nosnippet>240</a> <span class="kw">fn </span>hasher<E>(e: E) -> <span class="self">Self
|
||||
<a href=#241 id=241 data-nosnippet>241</a> </span><span class="kw">where
|
||||
<a href=#242 id=242 data-nosnippet>242</a> </span>E: Into<Box<<span class="kw">dyn </span>std::error::Error + Send + Sync>>,
|
||||
<a href=#243 id=243 data-nosnippet>243</a> {
|
||||
<a href=#244 id=244 data-nosnippet>244</a> <span class="self">Self</span>(ErrorRepr::Hasher(e.into()))
|
||||
<a href=#245 id=245 data-nosnippet>245</a> }
|
||||
<a href=#246 id=246 data-nosnippet>246</a>
|
||||
<a href=#247 id=247 data-nosnippet>247</a> <span class="kw">fn </span>unsupported_alg(alg: HashAlgId) -> <span class="self">Self </span>{
|
||||
<a href=#248 id=248 data-nosnippet>248</a> <span class="self">Self</span>(ErrorRepr::UnsupportedAlg { alg })
|
||||
<a href=#249 id=249 data-nosnippet>249</a> }
|
||||
<a href=#250 id=250 data-nosnippet>250</a>}
|
||||
<a href=#251 id=251 data-nosnippet>251</a>
|
||||
<a href=#252 id=252 data-nosnippet>252</a><span class="attr">#[derive(Debug, thiserror::Error)]
|
||||
<a href=#253 id=253 data-nosnippet>253</a>#[error(<span class="string">"hash commit error: {0}"</span>)]
|
||||
<a href=#254 id=254 data-nosnippet>254</a></span><span class="kw">enum </span>ErrorRepr {
|
||||
<a href=#255 id=255 data-nosnippet>255</a> <span class="attr">#[error(<span class="string">"VM error: {0}"</span>)]
|
||||
<a href=#256 id=256 data-nosnippet>256</a> </span>Vm(VmError),
|
||||
<a href=#257 id=257 data-nosnippet>257</a> <span class="attr">#[error(<span class="string">"failed to decode hash"</span>)]
|
||||
<a href=#258 id=258 data-nosnippet>258</a> </span>Decode,
|
||||
<a href=#259 id=259 data-nosnippet>259</a> <span class="attr">#[error(<span class="string">"failed to convert hash: {0}"</span>)]
|
||||
<a href=#260 id=260 data-nosnippet>260</a> </span>Convert(<span class="kw-2">&</span><span class="lifetime">'static </span>str),
|
||||
<a href=#261 id=261 data-nosnippet>261</a> <span class="attr">#[error(<span class="string">"unsupported hash algorithm: {alg}"</span>)]
|
||||
<a href=#262 id=262 data-nosnippet>262</a> </span>UnsupportedAlg { alg: HashAlgId },
|
||||
<a href=#263 id=263 data-nosnippet>263</a> <span class="attr">#[error(<span class="string">"hasher error: {0}"</span>)]
|
||||
<a href=#264 id=264 data-nosnippet>264</a> </span>Hasher(Box<<span class="kw">dyn </span>std::error::Error + Send + Sync>),
|
||||
<a href=#265 id=265 data-nosnippet>265</a>}
|
||||
<a href=#266 id=266 data-nosnippet>266</a>
|
||||
<a href=#267 id=267 data-nosnippet>267</a><span class="kw">impl </span>From<VmError> <span class="kw">for </span>HashCommitError {
|
||||
<a href=#268 id=268 data-nosnippet>268</a> <span class="kw">fn </span>from(value: VmError) -> <span class="self">Self </span>{
|
||||
<a href=#269 id=269 data-nosnippet>269</a> <span class="self">Self</span>(ErrorRepr::Vm(value))
|
||||
<a href=#270 id=270 data-nosnippet>270</a> }
|
||||
<a href=#271 id=271 data-nosnippet>271</a>}
|
||||
</code></pre></div></section></main></body></html>
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user