This commit is contained in:
sosthene-nitrokey
2024-10-02 10:04:32 +00:00
parent 54f56afc33
commit 9506c2cd4a
9 changed files with 426 additions and 42 deletions
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
+1 -1
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2
View File
@@ -17,6 +17,7 @@
<a href="#17" id="17">17</a>
<a href="#18" id="18">18</a>
<a href="#19" id="19">19</a>
<a href="#20" id="20">20</a>
</pre></div><pre class="rust"><code><span class="kw">pub const </span>MAJOR_OFFSET: u8 = <span class="number">5</span>;
<span class="kw">pub const </span>MAJOR_POSINT: u8 = <span class="number">0</span>;
@@ -26,6 +27,7 @@
<span class="kw">pub const </span>MAJOR_ARRAY: u8 = <span class="number">4</span>;
<span class="kw">pub const </span>MAJOR_MAP: u8 = <span class="number">5</span>;
<span class="kw">pub const </span>MAJOR_SIMPLE: u8 = <span class="number">7</span>;
<span class="kw">pub const </span>MAJOR_FLOAT: u8 = <span class="number">7</span>;
<span class="kw">pub const </span>SIMPLE_FALSE: u8 = <span class="number">20</span>;
<span class="kw">pub const </span>SIMPLE_TRUE: u8 = <span class="number">21</span>;
+377 -3
View File
@@ -1077,6 +1077,193 @@
<a href="#1077" id="1077">1077</a>
<a href="#1078" id="1078">1078</a>
<a href="#1079" id="1079">1079</a>
<a href="#1080" id="1080">1080</a>
<a href="#1081" id="1081">1081</a>
<a href="#1082" id="1082">1082</a>
<a href="#1083" id="1083">1083</a>
<a href="#1084" id="1084">1084</a>
<a href="#1085" id="1085">1085</a>
<a href="#1086" id="1086">1086</a>
<a href="#1087" id="1087">1087</a>
<a href="#1088" id="1088">1088</a>
<a href="#1089" id="1089">1089</a>
<a href="#1090" id="1090">1090</a>
<a href="#1091" id="1091">1091</a>
<a href="#1092" id="1092">1092</a>
<a href="#1093" id="1093">1093</a>
<a href="#1094" id="1094">1094</a>
<a href="#1095" id="1095">1095</a>
<a href="#1096" id="1096">1096</a>
<a href="#1097" id="1097">1097</a>
<a href="#1098" id="1098">1098</a>
<a href="#1099" id="1099">1099</a>
<a href="#1100" id="1100">1100</a>
<a href="#1101" id="1101">1101</a>
<a href="#1102" id="1102">1102</a>
<a href="#1103" id="1103">1103</a>
<a href="#1104" id="1104">1104</a>
<a href="#1105" id="1105">1105</a>
<a href="#1106" id="1106">1106</a>
<a href="#1107" id="1107">1107</a>
<a href="#1108" id="1108">1108</a>
<a href="#1109" id="1109">1109</a>
<a href="#1110" id="1110">1110</a>
<a href="#1111" id="1111">1111</a>
<a href="#1112" id="1112">1112</a>
<a href="#1113" id="1113">1113</a>
<a href="#1114" id="1114">1114</a>
<a href="#1115" id="1115">1115</a>
<a href="#1116" id="1116">1116</a>
<a href="#1117" id="1117">1117</a>
<a href="#1118" id="1118">1118</a>
<a href="#1119" id="1119">1119</a>
<a href="#1120" id="1120">1120</a>
<a href="#1121" id="1121">1121</a>
<a href="#1122" id="1122">1122</a>
<a href="#1123" id="1123">1123</a>
<a href="#1124" id="1124">1124</a>
<a href="#1125" id="1125">1125</a>
<a href="#1126" id="1126">1126</a>
<a href="#1127" id="1127">1127</a>
<a href="#1128" id="1128">1128</a>
<a href="#1129" id="1129">1129</a>
<a href="#1130" id="1130">1130</a>
<a href="#1131" id="1131">1131</a>
<a href="#1132" id="1132">1132</a>
<a href="#1133" id="1133">1133</a>
<a href="#1134" id="1134">1134</a>
<a href="#1135" id="1135">1135</a>
<a href="#1136" id="1136">1136</a>
<a href="#1137" id="1137">1137</a>
<a href="#1138" id="1138">1138</a>
<a href="#1139" id="1139">1139</a>
<a href="#1140" id="1140">1140</a>
<a href="#1141" id="1141">1141</a>
<a href="#1142" id="1142">1142</a>
<a href="#1143" id="1143">1143</a>
<a href="#1144" id="1144">1144</a>
<a href="#1145" id="1145">1145</a>
<a href="#1146" id="1146">1146</a>
<a href="#1147" id="1147">1147</a>
<a href="#1148" id="1148">1148</a>
<a href="#1149" id="1149">1149</a>
<a href="#1150" id="1150">1150</a>
<a href="#1151" id="1151">1151</a>
<a href="#1152" id="1152">1152</a>
<a href="#1153" id="1153">1153</a>
<a href="#1154" id="1154">1154</a>
<a href="#1155" id="1155">1155</a>
<a href="#1156" id="1156">1156</a>
<a href="#1157" id="1157">1157</a>
<a href="#1158" id="1158">1158</a>
<a href="#1159" id="1159">1159</a>
<a href="#1160" id="1160">1160</a>
<a href="#1161" id="1161">1161</a>
<a href="#1162" id="1162">1162</a>
<a href="#1163" id="1163">1163</a>
<a href="#1164" id="1164">1164</a>
<a href="#1165" id="1165">1165</a>
<a href="#1166" id="1166">1166</a>
<a href="#1167" id="1167">1167</a>
<a href="#1168" id="1168">1168</a>
<a href="#1169" id="1169">1169</a>
<a href="#1170" id="1170">1170</a>
<a href="#1171" id="1171">1171</a>
<a href="#1172" id="1172">1172</a>
<a href="#1173" id="1173">1173</a>
<a href="#1174" id="1174">1174</a>
<a href="#1175" id="1175">1175</a>
<a href="#1176" id="1176">1176</a>
<a href="#1177" id="1177">1177</a>
<a href="#1178" id="1178">1178</a>
<a href="#1179" id="1179">1179</a>
<a href="#1180" id="1180">1180</a>
<a href="#1181" id="1181">1181</a>
<a href="#1182" id="1182">1182</a>
<a href="#1183" id="1183">1183</a>
<a href="#1184" id="1184">1184</a>
<a href="#1185" id="1185">1185</a>
<a href="#1186" id="1186">1186</a>
<a href="#1187" id="1187">1187</a>
<a href="#1188" id="1188">1188</a>
<a href="#1189" id="1189">1189</a>
<a href="#1190" id="1190">1190</a>
<a href="#1191" id="1191">1191</a>
<a href="#1192" id="1192">1192</a>
<a href="#1193" id="1193">1193</a>
<a href="#1194" id="1194">1194</a>
<a href="#1195" id="1195">1195</a>
<a href="#1196" id="1196">1196</a>
<a href="#1197" id="1197">1197</a>
<a href="#1198" id="1198">1198</a>
<a href="#1199" id="1199">1199</a>
<a href="#1200" id="1200">1200</a>
<a href="#1201" id="1201">1201</a>
<a href="#1202" id="1202">1202</a>
<a href="#1203" id="1203">1203</a>
<a href="#1204" id="1204">1204</a>
<a href="#1205" id="1205">1205</a>
<a href="#1206" id="1206">1206</a>
<a href="#1207" id="1207">1207</a>
<a href="#1208" id="1208">1208</a>
<a href="#1209" id="1209">1209</a>
<a href="#1210" id="1210">1210</a>
<a href="#1211" id="1211">1211</a>
<a href="#1212" id="1212">1212</a>
<a href="#1213" id="1213">1213</a>
<a href="#1214" id="1214">1214</a>
<a href="#1215" id="1215">1215</a>
<a href="#1216" id="1216">1216</a>
<a href="#1217" id="1217">1217</a>
<a href="#1218" id="1218">1218</a>
<a href="#1219" id="1219">1219</a>
<a href="#1220" id="1220">1220</a>
<a href="#1221" id="1221">1221</a>
<a href="#1222" id="1222">1222</a>
<a href="#1223" id="1223">1223</a>
<a href="#1224" id="1224">1224</a>
<a href="#1225" id="1225">1225</a>
<a href="#1226" id="1226">1226</a>
<a href="#1227" id="1227">1227</a>
<a href="#1228" id="1228">1228</a>
<a href="#1229" id="1229">1229</a>
<a href="#1230" id="1230">1230</a>
<a href="#1231" id="1231">1231</a>
<a href="#1232" id="1232">1232</a>
<a href="#1233" id="1233">1233</a>
<a href="#1234" id="1234">1234</a>
<a href="#1235" id="1235">1235</a>
<a href="#1236" id="1236">1236</a>
<a href="#1237" id="1237">1237</a>
<a href="#1238" id="1238">1238</a>
<a href="#1239" id="1239">1239</a>
<a href="#1240" id="1240">1240</a>
<a href="#1241" id="1241">1241</a>
<a href="#1242" id="1242">1242</a>
<a href="#1243" id="1243">1243</a>
<a href="#1244" id="1244">1244</a>
<a href="#1245" id="1245">1245</a>
<a href="#1246" id="1246">1246</a>
<a href="#1247" id="1247">1247</a>
<a href="#1248" id="1248">1248</a>
<a href="#1249" id="1249">1249</a>
<a href="#1250" id="1250">1250</a>
<a href="#1251" id="1251">1251</a>
<a href="#1252" id="1252">1252</a>
<a href="#1253" id="1253">1253</a>
<a href="#1254" id="1254">1254</a>
<a href="#1255" id="1255">1255</a>
<a href="#1256" id="1256">1256</a>
<a href="#1257" id="1257">1257</a>
<a href="#1258" id="1258">1258</a>
<a href="#1259" id="1259">1259</a>
<a href="#1260" id="1260">1260</a>
<a href="#1261" id="1261">1261</a>
<a href="#1262" id="1262">1262</a>
<a href="#1263" id="1263">1263</a>
<a href="#1264" id="1264">1264</a>
<a href="#1265" id="1265">1265</a>
<a href="#1266" id="1266">1266</a>
</pre></div><pre class="rust"><code><span class="kw">use </span>serde::Deserialize;
<span class="kw">use </span>serde::de::IntoDeserializer;
@@ -1281,6 +1468,82 @@
}
}
<span class="kw">fn </span>ignore_int(<span class="kw-2">&amp;mut </span><span class="self">self</span>, major: u8) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
<span class="kw">let </span>additional = <span class="self">self</span>.expect_major(major)<span class="question-mark">?</span>;
<span class="kw">match </span>additional {
<span class="number">0</span>..=<span class="number">23 </span>=&gt; {}
<span class="number">24 </span>=&gt; {
<span class="self">self</span>.try_take_n(<span class="number">1</span>)<span class="question-mark">?</span>;
}
<span class="number">25 </span>=&gt; {
<span class="self">self</span>.try_take_n(<span class="number">2</span>)<span class="question-mark">?</span>;
}
<span class="number">26 </span>=&gt; {
<span class="self">self</span>.try_take_n(<span class="number">4</span>)<span class="question-mark">?</span>;
}
<span class="number">27 </span>=&gt; {
<span class="self">self</span>.try_take_n(<span class="number">8</span>)<span class="question-mark">?</span>;
}
<span class="kw">_ </span>=&gt; <span class="kw">return </span><span class="prelude-val">Err</span>(Error::DeserializeBadU16),
};
<span class="prelude-val">Ok</span>(())
}
<span class="kw">fn </span>ignore_bytes(<span class="kw-2">&amp;mut </span><span class="self">self</span>, major: u8) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
<span class="kw">let </span>length = <span class="self">self</span>.raw_deserialize_u32(major)<span class="question-mark">? </span><span class="kw">as </span>usize;
<span class="self">self</span>.try_take_n(length)<span class="question-mark">?</span>;
<span class="prelude-val">Ok</span>(())
}
<span class="kw">fn </span>ignore_array(<span class="kw-2">&amp;mut </span><span class="self">self</span>, major: u8, mult: usize) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
<span class="kw">let </span>length = <span class="self">self</span>.raw_deserialize_u32(major)<span class="question-mark">? </span><span class="kw">as </span>usize;
<span class="kw">let </span><span class="prelude-val">Some</span>(real_length) = length.checked_mul(mult) <span class="kw">else </span>{
<span class="kw">return </span><span class="prelude-val">Err</span>(Error::InexistentSliceToArrayError);
};
<span class="kw">for _ in </span><span class="number">0</span>..real_length {
<span class="self">self</span>.ignore()<span class="question-mark">?</span>;
}
<span class="prelude-val">Ok</span>(())
}
<span class="kw">fn </span>ignore_float(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
<span class="kw">let </span>additional = <span class="self">self</span>.expect_major(<span class="number">7</span>)<span class="question-mark">?</span>;
<span class="kw">match </span>additional {
<span class="number">0</span>..=<span class="number">23 </span>=&gt; {}
<span class="number">24 </span>=&gt; {
<span class="self">self</span>.try_take_n(<span class="number">1</span>)<span class="question-mark">?</span>;
}
<span class="number">25 </span>=&gt; {
<span class="self">self</span>.try_take_n(<span class="number">2</span>)<span class="question-mark">?</span>;
}
<span class="number">26 </span>=&gt; {
<span class="self">self</span>.try_take_n(<span class="number">4</span>)<span class="question-mark">?</span>;
}
<span class="number">27 </span>=&gt; {
<span class="self">self</span>.try_take_n(<span class="number">8</span>)<span class="question-mark">?</span>;
}
<span class="kw">_ </span>=&gt; <span class="kw">return </span><span class="prelude-val">Err</span>(Error::DeserializeBadMajor),
};
<span class="prelude-val">Ok</span>(())
}
<span class="kw">fn </span>ignore(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
<span class="kw">let </span>major = <span class="self">self</span>.peek_major()<span class="question-mark">?</span>;
<span class="kw">match </span>major {
MAJOR_POSINT | MAJOR_NEGINT =&gt; <span class="self">self</span>.ignore_int(major)<span class="question-mark">?</span>,
MAJOR_BYTES | MAJOR_STR =&gt; <span class="self">self</span>.ignore_bytes(major)<span class="question-mark">?</span>,
MAJOR_ARRAY =&gt; <span class="self">self</span>.ignore_array(MAJOR_ARRAY, <span class="number">1</span>)<span class="question-mark">?</span>,
MAJOR_MAP =&gt; <span class="self">self</span>.ignore_array(MAJOR_MAP, <span class="number">2</span>)<span class="question-mark">?</span>,
<span class="number">6 </span>=&gt; {
<span class="self">self</span>.ignore_int(<span class="number">6</span>)<span class="question-mark">?</span>;
<span class="self">self</span>.ignore()<span class="question-mark">?</span>;
}
MAJOR_FLOAT =&gt; <span class="self">self</span>.ignore_float()<span class="question-mark">?</span>,
<span class="kw">_ </span>=&gt; <span class="kw">return </span><span class="prelude-val">Err</span>(Error::DeserializeBadMajor),
}
<span class="prelude-val">Ok</span>(())
}
<span class="comment">// fn try_take_varint(&amp;mut self) -&gt; Result&lt;usize&gt; {
// for i in 0..VarintUsize::varint_usize_max() {
// let val = self.input.get(i).ok_or(Error::DeserializeUnexpectedEnd)?;
@@ -1514,11 +1777,26 @@
}
}
<span class="kw">fn </span>deserialize_i64&lt;V&gt;(<span class="self">self</span>, _visitor: V) -&gt; <span class="prelude-ty">Result</span>&lt;V::Value&gt;
<span class="kw">fn </span>deserialize_i64&lt;V&gt;(<span class="self">self</span>, visitor: V) -&gt; <span class="prelude-ty">Result</span>&lt;V::Value&gt;
<span class="kw">where
</span>V: Visitor&lt;<span class="lifetime">'de</span>&gt;,
{
<span class="prelude-val">Err</span>(Error::NotYetImplemented)
<span class="kw">match </span><span class="self">self</span>.peek_major()<span class="question-mark">? </span>{
<span class="comment">// TODO: figure out if this is BAAAAD for size or speed
</span>major @ <span class="number">0</span>..=<span class="number">1 </span>=&gt; {
<span class="kw">let </span>raw = <span class="self">self</span>.raw_deserialize_u64(major)<span class="question-mark">?</span>;
<span class="kw">if </span>raw &lt;= i64::max_value() <span class="kw">as </span>u64 {
<span class="kw">if </span>major == MAJOR_POSINT {
visitor.visit_i64(raw <span class="kw">as </span>i64)
} <span class="kw">else </span>{
visitor.visit_i64(-<span class="number">1 </span>- (raw <span class="kw">as </span>i64))
}
} <span class="kw">else </span>{
<span class="prelude-val">Err</span>(Error::DeserializeBadI64)
}
}
<span class="kw">_ </span>=&gt; <span class="prelude-val">Err</span>(Error::DeserializeBadI16),
}
}
<span class="kw">fn </span>deserialize_u8&lt;V&gt;(<span class="self">self</span>, visitor: V) -&gt; <span class="prelude-ty">Result</span>&lt;V::Value&gt;
@@ -1785,7 +2063,8 @@
</span>V: Visitor&lt;<span class="lifetime">'de</span>&gt;,
{
<span class="comment">// Ignore extra fields/options
</span>visitor.visit_none()
</span><span class="self">self</span>.ignore()<span class="question-mark">?</span>;
visitor.visit_none()
}
}
@@ -1869,6 +2148,7 @@
</span><span class="attr">#[cfg(test)]
</span><span class="kw">mod </span>tests {
<span class="comment">// use super::*;
</span><span class="kw">use </span><span class="kw">super</span>::from_bytes;
@@ -2142,6 +2422,100 @@
<span class="macro">assert_eq!</span>(de, e);
}
<span class="attr">#[test]
</span><span class="kw">fn </span>de_ignored_any() {
<span class="kw">use </span>serde::de::IgnoredAny;
<span class="kw">use </span>serde::{Deserialize, Serialize};
<span class="attr">#[derive(Serialize, Deserialize, PartialEq, Eq, Clone, Debug)]
</span><span class="kw">pub struct </span>ValOuter&lt;<span class="lifetime">'a</span>&gt; {
inner: Outer&lt;<span class="lifetime">'a</span>&gt;,
val: <span class="kw-2">&amp;</span><span class="lifetime">'a </span>str,
}
<span class="attr">#[derive(Deserialize)]
</span><span class="kw">pub struct </span>ValIgnored&lt;<span class="lifetime">'a</span>&gt; {
<span class="attr">#[allow(unused)]
</span>inner: IgnoredAny,
val: <span class="kw-2">&amp;</span><span class="lifetime">'a </span>str,
}
<span class="attr">#[derive(Serialize, Deserialize, PartialEq, Eq, Clone, Debug)]
</span><span class="kw">pub struct </span>Inner&lt;<span class="lifetime">'a</span>&gt; {
u8: u8,
u16: u16,
u32: u32,
u64: u64,
i8: i8,
i16: i16,
i32: i32,
i64: i64,
str: <span class="kw-2">&amp;</span><span class="lifetime">'a </span>str,
option: <span class="prelude-ty">Option</span>&lt;<span class="kw-2">&amp;</span><span class="lifetime">'a </span>str&gt;,
<span class="attr">#[serde(with = <span class="string">"serde_bytes"</span>)]
</span>bytes: <span class="kw-2">&amp;</span><span class="lifetime">'a </span>[u8],
unit: (),
}
<span class="attr">#[derive(Serialize, Deserialize, PartialEq, Eq, Clone, Debug)]
</span><span class="kw">pub struct </span>Outer&lt;<span class="lifetime">'a</span>&gt; {
u8: u8,
u16: u16,
u32: u32,
u64: u64,
i8: i8,
i16: i16,
i32: i32,
i64: i64,
str: <span class="kw-2">&amp;</span><span class="lifetime">'a </span>str,
<span class="attr">#[serde(with = <span class="string">"serde_bytes"</span>)]
</span>bytes: <span class="kw-2">&amp;</span><span class="lifetime">'a </span>[u8],
unit: (),
option: <span class="prelude-ty">Option</span>&lt;<span class="kw-2">&amp;</span><span class="lifetime">'a </span>str&gt;,
nested: Inner&lt;<span class="lifetime">'a</span>&gt;,
}
<span class="kw">let </span><span class="kw-2">mut </span>buf = [<span class="number">0</span>; <span class="number">1024</span>];
<span class="kw">let </span>val = Outer {
u8: u8::MAX,
u16: u16::MAX,
u32: u32::MAX,
u64: u64::MAX,
i8: i8::MIN,
i16: i16::MIN,
i32: i32::MIN,
i64: i64::MIN,
str: <span class="string">"string"</span>,
bytes: <span class="string">b"bytes"</span>,
unit: (),
option: <span class="prelude-val">Some</span>(<span class="string">"option"</span>),
nested: Inner {
u8: <span class="number">0</span>,
u16: <span class="number">0</span>,
u32: <span class="number">0</span>,
u64: <span class="number">0</span>,
i8: i8::MIN,
i16: i16::MIN,
i32: i32::MIN,
i64: i64::MIN,
str: <span class="string">""</span>,
option: <span class="prelude-val">None</span>,
bytes: <span class="string">b""</span>,
unit: (),
},
};
<span class="kw">let </span>ser = cbor_serialize(<span class="kw-2">&amp;</span>val, <span class="kw-2">&amp;mut </span>buf).unwrap();
<span class="kw">let _</span>: IgnoredAny = cbor_deserialize(ser).unwrap();
<span class="kw">let </span>val = ValOuter {
inner: val,
val: <span class="string">"value"</span>,
};
<span class="kw">let </span>ser = cbor_serialize(<span class="kw-2">&amp;</span>val, <span class="kw-2">&amp;mut </span>buf).unwrap();
<span class="kw">let </span>de: ValOuter = cbor_deserialize(ser).unwrap();
<span class="macro">assert_eq!</span>(val, de);
<span class="kw">let </span>de: ValIgnored = cbor_deserialize(ser).unwrap();
<span class="macro">assert_eq!</span>(de.val, <span class="string">"value"</span>);
}
<span class="comment">// #[test]
// fn fuzzer_things() {
// let data: [u8; 2] = [160, 96];
+6
View File
@@ -145,6 +145,9 @@
<a href="#145" id="145">145</a>
<a href="#146" id="146">146</a>
<a href="#147" id="147">147</a>
<a href="#148" id="148">148</a>
<a href="#149" id="149">149</a>
<a href="#150" id="150">150</a>
</pre></div><pre class="rust"><code><span class="attr">#![allow(unused_variables)]
</span><span class="kw">use </span>core::fmt::{Display, Formatter};
@@ -189,6 +192,8 @@
</span>DeserializeBadI16,
<span class="doccomment">/// Expected a i32, was too large
</span>DeserializeBadI32,
<span class="doccomment">/// Expected a i64, was too large
</span>DeserializeBadI64,
<span class="doccomment">/// Expected a u8
</span>DeserializeBadU8,
<span class="doccomment">/// Expected a u16
@@ -238,6 +243,7 @@
</span>DeserializeBadI8 =&gt; <span class="string">"Expected a i8"</span>,
DeserializeBadI16 =&gt; <span class="string">"Expected a i16"</span>,
DeserializeBadI32 =&gt; <span class="string">"Expected a i32"</span>,
DeserializeBadI64 =&gt; <span class="string">"Expected a i64"</span>,
DeserializeBadMajor =&gt; <span class="string">"Expected a different major type"</span>,
DeserializeBadU8 =&gt; <span class="string">"Expected a u8"</span>,
DeserializeBadU16 =&gt; <span class="string">"Expected a u16"</span>,