Merge branch 'master' of https://bitbucket.org/bilthon/fullerene
# Conflicts: # src/main/java/com/luminiasoft/bitshares/FileBin.java
This commit is contained in:
commit
f0d0037355
4 changed files with 54 additions and 77 deletions
|
@ -5,16 +5,12 @@ import com.google.gson.JsonObject;
|
||||||
import com.google.gson.JsonParser;
|
import com.google.gson.JsonParser;
|
||||||
import com.luminiasoft.bitshares.crypto.AndroidRandomSource;
|
import com.luminiasoft.bitshares.crypto.AndroidRandomSource;
|
||||||
import com.luminiasoft.bitshares.crypto.SecureRandomStrengthener;
|
import com.luminiasoft.bitshares.crypto.SecureRandomStrengthener;
|
||||||
import java.io.ByteArrayInputStream;
|
|
||||||
import java.io.ByteArrayOutputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.UnsupportedEncodingException;
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.math.BigInteger;
|
||||||
import java.security.MessageDigest;
|
import java.security.MessageDigest;
|
||||||
import java.security.NoSuchAlgorithmException;
|
import java.security.NoSuchAlgorithmException;
|
||||||
import java.security.SecureRandom;
|
import java.security.SecureRandom;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.logging.Level;
|
|
||||||
import java.util.logging.Logger;
|
|
||||||
import org.bitcoinj.core.ECKey;
|
import org.bitcoinj.core.ECKey;
|
||||||
import org.spongycastle.crypto.DataLengthException;
|
import org.spongycastle.crypto.DataLengthException;
|
||||||
import org.spongycastle.crypto.InvalidCipherTextException;
|
import org.spongycastle.crypto.InvalidCipherTextException;
|
||||||
|
@ -23,9 +19,6 @@ import org.spongycastle.crypto.modes.CBCBlockCipher;
|
||||||
import org.spongycastle.crypto.paddings.PaddedBufferedBlockCipher;
|
import org.spongycastle.crypto.paddings.PaddedBufferedBlockCipher;
|
||||||
import org.spongycastle.crypto.params.KeyParameter;
|
import org.spongycastle.crypto.params.KeyParameter;
|
||||||
import org.spongycastle.crypto.params.ParametersWithIV;
|
import org.spongycastle.crypto.params.ParametersWithIV;
|
||||||
import org.tukaani.xz.LZMA2Options;
|
|
||||||
import org.tukaani.xz.LZMAInputStream;
|
|
||||||
import org.tukaani.xz.LZMAOutputStream;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class to manage the Bin Files
|
* Class to manage the Bin Files
|
||||||
|
@ -49,6 +42,7 @@ public abstract class FileBin {
|
||||||
|
|
||||||
System.arraycopy(input, 0, publicKey, 0, publicKey.length);
|
System.arraycopy(input, 0, publicKey, 0, publicKey.length);
|
||||||
System.arraycopy(input, 33, rawDataEncripted, 0, rawDataEncripted.length);
|
System.arraycopy(input, 33, rawDataEncripted, 0, rawDataEncripted.length);
|
||||||
|
|
||||||
MessageDigest md = MessageDigest.getInstance("SHA-256");
|
MessageDigest md = MessageDigest.getInstance("SHA-256");
|
||||||
|
|
||||||
ECKey randomECKey = ECKey.fromPublicOnly(publicKey);
|
ECKey randomECKey = ECKey.fromPublicOnly(publicKey);
|
||||||
|
@ -59,26 +53,38 @@ public abstract class FileBin {
|
||||||
|
|
||||||
byte[] checksum = new byte[4];
|
byte[] checksum = new byte[4];
|
||||||
System.arraycopy(rawData, 0, checksum, 0, 4);
|
System.arraycopy(rawData, 0, checksum, 0, 4);
|
||||||
byte[] compressedData = new byte[rawData.length-4];
|
byte[] compressedData = new byte[rawData.length - 4];
|
||||||
System.arraycopy(rawData, 4, compressedData, 0, compressedData.length);
|
System.arraycopy(rawData, 4, compressedData, 0, compressedData.length);
|
||||||
|
|
||||||
System.out.println("Despues:"+byteToString(compressedData));
|
System.out.println("Despues:"+byteToString(compressedData));
|
||||||
byte[] wallet_object_bytes = Util.decompress(compressedData);
|
byte[] wallet_object_bytes = Util.decompress(compressedData);
|
||||||
String wallet_string = byteToString(wallet_object_bytes);
|
String wallet_string = new String(wallet_object_bytes, "UTF-8");
|
||||||
JsonObject wallet = new JsonParser().parse(wallet_string).getAsJsonObject();
|
JsonObject wallet = new JsonParser().parse(wallet_string).getAsJsonObject();
|
||||||
byte[] encKey_enc = wallet.get("encryption_key").getAsString().getBytes();
|
if (wallet.get("wallet").isJsonArray()) {
|
||||||
byte[] encKey = decryptAES(encKey_enc, password.getBytes("UTF-8"));
|
wallet = wallet.get("wallet").getAsJsonArray().get(0).getAsJsonObject();
|
||||||
byte[] encBrain = wallet.get("encrypted_brainkey").getAsString().getBytes();
|
} else {
|
||||||
String BrainKey = byteToString(decryptAES(encBrain, encKey));
|
wallet = wallet.get("wallet").getAsJsonObject();
|
||||||
|
}
|
||||||
|
byte[] encKey_enc = new BigInteger(wallet.get("encryption_key").getAsString(), 16).toByteArray();
|
||||||
|
byte[] temp = new byte[encKey_enc.length - (encKey_enc[0] == 0 ? 1 : 0)];
|
||||||
|
System.arraycopy(encKey_enc, (encKey_enc[0] == 0 ? 1 : 0), temp, 0, temp.length);
|
||||||
|
byte[] encKey = decryptAES(temp, password.getBytes("UTF-8"));
|
||||||
|
temp = new byte[encKey.length - 16];
|
||||||
|
System.arraycopy(encKey, 0, temp, 0, temp.length);
|
||||||
|
|
||||||
|
byte[] encBrain = new BigInteger(wallet.get("encrypted_brainkey").getAsString(), 16).toByteArray();
|
||||||
|
while(encBrain[0] == 0){
|
||||||
|
byte[]temp2 = new byte[encBrain.length-1];
|
||||||
|
System.arraycopy(encBrain, 1, temp2, 0, temp2.length);
|
||||||
|
encBrain = temp2;
|
||||||
|
}
|
||||||
|
String BrainKey = new String((decryptAES(encBrain, temp)), "UTF-8");
|
||||||
|
|
||||||
return BrainKey;
|
return BrainKey;
|
||||||
|
|
||||||
|
} catch (UnsupportedEncodingException | NoSuchAlgorithmException ex) {
|
||||||
} catch (UnsupportedEncodingException | NoSuchAlgorithmException ex){
|
|
||||||
|
|
||||||
}
|
}
|
||||||
//Creates cypher AES with password
|
|
||||||
//Uncrypt
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -142,33 +148,7 @@ public abstract class FileBin {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static byte[] compressDataLZMA(byte[] inputBytes) {
|
private static byte[] encryptAES(byte[] input, byte[] key) {
|
||||||
LZMAOutputStream out = null;
|
|
||||||
try {
|
|
||||||
ByteArrayInputStream input = new ByteArrayInputStream(inputBytes);
|
|
||||||
ByteArrayOutputStream output = new ByteArrayOutputStream(2048);
|
|
||||||
LZMA2Options options = new LZMA2Options();
|
|
||||||
out = new LZMAOutputStream(output, options, -1);
|
|
||||||
byte[] buf = new byte[inputBytes.length];
|
|
||||||
int size;
|
|
||||||
while ((size = input.read(buf)) != -1) {
|
|
||||||
out.write(buf, 0, size);
|
|
||||||
}
|
|
||||||
out.finish();
|
|
||||||
return output.toByteArray();
|
|
||||||
} catch (IOException ex) {
|
|
||||||
Logger.getLogger(FileBin.class.getName()).log(Level.SEVERE, null, ex);
|
|
||||||
} finally {
|
|
||||||
try {
|
|
||||||
out.close();
|
|
||||||
} catch (IOException ex) {
|
|
||||||
Logger.getLogger(FileBin.class.getName()).log(Level.SEVERE, null, ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static byte[] encryptAES(byte[] input, byte[] key) {
|
|
||||||
try {
|
try {
|
||||||
MessageDigest md = MessageDigest.getInstance("SHA-512");
|
MessageDigest md = MessageDigest.getInstance("SHA-512");
|
||||||
byte[] result = md.digest(key);
|
byte[] result = md.digest(key);
|
||||||
|
@ -202,6 +182,7 @@ public abstract class FileBin {
|
||||||
System.arraycopy(result, 0, sksBytes, 0, 32);
|
System.arraycopy(result, 0, sksBytes, 0, 32);
|
||||||
PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new CBCBlockCipher(new AESFastEngine()));
|
PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new CBCBlockCipher(new AESFastEngine()));
|
||||||
cipher.init(false, new ParametersWithIV(new KeyParameter(sksBytes), ivBytes));
|
cipher.init(false, new ParametersWithIV(new KeyParameter(sksBytes), ivBytes));
|
||||||
|
|
||||||
byte[] pre_out = new byte[cipher.getOutputSize(input.length)];
|
byte[] pre_out = new byte[cipher.getOutputSize(input.length)];
|
||||||
int proc = cipher.processBytes(input, 0, input.length, pre_out, 0);
|
int proc = cipher.processBytes(input, 0, input.length, pre_out, 0);
|
||||||
int proc2 = cipher.doFinal(pre_out, proc);
|
int proc2 = cipher.doFinal(pre_out, proc);
|
||||||
|
@ -211,22 +192,22 @@ public abstract class FileBin {
|
||||||
//Unpadding
|
//Unpadding
|
||||||
int count = out[out.length-1];
|
int count = out[out.length-1];
|
||||||
byte[] temp = new byte[count];
|
byte[] temp = new byte[count];
|
||||||
System.arraycopy(out, out.length-count, temp, 0, temp.length);
|
System.arraycopy(out, out.length - count, temp, 0, temp.length);
|
||||||
byte[] temp2 = new byte[count];
|
byte[] temp2 = new byte[count];
|
||||||
Arrays.fill(temp2, (byte)count);
|
Arrays.fill(temp2, (byte) count);
|
||||||
if (Arrays.equals(temp, temp2)){
|
if (Arrays.equals(temp, temp2)) {
|
||||||
temp = new byte[out.length-count];
|
temp = new byte[out.length - count];
|
||||||
System.arraycopy(out, 0, temp, 0, out.length-count);
|
System.arraycopy(out, 0, temp, 0, out.length - count);
|
||||||
return temp;
|
return temp;
|
||||||
} else {
|
} else {
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
} catch (NoSuchAlgorithmException | DataLengthException | IllegalStateException | InvalidCipherTextException ex) {
|
} catch (NoSuchAlgorithmException | DataLengthException | IllegalStateException | InvalidCipherTextException ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static String byteToString(byte[] input) {
|
public static String byteToString(byte[] input) {
|
||||||
StringBuilder result = new StringBuilder();
|
StringBuilder result = new StringBuilder();
|
||||||
for (byte in : input) {
|
for (byte in : input) {
|
||||||
|
|
|
@ -38,7 +38,7 @@ public class Main {
|
||||||
// e.printStackTrace();
|
// e.printStackTrace();
|
||||||
// }
|
// }
|
||||||
// test.testCustomSerializer();
|
// test.testCustomSerializer();
|
||||||
test.testUserAccountSerialization();
|
//test.testUserAccountSerialization();
|
||||||
// test.testTransactionSerialization();
|
// test.testTransactionSerialization();
|
||||||
// test.testLoginSerialization();
|
// test.testLoginSerialization();
|
||||||
// test.testNetworkBroadcastSerialization();
|
// test.testNetworkBroadcastSerialization();
|
||||||
|
@ -59,6 +59,6 @@ public class Main {
|
||||||
// test.testRelativeAccountHistory();
|
// test.testRelativeAccountHistory();
|
||||||
// test.testingInvoiceGeneration();
|
// test.testingInvoiceGeneration();
|
||||||
// test.testCompression();
|
// test.testCompression();
|
||||||
// test.testCreateBinFile();
|
test.testCreateBinFile();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,20 +12,15 @@ import com.luminiasoft.bitshares.ws.*;
|
||||||
import com.neovisionaries.ws.client.*;
|
import com.neovisionaries.ws.client.*;
|
||||||
import org.bitcoinj.core.*;
|
import org.bitcoinj.core.*;
|
||||||
import org.spongycastle.crypto.Digest;
|
import org.spongycastle.crypto.Digest;
|
||||||
import org.spongycastle.crypto.digests.RIPEMD128Digest;
|
|
||||||
import org.spongycastle.crypto.digests.RIPEMD160Digest;
|
import org.spongycastle.crypto.digests.RIPEMD160Digest;
|
||||||
import org.spongycastle.crypto.digests.SHA512Digest;
|
import org.spongycastle.crypto.digests.SHA512Digest;
|
||||||
import org.spongycastle.crypto.prng.DigestRandomGenerator;
|
import org.spongycastle.crypto.prng.DigestRandomGenerator;
|
||||||
|
|
||||||
import javax.net.ssl.SSLContext;
|
import javax.net.ssl.SSLContext;
|
||||||
import javax.net.ssl.SSLServerSocketFactory;
|
|
||||||
import javax.net.ssl.SSLSocketFactory;
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.lang.reflect.Type;
|
import java.lang.reflect.Type;
|
||||||
import java.net.URL;
|
import java.math.BigInteger;
|
||||||
import java.nio.file.Paths;
|
|
||||||
import java.security.NoSuchAlgorithmException;
|
import java.security.NoSuchAlgorithmException;
|
||||||
import java.security.PrivateKey;
|
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
@ -333,7 +328,7 @@ public class Test {
|
||||||
System.out.println(jsonAmount);
|
System.out.println(jsonAmount);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testUserAccountSerialization(){
|
public void testUserAccountSerialization() {
|
||||||
UserAccount account = new UserAccount("1.2.138632");
|
UserAccount account = new UserAccount("1.2.138632");
|
||||||
System.out.println(Util.bytesToHex(account.toBytes()));
|
System.out.println(Util.bytesToHex(account.toBytes()));
|
||||||
}
|
}
|
||||||
|
@ -458,7 +453,7 @@ public class Test {
|
||||||
} catch (WebSocketException e) {
|
} catch (WebSocketException e) {
|
||||||
System.out.println("WebSocketException. Msg: " + e.getMessage());
|
System.out.println("WebSocketException. Msg: " + e.getMessage());
|
||||||
} catch (NoSuchAlgorithmException e) {
|
} catch (NoSuchAlgorithmException e) {
|
||||||
System.out.println("NoSuchAlgoritmException. Msg: "+e.getMessage());
|
System.out.println("NoSuchAlgoritmException. Msg: " + e.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -710,14 +705,15 @@ public class Test {
|
||||||
System.out.println("NoSuchAlgorithmException. Msg: " + e.getMessage());
|
System.out.println("NoSuchAlgorithmException. Msg: " + e.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public void testingInvoiceGeneration(){
|
|
||||||
Invoice.LineItem[] lineItem = new Invoice.LineItem[] { new Invoice.LineItem("Apples", 2, "20 CSD")};
|
public void testingInvoiceGeneration() {
|
||||||
|
Invoice.LineItem[] lineItem = new Invoice.LineItem[]{new Invoice.LineItem("Apples", 2, "20 CSD")};
|
||||||
Invoice invoice = new Invoice("bilthon-83", "Bilthon's store", "Invoice #12", "BTS", lineItem, "Thank you", "");
|
Invoice invoice = new Invoice("bilthon-83", "Bilthon's store", "Invoice #12", "BTS", lineItem, "Thank you", "");
|
||||||
String qrCodeData = Invoice.toQrCode(invoice);
|
String qrCodeData = Invoice.toQrCode(invoice);
|
||||||
System.out.println("qrCodeData");
|
System.out.println("qrCodeData");
|
||||||
System.out.println(qrCodeData);
|
System.out.println(qrCodeData);
|
||||||
Invoice recovered = Invoice.fromQrCode(qrCodeData);
|
Invoice recovered = Invoice.fromQrCode(qrCodeData);
|
||||||
System.out.println("recovered invoice: "+recovered.toJsonString());
|
System.out.println("recovered invoice: " + recovered.toJsonString());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testCompression() {
|
public void testCompression() {
|
||||||
|
@ -729,8 +725,10 @@ public class Test {
|
||||||
System.out.println(Util.bytesToHex(compressed));
|
System.out.println(Util.bytesToHex(compressed));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testCreateBinFile(){
|
public void testCreateBinFile() {
|
||||||
byte[] fileOutput = FileBin.getBytesFromBrainKey(Main.BRAIN_KEY, "123456","bithon-83");
|
byte[] fileOutput = FileBin.getBytesFromBrainKey(Main.BRAIN_KEY, "123456", "bithon-83");
|
||||||
|
String stringFile = "02f9f3eb0f61a0a96134975d86048bf92e114d6a1ce286140cad3a96c33e697282bc0a8a24d1ad0c7bc084a79816ce38e36bd2d624aa8bf686f53fb4c7e25e3974da9b40e0b17e9d0b5b82793a04b19646169c49c58cd67f4950aee7d275141dd24f52baaaee772995a9bd6a6562a7a38aae08951236d3f612aecef7aedd720a91eacbab3a792ca3ebe0105838fe11f6e9d0e83e5d77eb82f17c7ba85c670e69294a8bcf8365cfeca487a60093498496bbec394c729e3fda9f32fdccdea56288b36fb14a26aa309b548a6dd9c1d616d22167348f8d580f9dc7361b4457d2dc6d75ec985d8e2d3dcdff89cd425d9f14037ac961eb10ac5f92bab356ccecd8cf018ec05ab40d915b628a75ae32cfa4005634f08b24c0dc8c5a7636ed70cbd86a7f0c4f6236d74310470fafe3af8b5346c8cb61957f7292b468d276498f9e806399588b0afd5777e6ee5fe7cd3a6691d9b5486cb5c7adbd5ad0b17588dd32d82b01d49ecf0f2bf24ee54a490ee620e8ab049047ffa416b5efa8f1f0155d8f1be866a10d0d62ae44a3a8ecc0121c08837c2ee1a25f8b6dd7266273c41f4b9a5e3d600e3fb4de870f99ab1a7196d93f222595f92e97a2480f58b61b62639154a374b987664fd317622aaad156f831b03f2d9606537b65b3b1fcfb1fb6be39560ad2c301dd1fc25cee755e61b49ebfe42ca7e64b4b0fc4aa347b48a85c0b585a3499fe278e25cb2141f8009b9afc875fa2a2c439bf6cdec4b5190a6deb7f9390f072beb24749a8a2114cc1870c07be079abb3ee0ebc827f9b53e158a529bc6552eba280f05edf5f7ae1911de7acb4888150a509d029ec7c9da6de8adabbca6773a0a293a0a42de8278c82e88b9390b42b56f58bd8633fb97130e799a47a744e2e8958fd5";
|
||||||
|
fileOutput = new BigInteger(stringFile, 16).toByteArray();
|
||||||
System.out.println(FileBin.getBrainkeyFromByte(fileOutput, "123456"));
|
System.out.println(FileBin.getBrainkeyFromByte(fileOutput, "123456"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,14 +1,12 @@
|
||||||
package com.luminiasoft.bitshares;
|
package com.luminiasoft.bitshares;
|
||||||
|
|
||||||
import org.tukaani.xz.LZMA2Options;
|
|
||||||
import org.tukaani.xz.LZMAInputStream;
|
|
||||||
import org.tukaani.xz.LZMAOutputStream;
|
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
|
import org.tukaani.xz.LZMA2Options;
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
import org.tukaani.xz.XZInputStream;
|
||||||
import org.tukaani.xz.XZOutputStream;
|
import org.tukaani.xz.XZOutputStream;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -77,11 +75,11 @@ public class Util {
|
||||||
* @author Henry Varona
|
* @author Henry Varona
|
||||||
*/
|
*/
|
||||||
public static byte[] decompress(byte[] inputBytes) {
|
public static byte[] decompress(byte[] inputBytes) {
|
||||||
LZMAInputStream in = null;
|
XZInputStream in = null;
|
||||||
try {
|
try {
|
||||||
ByteArrayInputStream input = new ByteArrayInputStream(inputBytes);
|
ByteArrayInputStream input = new ByteArrayInputStream(inputBytes);
|
||||||
ByteArrayOutputStream output = new ByteArrayOutputStream(2048);
|
ByteArrayOutputStream output = new ByteArrayOutputStream(2048);
|
||||||
in = new LZMAInputStream(input);
|
in = new XZInputStream(input);
|
||||||
int size;
|
int size;
|
||||||
while ((size = in.read()) != -1) {
|
while ((size = in.read()) != -1) {
|
||||||
output.write(size);
|
output.write(size);
|
||||||
|
|
Loading…
Reference in a new issue