1+ #!/usr/bin/env python
2+ import json
3+ import sys
4+
5+ __author__ = 'rohe0002'
6+
7+ import argparse
8+ import requests
9+ from jwkest .jwk import RSAKey , keyrep , load_jwks
10+ from jwkest .jwk import import_rsa_key_from_file
11+ from jwkest .jwk import SYMKey
12+ from jwkest .jws import JWS
13+
14+ def assign (lst ):
15+ keys = {}
16+ for typ , key in lst :
17+ try :
18+ keys [typ ].append (key )
19+ except KeyError :
20+ keys [typ ] = [key ]
21+ return keys
22+
23+
24+ def lrequest (url , method = "GET" , ** kwargs ):
25+ return requests .request (method , url , ** kwargs )
26+
27+
28+ def sign (msg , key , alg ):
29+ _jws = JWS (msg , alg = alg )
30+ return _jws .sign_compact (key )
31+
32+
33+ def verify (msg , keys ):
34+ _jws = JWS ()
35+ return _jws .verify_compact (msg , keys )
36+
37+
38+ if __name__ == "__main__" :
39+ parser = argparse .ArgumentParser ()
40+ parser .add_argument ('-s' , dest = "sign" , action = 'store_true' )
41+ parser .add_argument ('-v' , dest = "verify" , action = 'store_true' )
42+ parser .add_argument ('-f' , dest = "msg_file" ,
43+ help = "File containing a message" )
44+ parser .add_argument ('-r' , dest = "rsa_file" ,
45+ help = "File containing a RSA key" )
46+ parser .add_argument ('-k' , dest = "hmac_key" ,
47+ help = "If using a HMAC algorithm this is the key" )
48+ parser .add_argument ('-a' , dest = "alg" ,
49+ help = "The signing algorithm" )
50+ parser .add_argument ('-j' , dest = "jwk" , help = "JSON Web Key" )
51+ parser .add_argument ('-J' , dest = "jwks" , help = "JSON Web Keys" )
52+ parser .add_argument ("message" , nargs = "?" , help = "The message" )
53+
54+
55+ args = parser .parse_args ()
56+
57+ keys = []
58+ if args .rsa_file :
59+ keys = [RSAKey (key = import_rsa_key_from_file (args .rsa_file ))]
60+ elif args .hmac_key :
61+ keys = [SYMKey (key = args .hmac_key )]
62+
63+ if args .jwk :
64+ kspec = json .loads (open (args .jwk ).read ())
65+ keys .append (keyrep (kspec ))
66+
67+ if args .jwks :
68+ keys .extend (load_jwks (open (args .jwk ).read ()))
69+
70+ if not keys :
71+ exit (- 1 )
72+
73+ if args .msg_file :
74+ if args .msg_file == "A.2.1" :
75+ message = open ("A.2.1" ).read ().replace ("\n " ,"\r \n " )
76+ else :
77+ message = open (args .msg_file ).read ().strip ("\n " )
78+ elif args .message == "-" :
79+ message = sys .stdin .read ()
80+ else :
81+ message = args .message
82+
83+ if args .sign :
84+ print sign (message , keys , args .alg )
85+ elif args .verify :
86+ print verify (message , keys )
87+
88+
89+ # Given that idptest contains a RSA private key PEM encoded
90+ # ./jwkutil.py -s -r idptest -a RS256 -f ../setup.py > sig
91+ # ./jwkutil.py -v -r idptest -f sig
0 commit comments