The signature, as you realize, includes the http method (e.g. `GET`, `HEAD`) that the request will be using... but the signing process is a one-way process (using an HMAC digest), so the recipient of the signature (S3) has no way of knowing what parameters you used when signing the request -- it only knows that, based on the request you are making, the signature you provided doesn't match it.
The problem here is that you are creating a signature for a `HEAD` request, but curl is still _making_ a `GET` request. You can see this yourself by using `curl -v`.
The solution is to tell curl to actually make a `HEAD` request, and this is done with `curl -I`.