]> git.rkrishnan.org Git - tahoe-lafs/tahoe-lafs.git/blobdiff - src/allmydata/scripts/admin.py
bin/tahoe: clean up global-vs-subcommand arguments like --node-directory
[tahoe-lafs/tahoe-lafs.git] / src / allmydata / scripts / admin.py
index 119f8601e1f69154a073629a295aa02b4b13f3ac..1a6c9854f93ed32161d95b1ee7db47c618d7bc95 100644 (file)
@@ -1,32 +1,57 @@
 
 from twisted.python import usage
+from allmydata.scripts.common import BaseOptions
 
-class GenerateKeypairOptions(usage.Options):
+class GenerateKeypairOptions(BaseOptions):
     def getSynopsis(self):
         return "Usage: tahoe admin generate-keypair"
 
     def getUsage(self, width=None):
-        t = usage.Options.getUsage(self, width)
+        t = BaseOptions.getUsage(self, width)
         t += """
-Generate an ECDSA192 public/private keypair, dumped to stdout as two lines of
-base32-encoded text.
+Generate a public/private keypair, dumped to stdout as two lines of ASCII..
 
 """
         return t
 
-def generate_keypair(options):
-    from pycryptopp.publickey import ecdsa
-    from allmydata.util import base32
+def print_keypair(options):
+    from allmydata.util.keyutil import make_keypair
     out = options.stdout
-    privkey = ecdsa.generate(192)
-    print >>out, "private: priv-v0-%s" % base32.b2a(privkey.serialize())
-    pubkey = privkey.get_verifying_key()
-    print >>out, "public: pub-v0-%s" % base32.b2a(pubkey.serialize())
+    privkey_vs, pubkey_vs = make_keypair()
+    print >>out, "private:", privkey_vs
+    print >>out, "public:", pubkey_vs
 
-class AdminCommand(usage.Options):
+class DerivePubkeyOptions(BaseOptions):
+    def parseArgs(self, privkey):
+        self.privkey = privkey
+
+    def getSynopsis(self):
+        return "Usage: tahoe admin derive-pubkey PRIVKEY"
+
+    def getUsage(self, width=None):
+        t = BaseOptions.getUsage(self, width)
+        t += """
+Given a private (signing) key that was previously generated with
+generate-keypair, derive the public key and print it to stdout.
+
+"""
+        return t
+
+def derive_pubkey(options):
+    out = options.stdout
+    from allmydata.util import keyutil
+    privkey_vs = options.privkey
+    sk, pubkey_vs = keyutil.parse_privkey(privkey_vs)
+    print >>out, "private:", privkey_vs
+    print >>out, "public:", pubkey_vs
+    return 0
+
+class AdminCommand(BaseOptions):
     subCommands = [
-        ["generate-keypair", None, GenerateKeypairOptions,
-         "Generate a public/private keypair, write to stdout."],
+        ("generate-keypair", None, GenerateKeypairOptions,
+         "Generate a public/private keypair, write to stdout."),
+        ("derive-pubkey", None, DerivePubkeyOptions,
+         "Derive a public key from a private key."),
         ]
     def postOptions(self):
         if not hasattr(self, 'subOptions'):
@@ -34,19 +59,16 @@ class AdminCommand(usage.Options):
     def getSynopsis(self):
         return "Usage: tahoe admin SUBCOMMAND"
     def getUsage(self, width=None):
-        #t = usage.Options.getUsage(self, width)
-        t = """
-Subcommands:
-    tahoe admin generate-keypair    Generate a public/private keypair,
-                                    write to stdout.
-
+        t = BaseOptions.getUsage(self, width)
+        t += """
 Please run e.g. 'tahoe admin generate-keypair --help' for more details on
 each subcommand.
 """
         return t
 
 subDispatch = {
-    "generate-keypair": generate_keypair,
+    "generate-keypair": print_keypair,
+    "derive-pubkey": derive_pubkey,
     }
 
 def do_admin(options):