code: def _create_signing_params(self, url, keypair_id,
                            expire_time=None, valid_after_time=None,
                            ip_address=None, policy_url=None,
                            private_key_file=None, private_key_string=None):
          
          params = {}
          # Check if we can use a canned policy
          if expire_time and not valid_after_time and not ip_address and not policy_url:
              # we manually construct this policy string to ensure formatting
              # matches signature
              policy = self._canned_policy(url, expire_time)
              params["Expires"] = str(expire_time)
          else:
              # If no policy_url is specified, default to the full url.
              if policy_url is None:
                  policy_url = url
              # Can't use canned policy
              policy = self._custom_policy(policy_url, expires=expire_time,
                                           valid_after=valid_after_time,
                                           ip_address=ip_address)
  
              encoded_policy = self._url_base64_encode(policy)
              params["Policy"] = encoded_policy
          #sign the policy
          signature = self._sign_string(policy, private_key_file, private_key_string)
          #now base64 encode the signature (URL safe as well)
          encoded_signature = self._url_base64_encode(signature)
          params["Signature"] = encoded_signature
          params["Key-Pair-Id"] = keypair_id
          return params
docs: Creates the required URL parameters for a signed URL.