예제 #1
0
def test_encode_decode():
    key1 = bitjws.PrivateKey()
    pubkey1 = bitjws.pubkey_to_addr(key1.pubkey.serialize())
    key2 = bitjws.PrivateKey()
    pubkey2 = bitjws.pubkey_to_addr(key2.pubkey.serialize())

    ser = bitjws.multisig_sign_serialize([key1, key2])
    headers, payload = bitjws.multisig_validate_deserialize(ser)

    rawpayload = json.loads(ser)['payload']
    origpayload = bitjws.base64url_decode(rawpayload.encode('utf8'))

    keys_found = {pubkey1: False, pubkey2: False}
    assert len(headers) == 2
    for h in headers:
        assert len(h) == 3
        assert h['typ'] == 'JWT'
        assert h['alg'] == 'CUSTOM-BITCOIN-SIGN'
        assert h['kid'] in keys_found
        assert keys_found[h['kid']] == False
        keys_found[h['kid']] = True
    assert all(keys_found.values())

    assert isinstance(payload.get('exp', ''), (float, int))
    assert payload['aud'] is None
    assert len(payload) == 2
    assert payload == json.loads(origpayload.decode('utf8'))
예제 #2
0
def test_encode_decode():
    key1 = bitjws.PrivateKey()
    pubkey1 = bitjws.pubkey_to_addr(key1.pubkey.serialize())
    key2 = bitjws.PrivateKey()
    pubkey2 = bitjws.pubkey_to_addr(key2.pubkey.serialize())

    ser = bitjws.multisig_sign_serialize([key1, key2])
    headers, payload = bitjws.multisig_validate_deserialize(ser)

    rawpayload = json.loads(ser)['payload']
    origpayload = bitjws.base64url_decode(rawpayload.encode('utf8'))

    keys_found = {pubkey1: False, pubkey2: False}
    assert len(headers) == 2
    for h in headers:
        assert len(h) == 3
        assert h['typ'] == 'JWT'
        assert h['alg'] == 'CUSTOM-BITCOIN-SIGN'
        assert h['kid'] in keys_found
        assert keys_found[h['kid']] == False
        keys_found[h['kid']] = True
    assert all(keys_found.values())

    assert isinstance(payload.get('exp', ''), (float, int))
    assert payload['aud'] is None
    assert len(payload) == 2
    assert payload == json.loads(origpayload.decode('utf8'))
예제 #3
0
파일: server.py 프로젝트: kedgaks/wallet
    def _load_config(self, config):
        if ENVCFG in os.environ:
            logging.info("Loading config from {}".format(ENVCFG))
            #self.config.from_envvar(ENVCFG)
            data = json.load(open(os.getenv(ENVCFG)))
            self.config.update(**data)
        else:
            logging.warn("{} not defined".format(ENVCFG))
        if isinstance(config, dict):
            self.config.update(**config)

        if not self.config.get('api_signing_key'):
            raise Exception("Invalid config: missing api_signing_key")
        # Server key used to sign responses. The client can optionally
        # check that the response was signed by a key it knows to belong
        # to this server.
        self._privkey = bitjws.PrivateKey(
            bitjws.wif_to_privkey(self.config['api_signing_key']))
        logging.info("Server key address: {}".format(
            bitjws.pubkey_to_addr(self._privkey.pubkey.serialize())))

        self._cosigner_server = self.config.get('cosigner_server')
        if not self._cosigner_server:
            logging.warning("cosigner_server not present in config, "
                            "cosigning will not be available.")

        self._dbcfg = self.config.get('api_database')
        if not self._dbcfg:
            raise Exception("Invalid config: missing api_database")
        if 'engine' not in self._dbcfg:
            raise Exception("Invalid config for api_databae: missing 'engine'")
