Add PEM support.

Reviewed in https://codereview.appspot.com/7030054/.
diff --git a/tests/test_oauth2client_jwt.py b/tests/test_oauth2client_jwt.py
index 11162be..960a55a 100644
--- a/tests/test_oauth2client_jwt.py
+++ b/tests/test_oauth2client_jwt.py
@@ -53,15 +53,19 @@
 
 
 class CryptTests(unittest.TestCase):
+  def setUp(self):
+    self.format = 'p12'
+    self.signer = crypt.OpenSSLSigner
+    self.verifier = crypt.OpenSSLVerifier
 
   def test_sign_and_verify(self):
-    private_key = datafile('privatekey.p12')
+    private_key = datafile('privatekey.%s' % self.format)
     public_key = datafile('publickey.pem')
 
-    signer = crypt.Signer.from_string(private_key)
+    signer = self.signer.from_string(private_key)
     signature = signer.sign('foo')
 
-    verifier = crypt.Verifier.from_string(public_key, True)
+    verifier = self.verifier.from_string(public_key, True)
 
     self.assertTrue(verifier.verify('foo', signature))
 
@@ -82,8 +86,8 @@
           self.assertTrue(expected_error in msg)
 
   def _create_signed_jwt(self):
-    private_key = datafile('privatekey.p12')
-    signer = crypt.Signer.from_string(private_key)
+    private_key = datafile('privatekey.%s' % self.format)
+    signer = self.signer.from_string(private_key)
     audience = 'some_audience_address@testing.gserviceaccount.com'
     now = long(time.time())
 
@@ -129,7 +133,7 @@
         'some_audience_address@testing.gserviceaccount.com', http=http)
 
   def test_verify_id_token_bad_tokens(self):
-    private_key = datafile('privatekey.p12')
+    private_key = datafile('privatekey.%s' % self.format)
 
     # Wrong number of segments
     self._check_jwt_failure('foo', 'Wrong number of segments')
@@ -143,7 +147,7 @@
     self._check_jwt_failure(jwt, 'Invalid token signature')
 
     # No expiration
-    signer = crypt.Signer.from_string(private_key)
+    signer = self.signer.from_string(private_key)
     audience = 'https:#www.googleapis.com/auth/id?client_id=' + \
         'external_public_key@testing.gserviceaccount.com'
     jwt = crypt.make_signed_jwt(signer, {
@@ -186,10 +190,27 @@
     self._check_jwt_failure(jwt, 'Wrong recipient')
 
 
+class PEMCryptTestsPyCrypto(CryptTests):
+  def setUp(self):
+    self.format = 'pem'
+    self.signer = crypt.PyCryptoSigner
+    self.verifier = crypt.OpenSSLVerifier
+
+
+class PEMCryptTestsOpenSSL(CryptTests):
+  def setUp(self):
+    self.format = 'pem'
+    self.signer = crypt.OpenSSLSigner
+    self.verifier = crypt.OpenSSLVerifier
+
+
 class SignedJwtAssertionCredentialsTests(unittest.TestCase):
+  def setUp(self):
+    self.format = 'p12'
+    crypt.Signer = crypt.OpenSSLSigner
 
   def test_credentials_good(self):
-    private_key = datafile('privatekey.p12')
+    private_key = datafile('privatekey.%s' % self.format)
     credentials = SignedJwtAssertionCredentials(
         'some_account@example.com',
         private_key,
@@ -204,7 +225,7 @@
     self.assertEqual('Bearer 1/3w', content['Authorization'])
 
   def test_credentials_to_from_json(self):
-    private_key = datafile('privatekey.p12')
+    private_key = datafile('privatekey.%s' % self.format)
     credentials = SignedJwtAssertionCredentials(
         'some_account@example.com',
         private_key,
@@ -229,7 +250,7 @@
     return content
 
   def test_credentials_refresh_without_storage(self):
-    private_key = datafile('privatekey.p12')
+    private_key = datafile('privatekey.%s' % self.format)
     credentials = SignedJwtAssertionCredentials(
         'some_account@example.com',
         private_key,
@@ -241,7 +262,7 @@
     self.assertEqual('Bearer 3/3w', content['Authorization'])
 
   def test_credentials_refresh_with_storage(self):
-    private_key = datafile('privatekey.p12')
+    private_key = datafile('privatekey.%s' % self.format)
     credentials = SignedJwtAssertionCredentials(
         'some_account@example.com',
         private_key,
@@ -260,5 +281,35 @@
     os.unlink(filename)
 
 
+class PEMSignedJwtAssertionCredentialsOpenSSLTests(
+    SignedJwtAssertionCredentialsTests):
+  def setUp(self):
+    self.format = 'pem'
+    crypt.Signer = crypt.OpenSSLSigner
+
+
+class PEMSignedJwtAssertionCredentialsPyCryptoTests(
+    SignedJwtAssertionCredentialsTests):
+  def setUp(self):
+    self.format = 'pem'
+    crypt.Signer = crypt.PyCryptoSigner
+
+
+class PKCSSignedJwtAssertionCredentialsPyCryptoTests(unittest.TestCase):
+  def test_for_failure(self):
+    crypt.Signer = crypt.PyCryptoSigner
+    private_key = datafile('privatekey.p12')
+    credentials = SignedJwtAssertionCredentials(
+        'some_account@example.com',
+        private_key,
+        scope='read+write',
+        prn='joe@example.org')
+    try:
+      credentials._generate_assertion()
+      self.fail()
+    except NotImplementedError:
+      pass
+
+
 if __name__ == '__main__':
   unittest.main()