def validate_request_signature(<EOL>body: str, headers: MutableMapping, signing_secret: str<EOL>) -> None:
request_timestamp = int(headers["<STR_LIT>"])<EOL>if (int(time.time()) - request_timestamp) > (<NUM_LIT> * <NUM_LIT:5>):<EOL><INDENT>raise exceptions.InvalidTimestamp(timestamp=request_timestamp)<EOL><DEDENT>slack_signature = headers["<STR_LIT>"]<EOL>calculated_signature = (<EOL>"<STR_LIT>"<EOL>+ hmac.new(<EOL>signing_secret.encode("<STR_LIT:utf-8>"),<EOL>f"""<STR_LIT>""".encode("<STR_LIT:utf-8>"),<EOL>digestmod=hashlib.sha256,<EOL>).hexdigest()<EOL>)<EOL>if not hmac.compare_digest(slack_signature, calculated_signature):<EOL><INDENT>raise exceptions.InvalidSlackSignature(slack_signature, calculated_signature)<EOL><DEDENT>
Validate incoming request signature using the application signing secret.

Contrary to the ``team_id`` and ``verification_token`` verification this method is not called by ``slack-sansio`` when creating object from incoming HTTP request. Because the body of the request needs to be provided as text and not decoded as json beforehand.

Args:
    body: Raw request body
    headers: Request headers
    signing_secret: Application signing_secret

Raise:
    :class:`slack.exceptions.InvalidSlackSignature`: when provided and calculated signature do not match
    :class:`slack.exceptions.InvalidTimestamp`: when incoming request timestamp is more than 5 minutes old