Note values should be little-endian byte order.

This commit is contained in:
Sean Bowe
2016-05-12 13:19:13 -06:00
parent 032164d5d5
commit 81469bbb83
8 changed files with 129 additions and 10 deletions

View File

@@ -3,6 +3,7 @@
#include "sodium.h"
#include "zerocash/utils/util.h"
#include "zcash/util.h"
#include <memory>

View File

@@ -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);

View File

@@ -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
View 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
View 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