예제 #4
0
def test_user_can_only_get_own_coins():
    """Tests that user cannot get other users' coins throught the server"""
    print "creating a new user"
    privkey2 = bitjws.PrivateKey()
    my_pubkey2 = privkey2.pubkey.serialize()
    my_address2 = bitjws.pubkey_to_addr(my_pubkey2)

    username2 = str(my_address2)[0:8]

    client2 = BitJWSSwaggerClient.from_url(specurl, privkey=privkey2)

    luser2 = client2.get_model('User')(username=username2)
    user2 = client2.user.addUser(user=luser2).result()
    assert user.id != user2.id

    print "creating coins for both users"
    lcoin = client.get_model('Coin')(metal='ub', mint='uranus')
    client.coin.addCoin(coin=lcoin)

    lcoin2 = client2.get_model('Coin')(metal='ub', mint='uranus')
    client2.coin.addCoin(coin=lcoin2)

    print "checking users cannot get each others's coins"
    coins = client.coin.findCoin().result()
    coins2 = client2.coin.findCoin().result()

    def get_others_coins(user, coins):
        for c in coins:
            if c.user.id != user.id:
                return True
            return False

    assert not get_others_coins(user, coins)
    assert not get_others_coins(user2, coins2)
예제 #5
0
def test_encode_decode():
    key = bitjws.PrivateKey()

    ser = bitjws.sign_serialize(key)
    header, payload = bitjws.validate_deserialize(ser)

    rawheader, rawpayload = ser.rsplit('.', 1)[0].split('.')
    origheader = bitjws.base64url_decode(rawheader.encode('utf8'))
    origpayload = bitjws.base64url_decode(rawpayload.encode('utf8'))

    assert header['typ'] == 'JWT'
    assert header['alg'] == 'CUSTOM-BITCOIN-SIGN'
    assert header['kid'] == bitjws.pubkey_to_addr(key.pubkey.serialize())
    assert len(header) == 3
    assert header == json.loads(origheader.decode('utf8'))

    assert isinstance(payload.get('exp', ''), (float, int))
    assert payload['aud'] is None
    assert len(payload) == 2
    assert payload == json.loads(origpayload.decode('utf8'))

    # Assumption: it takes mores than 0 seconds to perform the above
    # instructions but less than 1 second. 3600 is the default
    # expiration time.
    diff = 3600 - (payload['exp'] - time.time())
    assert diff > 0 and diff < 1
예제 #6
0
def test_encode_decode():
    key = bitjws.PrivateKey()

    ser = bitjws.sign_serialize(key)
    header, payload = bitjws.validate_deserialize(ser)

    rawheader, rawpayload = ser.rsplit('.', 1)[0].split('.')
    origheader = bitjws.base64url_decode(rawheader.encode('utf8'))
    origpayload = bitjws.base64url_decode(rawpayload.encode('utf8'))

    assert header['typ'] == 'JWT'
    assert header['alg'] == 'CUSTOM-BITCOIN-SIGN'
    assert header['kid'] == bitjws.pubkey_to_addr(key.pubkey.serialize())
    assert len(header) == 3
    assert header == json.loads(origheader.decode('utf8'))

    assert isinstance(payload.get('exp', ''), (float, int))
    assert payload['aud'] is None
    assert len(payload) == 2
    assert payload == json.loads(origpayload.decode('utf8'))

    # Assumption: it takes mores than 0 seconds to perform the above
    # instructions but less than 1 second. 3600 is the default
    # expiration time.
    diff = 3600 - (payload['exp'] - time.time())
    assert diff > 0 and diff < 1
예제 #7
0
def test_register_user():
    # register a new user
    privkey2 = bitjws.PrivateKey()
    my_pubkey2 = privkey2.pubkey.serialize()
    my_address2 = bitjws.pubkey_to_addr(my_pubkey2)

    username2 = str(my_address2)[0:8]

    client2 = BitJWSSwaggerClient.from_url(specurl, privkey=privkey2)

    luser2 = client2.get_model("User")(username=username2)
    user2 = client2.user.addUser(user=luser2).result()
    assert hasattr(user2, "id")
