Example #1
0
def main():
    app = init_app()
    manager = Manager(app)
    manager.add_command('seed', Seed())
    # manager.add_command('import', ImportVisitors())
    manager.run()
    return app
Example #2
0
class TestSeed(unittest.TestCase):
    def setUp(self):
        self.seed = Seed(seed_list='./testing/seedlist')

    def test_print_help(self):
        self.assertIsNone(self.seed.print_help())

    def test_get_seeds(self):
        self.assertIsNotNone(self.seed.get_seeds())

    def test_print_seeds(self):
        self.assertIsNone(self.seed.print_seeds())

    def test_plant_seed(self):
        with self.assertRaises(SystemExit):
            self.seed.plant_seed()
Example #3
0
def make_shell_context():
    return dict(app=current_app,
                user_models=user_models,
                product_models=product_models,
                common_methods=common_methods,
                db=db,
                seed=Seed())
Example #4
0
class TestSeed(unittest.TestCase):

    def setUp(self):
        self.seed = Seed(seed_list='./testing/seedlist')

    def test_print_help(self):
        self.assertIsNone(self.seed.print_help())

    def test_get_seeds(self):
        self.assertIsNotNone(self.seed.get_seeds())

    def test_print_seeds(self):
        self.assertIsNone(self.seed.print_seeds())

    def test_plant_seed(self):
        with self.assertRaises(SystemExit):
            self.seed.plant_seed()
