Skip to content

Commit ae7e4f3

Browse files
adityanatrajtheacodes
authored andcommitted
Follow rfc 7515 and strip padding from JWS segments (#324)
* strip off illegal padding * oops: remove unused import base64
1 parent b4eee9c commit ae7e4f3

File tree

3 files changed

+38
-4
lines changed

3 files changed

+38
-4
lines changed

google/auth/_helpers.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,3 +215,20 @@ def padded_urlsafe_b64decode(value):
215215
b64string = to_bytes(value)
216216
padded = b64string + b'=' * (-len(b64string) % 4)
217217
return base64.urlsafe_b64decode(padded)
218+
219+
220+
def unpadded_urlsafe_b64encode(value):
221+
"""Encodes base64 strings removing any padding characters.
222+
223+
`rfc 7515`_ defines Base64url to NOT include any padding
224+
characters, but the stdlib doesn't do that by default.
225+
226+
_rfc7515: https://tools.ietf.org/html/rfc7515#page-6
227+
228+
Args:
229+
value (Union[str|bytes]): The bytes-like value to encode
230+
231+
Returns:
232+
Union[str|bytes]: The encoded value
233+
"""
234+
return base64.urlsafe_b64encode(value).rstrip(b'=')

google/auth/jwt.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040
4141
"""
4242

43-
import base64
4443
import collections
4544
import copy
4645
import datetime
@@ -86,13 +85,19 @@ def encode(signer, payload, header=None, key_id=None):
8685
header['kid'] = key_id
8786

8887
segments = [
89-
base64.urlsafe_b64encode(json.dumps(header).encode('utf-8')),
90-
base64.urlsafe_b64encode(json.dumps(payload).encode('utf-8')),
88+
_helpers.unpadded_urlsafe_b64encode(
89+
json.dumps(header).encode('utf-8')
90+
),
91+
_helpers.unpadded_urlsafe_b64encode(
92+
json.dumps(payload).encode('utf-8')
93+
),
9194
]
9295

9396
signing_input = b'.'.join(segments)
9497
signature = signer.sign(signing_input)
95-
segments.append(base64.urlsafe_b64encode(signature))
98+
segments.append(
99+
_helpers.unpadded_urlsafe_b64encode(signature)
100+
)
96101

97102
return b'.'.join(segments)
98103

tests/test__helpers.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,3 +167,15 @@ def test_padded_urlsafe_b64decode():
167167

168168
for case, expected in cases:
169169
assert _helpers.padded_urlsafe_b64decode(case) == expected
170+
171+
172+
def test_unpadded_urlsafe_b64encode():
173+
cases = [
174+
(b'', b''),
175+
(b'a', b'YQ'),
176+
(b'aa', b'YWE'),
177+
(b'aaa', b'YWFh'),
178+
]
179+
180+
for case, expected in cases:
181+
assert _helpers.unpadded_urlsafe_b64encode(case) == expected

0 commit comments

Comments
 (0)