├── .gitignore
├── LICENSE
├── README.md
├── package
├── linux
│ └── Authenticator Wallet.png
├── macosx
│ └── Authenticator Wallet.icns
└── windows
│ └── Authenticator Wallet.ico
├── pom.xml
└── src
├── main
├── java
│ ├── authenticator
│ │ ├── Authenticator.java
│ │ ├── BAApplicationParameters.java
│ │ ├── BASE.java
│ │ ├── BipSSS
│ │ │ ├── BipSSS.java
│ │ │ ├── Gf256.java
│ │ │ └── SSSUtils.java
│ │ ├── GCM
│ │ │ ├── GCMSender.java
│ │ │ └── dispacher
│ │ │ │ ├── Device.java
│ │ │ │ ├── Dispacher.java
│ │ │ │ └── MessageBuilder.java
│ │ ├── Utils
│ │ │ ├── CryptoUtils.java
│ │ │ ├── CurrencyConverter
│ │ │ │ ├── Currency.java
│ │ │ │ ├── CurrencyConverterSingelton.java
│ │ │ │ └── exceptions
│ │ │ │ │ └── CurrencyConverterSingeltonNoDataException.java
│ │ │ ├── EncodingUtils.java
│ │ │ ├── FileUtils.java
│ │ │ ├── KeyUtils.java
│ │ │ ├── OneName
│ │ │ │ ├── OneName.java
│ │ │ │ ├── OneNameAdapter.java
│ │ │ │ ├── OneNameListener.java
│ │ │ │ └── exceptions
│ │ │ │ │ ├── CannotSaveOneNameImageException.java
│ │ │ │ │ └── CannotSetOneNameProfileException.java
│ │ │ └── SafeList.java
│ │ ├── db
│ │ │ ├── ConfigFile.java.orig
│ │ │ ├── dbBase.java
│ │ │ ├── exceptions
│ │ │ │ ├── AccountWasNotFoundException.java
│ │ │ │ └── CouldNotOpenConfigFileException.java
│ │ │ ├── settingsDB.java
│ │ │ └── walletDB.java
│ │ ├── helpers
│ │ │ └── BAApplication.java
│ │ ├── hierarchy
│ │ │ ├── BAHierarchy.java
│ │ │ ├── HierarchyUtils.java
│ │ │ └── exceptions
│ │ │ │ ├── IncorrectPathException.java
│ │ │ │ ├── KeyIndexOutOfRangeException.java
│ │ │ │ ├── NoAccountCouldBeFoundException.java
│ │ │ │ └── NoUnusedKeyException.java
│ │ ├── listeners
│ │ │ ├── BAGeneralEventsAdapter.java
│ │ │ └── BAGeneralEventsListener.java
│ │ ├── network
│ │ │ ├── BANetworkInfo.java
│ │ │ ├── CannotProcessRequestPayload.java
│ │ │ ├── GetRequestIDPayload.java
│ │ │ ├── PongPayload.java
│ │ │ ├── TCPListener.java
│ │ │ ├── TrustedPeerNodes.java
│ │ │ ├── UpNp.java
│ │ │ └── exceptions
│ │ │ │ └── TCPListenerCouldNotStartException.java
│ │ ├── operations
│ │ │ ├── BAOperation.java
│ │ │ ├── BAWalletRestorer.java
│ │ │ ├── OperationsFactory.java
│ │ │ ├── OperationsUtils
│ │ │ │ ├── CommunicationObjects
│ │ │ │ │ └── SignMessage.java
│ │ │ │ ├── PairingProtocol.java
│ │ │ │ ├── PairingQRCode.java
│ │ │ │ ├── PaperSSSQR.java
│ │ │ │ ├── PaperWalletQR.java
│ │ │ │ └── SignProtocol.java
│ │ │ ├── exceptions
│ │ │ │ └── BAOperationNetworkRequirementsNotAvailableException.java
│ │ │ └── listeners
│ │ │ │ ├── OperationListener.java
│ │ │ │ └── OperationListenerAdapter.java
│ │ ├── protobuf
│ │ │ ├── AuthWalletHierarchy.java
│ │ │ ├── BAHierarchy.proto
│ │ │ ├── ProtoConfig.java
│ │ │ ├── ProtoSettings.java
│ │ │ ├── config.proto
│ │ │ └── configSettings.proto
│ │ └── walletCore
│ │ │ ├── WalletOperation.java
│ │ │ ├── WalletWrapper.java
│ │ │ ├── exceptions
│ │ │ ├── AddressNotWatchedByWalletException.java
│ │ │ ├── AddressWasNotFoundException.java
│ │ │ ├── CannotBroadcastTransactionException.java
│ │ │ ├── CannotGetAccountFilteredTransactionsException.java
│ │ │ ├── CannotGetAccountUsedAddressesException.java
│ │ │ ├── CannotGetAddressException.java
│ │ │ ├── CannotGetHDKeyException.java
│ │ │ ├── CannotGetPendingRequestsException.java
│ │ │ ├── CannotReadFromConfigurationFileException.java
│ │ │ ├── CannotRemovePendingRequestException.java
│ │ │ ├── CannotWriteToConfigurationFileException.java
│ │ │ ├── NoWalletPasswordException.java
│ │ │ └── UnableToCompleteTxSigningException.java
│ │ │ └── utils
│ │ │ ├── BAPassword.java
│ │ │ ├── BalanceUpdater.java
│ │ │ ├── CoinsReceivedNotificationSender.java
│ │ │ └── WalletListener.java
│ └── wallettemplate
│ │ ├── AccountsController.java
│ │ ├── CoinJoinController.java
│ │ ├── Controller.java
│ │ ├── ControllerHelpers
│ │ ├── AsyncTask.java
│ │ ├── SendTxHelper.java
│ │ ├── SendTxOverlayHelper.java
│ │ ├── TableTx.java
│ │ ├── ThrottledRunnableExecutor.java
│ │ └── UIUpdateHelper.java
│ │ ├── Main.java
│ │ ├── NotImplementedYetController.java
│ │ ├── OneNameController.java
│ │ ├── OneNameControllerDisplay.java
│ │ ├── PairWallet.java
│ │ ├── RemoteUpdateWindow.java
│ │ ├── SettingsController.java
│ │ ├── ShowSeedController.java
│ │ ├── ShutDownController.java
│ │ ├── controls
│ │ ├── BitcoinAddressValidator.java
│ │ ├── DisplayAccountCell.java
│ │ ├── ScrollPaneContentManager.java
│ │ └── SendToCell.java
│ │ ├── startup
│ │ ├── AddAccountWindow.java
│ │ ├── RestoreAccountCell.java
│ │ ├── RestoreProcessCell.java
│ │ ├── SSSRestoreCell.java
│ │ ├── StartupController.java
│ │ ├── StartupControllerHelper.java
│ │ ├── TestSSSCell.java
│ │ ├── TestSSSResultCell.java
│ │ ├── TestSSSWindow.java
│ │ └── backup
│ │ │ ├── PaperSSSController.java
│ │ │ └── PaperWalletController.java
│ │ └── utils
│ │ ├── AlertWindowController.java
│ │ ├── BaseUI.java
│ │ ├── GuiUtils.java
│ │ ├── ImageUtils.java
│ │ ├── TextFieldValidator.java
│ │ ├── TextUtils.java
│ │ ├── ThrottledRunLater.java
│ │ └── dialogs
│ │ ├── BADialog.java
│ │ ├── BADialogBase.java
│ │ └── DialogFactory.java
└── resources
│ └── wallettemplate
│ ├── DefaultAvatar.png
│ ├── DisplayOneName.fxml
│ ├── OneName.fxml
│ ├── SendToCell.fxml
│ ├── Settings.fxml
│ ├── ShutDownWarning.fxml
│ ├── Tor_color.png
│ ├── Tor_grey.png
│ ├── accounts
│ ├── account_cell.fxml
│ ├── accounts.fxml
│ ├── accounts_display_bg.png
│ ├── btnAddAccount.png
│ ├── btnSettingsSmall.png
│ ├── close.png
│ └── closeSettingsWindow.png
│ ├── accounts_icons
│ ├── authenticator_logo_small.png
│ ├── bitcoin_logo_plain_small.png
│ └── btnSettingsSmall.png
│ ├── apps
│ ├── btnAccounts.png
│ ├── btnAccounts@2x.png
│ ├── btnAddressBook.png
│ ├── btnAddressBook@2x.png
│ ├── btnBitcoinAuthenticator.png
│ ├── btnBitcoinAuthenticator@2x.png
│ ├── btnBnB.png
│ ├── btnBnB@2x.png
│ ├── btnCoinControl.png
│ ├── btnCoinControl@2x.png
│ ├── btnCoinJoin.png
│ ├── btnCoinJoin@2x.png
│ ├── btnCoinbase.png
│ ├── btnCoinbase@2x.png
│ ├── btnDonate.png
│ ├── btnDonate@2x.png
│ ├── btnLocalBitcoins.png
│ ├── btnLocalBitcoins@2x.png
│ ├── btnLocks.png
│ ├── btnLocks@2x.png
│ ├── btnOneName.png
│ ├── btnOneName@2x.png
│ ├── btnSettings.png
│ └── btnSettings@2x.png
│ ├── auth1.png
│ ├── auth2.png
│ ├── authenticator_logo_plain_small.png
│ ├── background.png
│ ├── bitcoin_logo_plain.png
│ ├── bitcoin_logo_small.png
│ ├── btnApps_grey.png
│ ├── btnApps_grey@2x.png
│ ├── btnApps_white.png
│ ├── btnApps_white@2x.png
│ ├── btnAvatar.png
│ ├── btnBitcoinAuthenticator.png
│ ├── btnBitcoinAuthenticator@2x.png
│ ├── btnLocked.png
│ ├── btnLocked@2x.png
│ ├── btnOverview_grey.png
│ ├── btnOverview_grey@2x.png
│ ├── btnOverview_white.png
│ ├── btnOverview_white@2x.png
│ ├── btnReceive_grey.png
│ ├── btnReceive_grey@2x.png
│ ├── btnReceive_white.png
│ ├── btnReceive_white@2x.png
│ ├── btnSend_grey.png
│ ├── btnSend_grey@2x.png
│ ├── btnSend_white.png
│ ├── btnSend_white@2x.png
│ ├── btnTransactions_grey.png
│ ├── btnTransactions_grey@2x.png
│ ├── btnTransactions_white.png
│ ├── btnTransactions_white@2x.png
│ ├── btnUnlocked.png
│ ├── btnUnlocked@2x.png
│ ├── checkpoints
│ ├── checkpoints.testnet
│ ├── close.png
│ ├── coinjoin.fxml
│ ├── coinjoin.png
│ ├── connection0.png
│ ├── connection1.png
│ ├── connection2.png
│ ├── connection3.png
│ ├── gui.fxml
│ ├── in-out.png
│ ├── in.png
│ ├── ivAddress.png
│ ├── ivSync.png
│ ├── lockbackground.png
│ ├── minimize.png
│ ├── net_green.png
│ ├── net_grey.png
│ ├── net_yellow.png
│ ├── on_script.png
│ ├── on_symbol.png
│ ├── out.png
│ ├── ovrImage.png
│ ├── pairing
│ ├── BAApp.fxml
│ ├── baPhone.jpg
│ ├── btnBitcoinAuthenticator.png
│ └── btnHelp.png
│ ├── passwords.html
│ ├── phone.png
│ ├── progress-green.png
│ ├── progress-red.png
│ ├── progress-yellow.png
│ ├── remote_update
│ ├── RemoteUpdateWindow.fxml
│ └── splashBackground.png
│ ├── rocket.png
│ ├── show_seed.fxml
│ ├── startup
│ ├── 2fa1.png
│ ├── 2fa2.png
│ ├── 2fa3.png
│ ├── AddPairedAccount.fxml
│ ├── AddStandardAccount.fxml
│ ├── PaperWallet.png
│ ├── PaperWalletSSS.png
│ ├── SSSRestoreCell.fxml
│ ├── TestSSS.fxml
│ ├── TestSSSCell.fxml
│ ├── TestSSSResultCell.fxml
│ ├── btnNewWallet.png
│ ├── btnP2KH.png
│ ├── btnPaperWallet.png
│ ├── btnRestore.png
│ ├── btnSSS.png
│ ├── btnSave.png
│ ├── failed_icon.png
│ ├── googleplay.png
│ ├── logo.png
│ ├── restore_account_cell.fxml
│ ├── restore_process_cell.fxml
│ ├── success_icon.png
│ └── walletstartup.fxml
│ ├── trash.png
│ └── utils
│ ├── GUI.css
│ ├── alert.fxml
│ ├── controls
│ └── bitcoin_address.fxml
│ ├── dialogs
│ ├── confirmDialog.fxml
│ ├── infoDialog.fxml
│ └── inputDialog.fxml
│ └── text-validation.css
└── test
└── java
└── authenticator
├── AuthenticatorTest.java
├── CoinsReceivedNotificationTest.java
├── CryptoUtilsTest.java
├── FileUtilsTest.java
├── GCM
└── MessageBuilderTest.java
├── backup
├── QRBackupTest.java
└── SSSBackupTest.java
├── network
├── GetRequestIDPayloadTest.java
└── PongPayloadTest.java
├── operations
├── PairingQRTest.java
├── PairingTest.java
├── SignTransactionTest.java
└── UpdateIPsTest.java
└── walletCore
└── utils
├── CoinsReceivedNotificationSenderTest.java
└── WalletListenerTest.java
/.gitignore:
--------------------------------------------------------------------------------
1 | local.properties
2 | .classpath
3 | .project
4 | .settings/
5 | .idea/
6 | consensus-microdesc
7 | certificates
8 | cached-microdescs
9 | state
10 | cached-microdescs.new
11 | *.config
12 | *.spvchain
13 | *.wallet
14 | *.orig
15 | PairingQRCode.png
16 | bin/
17 | gen/
18 | target/
19 | packages/
20 | proguard/
21 | /target/
22 | /dist/
23 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2014 Bitcoin Authenticator
4 | Permission is hereby granted, free of charge, to any person obtaining a copy
5 | of this software and associated documentation files (the "Software"), to deal
6 | in the Software without restriction, including without limitation the rights
7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 | copies of the Software, and to permit persons to whom the Software is
9 | furnished to do so, subject to the following conditions:
10 |
11 | The above copyright notice and this permission notice shall be included in all
12 | copies or substantial portions of the Software.
13 |
14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20 | SOFTWARE.
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | BitcoinAuthenticator - Wallet
2 | ====================
3 |
4 | ###IMPORTANT - This project is under development.
5 | [](https://coveralls.io/r/negedzuregal/BitcoinAuthWallet?branch=develop)
6 |
7 |
8 | ####What Is This ?
9 | 
10 |
11 | Bitcoin Authenticator is a P2P bitcoin wallet and [android application](https://github.com/cpacia/BitcoinAuthenticator) for creating a 2 factor transaction authentication and authorization. Bitcoin Authenticator is composed of a desktop wallet and an [android application](https://github.com/cpacia/BitcoinAuthenticator), by pairing the two together they create an P2SH bitcoin address. Any bitcoins that are transferred to that address will require the authentication and digital signature of both the desktop wallet and the android Authenticator app.
12 |
13 | ####How do i get the android application ?
14 | [Click here](https://github.com/cpacia/BitcoinAuthenticator)
15 |
16 | #### Building requirements for the BitcoinAuthenticator wallet
17 | 1. Install Java 8
18 | 2. [Eclipse Luna, Support for java 8](http://www.eclipse.org/home/index.php) (Obviously, only if you work with eclipse)
19 |
20 | ## Building
21 |
22 | #####With Maven
23 | 1. Clone the project:
24 | ```
25 | $ git clone https://github.com/negedzuregal/BitcoinAuthWallet.git
26 | ```
27 | 2.
28 | ```
29 | $ cd BitcoinAuthWallet
30 | ```
31 | 3. build:
32 | ```
33 | $mvn clean package
34 | ```
35 |
36 | #### Protobuf class
37 | From the Protobuf folder(/src/main/java/authenticator/protobuf):
38 | ```
39 | $ protoc .proto --java_out=../../ --proto_path=./ --proto_path=
40 | ```
41 |
42 | For protobuf-install-directory see [this](http://stackoverflow.com/questions/20069295/importing-google-protobuf-descriptor-proto-in-java-protocol-buffers)
43 |
44 | #### Importing Into Eclipse
45 | 1. In Eclipse:
46 | ```
47 | File -> Import -> existing maven project
48 | ```
49 | 3. Run with JVM assertion flag:
50 | ```
51 | Run -> Run Configurations -> arguments -> add -ea in VM Arguments
52 | ```
53 |
54 | ## Native Installer
55 | 1. build:
56 | ```
57 | $mvn clean package
58 | ```
59 | 2. Set jh (OSX/ Linux):
60 | ```
61 | $ jh=$JAVA_HOME/bin
62 | ```
63 |
64 | Set jh (Windows):
65 | ```
66 | c:\ set jh=%JAVA_HOME%/bin
67 | ```
68 | 3. Build (OSX/ Linux):
69 | ```
70 | $ $jh/javafxpackager -deploy -v -native -outdir . -outdir packages -outfile BTCAuthenticator -srcdir target -srcfiles wallettemplate-app.jar -appclass wallettemplate.Main -name "Authenticator Wallet" -title "Authenticator Wallet"
71 | ```
72 |
73 | Build (Windows):
74 | ```
75 | c:\ "%jh%/javafxpackager.exe" -deploy -v -native -outdir . -outdir packages -outfile BTCAuthenticator -srcdir target -srcfiles wallettemplate-app.jar -appclass wallettemplate.Main -name "Authenticator Wallet" -title "Authenticator Wallet"
76 | ```
77 |
78 | ## Development
79 | - Check our future development proposals [here](https://docs.google.com/spreadsheets/d/1o5ZS_L8OppZJit46SzpauJOthI0ncWuIgmo6ZtPevOU/edit?usp=sharing)
80 |
81 | ## Testing
82 | - Our UX testing checklist [here](https://docs.google.com/spreadsheets/d/1Tcg6E1ZxlYmg9TjcGjNhZoP0vHRUZT_O_2SzJJVfcKQ/edit?usp=sharing)
83 | - Unit testing coverage is low, any contribution will be much appreciated !
84 |
85 | ## Contacts
86 | If you have any questions feel free to contact us:
87 |
ctpacia@gmail.com (Chris Pacia)
88 |
alonmuroch@gmail.com (Alon Muroch)
--------------------------------------------------------------------------------
/package/linux/Authenticator Wallet.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BitcoinAuthenticator/Wallet/e18dc199c7917bcb568ba0fae10480504d2e71a2/package/linux/Authenticator Wallet.png
--------------------------------------------------------------------------------
/package/macosx/Authenticator Wallet.icns:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BitcoinAuthenticator/Wallet/e18dc199c7917bcb568ba0fae10480504d2e71a2/package/macosx/Authenticator Wallet.icns
--------------------------------------------------------------------------------
/package/windows/Authenticator Wallet.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BitcoinAuthenticator/Wallet/e18dc199c7917bcb568ba0fae10480504d2e71a2/package/windows/Authenticator Wallet.ico
--------------------------------------------------------------------------------
/src/main/java/authenticator/BASE.java:
--------------------------------------------------------------------------------
1 | package authenticator;
2 |
3 | import org.slf4j.Logger;
4 | import org.slf4j.LoggerFactory;
5 |
6 | import com.google.common.util.concurrent.AbstractService;
7 |
8 | public class BASE extends AbstractService{
9 | public Logger LOG;
10 | public BASE(Class> t)
11 | {
12 | LOG = LoggerFactory.getLogger(t);
13 | }
14 |
15 | @Override
16 | protected void doStart() {
17 | // TODO Auto-generated method stub
18 |
19 | }
20 | @Override
21 | protected void doStop() {
22 | // TODO Auto-generated method stub
23 |
24 | }
25 |
26 | }
27 |
--------------------------------------------------------------------------------
/src/main/java/authenticator/BipSSS/SSSUtils.java:
--------------------------------------------------------------------------------
1 | package authenticator.BipSSS;
2 |
3 | import java.util.ArrayList;
4 | import java.util.List;
5 |
6 | import authenticator.BipSSS.BipSSS.Share;
7 |
8 | public class SSSUtils {
9 | public List getAllPossibleCombinations(List shares, int len){
10 | List ret = new ArrayList();
11 |
12 | getCombination(shares, len, 0, new Share[len], ret);
13 | return ret;
14 | }
15 |
16 | private void getCombination(List arr, int len, int startPosition, Share[] result, List finalRsult){
17 | if (len == 0){
18 | Share[] temp = new Share[result.length];
19 | System.arraycopy(result, 0, temp, 0, result.length);
20 | finalRsult.add(temp);
21 | return;
22 | }
23 | for (int i = startPosition; i <= arr.size() - len; i++){
24 | //result[result.length - len] = arr[i];
25 | //combinations2(arr, len-1, i+1, result);
26 |
27 | result[result.length - len] = arr.get(i);
28 | getCombination(arr, len-1, i+1, result, finalRsult);
29 | }
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/src/main/java/authenticator/GCM/GCMSender.java:
--------------------------------------------------------------------------------
1 | package authenticator.GCM;
2 |
3 | import java.io.IOException;
4 | import java.util.ArrayList;
5 |
6 | import com.google.android.gcm.server.Message;
7 | import com.google.android.gcm.server.MulticastResult;
8 | import com.google.android.gcm.server.Sender;
9 |
10 | import authenticator.GCM.dispacher.MessageBuilder;
11 |
12 | public class GCMSender {
13 |
14 | public void sender(ArrayList devicesList,MessageBuilder msg)
15 | {
16 | final String GCM_API_KEY = "AIzaSyCKpWWEQk6UDW6ZSAeJfYVyuHcJg1g2V_o";
17 | Sender sender = new Sender(GCM_API_KEY);
18 | //ArrayList devicesList = new ArrayList();
19 | //devicesList.add("APA91bGr1kYu7L6oKUfyCEhg0ofuGoFYdRbqj1QHBFAMVI_eFkYSp2NU3u01MfQ92jhBUVY4qhCYKO-xERCq3t52yKih671fEkNPHS_YIVfrvuj9PcD8_ETAoKdhHAnWpNZkofbFjOzdD0uMamTOQ0_xIoRymcm8DjeZ5zi6sfXryJ-bykS4nd0");
20 | String data = msg.toString();//"{Data:Hello World}";
21 | Message message = new Message.Builder()
22 | .collapseKey("1")
23 | .timeToLive(3)
24 | .delayWhileIdle(true)
25 | .addData("data",data)
26 | .build();
27 | MulticastResult result;
28 | try {
29 | result = sender.send(message, devicesList, 1);
30 | // sender.send(message, devicesList, 1);
31 |
32 | System.out.println(result.toString());
33 | if (result.getResults() != null) {
34 | int canonicalRegId = result.getCanonicalIds();
35 | if (canonicalRegId != 0) {
36 | }
37 | } else {
38 | int error = result.getFailure();
39 | System.out.println(error);
40 | }
41 | } catch (IOException e) {
42 | // TODO Auto-generated catch block
43 | e.printStackTrace();
44 | }
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/src/main/java/authenticator/GCM/dispacher/Device.java:
--------------------------------------------------------------------------------
1 | package authenticator.GCM.dispacher;
2 |
3 | import javax.crypto.SecretKey;
4 |
5 | public class Device {
6 | public byte[] chaincode;
7 | public byte[] mPubKey;
8 | public byte[] gcmRegId;
9 | public byte[] pairingID;
10 | public SecretKey sharedsecret;
11 |
12 | public Device(){ }
13 | public Device(byte[] chain,
14 | byte[] pubKey,
15 | byte[] gcm,
16 | byte[] pairID,
17 | SecretKey secret)
18 | {
19 | chaincode = chain;
20 | mPubKey = pubKey;
21 | gcmRegId = gcm;
22 | pairingID = pairID;
23 | sharedsecret = secret;
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/src/main/java/authenticator/GCM/dispacher/Dispacher.java:
--------------------------------------------------------------------------------
1 | package authenticator.GCM.dispacher;
2 |
3 | import java.io.DataInputStream;
4 | import java.io.DataOutputStream;
5 | import java.io.IOException;
6 | import java.net.ServerSocket;
7 | import java.net.Socket;
8 | import java.util.ArrayList;
9 |
10 | import org.json.JSONException;
11 | import org.xml.sax.SAXException;
12 |
13 | import authenticator.Authenticator;
14 | import authenticator.GCM.GCMSender;
15 | import authenticator.network.UpNp;
16 | import authenticator.protobuf.ProtoConfig.ATGCMMessageType;
17 |
18 | /**
19 | * A wrapper class for dispaching GCM notifications to devices.
20 | *
21 | * @author alon
22 | *
23 | */
24 | public class Dispacher {
25 | DataOutputStream outStream;
26 | DataInputStream inStream;
27 |
28 | public Dispacher(){}
29 | public Dispacher(DataOutputStream out,DataInputStream in)
30 | {
31 | outStream = out;
32 | inStream = in;
33 | }
34 |
35 | public String dispachMessage(ATGCMMessageType msgType, Device device, String ... args) throws JSONException, IOException
36 | {
37 | switch (msgType){
38 | /**
39 | * arg:
40 | * [0] - Custom msg
41 | * [1] - external IP
42 | * [2] - Internal IP
43 | */
44 | case SignTX:
45 | if(device.gcmRegId != null)
46 | {
47 | MessageBuilder msgGCM = null;
48 | try {
49 |
50 | msgGCM = new MessageBuilder(ATGCMMessageType.SignTX,
51 | new String[]{new String(device.pairingID),
52 | args[1],
53 | args[2],
54 | args[0]});
55 | ArrayList devicesList = new ArrayList();
56 | devicesList.add(new String(device.gcmRegId));
57 | GCMSender sender = new GCMSender();
58 | sender.sender(devicesList,msgGCM);
59 |
60 | } catch (Exception e) {
61 | // TODO Auto-generated catch block
62 | e.printStackTrace();
63 | }
64 | if(msgGCM != null)
65 | return msgGCM.getString("RequestID");
66 | return null;
67 | }
68 | else
69 | ;//TODO
70 | break;
71 | /**
72 | * arg:
73 | * [0] - external IP
74 | * [1] - Internal IP
75 | */
76 | case UpdatePendingRequestIPs:
77 | if(device.gcmRegId != null)
78 | {
79 | MessageBuilder msgGCM = null;
80 | try {
81 | msgGCM = new MessageBuilder(ATGCMMessageType.UpdatePendingRequestIPs,
82 | new String[]{new String(device.pairingID),
83 | args[0],
84 | args[1],
85 | ""});
86 | ArrayList devicesList = new ArrayList();
87 | devicesList.add(new String(device.gcmRegId));
88 | GCMSender sender = new GCMSender();
89 | sender.sender(devicesList,msgGCM);
90 |
91 | } catch (Exception e) { e.printStackTrace(); }
92 | return null;
93 | }
94 | else
95 | ;//TODO
96 | break;
97 | /**
98 | * arg:
99 | * [0] - Custom msg
100 | */
101 | case CoinsReceived:
102 | if(device.gcmRegId != null)
103 | {
104 | MessageBuilder msgGCM = null;
105 | try {
106 |
107 | msgGCM = new MessageBuilder(ATGCMMessageType.CoinsReceived,
108 | new String[]{new String(device.pairingID), args[0]});
109 | ArrayList devicesList = new ArrayList();
110 | devicesList.add(new String(device.gcmRegId));
111 | GCMSender sender = new GCMSender();
112 | sender.sender(devicesList,msgGCM);
113 |
114 | } catch (Exception e) {
115 | e.printStackTrace();
116 | }
117 | return null;
118 | }
119 | else
120 | ;
121 | break;
122 | }
123 | return null;
124 | }
125 |
126 | }
127 |
--------------------------------------------------------------------------------
/src/main/java/authenticator/GCM/dispacher/MessageBuilder.java:
--------------------------------------------------------------------------------
1 | package authenticator.GCM.dispacher;
2 |
3 | import java.math.BigInteger;
4 | import java.security.MessageDigest;
5 | import java.security.NoSuchAlgorithmException;
6 | import java.sql.Timestamp;
7 |
8 | import org.json.JSONException;
9 | import org.json.JSONObject;
10 |
11 | import authenticator.protobuf.ProtoConfig.ATGCMMessageType;
12 |
13 |
14 | public class MessageBuilder extends JSONObject{
15 | public MessageBuilder(ATGCMMessageType type,String ... arg) throws JSONException
16 | {
17 | JSONObject reqPayload;
18 | switch (type){
19 | /**
20 | * arg -
21 | * 0 - WalletID
22 | * 1 - ExternalIP
23 | * 2 - LocalIP
24 | * 3 - CustomMsg
25 | * 4 - tmp, for testing purposes
26 | */
27 | case SignTX:
28 | if(arg.length > 4)
29 | this.put("tmp", arg[4]);
30 | else
31 | this.put("tmp", new Timestamp( new java.util.Date().getTime() ));
32 | this.put("WalletID", arg[0]);
33 | this.put("RequestType", ATGCMMessageType.SignTX_VALUE);
34 | reqPayload = new JSONObject();
35 | reqPayload.put("ExternalIP", arg[1]);
36 | reqPayload.put("LocalIP", arg[2]);
37 | this.put("ReqPayload", reqPayload);
38 | this.put("CustomMsg", arg[3]); // TODO localize
39 | this.put("RequestID", getRequestIDDigest(this));
40 | break;
41 | /**
42 | * arg -
43 | * 0 - WalletID
44 | * 1 - ExternalIP
45 | * 2 - LocalIP
46 | * 3 - CustomMsg
47 | */
48 | case UpdatePendingRequestIPs:
49 | this.put("tmp", new Timestamp( new java.util.Date().getTime() ));
50 | this.put("WalletID", arg[0]);
51 | this.put("RequestType", ATGCMMessageType.UpdatePendingRequestIPs_VALUE);
52 | reqPayload = new JSONObject();
53 | reqPayload.put("ExternalIP", arg[1]);
54 | reqPayload.put("LocalIP", arg[2]);
55 | this.put("ReqPayload", reqPayload);
56 | this.put("CustomMsg", arg[3]); // TODO localize
57 | break;
58 | /**
59 | * arg -
60 | * 0 - WalletID
61 | * 1 - CustomMsg
62 | */
63 | case CoinsReceived:
64 | this.put("tmp", new Timestamp( new java.util.Date().getTime() ));
65 | this.put("WalletID", arg[0]);
66 | this.put("RequestType", ATGCMMessageType.CoinsReceived_VALUE);
67 | this.put("CustomMsg", arg[1]);
68 | break;
69 | }
70 | }
71 |
72 | private String getConcatinatedPayload(MessageBuilder msg) throws JSONException{
73 | String ReqPayload = msg.get("ReqPayload").toString();
74 | String tmp = msg.get("tmp").toString();
75 | String RequestType = msg.get("RequestType").toString();
76 | String WalletID = msg.get("WalletID").toString();
77 | return ReqPayload +
78 | tmp +
79 | RequestType +
80 | WalletID;
81 | }
82 |
83 | private String getRequestIDDigest(MessageBuilder msg) throws JSONException
84 | {
85 | MessageDigest md = null;
86 | try {md = MessageDigest.getInstance("SHA-1");}
87 | catch(NoSuchAlgorithmException e) {e.printStackTrace();}
88 | byte[] digest = md.digest(getConcatinatedPayload(msg).getBytes());
89 | String ret = new BigInteger(1, digest).toString(16);
90 | //Make sure it is 40 chars, if less pad with 0, if more substringit
91 | if(ret.length() > 40)
92 | {
93 | ret = ret.substring(0, 39);
94 | }
95 | else if(ret.length() < 40)
96 | {
97 | int paddingNeeded = 40 - ret.length();
98 | String padding = "";
99 | for(int i=0;i currenciesList;
24 |
25 | static public boolean isReady = false;
26 | /**
27 | * Requires downloading the currency data in an async process.
28 | * Use this method as follows:
29 | * new CurrencyConverterSingelton(new CurrencyConverterListener(){ });
30 | *
31 | * @param listener
32 | */
33 | public CurrencyConverterSingelton(String[] lstCurrencies, CurrencyConverterListener listener){
34 | currenciesList = Arrays.asList(lstCurrencies);
35 | if(isReady == false){
36 | currencies = new CurrencyList();
37 | try {
38 | getCurrencies(currenciesList, listener, this);
39 | } catch (IOException | JSONException e) {
40 | e.printStackTrace();
41 | if(listener != null)
42 | listener.onErrorGettingCurrencyData(e);
43 | }
44 | }
45 | else if(listener != null){
46 | listener.onFinishedGettingCurrencyData(this);
47 | }
48 | }
49 |
50 | public static void CANNOT_EXECUTE_ASYNC_SO_CHECK_IS_READY() throws CurrencyConverterSingeltonNoDataException{
51 | if(CurrencyConverterSingelton.isReady != true)
52 | throw new CurrencyConverterSingeltonNoDataException("No Currency Data");
53 | }
54 |
55 | /**
56 | *
57 | *
58 | * @param lstCurrencies
59 | * @param listener
60 | * @param self
61 | * @throws IOException
62 | * @throws JSONException
63 | */
64 | private void getCurrencies(List lstCurrencies, final CurrencyConverterListener listener, CurrencyConverterSingelton self) throws IOException, JSONException{
65 | // TODO - download more than one currency
66 | String s = "https://api.bitcoinaverage.com/ticker/global/" + lstCurrencies.get(0) + "/";
67 | EncodingUtils.readFromUrl(s, new AsyncCompletionHandler(){
68 | @Override
69 | public Response onCompleted(Response arg0) throws Exception {
70 | String res = arg0.getResponseBody();
71 | JSONObject json = new JSONObject(res);
72 | //double last = json.getDouble("last");
73 | CurrencyConverterSingelton.currencies.add(new Currency(lstCurrencies.get(0), json));
74 |
75 | if(listener != null)
76 | listener.onFinishedGettingCurrencyData(self);
77 |
78 | CurrencyConverterSingelton.isReady = true;
79 |
80 | return null;
81 | }
82 | });
83 | }
84 |
85 | public interface CurrencyConverterListener{
86 | public void onFinishedGettingCurrencyData(CurrencyConverterSingelton currencies);
87 | public void onErrorGettingCurrencyData(Exception e);
88 | }
89 |
90 | public class CurrencyList{
91 | private List lst;
92 |
93 | public CurrencyList() {
94 | lst = new ArrayList();
95 | }
96 |
97 | public void add(Currency c) {
98 | lst.add(c);
99 | }
100 |
101 | public Currency get(int index) {
102 | return lst.get(index);
103 | }
104 |
105 | public Currency get(String upperCaseCurrencyCode) {
106 | for(Currency c: lst) {
107 | if(c.UPPERCASE_CURRENCY_CODE.equals(upperCaseCurrencyCode))
108 | return c;
109 | }
110 | return null;
111 | }
112 | }
113 | }
114 |
--------------------------------------------------------------------------------
/src/main/java/authenticator/Utils/CurrencyConverter/exceptions/CurrencyConverterSingeltonNoDataException.java:
--------------------------------------------------------------------------------
1 | package authenticator.Utils.CurrencyConverter.exceptions;
2 |
3 | public class CurrencyConverterSingeltonNoDataException extends Exception{
4 | public CurrencyConverterSingeltonNoDataException(String msg){
5 | super(msg);
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/src/main/java/authenticator/Utils/EncodingUtils.java:
--------------------------------------------------------------------------------
1 | package authenticator.Utils;
2 |
3 | import java.io.BufferedReader;
4 | import java.io.ByteArrayOutputStream;
5 | import java.io.IOException;
6 | import java.io.InputStreamReader;
7 | import java.io.Reader;
8 | import java.net.URL;
9 | import java.net.URLConnection;
10 | import java.util.Formatter;
11 |
12 | import org.json.JSONException;
13 | import org.json.JSONObject;
14 | import org.spongycastle.util.encoders.Hex;
15 | import org.bitcoinj.core.Transaction;
16 | import org.bitcoinj.crypto.DeterministicKey;
17 |
18 | import com.ning.http.client.AsyncCompletionHandler;
19 | import com.ning.http.client.AsyncHttpClient;
20 | import com.ning.http.client.Response;
21 |
22 | public class EncodingUtils {
23 |
24 | /**For reading the JSON*/
25 | private static String readAll(Reader rd) throws IOException {
26 | StringBuilder sb = new StringBuilder();
27 | int cp;
28 | while ((cp = rd.read()) != -1) {
29 | sb.append((char) cp);
30 | }
31 | return sb.toString();
32 | }
33 |
34 | /**Reads JSON object from a URL*/
35 | public static void readFromUrl(String url, AsyncCompletionHandler listener) throws IOException {
36 | AsyncHttpClient asyncHttpClient = new AsyncHttpClient();
37 | asyncHttpClient.prepareGet(url).execute(new AsyncCompletionHandler(){
38 |
39 | @Override
40 | public Response onCompleted(Response response) throws Exception {
41 | listener.onCompleted(response);
42 | asyncHttpClient.closeAsynchronously();
43 | return null;
44 | }
45 |
46 | });
47 |
48 | }
49 |
50 | static public String getAbsolutePathForFile(String fileName) throws IOException
51 | {
52 | return new java.io.File( "." ).getCanonicalPath() + "/" + fileName;
53 | }
54 |
55 | public static String getStringTransaction(Transaction tx)
56 | {
57 | //Convert tx to byte array for sending.
58 | String formatedTx = null;
59 | final StringBuilder sb = new StringBuilder();
60 | Formatter formatter = new Formatter(sb);
61 | try {
62 | ByteArrayOutputStream os = new ByteArrayOutputStream();
63 | tx.bitcoinSerialize(os);
64 | byte[] bytes = os.toByteArray();
65 | for (byte b : bytes) {
66 | formatter.format("%02x", b);
67 | }
68 | formatedTx = sb.toString();
69 | }catch (IOException e) {
70 | } finally {
71 | formatter.close();
72 | }
73 | return formatedTx;
74 | }
75 |
76 |
77 | }
78 |
--------------------------------------------------------------------------------
/src/main/java/authenticator/Utils/KeyUtils.java:
--------------------------------------------------------------------------------
1 | package authenticator.Utils;
2 |
3 | public class KeyUtils {
4 |
5 | public static byte[] hexStringToByteArray(String s) {
6 | int len = s.length();
7 | byte[] data = new byte[len / 2];
8 | for (int i = 0; i < len; i += 2) {
9 | data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
10 | + Character.digit(s.charAt(i+1), 16));
11 | }
12 | return data;
13 | }
14 | final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();
15 | public static String bytesToHex(byte[] bytes) {
16 | char[] hexChars = new char[bytes.length * 2];
17 | for ( int j = 0; j < bytes.length; j++ ) {
18 | int v = bytes[j] & 0xFF;
19 | hexChars[j * 2] = hexArray[v >>> 4];
20 | hexChars[j * 2 + 1] = hexArray[v & 0x0F];
21 | }
22 | return new String(hexChars);
23 | }
24 |
25 | }
26 |
--------------------------------------------------------------------------------
/src/main/java/authenticator/Utils/OneName/OneNameAdapter.java:
--------------------------------------------------------------------------------
1 | package authenticator.Utils.OneName;
2 |
3 | import javafx.scene.image.Image;
4 | import authenticator.protobuf.ProtoConfig.AuthenticatorConfiguration.ConfigOneNameProfile;
5 |
6 | public class OneNameAdapter implements OneNameListener{
7 |
8 | @Override
9 | public void getOneNameData(ConfigOneNameProfile data) {
10 | // TODO Auto-generated method stub
11 |
12 | }
13 |
14 | @Override
15 | public void getOneNameAvatarImage(ConfigOneNameProfile one, Image img) {
16 | // TODO Auto-generated method stub
17 |
18 | }
19 |
20 | }
21 |
--------------------------------------------------------------------------------
/src/main/java/authenticator/Utils/OneName/OneNameListener.java:
--------------------------------------------------------------------------------
1 | package authenticator.Utils.OneName;
2 |
3 | import authenticator.protobuf.ProtoConfig.AuthenticatorConfiguration.ConfigOneNameProfile;
4 | import javafx.scene.image.Image;
5 |
6 | public interface OneNameListener {
7 | public void getOneNameData(ConfigOneNameProfile data);
8 | public void getOneNameAvatarImage(ConfigOneNameProfile one, Image img);
9 | }
10 |
--------------------------------------------------------------------------------
/src/main/java/authenticator/Utils/OneName/exceptions/CannotSaveOneNameImageException.java:
--------------------------------------------------------------------------------
1 | package authenticator.Utils.OneName.exceptions;
2 |
3 | public class CannotSaveOneNameImageException extends Exception{
4 | public CannotSaveOneNameImageException(String msg){
5 | super(msg);
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/src/main/java/authenticator/Utils/OneName/exceptions/CannotSetOneNameProfileException.java:
--------------------------------------------------------------------------------
1 | package authenticator.Utils.OneName.exceptions;
2 |
3 | public class CannotSetOneNameProfileException extends Exception{
4 | public CannotSetOneNameProfileException(String msg){
5 | super(msg);
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/src/main/java/authenticator/Utils/SafeList.java:
--------------------------------------------------------------------------------
1 | package authenticator.Utils;
2 |
3 | import java.util.ArrayList;
4 |
5 | public class SafeList{
6 | private ArrayList