diff --git a/src/Peer.cpp b/src/Peer.cpp index 6112db77d..c38008be8 100644 --- a/src/Peer.cpp +++ b/src/Peer.cpp @@ -712,6 +712,27 @@ void Peer::recvLedger(newcoin::TMLedgerData& packet) punishPeer(PP_UNWANTED_DATA); } +std::vector Peer::getSessionCookie() +{ + // get session information we can sign + // (both sides get the same information, neither side controls it) + SSL* ssl = mSocketSsl.native_handle(); + if (!ssl) throw std::runtime_error("No underlying connection"); + + // Get both finished messages + unsigned char s1[1024], s2[1024]; + int l1 = SSL_get_finished(ssl, s1, 1024); + int l2 = SSL_get_finished(ssl, s2, 1024); + if ((l1 < 16) || (l2 < 16)) throw std::runtime_error("Connection setup not complete"); + + // Hash them and XOR the results + unsigned char sha1[32], sha2[32]; + SHA512(s1, l1, sha1); + SHA512(s2, l2, sha2); + for(int i=0; i<32; i++) sha1[i]^=sha2[i]; + return std::vector(sha1, sha1+33); +} + void Peer::sendHello() { // XXX Start timer for hello required by. diff --git a/src/Peer.h b/src/Peer.h index 963bd8971..f86cd2bf4 100644 --- a/src/Peer.h +++ b/src/Peer.h @@ -81,6 +81,8 @@ protected: void recvGetLedger(newcoin::TMGetLedger& packet); void recvLedger(newcoin::TMLedgerData& packet); + std::vector getSessionCookie(); + public: typedef boost::shared_ptr pointer; diff --git a/src/SerializedLedger.cpp b/src/SerializedLedger.cpp index 7cf36ed7e..4a566542a 100644 --- a/src/SerializedLedger.cpp +++ b/src/SerializedLedger.cpp @@ -2,7 +2,7 @@ #include "SerializedLedger.h" SerializedLedgerEntry::SerializedLedgerEntry(SerializerIterator& sit, const uint256& index) - : STObject("LedgerEntry"), mIndex(index) + : SerializedType("LedgerEntry"), mIndex(index) { uint16 type = sit.get16(); mFormat = getLgrFormat(static_cast(type)); @@ -13,7 +13,7 @@ SerializedLedgerEntry::SerializedLedgerEntry(SerializerIterator& sit, const uint } SerializedLedgerEntry::SerializedLedgerEntry(const Serializer& s, const uint256& index) - : STObject("LedgerEntry"), mIndex(index) + : SerializedType("LedgerEntry"), mIndex(index) { SerializerIterator sit(s); @@ -25,7 +25,7 @@ SerializedLedgerEntry::SerializedLedgerEntry(const Serializer& s, const uint256& mObject = STObject(mFormat->elements, sit); } -SerializedLedgerEntry::SerializedLedgerEntry(LedgerEntryType type) : STObject("LedgerEntry"), mType(type) +SerializedLedgerEntry::SerializedLedgerEntry(LedgerEntryType type) : SerializedType("LedgerEntry"), mType(type) { mFormat = getLgrFormat(type); if (mFormat == NULL) throw std::runtime_error("invalid ledger entry type"); diff --git a/src/SerializedLedger.h b/src/SerializedLedger.h index a87cb360c..628e6640f 100644 --- a/src/SerializedLedger.h +++ b/src/SerializedLedger.h @@ -5,7 +5,7 @@ #include "LedgerFormats.h" #include "NewcoinAddress.h" -class SerializedLedgerEntry : public STObject +class SerializedLedgerEntry : public SerializedType { public: typedef boost::shared_ptr pointer; diff --git a/src/SerializedTransaction.h b/src/SerializedTransaction.h index fe6609518..d4ac9f035 100644 --- a/src/SerializedTransaction.h +++ b/src/SerializedTransaction.h @@ -10,7 +10,7 @@ #include "TransactionFormats.h" #include "NewcoinAddress.h" -class SerializedTransaction : public STObject +class SerializedTransaction : public SerializedType { public: typedef boost::shared_ptr pointer; diff --git a/src/Transaction.cpp b/src/Transaction.cpp index 15278c8ea..7f63e9de2 100644 --- a/src/Transaction.cpp +++ b/src/Transaction.cpp @@ -125,8 +125,8 @@ Transaction::Transaction(const NewcoinAddress& fromID, const NewcoinAddress& toI mTransaction->makeITFieldPresent(sfSourceTag); mTransaction->setITFieldU32(sfSourceTag, ident); } - mTransaction->setValueFieldU64(sfAmount, amount); - mTransaction->setValueFieldAccount(sfDestination, toID.getAccountID()); + mTransaction->setITFieldU64(sfAmount, amount); + mTransaction->setITFieldAccount(sfDestination, toID.getAccountID()); updateID(); }