@@ -391,10 +391,12 @@ def _generate_signed_url_helper(
391391 query_parameters = None ,
392392 credentials = None ,
393393 expiration = None ,
394+ encryption_key = None ,
394395 ):
395396 from six .moves .urllib import parse
396397 from google .cloud ._helpers import UTC
397398 from google .cloud .storage .blob import _API_ACCESS_ENDPOINT
399+ from google .cloud .storage .blob import _get_encryption_headers
398400
399401 api_access_endpoint = api_access_endpoint or _API_ACCESS_ENDPOINT
400402
@@ -406,7 +408,7 @@ def _generate_signed_url_helper(
406408 connection = _Connection ()
407409 client = _Client (connection )
408410 bucket = _Bucket (client )
409- blob = self ._make_one (blob_name , bucket = bucket )
411+ blob = self ._make_one (blob_name , bucket = bucket , encryption_key = encryption_key )
410412
411413 if version is None :
412414 effective_version = "v2"
@@ -442,6 +444,15 @@ def _generate_signed_url_helper(
442444
443445 encoded_name = blob_name .encode ("utf-8" )
444446 expected_resource = "/name/{}" .format (parse .quote (encoded_name , safe = b"/~" ))
447+ if encryption_key is not None :
448+ expected_headers = headers or {}
449+ if effective_version == "v2" :
450+ expected_headers ["X-Goog-Encryption-Algorithm" ] = "AES256"
451+ else :
452+ expected_headers .update (_get_encryption_headers (encryption_key ))
453+ else :
454+ expected_headers = headers
455+
445456 expected_kwargs = {
446457 "resource" : expected_resource ,
447458 "expiration" : expiration ,
@@ -452,7 +463,7 @@ def _generate_signed_url_helper(
452463 "response_type" : response_type ,
453464 "response_disposition" : response_disposition ,
454465 "generation" : generation ,
455- "headers" : headers ,
466+ "headers" : expected_headers ,
456467 "query_parameters" : query_parameters ,
457468 }
458469 signer .assert_called_once_with (expected_creds , ** expected_kwargs )
@@ -514,6 +525,14 @@ def test_generate_signed_url_v2_w_generation(self):
514525 def test_generate_signed_url_v2_w_headers (self ):
515526 self ._generate_signed_url_v2_helper (headers = {"x-goog-foo" : "bar" })
516527
528+ def test_generate_signed_url_v2_w_csek (self ):
529+ self ._generate_signed_url_v2_helper (encryption_key = os .urandom (32 ))
530+
531+ def test_generate_signed_url_v2_w_csek_and_headers (self ):
532+ self ._generate_signed_url_v2_helper (
533+ encryption_key = os .urandom (32 ), headers = {"x-goog-foo" : "bar" }
534+ )
535+
517536 def test_generate_signed_url_v2_w_credentials (self ):
518537 credentials = object ()
519538 self ._generate_signed_url_v2_helper (credentials = credentials )
@@ -566,6 +585,14 @@ def test_generate_signed_url_v4_w_generation(self):
566585 def test_generate_signed_url_v4_w_headers (self ):
567586 self ._generate_signed_url_v4_helper (headers = {"x-goog-foo" : "bar" })
568587
588+ def test_generate_signed_url_v4_w_csek (self ):
589+ self ._generate_signed_url_v4_helper (encryption_key = os .urandom (32 ))
590+
591+ def test_generate_signed_url_v4_w_csek_and_headers (self ):
592+ self ._generate_signed_url_v4_helper (
593+ encryption_key = os .urandom (32 ), headers = {"x-goog-foo" : "bar" }
594+ )
595+
569596 def test_generate_signed_url_v4_w_credentials (self ):
570597 credentials = object ()
571598 self ._generate_signed_url_v4_helper (credentials = credentials )
0 commit comments