| Index: tools/origin_trials/generate_token.py
|
| diff --git a/tools/origin_trials/generate_token.py b/tools/origin_trials/generate_token.py
|
| index 54e61c6448254458b3f3ce28824791bc6defac48..48aa090b18d955cd2ca65ae8c822e564f1238de5 100755
|
| --- a/tools/origin_trials/generate_token.py
|
| +++ b/tools/origin_trials/generate_token.py
|
| @@ -14,8 +14,10 @@ Run "generate_token.py -h" for more help on usage.
|
| """
|
| import argparse
|
| import base64
|
| +import json
|
| import re
|
| import os
|
| +import struct
|
| import sys
|
| import time
|
| import urlparse
|
| @@ -29,6 +31,9 @@ import ed25519
|
| # no longer than 63 ASCII characters)
|
| DNS_LABEL_REGEX = re.compile(r"^(?!-)[a-z\d-]{1,63}(?<!-)$", re.IGNORECASE)
|
|
|
| +# This script generates Version 2 tokens
|
| +VERSION = "\x02"
|
| +
|
| def HostnameFromArg(arg):
|
| """Determines whether a string represents a valid hostname.
|
|
|
| @@ -75,13 +80,19 @@ def ExpiryFromArgs(args):
|
| return (int(time.time()) + (int(args.expire_days) * 86400))
|
|
|
| def GenerateTokenData(origin, api_name, expiry):
|
| - return "{0}|{1}|{2}".format(origin, api_name, expiry)
|
| + return json.dumps({"origin": origin,
|
| + "feature": api_name,
|
| + "expiry": expiry}).encode('utf-8')
|
| +
|
| +def GenerateDataToSign(version, data):
|
| + return version + struct.pack(">I",len(data)) + data
|
|
|
| def Sign(private_key, data):
|
| return ed25519.signature(data, private_key[:32], private_key[32:])
|
|
|
| def FormatToken(version, signature, data):
|
| - return version + "|" + base64.b64encode(signature) + "|" + data
|
| + return base64.b64encode(version + signature +
|
| + struct.pack(">I",len(data)) + data)
|
|
|
| def main():
|
| parser = argparse.ArgumentParser(
|
| @@ -123,11 +134,12 @@ def main():
|
| sys.exit(1)
|
|
|
| token_data = GenerateTokenData(args.origin, args.trial_name, expiry)
|
| - signature = Sign(private_key, token_data)
|
| + data_to_sign = GenerateDataToSign(VERSION, token_data)
|
| + signature = Sign(private_key, data_to_sign)
|
|
|
| # Verify that that the signature is correct before printing it.
|
| try:
|
| - ed25519.checkvalid(signature, token_data, private_key[32:])
|
| + ed25519.checkvalid(signature, data_to_sign, private_key[32:])
|
| except Exception, exc:
|
| print "There was an error generating the signature."
|
| print "(The original error was: %s)" % exc
|
| @@ -135,7 +147,7 @@ def main():
|
|
|
| # Output a properly-formatted token. Version 1 is hard-coded, as it is
|
| # the only defined token version.
|
| - print FormatToken("1", signature, token_data)
|
| + print FormatToken(VERSION, signature, token_data)
|
|
|
| if __name__ == "__main__":
|
| main()
|
|
|