1919
2020import java .net .URI ;
2121import java .security .InvalidKeyException ;
22+ import java .security .PrivateKey ;
2223import java .util .function .Consumer ;
2324import software .amazon .awssdk .annotations .Immutable ;
2425import software .amazon .awssdk .annotations .SdkPublicApi ;
@@ -140,7 +141,7 @@ public SignedUrl getSignedUrlWithCannedPolicy(CannedSignerRequest request) {
140141 try {
141142 String resourceUrl = request .resourceUrl ();
142143 String cannedPolicy = SigningUtils .buildCannedPolicy (resourceUrl , request .expirationDate ());
143- byte [] signatureBytes = SigningUtils . signWithSha1Rsa (cannedPolicy .getBytes (UTF_8 ), request .privateKey ());
144+ byte [] signatureBytes = signPolicy (cannedPolicy .getBytes (UTF_8 ), request .privateKey ());
144145 String urlSafeSignature = SigningUtils .makeBytesUrlSafe (signatureBytes );
145146 URI uri = URI .create (resourceUrl );
146147 String protocol = uri .getScheme ();
@@ -266,7 +267,7 @@ public SignedUrl getSignedUrlWithCustomPolicy(CustomSignerRequest request) {
266267 request .expirationDate (),
267268 request .ipRange ());
268269
269- byte [] signatureBytes = SigningUtils . signWithSha1Rsa (policy .getBytes (UTF_8 ), request .privateKey ());
270+ byte [] signatureBytes = signPolicy (policy .getBytes (UTF_8 ), request .privateKey ());
270271 String urlSafePolicy = SigningUtils .makeStringUrlSafe (policy );
271272 String urlSafeSignature = SigningUtils .makeBytesUrlSafe (signatureBytes );
272273 URI uri = URI .create (resourceUrl );
@@ -368,7 +369,7 @@ public CookiesForCannedPolicy getCookiesForCannedPolicy(Consumer<CannedSignerReq
368369 public CookiesForCannedPolicy getCookiesForCannedPolicy (CannedSignerRequest request ) {
369370 try {
370371 String cannedPolicy = SigningUtils .buildCannedPolicy (request .resourceUrl (), request .expirationDate ());
371- byte [] signatureBytes = SigningUtils . signWithSha1Rsa (cannedPolicy .getBytes (UTF_8 ), request .privateKey ());
372+ byte [] signatureBytes = signPolicy (cannedPolicy .getBytes (UTF_8 ), request .privateKey ());
372373 String urlSafeSignature = SigningUtils .makeBytesUrlSafe (signatureBytes );
373374 String expiry = String .valueOf (request .expirationDate ().getEpochSecond ());
374375 return DefaultCookiesForCannedPolicy .builder ()
@@ -469,7 +470,7 @@ public CookiesForCustomPolicy getCookiesForCustomPolicy(CustomSignerRequest requ
469470 try {
470471 String policy = SigningUtils .buildCustomPolicy (request .resourceUrl (), request .activeDate (), request .expirationDate (),
471472 request .ipRange ());
472- byte [] signatureBytes = SigningUtils . signWithSha1Rsa (policy .getBytes (UTF_8 ), request .privateKey ());
473+ byte [] signatureBytes = signPolicy (policy .getBytes (UTF_8 ), request .privateKey ());
473474 String urlSafePolicy = SigningUtils .makeStringUrlSafe (policy );
474475 String urlSafeSignature = SigningUtils .makeBytesUrlSafe (signatureBytes );
475476 return DefaultCookiesForCustomPolicy .builder ()
@@ -482,4 +483,20 @@ public CookiesForCustomPolicy getCookiesForCustomPolicy(CustomSignerRequest requ
482483 }
483484 }
484485
486+ private static byte [] signPolicy (byte [] policyToSign , PrivateKey privateKey ) throws InvalidKeyException {
487+ // all CloudFront signed urls currently require the SHA1 and currently only support RSA and EC
488+ switch (privateKey .getAlgorithm ()) {
489+ case "RSA" :
490+ return SigningUtils .signWithSha1Rsa (policyToSign , privateKey );
491+ case "EC" :
492+ case "ECDSA" :
493+ return SigningUtils .signWithSha1ECDSA (policyToSign , privateKey );
494+ default :
495+ // do not attempt to use a generic Signer based on the privateKey algorithm:
496+ // future supported key types likely require different hash algorithms (eg, SHA256 or higher instead of SHA1)
497+ throw new IllegalArgumentException (
498+ "Unsupported key algorithm for CloudFront signed URL: " + privateKey .getAlgorithm ());
499+ }
500+ }
501+
485502}
0 commit comments