Example #5
0
def main():
    if ARGS.merge:
        merge_json()
    elif ARGS.csv:
        Seed().to_json()
    else:
        raise ValueError(
            "Missing argument. To see list of arguments use --help.")
 def __init__(self, players=32, year=2137):
     self.gen = PlayerGenerator()
     self.MATCH_LENGTH = (10, 13, 16, 17, 18)
     self.SEEDS_PRIORITY = tuple(Seed.generate(players // 2))
     self.ROUNDS_NAMES = ("Winner", "Final", "Semi Finals",
                          "Quarter Finals", "Round ")
     self.year = year
     self.players = players
Example #7
0
 def setUp(self):
     self.seed = Seed(seed_list='./testing/seedlist')
Example #8
0
from flask_migrate import Migrate
from flask_migrate import MigrateCommand
from flask_script import Manager

from ros.lib.app import app, db
from seed import Seed

migrate = Migrate(app, db)
manager = Manager(app)
manager.add_command("db", MigrateCommand)
manager.add_command('seed', Seed())

if __name__ == "__main__":
    manager.run()
Example #9
0
    def set_game(self):
        self.pacman_alive = True
        self.kostul = True
        self.counterOfEatenFruits = 0
        self.gameover_exists = False
        self.counter = Counter()
        self.state = STATES["game"]
        self.ghosts.clear()
        self.objects.clear()
        self.objects.append(
            GameField([
                pygame.transform.scale(pygame.image.load("./Entity/Map.png"),
                                       (424, 468))
            ], [0, 0, 424, 468]))
        self.objects.append(
            Pacman(self.genPacmanImg(), [229, 255, 20, 20], 0, 1))
        self.start_v = 33
        self.finish_v = 34
        cnt = -1
        for v in self.graph.coordinates:
            cnt += 1
            name_on = "./Entity/Fruit/ SeedOn.png"
            name_off = "./Entity/Fruit/seedOff.png"
            self.objects.append(
                Seed([[
                    pygame.transform.scale(pygame.image.load(name_on), (2, 2))
                ], [
                    pygame.transform.scale(pygame.image.load(name_off), (2, 2))
                ]], [v[0] - 1, v[1] - 1, 2, 2]))  ## 3-68 элементы - зерна
            if 28 <= cnt <= 30:
                self.objects[-1].change_type(1)
        self.objects.append(
            Ghost(self.genPinkGhostImg(), [
                self.graph.coordinates[29][0], self.graph.coordinates[29][1],
                20, 20
            ], 0))  ## 69 элемент - розовый призрак
        self.objects.append(
            Ghost(self.genRedGhostImg(), [
                self.graph.coordinates[28][0], self.graph.coordinates[28][1],
                20, 20
            ], 0))  ## 70 элемент - красный призрак

        cnt = -1
        cnt = random.randint(0, 66)  # генерация фруктов
        while (28 <= cnt <= 30):
            cnt = random.randint(0, 66)
        v = self.graph.coordinates[cnt]
        self.objects[cnt + 2].change_type(1)
        i = random.randint(1, 5)
        self.fruit_index = len(self.objects)
        name_on = "./Entity/Fruit/fruit" + str(i) + ".png"
        name_off = "./Entity/Fruit/seedOff.png"
        self.objects.append(
            Fruit([[
                pygame.transform.scale(pygame.image.load(name_on), (15, 15))
            ], [pygame.transform.scale(pygame.image.load(name_off),
                                       (15, 15))]],
                  [v[0] - 5, v[1] - 8, 15, 15]))
        #self.objects[69].move_to_point([self.graph.coordinates[29][0], self.graph.coordinates[29][1]])
        self.objects[69].start_moving_to_point([
            self.graph.coordinates[23][0] - 10,
            self.graph.coordinates[23][1] - 10
        ])
        self.ghosts.append([69, 29, 23])
        self.objects[70].start_moving_to_point([
            self.graph.coordinates[29][0] - 10,
            self.graph.coordinates[29][1] - 10
        ])
        self.ghosts.append([70, 28, 29])
Example #10
0
 def do_reset_seeds(self):
     self.master = Seed()
     self.stretched_master = Seed()
     self.seed = Seed()
     self.update_prompt()
Example #11
0
 def __init__(self):
     pygame.init()
     pygame.font.init()
     self.pacman = Pacman()
     self.map_start = time.monotonic()
     self.Highscore = highscore.Highscore()
     self.positionD = 380, 306
     self.positionG = 400, 306
     self.positionS = 360, 306
     self.position = 380, 290
     self.Ghost = Ghost(self.position)
     self.Gannibal = Gannibal(self.positionG)
     self.Stalker = Stalker(self.positionS)
     self.Debil = Debil(self.positionD)
     self.Output = Output()
     self.Seed = Seed()
     self.Berry = Berry()
     self.bigseed = BigSeed()
     self.gameover = False
     self.map = [[
         2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
         2, 2, 2, 2
     ],
                 [
                     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
                     2, 2, 2, 2, 2, 2, 2, 2
                 ],
                 [
                     2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
                     1, 1, 1, 1, 1, 1, 1, 2
                 ],
                 [
                     2, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
                     0, 0, 0, 0, 0, 0, 1, 2
                 ],
                 [
                     2, 2, 2, 2, 2, 2, 1, 3, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1,
                     1, 1, 0, 1, 1, 3, 1, 2
                 ],
                 [
                     2, 2, 2, 2, 2, 2, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1,
                     1, 1, 0, 1, 1, 0, 1, 2
                 ],
                 [
                     2, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                     0, 0, 0, 0, 0, 0, 1, 2
                 ],
                 [
                     2, 2, 2, 2, 2, 2, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1,
                     0, 1, 0, 1, 1, 0, 1, 2
                 ],
                 [
                     2, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0,
                     0, 1, 0, 0, 0, 0, 1, 2
                 ],
                 [
                     2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 0, 1, 1, 1, 2, 1, 2, 1,
                     1, 1, 0, 1, 1, 1, 1, 2
                 ],
                 [
                     2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0, 1, 2, 2, 2, 2, 2, 2,
                     2, 1, 0, 1, 2, 2, 2, 2
                 ],
                 [
                     2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 0, 1, 2, 1, 1, 1, 1, 1,
                     2, 1, 0, 1, 1, 1, 1, 2
                 ],
                 [
                     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 1, 2, 2, 2, 1,
                     2, 2, 0, 2, 2, 2, 2, 2
                 ],
                 [
                     2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 0, 1, 2, 1, 1, 1, 1, 1,
                     2, 1, 0, 1, 1, 1, 1, 2
                 ],
                 [
                     2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0, 1, 2, 2, 2, 2, 2, 2,
                     2, 1, 0, 1, 2, 2, 2, 2
                 ],
                 [
                     2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 0, 1, 2, 1, 1, 1, 1, 1,
                     2, 1, 0, 1, 1, 1, 1, 2
                 ],
                 [
                     2, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
                     0, 0, 0, 0, 0, 0, 1, 2
                 ],
                 [
                     2, 2, 2, 2, 2, 2, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1,
                     1, 1, 0, 1, 1, 0, 1, 2
                 ],
                 [
                     2, 2, 2, 2, 2, 2, 1, 3, 0, 1, 0, 0, 0, 0, 0, 0, 2, 0,
                     0, 0, 0, 1, 0, 3, 1, 2
                 ],
                 [
                     2, 2, 2, 2, 2, 2, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1,
                     0, 1, 0, 1, 0, 1, 1, 2
                 ],
                 [
                     2, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0,
                     0, 1, 0, 0, 0, 0, 1, 2
                 ],
                 [
                     2, 2, 2, 2, 2, 2, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1,
                     1, 1, 1, 1, 1, 0, 1, 2
                 ],
                 [
                     2, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                     0, 0, 0, 0, 0, 0, 1, 2
                 ],
                 [
                     2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
                     1, 1, 1, 1, 1, 1, 1, 2
                 ]]
Example #12
0
 def do_reset_seeds(self):
     self.master = Seed()
     self.stretched_master = Seed()
     self.seed = Seed()
     self.update_prompt()
Example #13
0
 def setUp(self):
     self.seed = Seed(seed_list='./testing/seedlist')
Example #14
0
 def _get_seed_account_id(self):
     seed = Seed(self.api_key)
     return seed.execute()
Example #15
0
def getseed(name):
    for s in SeedList:
        if s['name'] == name:
            out = Seed(s['x'], s['y'], s['name'], s['seed'])
            return out
Example #16
0
class SeedShell(Cmd):

    intro = """
    Granary is an interactive shell for managing seeds for use in crypto-currencies.

    Glossary:
        - Master seed: A seed used to encrypt other seeds
        - Stretched Master: The master seed, stretched by a passphrase
        - Seed: A seed encrypted with the stretched master and used to derive BIP32 keys (xpriv/xpub)

    Process:
        Try the following commands to build a seed

        Step 1. Generate or load a master encryption seed
            Commands: generate_master, master_from_shares, load_master, save_master

        Step 2. stretched the master seed
            Command: stretch_master

        Step 3. Generate or load a seed for customer keys:
            Commands: generate_seed, load_seed, load_seed_mnemonic, save_seed, show_seed

        Use command "seeds" to see the fingerprints of all loaded seeds

        Or enter "help" for a list of commands, "help <command>" for a description of each command
        eg. help show_seed

    """

    version_string = "Granary Shell v%s\n" % __version__
    intro = version_string + intro

    doc_header = version_string + "Documented commands (type help <topic>):"

    def __init__(self):
        Cmd.__init__(self)
        self.master = Seed()
        self.stretched_master = Seed()
        self.seed = Seed()
        self.recovery_package = None

    def do_reset_seeds(self):
        self.master = Seed()
        self.stretched_master = Seed()
        self.seed = Seed()
        self.update_prompt()

    def help_reset_seeds(self):
        print "Reset all stored seeds"

    def update_prompt(self):
        prompt = "granary-v%s " % __version__
        if self.stretched_master:
            prompt += "SM-%s" % self.stretched_master.fingerprint()
            prompt += "# "
        elif self.master:
            prompt += "M-%s" % self.master.fingerprint()
            prompt += "$ "
        else:
            prompt += "$ "
        self.prompt = prompt

    def do_seeds(self, arg=None):
        print "Seeds loaded"
        print "-" * 20
        print "Master           : ", self.master.fingerprint() or "None"
        print "Stretched Master : ", self.stretched_master.fingerprint(
        ) or "None"
        print "Seed             : ", self.seed.fingerprint() or "None"
        print "-" * 20

    def help_seeds(self):
        print "Show all stored seed fingerprints"

    def do_generate_master(self, arg):
        print "===== Generating Master"
        self.master.from_random()

        print "===== Splitting Master into mnemonic shares"
        mnemonic_share_list = seedlib.split(self.master.bin_seed())

        print "===== Printing shares for key fingerprint", self.master.fingerprint(
        )
        for i in range(5):
            print "\n"
            print i + 1, ".", mnemonic_share_list[i]
        print "\n"
        self.update_prompt()

    def help_generate_master(self):
        print "Generate a new master seed from entropy"

    def do_load_master(self, filename):
        if not filename or not os.path.isfile(filename):
            raise Exception("load_master requires a filename")

        if self.master:
            if raw_input("Overwrite existing master? (y/N): ") not in [
                    "y", "Y"
            ]:
                raise Exception(
                    "aborting load. Keeping existing master seed %s" %
                    self.master_fingerprint)

        m = seedlib.regex_master_filename_fingerprint.search(filename)
        expected_fingerprint = m.groupdict()['fingerprint']
        decrypted_master = seedlib.gpg_decrypt_master(expected_fingerprint)
        if not seedlib.fingerprint(decrypted_master) == expected_fingerprint:
            raise Exception(
                "load_master: error, failed to load master seed with correct fingerprint"
            )
        else:
            print "Loaded master seed", expected_fingerprint
            self.master.from_bin(decrypted_master)
            self.update_prompt()

    def complete_load_master(self, text, line, begidx, endidx):
        files = glob.glob(seedlib.master_filename_template % "*")
        if not text:
            return files
        else:
            return [f for f in files if f.startswith(text)]

    def help_load_master(self):
        print "Load a PGP encrypted master seed from a file"

    def do_master_from_shares(self, args):
        if self.master:
            if raw_input("Overwrite existing master? (y/N): ") not in [
                    "y", "Y"
            ]:
                raise Exception(
                    "aborting load. Keeping existing master seed %s" %
                    self.master_fingerprint)

        expected_fingerprint = str(
            raw_input("Enter master fingerprint: ")).upper()
        shares = []
        while (len(shares) < seedlib.quorum_shares):
            need = seedlib.quorum_shares - len(shares)
            try:
                share = str(
                    raw_input("Enter a key share  (" + str(need) +
                              " more needed): "))
                decoded_share = seedlib.mnemonic_decode(share)
                shares.append(decoded_share)
            except KeyboardInterrupt:
                raise
            except Exception as e:
                print e, "... try again"

        print "Reconstructing key"
        master_bin_seed = ssss_wrapper.ssss_combine_unindexed(
            shares, expected_fingerprint)
        self.master.from_bin(master_bin_seed)
        self.update_prompt()

    def help_master_from_shares(self):
        print "Reconstruct a master seed from M-of-N mnemonic shares"

    def do_save_master(self, args):
        if not self.master:
            raise Exception(
                "save_master: No master seed is loaded. Load or generate a master seed"
            )

        encrypted_master = seedlib.gpg_encrypt_master(self.master.as_hex())
        print "Storing encrypted master"
        keyfilename = seedlib.master_filename_template % self.master.fingerprint(
        )
        keyfile = open(keyfilename, 'w')

        key_json = {
            "fingerprint": self.master.fingerprint(),
            "pgp": str(encrypted_master),
        }
        key_text = json.dumps(key_json, sort_keys=True, indent=2)
        keyfile.write(key_text)
        keyfile.close
        print key_text
        print "Data saved to ", keyfilename

    def help_save_master(self):
        print "Save a PGP encrypted master seed to a file"

    def do_stretch_master(self, arg=None):
        if not self.master:
            raise Exception(
                "stretch_master: Load or generate a master seed first")
        passphrase = getpass.getpass(
            "Type passphrase for master key stretching: ")
        passphrase = seedlib.mnemonic.normalize_string(passphrase)
        print "Password stretching, please wait, may take a while"
        self.stretched_master.from_bin(
            seedlib.stretched_key(self.master.bin_seed(), passphrase))
        print "Stretched key fingerprint: ", self.stretched_master.fingerprint(
        )
        self.update_prompt()

    def help_stretch_master(self):
        print "Generate a stretched key by stretching the master with a passphrase"

    def do_generate_seed(self, args):
        if not self.stretched_master:
            raise Exception("generate_seed: stretch a master seed first")

        # generate seed
        print "Generating customer seed"
        self.seed.from_random()

        print "Customer key fingerprint:", self.seed.fingerprint()

        print "Encrypting customer seed"
        encrypted_customer_seed = seedlib.encrypt(
            self.seed.bin_seed(), self.stretched_master.bin_seed())

        print "Creating encrypted mnemonic"
        encrypted_mnemonic = seedlib.mnemonic.to_mnemonic(
            encrypted_customer_seed)
        print encrypted_mnemonic

        print "Decrypting seed"
        decrypted_seed = seedlib.decode_seed(encrypted_mnemonic,
                                             self.seed.fingerprint(),
                                             self.stretched_master.bin_seed())

        print "Running validation tests"
        assert (decrypted_seed == self.seed.bin_seed())

        print "Validation tests completed successfully"

    def help_generate_seed(self):
        print "Generate a seed from entropy and encrypt it with a stretched master key"

    def do_load_seed(self, filename):
        if not self.master:
            raise Exception("password: Load the master seed first")

        if not filename or not os.path.isfile(filename):
            raise Exception("load_seed requires a filename")

        m = seedlib.regex_seed_filename_fingerprint.search(filename)
        expected_fingerprint = m.groupdict()['fingerprint']

        seed_file = open(filename, 'r')
        seed_data = json.loads(seed_file.read())
        seed_file.close()

        expected_fingerprint = seed_data['fingerprint']
        encrypted_mnemonic = seed_data['encrypted_mnemonic']
        expected_master = seed_data['master']
        expected_stretched_master = seed_data['stretched_master']

        if expected_stretched_master != self.stretched_master.fingerprint():
            raise Exception(
                "load_seed: Seed is encrypted with a different stretched master than the one currently loaded"
            )

        decrypted_seed = seedlib.decode_seed(encrypted_mnemonic,
                                             expected_fingerprint,
                                             self.stretched_master.bin_seed())
        if not seedlib.fingerprint(decrypted_seed) == expected_fingerprint:
            raise Exception(
                "load_seed: Decrypted seed fingerprint does not match expected fingerprint"
            )
        else:
            print "Loaded seed", expected_fingerprint
            self.seed.from_bin(decrypted_seed)
            self.update_prompt()

    def help_load_seed(self):
        print "Load an encrypted seed from a file and decrypt it with the stretched master key"

    def do_load_seed_mnemonic(self, args):
        if not self.master:
            raise Exception("load_seed_mnemonic: Load the master seed first")
        if not self.stretched_master:
            raise Exception("load_seed_mnemonic: stretch a master seed first")
        mnemonic_size = int(
            raw_input("How many mnemonic words (12, 18 or 24): "))
        assert mnemonic_size in [12, 18, 24]
        words = []
        while (len(words) < mnemonic_size):
            need = mnemonic_size - len(words)
            try:
                word_input = str(
                    raw_input("Enter mnemonic word #" + str(len(words) + 1) +
                              ", entire mnemonic, or Ctrl-C to exit: "))
                for word in word_input.split():
                    if word not in seedlib.mnemonic.wordlist:
                        raise ValueError(
                            "word {0} not in mnemonic dictionary".format(word))
                    words.append(word)
            except KeyboardInterrupt:
                raise
            except Exception as e:
                print e, "... try again"
        mnemonic_phrase = str(" ").join(words)
        seed = seedlib.mnemonic_decode(mnemonic_phrase)
        fingerprint = seedlib.fingerprint(seed)
        print "Loaded seed", fingerprint
        self.seed.from_bin(seed)
        self.update_prompt()
        print "You can try the following commands now: seed, show_seed, save_seed"

    def help_load_seed_mnemonic(self):
        print "Load an unencrypted seed from a mnemonic phrase and encrypt it with the stretched master key"

    def do_save_seed(self, args):
        if not self.seed:
            raise Exception("save_seed: No seed to save")

        print "Storing seed"
        keyfilename = seedlib.seed_filename_template % self.seed.fingerprint()
        keyfile = open(keyfilename, 'w')

        encrypted_customer_seed = seedlib.encrypt(
            self.seed.bin_seed(), self.stretched_master.bin_seed())
        encrypted_mnemonic = seedlib.mnemonic.to_mnemonic(
            encrypted_customer_seed)

        key_json = {
            "fingerprint": self.seed.fingerprint(),
            "master": self.master.fingerprint(),
            "stretched_master": self.stretched_master.fingerprint(),
            "encrypted_mnemonic": encrypted_mnemonic,
        }
        key_text = json.dumps(key_json, indent=2)
        keyfile.write(key_text)
        keyfile.close
        print "Data saved to ", keyfilename
        print key_text

    def help_save_seed(self):
        print "Save an encrypted seed to a file"

    def complete_load_seed(self, text, line, begidx, endidx):
        files = glob.glob(seedlib.seed_filename_template % "*")
        if not text:
            return files
        else:
            return [f for f in files if f.startswith(text)]

    def do_show_seed(self, args):
        if not self.seed:
            raise Exception("show seed xpub: Load or generate a seed first")

        master_xpriv = self.seed.as_HD_root()
        master_xpub = bitcoin.bip32_privtopub(master_xpriv)
        encrypted_customer_seed = seedlib.encrypt(
            self.seed.bin_seed(), self.stretched_master.bin_seed())
        encrypted_mnemonic = seedlib.mnemonic.to_mnemonic(
            encrypted_customer_seed)

        print "Seed fingerprint     :", self.seed.fingerprint()
        print "Seed mnemonic        :", seedlib.mnemonic.to_mnemonic(
            self.seed.bin_seed())
        print "Encrypted mnemonic   :", encrypted_mnemonic
        print "Master xpub          :", master_xpub
        print "0H xpub              :", bitcoin.bip32_privtopub(
            seedlib.bip32_child(master_xpriv, "0H"))
        print "0H/0 xpub            :", bitcoin.bip32_privtopub(
            seedlib.bip32_child(master_xpriv, "0H/0"))
        print "44H/0H/0H/0/0 xpub   :", bitcoin.bip32_privtopub(
            seedlib.bip32_child(master_xpriv, "44H/0H/0H/0/0"))

        if args:
            print "{0} xpub              : {1}".format(
                args,
                bitcoin.bip32_privtopub(seedlib.bip32_child(
                    master_xpriv, args)))

    def help_show_seed(self):
        print "show_seed [PATH]"
        print "Show seed as unencrypted BIP39 mnemonic and standard path xpubs (including optional PATH xpub)"

    def do_load_recovery(self, filename):
        if not filename or not os.path.isfile(filename):
            raise Exception("load_recovery requires a filename")
        self.recovery_package = recovery.load_recovery(filename)

    def complete_load_recovery(self, text, line, begidx, endidx):
        files = glob.glob("*")
        if not text:
            return files
        else:
            return [f for f in files if f.startswith(text)]

    def do_cosign(self, args):
        if not self.seed:
            raise Exception("cosign: Load or generate a seed first")

        if not self.recovery_package:
            raise Exception(
                "cosign: Load a recovery package first (load_recovery)")

        path = None
        if args and len(args.split()) > 0:
            path = args.split()[0]

        master_xpriv = self.seed.as_HD_root()

        if path:
            path = [
                2**31 +
                int(child[:-1]) if child[-1:] in "hp'HP" else int(child)
                for child in path.split('/')
            ]
            for p in path:
                master_xpriv = bitcoin.bip32_ckd(master_xpriv, p)

        self.recovery_package = recovery.cosign(master_xpriv,
                                                self.recovery_package)

    def help_cosign(self):
        print "cosign [KEYPATH]"
        print "Sign a transaction recovery package using the BIP32 KEYPATH private key derived from seed"

    def do_validate(self, args):
        if not self.recovery_package:
            raise Exception(
                "validate: Load a recovery package first (load_recovery)")
        recovery.validate(self.recovery_package)

    def help_validate(self):
        print "validate"
        print "Validate a transaction recovery package"

    def do_normalize(self, args):
        if not self.recovery_package:
            raise Exception(
                "normalize: Load a recovery package first (load_recovery)")
        r = recovery.normalize(self.recovery_package)
        self.recovery_package = r

    def help_normalize(self):
        print "normalize"
        print "Normalize a transaction recovery package"

    def do_save_recovery(self, filename):
        if not self.recovery_package:
            raise Exception(
                "save_recovery: Load a recovery package first (load_recovery)")
        if not filename or os.path.isfile(filename):
            raise Exception(
                "save_recovery requires a filename and that file must not exist"
            )
        recovery.save_recovery(self.recovery_package, filename)

    def help_save_recovery(self):
        print "save_recovery FILENAME"
        print "Save a transaction recovery package to FILENAME, FILENAME must not already exist"
Example #17
0
 def __init__(self):
     Cmd.__init__(self)
     self.master = Seed()
     self.stretched_master = Seed()
     self.seed = Seed()
     self.recovery_package = None
Example #18
0
class SeedShell(Cmd):

    intro = """
    Granary is an interactive shell for managing seeds for use in crypto-currencies.

    Glossary:
        - Master seed: A seed used to encrypt other seeds
        - Stretched Master: The master seed, stretched by a passphrase
        - Seed: A seed encrypted with the stretched master and used to derive BIP32 keys (xpriv/xpub)

    Process:
        Try the following commands to build a seed

        Step 1. Generate or load a master encryption seed
            Commands: generate_master, master_from_shares, load_master, save_master

        Step 2. stretched the master seed
            Command: stretch_master

        Step 3. Generate or load a seed for customer keys:
            Commands: generate_seed, load_seed, load_seed_mnemonic, save_seed, show_seed

        Use command "seeds" to see the fingerprints of all loaded seeds

        Or enter "help" for a list of commands, "help <command>" for a description of each command
        eg. help show_seed

    """

    version_string = "Granary Shell v%s\n" % __version__
    intro = version_string + intro

    doc_header = version_string + "Documented commands (type help <topic>):"

    def __init__(self):
        Cmd.__init__(self)
        self.master = Seed()
        self.stretched_master = Seed()
        self.seed = Seed()
        self.recovery_package = None

    def do_reset_seeds(self):
        self.master = Seed()
        self.stretched_master = Seed()
        self.seed = Seed()
        self.update_prompt()


    def help_reset_seeds(self):
        print "Reset all stored seeds"

    def update_prompt(self):
        prompt = "granary-v%s " % __version__
        if self.stretched_master:
            prompt += "SM-%s" % self.stretched_master.fingerprint()
            prompt += "# "
        elif self.master:
            prompt += "M-%s" % self.master.fingerprint()
            prompt += "$ "
        else:
            prompt +="$ "
        self.prompt = prompt


    def do_seeds(self, arg=None):
        print "Seeds loaded"
        print "-" * 20
        print "Master           : ", self.master.fingerprint() or "None"
        print "Stretched Master : ", self.stretched_master.fingerprint() or "None"
        print "Seed             : ", self.seed.fingerprint() or "None"
        print "-" * 20


    def help_seeds(self):
        print "Show all stored seed fingerprints"


    def do_generate_master(self, arg):
        print "===== Generating Master"
        self.master.from_random()

        print "===== Splitting Master into mnemonic shares"
        mnemonic_share_list = seedlib.split(self.master.bin_seed())

        print "===== Printing shares for key fingerprint", self.master.fingerprint()
        for i in range(5):
            print "\n"
            print i+1,".", mnemonic_share_list[i]
        print "\n"
        self.update_prompt()


    def help_generate_master(self):
        print "Generate a new master seed from entropy"


    def do_load_master(self, filename):
        if not filename or not os.path.isfile(filename):
            raise Exception("load_master requires a filename")

        if self.master:
            if raw_input("Overwrite existing master? (y/N): ") not in ["y","Y"]:
                raise Exception("aborting load. Keeping existing master seed %s" % self.master_fingerprint)

        m = seedlib.regex_master_filename_fingerprint.search(filename)
        expected_fingerprint = m.groupdict()['fingerprint']
        decrypted_master = seedlib.gpg_decrypt_master(expected_fingerprint)
        if not seedlib.fingerprint(decrypted_master) == expected_fingerprint:
            raise Exception("load_master: error, failed to load master seed with correct fingerprint")
        else:
            print "Loaded master seed", expected_fingerprint
            self.master.from_bin(decrypted_master)
            self.update_prompt()


    def complete_load_master(self, text, line, begidx, endidx):
        files = glob.glob(seedlib.master_filename_template % "*")
        if not text:
            return files
        else:
            return [f for f in files if f.startswith(text)]


    def help_load_master(self):
        print "Load a PGP encrypted master seed from a file"


    def do_master_from_shares(self, args):
        if self.master:
            if raw_input("Overwrite existing master? (y/N): ") not in ["y","Y"]:
                raise Exception("aborting load. Keeping existing master seed %s" % self.master_fingerprint)

        expected_fingerprint = str(raw_input("Enter master fingerprint: ")).upper()
        shares = []
        while (len(shares) < seedlib.quorum_shares):
            need = seedlib.quorum_shares - len(shares)
            try:
                share = str(raw_input("Enter a key share  ("+str(need)+" more needed): "))
                decoded_share = seedlib.mnemonic_decode(share)
                shares.append(decoded_share)
            except KeyboardInterrupt:
                raise
            except Exception as e:
                print e, "... try again"

        print "Reconstructing key"
        master_bin_seed = ssss_wrapper.ssss_combine_unindexed(shares, expected_fingerprint)
        self.master.from_bin(master_bin_seed)
        self.update_prompt()


    def help_master_from_shares(self):
        print "Reconstruct a master seed from M-of-N mnemonic shares"


    def do_save_master(self, args):
        if not self.master:
            raise Exception("save_master: No master seed is loaded. Load or generate a master seed")

        encrypted_master = seedlib.gpg_encrypt_master(self.master.as_hex())
        print "Storing encrypted master"
        keyfilename = seedlib.master_filename_template % self.master.fingerprint()
        keyfile = open(keyfilename,'w')

        key_json = {
            "fingerprint" : self.master.fingerprint(),
            "pgp" : str(encrypted_master),
        }
        key_text = json.dumps(key_json, sort_keys=True, indent=2)
        keyfile.write(key_text)
        keyfile.close
        print key_text
        print "Data saved to ", keyfilename


    def help_save_master(self):
        print "Save a PGP encrypted master seed to a file"


    def do_stretch_master(self, arg=None):
        if not self.master:
            raise Exception("stretch_master: Load or generate a master seed first")
        passphrase = getpass.getpass("Type passphrase for master key stretching: ")
        passphrase = seedlib.mnemonic.normalize_string(passphrase)
        print "Password stretching, please wait, may take a while"
        self.stretched_master.from_bin(seedlib.stretched_key(self.master.bin_seed(), passphrase))
        print "Stretched key fingerprint: ", self.stretched_master.fingerprint()
        self.update_prompt()


    def help_stretch_master(self):
        print "Generate a stretched key by stretching the master with a passphrase"


    def do_generate_seed(self, args):
        if not self.stretched_master:
            raise Exception("generate_seed: stretch a master seed first")

        # generate seed
        print "Generating customer seed"
        self.seed.from_random()

        print "Customer key fingerprint:", self.seed.fingerprint()

        print "Encrypting customer seed"
        encrypted_customer_seed = seedlib.encrypt(self.seed.bin_seed(), self.stretched_master.bin_seed())

        print "Creating encrypted mnemonic"
        encrypted_mnemonic = seedlib.mnemonic.to_mnemonic(encrypted_customer_seed)
        print encrypted_mnemonic

        print "Decrypting seed"
        decrypted_seed = seedlib.decode_seed(encrypted_mnemonic, self.seed.fingerprint(), self.stretched_master.bin_seed())

        print "Running validation tests"
        assert(decrypted_seed == self.seed.bin_seed())

        print "Validation tests completed successfully"


    def help_generate_seed(self):
        print "Generate a seed from entropy and encrypt it with a stretched master key"


    def do_load_seed(self, filename):
        if not self.master:
            raise Exception("password: Load the master seed first")

        if not filename or not os.path.isfile(filename):
            raise Exception("load_seed requires a filename")

        m = seedlib.regex_seed_filename_fingerprint.search(filename)
        expected_fingerprint = m.groupdict()['fingerprint']

        seed_file = open(filename, 'r')
        seed_data = json.loads(seed_file.read())
        seed_file.close()

        expected_fingerprint = seed_data['fingerprint']
        encrypted_mnemonic = seed_data['encrypted_mnemonic']
        expected_master = seed_data['master']
        expected_stretched_master = seed_data['stretched_master']

        if expected_stretched_master != self.stretched_master.fingerprint():
            raise Exception("load_seed: Seed is encrypted with a different stretched master than the one currently loaded")

        decrypted_seed = seedlib.decode_seed(encrypted_mnemonic, expected_fingerprint, self.stretched_master.bin_seed())
        if not seedlib.fingerprint(decrypted_seed) == expected_fingerprint:
            raise Exception("load_seed: Decrypted seed fingerprint does not match expected fingerprint")
        else:
            print "Loaded seed", expected_fingerprint
            self.seed.from_bin(decrypted_seed)
            self.update_prompt()


    def help_load_seed(self):
        print "Load an encrypted seed from a file and decrypt it with the stretched master key"

    def do_load_seed_mnemonic(self, args):
        if not self.master:
            raise Exception("load_seed_mnemonic: Load the master seed first")
        if not self.stretched_master:
            raise Exception("load_seed_mnemonic: stretch a master seed first")
        mnemonic_size = int(raw_input("How many mnemonic words (12, 18 or 24): "))
        assert mnemonic_size in [12,18,24]
        words = []
        while (len(words) < mnemonic_size):
            need = mnemonic_size - len(words)
            try:
                word_input = str(raw_input("Enter mnemonic word #"+str(len(words)+1)+", entire mnemonic, or Ctrl-C to exit: "))
                for word in word_input.split():
                    if word not in seedlib.mnemonic.wordlist:
                        raise ValueError("word {0} not in mnemonic dictionary".format(word))
                    words.append(word)
            except KeyboardInterrupt:
                raise
            except Exception as e:
                print e, "... try again"
        mnemonic_phrase = str(" ").join(words)
        seed = seedlib.mnemonic_decode(mnemonic_phrase)
        fingerprint = seedlib.fingerprint(seed)
        print "Loaded seed", fingerprint
        self.seed.from_bin(seed)
        self.update_prompt()
        print "You can try the following commands now: seed, show_seed, save_seed"


    def help_load_seed_mnemonic(self):
        print "Load an unencrypted seed from a mnemonic phrase and encrypt it with the stretched master key"

    def do_save_seed(self, args):
        if not self.seed:
            raise Exception("save_seed: No seed to save")

        print "Storing seed"
        keyfilename = seedlib.seed_filename_template % self.seed.fingerprint()
        keyfile = open(keyfilename,'w')

        encrypted_customer_seed = seedlib.encrypt(self.seed.bin_seed(), self.stretched_master.bin_seed())
        encrypted_mnemonic = seedlib.mnemonic.to_mnemonic(encrypted_customer_seed)

        key_json = {
            "fingerprint"           : self.seed.fingerprint(),
            "master"                : self.master.fingerprint(),
            "stretched_master"      : self.stretched_master.fingerprint(),
            "encrypted_mnemonic"    : encrypted_mnemonic,
        }
        key_text = json.dumps(key_json, indent=2)
        keyfile.write(key_text)
        keyfile.close
        print "Data saved to ", keyfilename
        print key_text


    def help_save_seed(self):
        print "Save an encrypted seed to a file"


    def complete_load_seed(self, text, line, begidx, endidx):
        files = glob.glob(seedlib.seed_filename_template % "*")
        if not text:
            return files
        else:
            return [f for f in files if f.startswith(text)]


    def do_show_seed(self, args):
        if not self.seed:
            raise Exception("show seed xpub: Load or generate a seed first")

        master_xpriv = self.seed.as_HD_root()
        master_xpub = bitcoin.bip32_privtopub(master_xpriv)
        encrypted_customer_seed = seedlib.encrypt(self.seed.bin_seed(), self.stretched_master.bin_seed())
        encrypted_mnemonic = seedlib.mnemonic.to_mnemonic(encrypted_customer_seed)

        print "Seed fingerprint     :", self.seed.fingerprint()
        print "Seed mnemonic        :", seedlib.mnemonic.to_mnemonic(self.seed.bin_seed())
        print "Encrypted mnemonic   :", encrypted_mnemonic
        print "Master xpub          :", master_xpub
        print "0H xpub              :", bitcoin.bip32_privtopub(seedlib.bip32_child(master_xpriv, "0H"))
        print "0H/0 xpub            :", bitcoin.bip32_privtopub(seedlib.bip32_child(master_xpriv, "0H/0"))
        print "44H/0H/0H/0/0 xpub   :", bitcoin.bip32_privtopub(seedlib.bip32_child(master_xpriv, "44H/0H/0H/0/0"))

        if args:
            print "{0} xpub              : {1}".format(args,bitcoin.bip32_privtopub(seedlib.bip32_child(master_xpriv, args)))


    def help_show_seed(self):
        print "show_seed [PATH]"
        print "Show seed as unencrypted BIP39 mnemonic and standard path xpubs (including optional PATH xpub)"

    def do_load_recovery(self, filename):
        if not filename or not os.path.isfile(filename):
            raise Exception("load_recovery requires a filename")
        self.recovery_package = recovery.load_recovery(filename)

    def complete_load_recovery(self, text, line, begidx, endidx):
        files = glob.glob("*")
        if not text:
            return files
        else:
            return [f for f in files if f.startswith(text)]


    def do_cosign(self, args):
        if not self.seed:
            raise Exception("cosign: Load or generate a seed first")

        if not self.recovery_package:
            raise Exception("cosign: Load a recovery package first (load_recovery)")

        path = None
        if args and len(args.split()) > 0:
            path = args.split()[0]

        master_xpriv = self.seed.as_HD_root()

        if path:
            path = [2**31 + int(child[:-1]) if child[-1:] in "hp'HP" else int(child) for child in path.split('/')]
            for p in path:
                master_xpriv = bitcoin.bip32_ckd(master_xpriv, p)

        self.recovery_package = recovery.cosign(master_xpriv, self.recovery_package)

    def help_cosign(self):
        print "cosign [KEYPATH]"
        print "Sign a transaction recovery package using the BIP32 KEYPATH private key derived from seed"


    def do_validate(self, args):
        if not self.recovery_package:
            raise Exception("validate: Load a recovery package first (load_recovery)")
        recovery.validate(self.recovery_package)

    def help_validate(self):
        print "validate"
        print "Validate a transaction recovery package"

    def do_normalize(self, args):
        if not self.recovery_package:
            raise Exception("normalize: Load a recovery package first (load_recovery)")
        r = recovery.normalize(self.recovery_package)
        self.recovery_package = r

    def help_normalize(self):
        print "normalize"
        print "Normalize a transaction recovery package"

    def do_save_recovery(self, filename):
        if not self.recovery_package:
            raise Exception("save_recovery: Load a recovery package first (load_recovery)")
        if not filename or os.path.isfile(filename):
            raise Exception("save_recovery requires a filename and that file must not exist")
        recovery.save_recovery(self.recovery_package, filename)

    def help_save_recovery(self):
        print "save_recovery FILENAME"
        print "Save a transaction recovery package to FILENAME, FILENAME must not already exist"
Example #19
0
 def __init__(self):
     Cmd.__init__(self)
     self.master = Seed()
     self.stretched_master = Seed()
     self.seed = Seed()
     self.recovery_package = None
Example #20
0
 def draw_map(self, screen):
     for y in range(len(self.map)):
         for x in range(len(self.map[y])):
             if timedelta(seconds=time.monotonic() -
                          self.map_start).seconds <= 10:
                 self.map[11][15] = 2
             if x == 15 and y == 11 and timedelta(
                     seconds=time.monotonic() -
                     self.map_start).seconds <= 10:
                 pygame.draw.line(screen, (255, 255, 255),
                                  (25 * x, y * 25 + 12),
                                  (25 * x + 25, y * 25 + 12), 5)
             elif self.map[y][x] == 1:
                 pygame.draw.rect(screen, constants.FIELD_COLOR,
                                  (x * 25, y * 25, 25, 25))
             elif self.map[y][x] == 0:
                 tmp = Seed()
                 tmp.draw(screen, (x * 25 + 12, y * 25 + 12))
             elif self.map[y][x] == 3:
                 tmp1 = BigSeed()
                 tmp1.draw(screen, (x * 25 + 12, y * 25 + 12))
     graph = pygame.draw.rect
     graph(screen, constants.BLACK, [155, 55, 465, 15], 0)
     graph(screen, constants.BLACK, [155, 55, 15, 190], 0)
     graph(screen, constants.BLACK, [605, 55, 15, 190], 0)
     graph(screen, constants.BLACK, [380, 55, 15, 90], 0)
     graph(screen, constants.BLACK, [380, 180, 15, 65], 0)
     graph(screen, constants.BLACK, [330, 180, 115, 15], 0)
     graph(screen, constants.BLACK, [155, 580, 465, 15], 0)
     graph(screen, constants.BLACK, [155, 380, 15, 200], 0)
     graph(screen, constants.BLACK, [605, 380, 15, 200], 0)
     graph(screen, constants.BLACK, [380, 380, 15, 65], 0)
     graph(screen, constants.BLACK, [330, 380, 115, 15], 0)
     graph(screen, constants.BLACK, [380, 480, 15, 65], 0)
     graph(screen, constants.BLACK, [330, 480, 115, 15], 0)
     graph(screen, constants.BLACK, [330, 330, 115, 15], 0)
     graph(screen, constants.BLACK, [530, 330, 90, 15], 0)
     graph(screen, constants.BLACK, [155, 330, 90, 15], 0)
     graph(screen, constants.BLACK, [530, 380, 90, 15], 0)
     graph(screen, constants.BLACK, [155, 380, 90, 15], 0)
     graph(screen, constants.BLACK, [530, 280, 90, 15], 0)
     graph(screen, constants.BLACK, [155, 280, 90, 15], 0)
     graph(screen, constants.BLACK, [530, 230, 90, 15], 0)
     graph(screen, constants.BLACK, [155, 230, 90, 15], 0)
     graph(screen, constants.BLACK, [230, 245, 15, 35], 0)
     graph(screen, constants.BLACK, [230, 345, 15, 35], 0)
     graph(screen, constants.BLACK, [530, 230, 15, 65], 0)
     graph(screen, constants.BLACK, [530, 330, 15, 65], 0)
     graph(screen, constants.BLACK, [205, 530, 140, 15], 0)
     graph(screen, constants.BLACK, [430, 530, 140, 15], 0)
     graph(screen, constants.BLACK, [280, 480, 15, 65], 0)
     graph(screen, constants.BLACK, [480, 480, 15, 65], 0)
     graph(screen, constants.BLACK, [280, 430, 65, 15], 0)
     graph(screen, constants.BLACK, [430, 430, 65, 15], 0)
     graph(screen, constants.BLACK, [230, 430, 15, 65], 0)
     graph(screen, constants.BLACK, [530, 430, 15, 65], 0)
     graph(screen, constants.BLACK, [230, 430, -25, 15], 0)
     graph(screen, constants.BLACK, [530, 430, 40, 15], 0)
     graph(screen, constants.BLACK, [170, 480, 25, 15], 0)
     graph(screen, constants.BLACK, [580, 480, 35, 15], 0)
     graph(screen, constants.BLACK, [205, 105, 40, 40], 0)
     graph(screen, constants.BLACK, [205, 180, 40, 15], 0)
     graph(screen, constants.BLACK, [530, 180, 40, 15], 0)
     graph(screen, constants.BLACK, [530, 105, 40, 40], 0)
     graph(screen, constants.BLACK, [280, 105, 65, 40], 0)
     graph(screen, constants.BLACK, [430, 105, 65, 40], 0)
     graph(screen, constants.BLACK, [280, 180, 15, 115], 0)
     graph(screen, constants.BLACK, [480, 180, 15, 115], 0)
     graph(screen, constants.BLACK, [280, 230, 65, 15], 0)
     graph(screen, constants.BLACK, [480, 230, -50, 15], 0)
     graph(screen, constants.BLACK, [280, 330, 15, 65], 0)
     graph(screen, constants.BLACK, [480, 330, 15, 65], 0)
     graph(screen, constants.BLACK, [330, 280, 15, 55], 0)
     graph(screen, constants.BLACK, [430, 280, 15, 55], 0)
     graph(screen, constants.BLACK, [330, 280, 40, 15], 0)
     graph(screen, constants.BLACK, [430, 280, -25, 15], 0)