Note values should be little-endian byte order.
This commit is contained in:
@@ -3,6 +3,7 @@
|
||||
#include "sodium.h"
|
||||
|
||||
#include "zerocash/utils/util.h"
|
||||
#include "zcash/util.h"
|
||||
|
||||
#include <memory>
|
||||
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
#include "Note.hpp"
|
||||
#include "prf.h"
|
||||
#include "crypto/sha256.h"
|
||||
#include "zerocash/utils/util.h"
|
||||
|
||||
#include "version.h"
|
||||
#include "streams.h"
|
||||
|
||||
#include "zcash/util.h"
|
||||
|
||||
namespace libzcash {
|
||||
|
||||
Note::Note() {
|
||||
@@ -22,8 +23,7 @@ uint256 Note::cm() const {
|
||||
hasher.Write(&discriminant, 1);
|
||||
hasher.Write(a_pk.begin(), 32);
|
||||
|
||||
std::vector<unsigned char> value_vec(sizeof(value), 0);
|
||||
libzerocash::convertIntToBytesVector(value, value_vec);
|
||||
auto value_vec = convertIntToVectorLE(value);
|
||||
|
||||
hasher.Write(&value_vec[0], value_vec.size());
|
||||
hasher.Write(rho.begin(), 32);
|
||||
|
||||
@@ -29,8 +29,7 @@ std::vector<bool> uint256_to_bool_vector(uint256 input) {
|
||||
}
|
||||
|
||||
std::vector<bool> uint64_to_bool_vector(uint64_t input) {
|
||||
std::vector<unsigned char> num_bv(8, 0);
|
||||
libzerocash::convertIntToBytesVector(input, num_bv);
|
||||
auto num_bv = convertIntToVectorLE(input);
|
||||
std::vector<bool> num_v(64, 0);
|
||||
libzerocash::convertBytesVectorToVector(num_bv, num_v);
|
||||
|
||||
@@ -47,9 +46,26 @@ void insert_uint64(std::vector<bool>& into, uint64_t from) {
|
||||
into.insert(into.end(), num.begin(), num.end());
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
T swap_endianness_u64(T v) {
|
||||
if (v.size() != 64) {
|
||||
throw std::length_error("invalid bit length for 64-bit unsigned integer");
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < 4; i++) {
|
||||
for (size_t j = 0; j < 8; j++) {
|
||||
std::swap(v[i*8 + j], v[((7-i)*8)+j]);
|
||||
}
|
||||
}
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
template<typename FieldT>
|
||||
linear_combination<FieldT> packed_addition(pb_variable_array<FieldT>& input) {
|
||||
linear_combination<FieldT> packed_addition(pb_variable_array<FieldT> input) {
|
||||
auto input_swapped = swap_endianness_u64(input);
|
||||
|
||||
return pb_packing_sum<FieldT>(pb_variable_array<FieldT>(
|
||||
input.rbegin(), input.rend()
|
||||
input_swapped.rbegin(), input_swapped.rend()
|
||||
));
|
||||
}
|
||||
|
||||
12
src/zcash/util.cpp
Normal file
12
src/zcash/util.cpp
Normal file
@@ -0,0 +1,12 @@
|
||||
#include "zcash/util.h"
|
||||
#include <algorithm>
|
||||
|
||||
std::vector<unsigned char> convertIntToVectorLE(const uint64_t val_int) {
|
||||
std::vector<unsigned char> bytes;
|
||||
|
||||
for(size_t i = 0; i < 8; i++) {
|
||||
bytes.push_back(val_int >> (i * 8));
|
||||
}
|
||||
|
||||
return bytes;
|
||||
}
|
||||
9
src/zcash/util.h
Normal file
9
src/zcash/util.h
Normal file
@@ -0,0 +1,9 @@
|
||||
#ifndef __ZCASH_UTIL_H
|
||||
#define __ZCASH_UTIL_H
|
||||
|
||||
#include <vector>
|
||||
#include <cstdint>
|
||||
|
||||
std::vector<unsigned char> convertIntToVectorLE(const uint64_t val_int);
|
||||
|
||||
#endif // __ZCASH_UTIL_H
|
||||
Reference in New Issue
Block a user