forked from I2P_Developers/i2p.i2p
Streaming: Move Packet.writeSignedPacket() to PacketLocal
This commit is contained in:
@ -12,7 +12,6 @@ import net.i2p.data.DataFormatException;
|
|||||||
import net.i2p.data.DataHelper;
|
import net.i2p.data.DataHelper;
|
||||||
import net.i2p.data.Destination;
|
import net.i2p.data.Destination;
|
||||||
import net.i2p.data.Signature;
|
import net.i2p.data.Signature;
|
||||||
import net.i2p.data.SigningPrivateKey;
|
|
||||||
import net.i2p.data.SigningPublicKey;
|
import net.i2p.data.SigningPublicKey;
|
||||||
import net.i2p.util.Log;
|
import net.i2p.util.Log;
|
||||||
|
|
||||||
@ -72,13 +71,13 @@ class Packet {
|
|||||||
private long _receiveStreamId;
|
private long _receiveStreamId;
|
||||||
private long _sequenceNum;
|
private long _sequenceNum;
|
||||||
private long _ackThrough;
|
private long _ackThrough;
|
||||||
private long _nacks[];
|
protected long _nacks[];
|
||||||
private int _resendDelay;
|
private int _resendDelay;
|
||||||
private int _flags;
|
private int _flags;
|
||||||
private ByteArray _payload;
|
private ByteArray _payload;
|
||||||
// the next four are set only if the flags say so
|
// the next four are set only if the flags say so
|
||||||
private Signature _optionSignature;
|
protected Signature _optionSignature;
|
||||||
private Destination _optionFrom;
|
protected Destination _optionFrom;
|
||||||
private int _optionDelay;
|
private int _optionDelay;
|
||||||
private int _optionMaxSize;
|
private int _optionMaxSize;
|
||||||
private int _localPort;
|
private int _localPort;
|
||||||
@ -420,7 +419,7 @@ class Packet {
|
|||||||
* @param fakeSigLen if 0, include the real signature in _optionSignature;
|
* @param fakeSigLen if 0, include the real signature in _optionSignature;
|
||||||
* if nonzero, leave space for that many bytes
|
* if nonzero, leave space for that many bytes
|
||||||
*/
|
*/
|
||||||
private int writePacket(byte buffer[], int offset, int fakeSigLen) throws IllegalStateException {
|
protected int writePacket(byte buffer[], int offset, int fakeSigLen) throws IllegalStateException {
|
||||||
int cur = offset;
|
int cur = offset;
|
||||||
DataHelper.toLong(buffer, cur, 4, (_sendStreamId >= 0 ? _sendStreamId : STREAM_ID_UNKNOWN));
|
DataHelper.toLong(buffer, cur, 4, (_sendStreamId >= 0 ? _sendStreamId : STREAM_ID_UNKNOWN));
|
||||||
cur += 4;
|
cur += 4;
|
||||||
@ -721,45 +720,6 @@ class Packet {
|
|||||||
return ok;
|
return ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Sign and write the packet to the buffer (starting at the offset) and return
|
|
||||||
* the number of bytes written.
|
|
||||||
*
|
|
||||||
* @param buffer data to be written
|
|
||||||
* @param offset starting point in the buffer
|
|
||||||
* @param ctx Application Context
|
|
||||||
* @param key signing key
|
|
||||||
* @return Count of bytes written
|
|
||||||
* @throws IllegalStateException if there is data missing or otherwise b0rked
|
|
||||||
*/
|
|
||||||
public int writeSignedPacket(byte buffer[], int offset, I2PAppContext ctx, SigningPrivateKey key) throws IllegalStateException {
|
|
||||||
setFlag(FLAG_SIGNATURE_INCLUDED);
|
|
||||||
int size = writePacket(buffer, offset, key.getType().getSigLen());
|
|
||||||
_optionSignature = ctx.dsa().sign(buffer, offset, size, key);
|
|
||||||
//if (false) {
|
|
||||||
// Log l = ctx.logManager().getLog(Packet.class);
|
|
||||||
// l.error("Signing: " + toString());
|
|
||||||
// l.error(Base64.encode(buffer, 0, size));
|
|
||||||
// l.error("Signature: " + Base64.encode(_optionSignature.getData()));
|
|
||||||
//}
|
|
||||||
// jump into the signed data and inject the signature where we
|
|
||||||
// previously placed a bunch of zeroes
|
|
||||||
int signatureOffset = offset
|
|
||||||
+ 4 // sendStreamId
|
|
||||||
+ 4 // receiveStreamId
|
|
||||||
+ 4 // sequenceNum
|
|
||||||
+ 4 // ackThrough
|
|
||||||
+ (_nacks != null ? 4*_nacks.length + 1 : 1)
|
|
||||||
+ 1 // resendDelay
|
|
||||||
+ 2 // flags
|
|
||||||
+ 2 // optionSize
|
|
||||||
+ (isFlagSet(FLAG_DELAY_REQUESTED) ? 2 : 0)
|
|
||||||
+ (isFlagSet(FLAG_FROM_INCLUDED) ? _optionFrom.size() : 0)
|
|
||||||
+ (isFlagSet(FLAG_MAX_PACKET_SIZE_INCLUDED) ? 2 : 0);
|
|
||||||
System.arraycopy(_optionSignature.getData(), 0, buffer, signatureOffset, _optionSignature.length());
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
StringBuilder str = formatAsString();
|
StringBuilder str = formatAsString();
|
||||||
|
@ -9,6 +9,7 @@ import net.i2p.I2PAppContext;
|
|||||||
import net.i2p.data.Destination;
|
import net.i2p.data.Destination;
|
||||||
import net.i2p.data.SessionKey;
|
import net.i2p.data.SessionKey;
|
||||||
import net.i2p.data.SessionTag;
|
import net.i2p.data.SessionTag;
|
||||||
|
import net.i2p.data.SigningPrivateKey;
|
||||||
import net.i2p.util.Log;
|
import net.i2p.util.Log;
|
||||||
import net.i2p.util.SimpleTimer2;
|
import net.i2p.util.SimpleTimer2;
|
||||||
|
|
||||||
@ -190,7 +191,48 @@ class PacketLocal extends Packet implements MessageOutputStream.WriteStatus {
|
|||||||
|
|
||||||
public void setResendPacketEvent(SimpleTimer2.TimedEvent evt) { _resendEvent = evt; }
|
public void setResendPacketEvent(SimpleTimer2.TimedEvent evt) { _resendEvent = evt; }
|
||||||
|
|
||||||
@Override
|
/**
|
||||||
|
* Sign and write the packet to the buffer (starting at the offset) and return
|
||||||
|
* the number of bytes written.
|
||||||
|
*
|
||||||
|
* @param buffer data to be written
|
||||||
|
* @param offset starting point in the buffer
|
||||||
|
* @param ctx Application Context
|
||||||
|
* @param key signing key
|
||||||
|
* @return Count of bytes written
|
||||||
|
* @throws IllegalStateException if there is data missing or otherwise b0rked
|
||||||
|
* @since 0.9.20 moved from Packet
|
||||||
|
*/
|
||||||
|
public int writeSignedPacket(byte buffer[], int offset, I2PAppContext ctx, SigningPrivateKey key) throws IllegalStateException {
|
||||||
|
setFlag(FLAG_SIGNATURE_INCLUDED);
|
||||||
|
int size = writePacket(buffer, offset, key.getType().getSigLen());
|
||||||
|
_optionSignature = ctx.dsa().sign(buffer, offset, size, key);
|
||||||
|
//if (false) {
|
||||||
|
// Log l = ctx.logManager().getLog(Packet.class);
|
||||||
|
// l.error("Signing: " + toString());
|
||||||
|
// l.error(Base64.encode(buffer, 0, size));
|
||||||
|
// l.error("Signature: " + Base64.encode(_optionSignature.getData()));
|
||||||
|
//}
|
||||||
|
// jump into the signed data and inject the signature where we
|
||||||
|
// previously placed a bunch of zeroes
|
||||||
|
int signatureOffset = offset
|
||||||
|
//+ 4 // sendStreamId
|
||||||
|
//+ 4 // receiveStreamId
|
||||||
|
//+ 4 // sequenceNum
|
||||||
|
//+ 4 // ackThrough
|
||||||
|
//+ 1 // resendDelay
|
||||||
|
//+ 2 // flags
|
||||||
|
//+ 2 // optionSize
|
||||||
|
+ 21
|
||||||
|
+ (_nacks != null ? 4*_nacks.length + 1 : 1)
|
||||||
|
+ (isFlagSet(FLAG_DELAY_REQUESTED) ? 2 : 0)
|
||||||
|
+ (isFlagSet(FLAG_FROM_INCLUDED) ? _optionFrom.size() : 0)
|
||||||
|
+ (isFlagSet(FLAG_MAX_PACKET_SIZE_INCLUDED) ? 2 : 0);
|
||||||
|
System.arraycopy(_optionSignature.getData(), 0, buffer, signatureOffset, _optionSignature.length());
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public StringBuilder formatAsString() {
|
public StringBuilder formatAsString() {
|
||||||
StringBuilder buf = super.formatAsString();
|
StringBuilder buf = super.formatAsString();
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user