/gdata/oauth/rsa.py

http://radioappz.googlecode.com/ · Python · 120 lines · 73 code · 23 blank · 24 comment · 0 complexity · ec250fe0ff43befc6344e3610402626a MD5 · raw file

  1. #!/usr/bin/python
  2. """
  3. requires tlslite - http://trevp.net/tlslite/
  4. """
  5. import binascii
  6. from gdata.tlslite.utils import keyfactory
  7. from gdata.tlslite.utils import cryptomath
  8. # XXX andy: ugly local import due to module name, oauth.oauth
  9. import gdata.oauth as oauth
  10. class OAuthSignatureMethod_RSA_SHA1(oauth.OAuthSignatureMethod):
  11. def get_name(self):
  12. return "RSA-SHA1"
  13. def _fetch_public_cert(self, oauth_request):
  14. # not implemented yet, ideas are:
  15. # (1) do a lookup in a table of trusted certs keyed off of consumer
  16. # (2) fetch via http using a url provided by the requester
  17. # (3) some sort of specific discovery code based on request
  18. #
  19. # either way should return a string representation of the certificate
  20. raise NotImplementedError
  21. def _fetch_private_cert(self, oauth_request):
  22. # not implemented yet, ideas are:
  23. # (1) do a lookup in a table of trusted certs keyed off of consumer
  24. #
  25. # either way should return a string representation of the certificate
  26. raise NotImplementedError
  27. def build_signature_base_string(self, oauth_request, consumer, token):
  28. sig = (
  29. oauth.escape(oauth_request.get_normalized_http_method()),
  30. oauth.escape(oauth_request.get_normalized_http_url()),
  31. oauth.escape(oauth_request.get_normalized_parameters()),
  32. )
  33. key = ''
  34. raw = '&'.join(sig)
  35. return key, raw
  36. def build_signature(self, oauth_request, consumer, token):
  37. key, base_string = self.build_signature_base_string(oauth_request,
  38. consumer,
  39. token)
  40. # Fetch the private key cert based on the request
  41. cert = self._fetch_private_cert(oauth_request)
  42. # Pull the private key from the certificate
  43. privatekey = keyfactory.parsePrivateKey(cert)
  44. # Convert base_string to bytes
  45. #base_string_bytes = cryptomath.createByteArraySequence(base_string)
  46. # Sign using the key
  47. signed = privatekey.hashAndSign(base_string)
  48. return binascii.b2a_base64(signed)[:-1]
  49. def check_signature(self, oauth_request, consumer, token, signature):
  50. decoded_sig = base64.b64decode(signature);
  51. key, base_string = self.build_signature_base_string(oauth_request,
  52. consumer,
  53. token)
  54. # Fetch the public key cert based on the request
  55. cert = self._fetch_public_cert(oauth_request)
  56. # Pull the public key from the certificate
  57. publickey = keyfactory.parsePEMKey(cert, public=True)
  58. # Check the signature
  59. ok = publickey.hashAndVerify(decoded_sig, base_string)
  60. return ok
  61. class TestOAuthSignatureMethod_RSA_SHA1(OAuthSignatureMethod_RSA_SHA1):
  62. def _fetch_public_cert(self, oauth_request):
  63. cert = """
  64. -----BEGIN CERTIFICATE-----
  65. MIIBpjCCAQ+gAwIBAgIBATANBgkqhkiG9w0BAQUFADAZMRcwFQYDVQQDDA5UZXN0
  66. IFByaW5jaXBhbDAeFw03MDAxMDEwODAwMDBaFw0zODEyMzEwODAwMDBaMBkxFzAV
  67. BgNVBAMMDlRlc3QgUHJpbmNpcGFsMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB
  68. gQC0YjCwIfYoprq/FQO6lb3asXrxLlJFuCvtinTF5p0GxvQGu5O3gYytUvtC2JlY
  69. zypSRjVxwxrsuRcP3e641SdASwfrmzyvIgP08N4S0IFzEURkV1wp/IpH7kH41Etb
  70. mUmrXSwfNZsnQRE5SYSOhh+LcK2wyQkdgcMv11l4KoBkcwIDAQABMA0GCSqGSIb3
  71. DQEBBQUAA4GBAGZLPEuJ5SiJ2ryq+CmEGOXfvlTtEL2nuGtr9PewxkgnOjZpUy+d
  72. 4TvuXJbNQc8f4AMWL/tO9w0Fk80rWKp9ea8/df4qMq5qlFWlx6yOLQxumNOmECKb
  73. WpkUQDIDJEoFUzKMVuJf4KO/FJ345+BNLGgbJ6WujreoM1X/gYfdnJ/J
  74. -----END CERTIFICATE-----
  75. """
  76. return cert
  77. def _fetch_private_cert(self, oauth_request):
  78. cert = """
  79. -----BEGIN PRIVATE KEY-----
  80. MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALRiMLAh9iimur8V
  81. A7qVvdqxevEuUkW4K+2KdMXmnQbG9Aa7k7eBjK1S+0LYmVjPKlJGNXHDGuy5Fw/d
  82. 7rjVJ0BLB+ubPK8iA/Tw3hLQgXMRRGRXXCn8ikfuQfjUS1uZSatdLB81mydBETlJ
  83. hI6GH4twrbDJCR2Bwy/XWXgqgGRzAgMBAAECgYBYWVtleUzavkbrPjy0T5FMou8H
  84. X9u2AC2ry8vD/l7cqedtwMPp9k7TubgNFo+NGvKsl2ynyprOZR1xjQ7WgrgVB+mm
  85. uScOM/5HVceFuGRDhYTCObE+y1kxRloNYXnx3ei1zbeYLPCHdhxRYW7T0qcynNmw
  86. rn05/KO2RLjgQNalsQJBANeA3Q4Nugqy4QBUCEC09SqylT2K9FrrItqL2QKc9v0Z
  87. zO2uwllCbg0dwpVuYPYXYvikNHHg+aCWF+VXsb9rpPsCQQDWR9TT4ORdzoj+Nccn
  88. qkMsDmzt0EfNaAOwHOmVJ2RVBspPcxt5iN4HI7HNeG6U5YsFBb+/GZbgfBT3kpNG
  89. WPTpAkBI+gFhjfJvRw38n3g/+UeAkwMI2TJQS4n8+hid0uus3/zOjDySH3XHCUno
  90. cn1xOJAyZODBo47E+67R4jV1/gzbAkEAklJaspRPXP877NssM5nAZMU0/O/NGCZ+
  91. 3jPgDUno6WbJn5cqm8MqWhW1xGkImgRk+fkDBquiq4gPiT898jusgQJAd5Zrr6Q8
  92. AO/0isr/3aa6O6NLQxISLKcPDk2NOccAfS/xOtfOz4sJYM3+Bs4Io9+dZGSDCA54
  93. Lw03eHTNQghS0A==
  94. -----END PRIVATE KEY-----
  95. """
  96. return cert