mirror of
https://github.com/sparrowwallet/drongo.git
synced 2024-12-26 01:56:44 +00:00
handle psbt keytypes with values greater than single byte compact integers
This commit is contained in:
parent
6b1a0bba95
commit
d73d3439f6
2 changed files with 25 additions and 19 deletions
|
@ -16,11 +16,11 @@ import java.util.Map;
|
||||||
|
|
||||||
public class PSBTEntry {
|
public class PSBTEntry {
|
||||||
private final byte[] key;
|
private final byte[] key;
|
||||||
private final byte keyType;
|
private final int keyType;
|
||||||
private final byte[] keyData;
|
private final byte[] keyData;
|
||||||
private final byte[] data;
|
private final byte[] data;
|
||||||
|
|
||||||
public PSBTEntry(byte[] key, byte keyType, byte[] keyData, byte[] data) {
|
public PSBTEntry(byte[] key, int keyType, byte[] keyData, byte[] data) {
|
||||||
this.key = key;
|
this.key = key;
|
||||||
this.keyType = keyType;
|
this.keyType = keyType;
|
||||||
this.keyData = keyData;
|
this.keyData = keyData;
|
||||||
|
@ -39,12 +39,13 @@ public class PSBTEntry {
|
||||||
byte[] key = new byte[keyLen];
|
byte[] key = new byte[keyLen];
|
||||||
psbtByteBuffer.get(key);
|
psbtByteBuffer.get(key);
|
||||||
|
|
||||||
byte keyType = key[0];
|
ByteBuffer keyBuf = ByteBuffer.wrap(key);
|
||||||
|
int keyType = readCompactInt(keyBuf);
|
||||||
|
|
||||||
byte[] keyData = null;
|
byte[] keyData = null;
|
||||||
if (key.length > 1) {
|
if(keyBuf.hasRemaining()) {
|
||||||
keyData = new byte[key.length - 1];
|
keyData = new byte[keyBuf.remaining()];
|
||||||
System.arraycopy(key, 1, keyData, 0, keyData.length);
|
keyBuf.get(keyData);
|
||||||
}
|
}
|
||||||
|
|
||||||
int dataLen = readCompactInt(psbtByteBuffer);
|
int dataLen = readCompactInt(psbtByteBuffer);
|
||||||
|
@ -143,22 +144,20 @@ public class PSBTEntry {
|
||||||
return baos.toByteArray();
|
return baos.toByteArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
static PSBTEntry populateEntry(byte type, byte[] keydata, byte[] data) {
|
static PSBTEntry populateEntry(int type, byte[] keyData, byte[] data) {
|
||||||
return new PSBTEntry(new byte[] {type}, type, keydata, data);
|
ByteArrayOutputStream baos = new ByteArrayOutputStream(1 + (keyData == null ? 0 : keyData.length));
|
||||||
}
|
baos.writeBytes(writeCompactInt(type));
|
||||||
|
|
||||||
void serializeToStream(ByteArrayOutputStream baos) {
|
|
||||||
int keyLen = 1;
|
|
||||||
if(keyData != null) {
|
|
||||||
keyLen += keyData.length;
|
|
||||||
}
|
|
||||||
|
|
||||||
baos.writeBytes(writeCompactInt(keyLen));
|
|
||||||
baos.writeBytes(key);
|
|
||||||
if(keyData != null) {
|
if(keyData != null) {
|
||||||
baos.writeBytes(keyData);
|
baos.writeBytes(keyData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return new PSBTEntry(baos.toByteArray(), type, keyData, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
void serializeToStream(ByteArrayOutputStream baos) {
|
||||||
|
baos.writeBytes(writeCompactInt(key.length));
|
||||||
|
baos.writeBytes(key);
|
||||||
|
|
||||||
baos.writeBytes(writeCompactInt(data.length));
|
baos.writeBytes(writeCompactInt(data.length));
|
||||||
baos.writeBytes(data);
|
baos.writeBytes(data);
|
||||||
}
|
}
|
||||||
|
@ -167,7 +166,7 @@ public class PSBTEntry {
|
||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
public byte getKeyType() {
|
public int getKeyType() {
|
||||||
return keyType;
|
return keyType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -313,6 +313,13 @@ public class PSBTTest {
|
||||||
Assertions.assertEquals(noWitnessDataPsbt, psbt4.toBase64String());
|
Assertions.assertEquals(noWitnessDataPsbt, psbt4.toBase64String());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void largeKeyType() throws PSBTParseException {
|
||||||
|
String psbt = "cHNidP8BAD8CAAAAAf//////////////////////////////////////////AAAAAAD/////AQAAAAAAAAAAA2oBAAAAAAAF/v//AAAAAAAA";
|
||||||
|
PSBT psbt1 = PSBT.fromString(psbt);
|
||||||
|
Assertions.assertEquals("cHNidP8BAD8CAAAAAf//////////////////////////////////////////AAAAAAD/////AQAAAAAAAAAAA2oBAAAAAAAAAAA=", psbt1.toBase64String());
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void creatorBip() throws PSBTParseException {
|
public void creatorBip() throws PSBTParseException {
|
||||||
Transaction transaction = new Transaction();
|
Transaction transaction = new Transaction();
|
||||||
|
|
Loading…
Reference in a new issue