예제 #8
0
def test_register_user():
    # register a new user
    privkey2 = bitjws.PrivateKey()
    my_pubkey2 = privkey2.pubkey.serialize()
    my_address2 = bitjws.pubkey_to_addr(my_pubkey2)

    username2 = str(my_address2)[0:8]

    client2 = BitJWSSwaggerClient.from_url(specurl, privkey=privkey2)

    luser2 = client2.get_model('User')(username=username2)
    user2 = client2.user.addUser(user=luser2).result()
    assert hasattr(user2, 'id')
예제 #9
0
def test_echo_request():
    privkey = bitjws.PrivateKey()
    pubkey = bitjws.pubkey_to_addr(privkey.pubkey.serialize())
    echo_msg = {'hello': 'server'}
    data = bitjws.sign_serialize(privkey, data=echo_msg, iat=time.time(), requrl="/echo")
    fbj = FlaskBitjws(server.app)
    app = server.app.test_client()
    udata = json.dumps({'username': pubkey[0:8], 'kid': pubkey})
    user = app.post('/user', data=udata)
    echo = app.post('/echo', data=data, headers={'Content-Type': 'application/jose'})
    h, p = bitjws.validate_deserialize(echo.get_data().decode('utf8'), requrl='/response')
    assert 'alg' in h
    assert h['alg'] == 'CUSTOM-BITCOIN-SIGN'
    assert 'typ' in h
    assert 'kid' in h
    assert 'data' in p
    assert p['data'] == echo_msg
예제 #10
0
    def __init__(self, app, privkey=None,
                 loginmanager=None,
                 get_last_nonce=get_last_nonce,
                 get_user_by_key=get_user_by_key,
                 basepath=""):
        """
        Initialize a flask-bitjws Application with optional LoginManager.
        If you do not provide your own LoginManager one will be created.

        Create or set the private key to use with this application.

        :param str app: The flask application
        :param str privkey: the bitjws private key to use for signing responses
        :param flask.ext.login.LoginManager loginmanager: An optional LoginManager
        :param function get_last_nonce: A function to overwrite this class's stub.
        :param function get_user_by_key: A function to overwrite this class's stub.
        :param str basepath: The public basepath this app is deployed on.
             (only preceding slash required i.e. '/path')
        """
        if privkey is not None and isinstance(privkey, str):
            self._privkey = bitjws.PrivateKey(bitjws.wif_to_privkey(privkey))
        elif privkey is not None and isinstance(privkey, bitjws.PrivateKey):
            self._privkey = privkey
        else:
            self._privkey = bitjws.PrivateKey()
        self.pubkey = bitjws.pubkey_to_addr(self._privkey.pubkey.serialize())

        if loginmanager is None:
            loginmanager = login.LoginManager()
            loginmanager.anonymous_user = login.AnonymousUserMixin
            loginmanager.init_app(app)
        loginmanager.request_loader(load_user_from_request)

        self.get_last_nonce = get_last_nonce
        self.get_user_by_key = get_user_by_key

        self.basepath = basepath

        app.bitjws = self
예제 #11
0
def create_user():
    privkey = bitjws.PrivateKey()
    my_pubkey = privkey.pubkey.serialize()
    my_address = bitjws.pubkey_to_addr(my_pubkey)
    username = str(my_address)[0:8]
    user = um.User(username=username)
    ses.add(user)
    try:
        ses.commit()
    except Exception as ie:
        print ie
        ses.rollback()
        ses.flush()
    userkey = um.UserKey(key=my_address, keytype='public', user_id=user.id,
                         last_nonce=0)
    ses.add(userkey)
    ses.add(wm.Balance(total=0, available=0, currency=CURRENCY, reference='open account', user_id=user.id))
    try:
        ses.commit()
    except Exception as ie:
        print ie
        ses.rollback()
        ses.flush()
    return user
예제 #12
0
# Install requirements: pip install flask flask-login
import flask
from flask.ext import login
import bitjws

# Server key used to sign responses. The client can optionally
# check that the response was signed by a key it knows to belong
# to this server.
privkey = bitjws.PrivateKey()
print("Server WIF key: {}".format(bitjws.privkey_to_wif(privkey.private_key)))
print("Server key address: {}".format(
    bitjws.pubkey_to_addr(privkey.pubkey.serialize())))

