-
Notifications
You must be signed in to change notification settings - Fork 14
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Antonio Buedo
committed
Aug 19, 2019
1 parent
5f38f19
commit 004edaf
Showing
24 changed files
with
2,511 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
/bin/** | ||
/build/cache/ | ||
/build/docs/ | ||
/build/dist/ | ||
/build/logs/ | ||
/docs/_build/ | ||
/node_modules/ | ||
/vendor/ | ||
/.settings/ | ||
.project | ||
.buildpath | ||
composer.lock | ||
composer.phar | ||
.DS_Store | ||
build/.DS_Store | ||
docs/.DS_Store | ||
examples/.DS_Store |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
{ | ||
"name": "bitpay/key-utils", | ||
"description": "BitPay Utils pack for cryptography", | ||
"type": "library", | ||
"license": "MIT", | ||
"authors": [ | ||
{ | ||
"name": "Antonio Buedo", | ||
"email": "sales-engineering@bitpay.com" | ||
} | ||
], | ||
"autoload": { | ||
"psr-4": { | ||
"": "src/" | ||
} | ||
}, | ||
"require": { | ||
"ext-bcmath": "*", | ||
"ext-openssl": "*", | ||
"ext-curl": "*", | ||
"ext-json": "*", | ||
"ext-iconv": "*", | ||
"ext-gmp": "*" | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,87 @@ | ||
<?php | ||
|
||
use BitPayKeyUtils\KeyHelper\PrivateKey; | ||
use BitPayKeyUtils\Storage\EncryptedFilesystemStorage; | ||
|
||
require __DIR__ . '/vendor/autoload.php'; | ||
|
||
/** | ||
* Generate new private key for every new merchant. | ||
* Make sure you provide an easy recognizable name for each private key/Merchant | ||
* | ||
* WARNING: It is EXTREMELY IMPORTANT to place this key files in a very SECURE location | ||
**/ | ||
$privateKey = new PrivateKey(__DIR__ . '/secure/SecurePathPlusYourClientName.key'); | ||
$storageEngine = new EncryptedFilesystemStorage('YourMasterPassword'); | ||
|
||
try { | ||
// Use the EncryptedFilesystemStorage to load the Merchant's encrypted private key with the Master Password. | ||
$privateKey = $storageEngine->load(__DIR__ . '/secure/SecurePathPlusYourClientName.key'); | ||
} catch (Exception $ex) { | ||
// Check if the loaded keys is a valid key | ||
if (!$privateKey->isValid()) { | ||
$privateKey->generate(); | ||
} | ||
|
||
// Encrypt and store it securely. | ||
// This Master password could be one for all keys or a different one for each merchant | ||
$storageEngine->persist($privateKey); | ||
} | ||
|
||
/** | ||
* Generate the public key from the private key every time (no need to store the public key). | ||
**/ | ||
try { | ||
$publicKey = $privateKey->getPublicKey(); | ||
} catch (Exception $ex) { | ||
echo $ex->getMessage(); | ||
} | ||
|
||
/** | ||
* Derive the SIN from the public key. | ||
**/ | ||
$sin = $publicKey->getSin()->__toString(); | ||
|
||
/** | ||
* Use the SIN to request a pairing code and token. | ||
* The pairing code has to be approved in the BitPay Dashboard | ||
* THIS is just a cUrl example, which explains how to use the key pair for signing requests | ||
**/ | ||
$resourceUrl = 'https://test.bitpay.com/tokens'; | ||
|
||
$facade = 'merchant'; | ||
|
||
$postData = json_encode([ | ||
'id' => $sin, | ||
'facade' => $facade | ||
]); | ||
|
||
$curlCli = curl_init($resourceUrl); | ||
|
||
curl_setopt($curlCli, CURLOPT_HTTPHEADER, [ | ||
'x-accept-version: 2.0.0', | ||
'Content-Type: application/json', | ||
'x-identity' => $publicKey->__toString(), | ||
'x-signature' => $privateKey->sign($resourceUrl . $postData), | ||
]); | ||
|
||
curl_setopt($curlCli, CURLOPT_CUSTOMREQUEST, 'POST'); | ||
curl_setopt($curlCli, CURLOPT_POSTFIELDS, stripslashes($postData)); | ||
curl_setopt($curlCli, CURLOPT_RETURNTRANSFER, true); | ||
|
||
$result = curl_exec($curlCli); | ||
$resultData = json_decode($result, TRUE); | ||
curl_close($curlCli); | ||
|
||
if (array_key_exists('error', $resultData)) { | ||
echo $resultData['error']; | ||
exit; | ||
} | ||
|
||
/** | ||
* Example of a pairing Code returned from the BitPay API | ||
* which needs to be APPROVED on the BitPay Dashboard before being able to use it. | ||
**/ | ||
echo $resultData['data'][0]['pairingCode']; | ||
|
||
/** End of request **/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,111 @@ | ||
<?php | ||
|
||
namespace BitPayKeyUtils\KeyHelper; | ||
|
||
use BitPayKeyUtils\Util\Point; | ||
|
||
/** | ||
* Abstract object that is used for Public, Private, and SIN keys | ||
* | ||
* @package Bitcore | ||
*/ | ||
abstract class Key extends Point implements KeyInterface | ||
{ | ||
/** | ||
* @var string | ||
*/ | ||
protected $hex; | ||
|
||
/** | ||
* @var string | ||
*/ | ||
protected $dec; | ||
|
||
/** | ||
* @var string | ||
*/ | ||
protected $id; | ||
|
||
/** | ||
* @param string $id | ||
*/ | ||
public function __construct($id = null) | ||
{ | ||
$this->id = $id; | ||
} | ||
|
||
/** | ||
* Returns a new instance of self. | ||
* | ||
* @param string $id | ||
* @return KeyInterface | ||
*/ | ||
public static function create($id = null) | ||
{ | ||
$class = get_called_class(); | ||
|
||
return new $class($id); | ||
} | ||
|
||
/** | ||
* @return string | ||
*/ | ||
public function getId() | ||
{ | ||
return $this->id; | ||
} | ||
|
||
/** | ||
* @return string | ||
*/ | ||
public function getHex() | ||
{ | ||
return $this->hex; | ||
} | ||
|
||
/** | ||
* @return string | ||
*/ | ||
public function getDec() | ||
{ | ||
return $this->dec; | ||
} | ||
|
||
/** | ||
* @inheritdoc | ||
*/ | ||
public function serialize() | ||
{ | ||
return serialize( | ||
array( | ||
$this->id, | ||
$this->x, | ||
$this->y, | ||
$this->hex, | ||
$this->dec, | ||
) | ||
); | ||
} | ||
|
||
/** | ||
* @inheritdoc | ||
*/ | ||
public function unserialize($data) | ||
{ | ||
list( | ||
$this->id, | ||
$this->x, | ||
$this->y, | ||
$this->hex, | ||
$this->dec | ||
) = unserialize($data); | ||
} | ||
|
||
/** | ||
* @return boolean | ||
*/ | ||
public function isGenerated() | ||
{ | ||
return (!empty($this->hex)); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
<?php | ||
|
||
namespace BitPayKeyUtils\KeyHelper; | ||
|
||
use Serializable; | ||
|
||
/** | ||
* @package Bitcore | ||
*/ | ||
interface KeyInterface extends Serializable | ||
{ | ||
/** | ||
* Generates a new key | ||
*/ | ||
public function generate(); | ||
|
||
/** | ||
* @return boolean | ||
*/ | ||
public function isValid(); | ||
} |
Oops, something went wrong.