# Setup flask app with flask-login.
app = flask.Flask(__name__)
login_manager = login.LoginManager()
login_manager.init_app(app)


# Dummy User.
class User(login.UserMixin):
    def __init__(self, address):
        self.id = address


# Custom request authentication based on bitjws.
@login_manager.request_loader
def load_user_from_request(request):
    header, payload = bitjws.validate_deserialize(request.data.decode('utf8'))
    if header is None:
        # Validation failed.
예제 #13
0
import os
import pytest
import time
from bravado_bitjws.client import BitJWSSwaggerClient
from desw import CFG, ses, eng, models
from desw.plugin import internal_credit, internal_address, internal_confirm_credit

from bravado.swagger_model import load_file

host = "0.0.0.0"
url = "http://0.0.0.0:8002/"
specurl = os.path.abspath('../desw/desw/static/swagger.json')

privkey = bitjws.PrivateKey()
my_pubkey = privkey.pubkey.serialize()
my_address = bitjws.pubkey_to_addr(my_pubkey)
username = str(my_address)[0:8]
client = BitJWSSwaggerClient.from_spec(load_file(specurl), origin_url=url)
luser = client.get_model('User')(username=username)
user = client.user.addUser(user=luser).result().user

privkey2 = bitjws.PrivateKey()
my_pubkey2 = privkey2.pubkey.serialize()
my_address2 = bitjws.pubkey_to_addr(my_pubkey2)
username2 = str(my_address2)[0:8]
client2 = BitJWSSwaggerClient.from_spec(load_file(specurl), origin_url=url)
luser2 = client2.get_model('User')(username=username2)
user2 = client2.user.addUser(user=luser2).result().user


def test_addresses():
예제 #14
0
import pytest
import bitjws
from bravado_bitjws.client import BitJWSSwaggerClient

privkey = bitjws.PrivateKey()

my_pubkey = privkey.pubkey.serialize()
my_address = bitjws.pubkey_to_addr(my_pubkey)

host = "0.0.0.0"
url = "http://0.0.0.0:8002/"
specurl = "%sstatic/swagger.json" % url
username = str(my_address)[0:8]

client = BitJWSSwaggerClient.from_url(specurl, privkey=privkey)

luser = client.get_model("User")(username=username)
user = client.user.addUser(user=luser).result()


def test_register_user():
    # register a new user
    privkey2 = bitjws.PrivateKey()
    my_pubkey2 = privkey2.pubkey.serialize()
    my_address2 = bitjws.pubkey_to_addr(my_pubkey2)

    username2 = str(my_address2)[0:8]

    client2 = BitJWSSwaggerClient.from_url(specurl, privkey=privkey2)

    luser2 = client2.get_model("User")(username=username2)
예제 #15
0
import bitjws
from bravado_bitjws.client import BitJWSSwaggerClient
import pika


# Prepend the parent directory to the sys path.
CLIENT_DIR = ".."
if CLIENT_DIR not in sys.path:
    sys.path.insert(0, CLIENT_DIR)

import pikaconfig

TEST_URL = os.environ.get('WSOCK_URL', 'ws://localhost:8123/websocket')

privkey = bitjws.PrivateKey()
pubhash = bitjws.pubkey_to_addr(privkey.pubkey.serialize())

url = 'http://0.0.0.0:8002/'
specurl = '%sstatic/swagger.json' % url

try:
    bitjws_client = BitJWSSwaggerClient.from_url(specurl,
                                                 privkey=privkey, aud='/response')
    username = str(pubhash)[0:8]
    luser = bitjws_client.get_model('User')(username=username)
    user = bitjws_client.user.addUser(user=luser).result()
except:
    bitjws_client = None
    print "Could not connet to BitJWS server... Continuing without it."
    pass
예제 #16
0
파일: __init__.py 프로젝트: GitGuild/desw
def create_username_address():
    privkey = bitjws.PrivateKey()
    my_pubkey = privkey.pubkey.serialize()
    my_address = bitjws.pubkey_to_addr(my_pubkey)
    username = str(my_address)[0:8]
    return username, my_address