¿Por qué HMAC SHA-1 devolvería un resumen diferente con la misma entrada?

Estoy tratando de construir una firma encriptada que funcione para el servicio web Amazon S3, escribiendo una biblioteca de conexión usando Objective C.

Me he encontrado con problemas de resumen HMAC SHA-1 con el código ObjC, por lo que lo estoy dejando de lado y mirando el código Perl existente que funciona, para tratar de solucionar problemas de creación de resumen.

Estoy probando la salida de resumen HMAC SHA-1 dels3ls comando de laNet::Amazon::S3 paquete y comparar eso contra el_encode subrutina que saqué y puse en su propio script perl:

#!/usr/bin/perl -w                                                                                                                                                                                    

use MIME::Base64 qw(encode_base64);
use Digest::HMAC_SHA1;
use String::Escape qw( printable unprintable );

sub _ascii_to_hex {
    (my $str = shift) =~ s/(.|\n)/sprintf("%02lx", ord $1)/eg;
    return $str;
}

sub _encode {
    my ( $aws_secret_access_key, $str ) = @_;
    print "secret key hex: "._ascii_to_hex($aws_secret_access_key)."\n";
    my $hmac = Digest::HMAC_SHA1->new($aws_secret_access_key);
    $hmac->add($str);
    my $digest = $hmac->digest;
    print "cleartext hex: "._ascii_to_hex($str)."\n";
    print "digest hex: "._ascii_to_hex($digest)."\n";
    my $b64 = encode_base64( $digest, '' );
    print "encoded: ".$b64."\n";
}

my $secret = "abcd1234";
my $cleartext = "GET\n\n\nFri, 12 Dec 2008 10:08:51 GMT+00:00\n/";
_encode($secret, $cleartext);

Aquí hay un ejemplo de salida de este script:

$ ./testhmac.pl 
secret key hex: 6162636431323334
cleartext hex: 4745540a0a0a4672692c2031322044656320323030382031303a30383a353120474d542b30303a30300a2f
digest hex: 63308f9b8a198440d6d8685a3f3f70d0aab02f68
encoded: YzCPm4oZhEDW2GhaPz9w0KqwL2g=

Lo que estoy probando es que, si ingreso la misma clave secreta y texto claro en el mismo_encode función de laNet::Amazon::S3 paquete, debería ver la misma clave secreta, texto en claro y bytes de resumen.

De hecho, obtengo los mismos bytes para la clave secreta y el texto en claro.

Pero obtengo algo diferente para el resumen (y, por supuesto, la codificación base64), por ejemplo:

$ s3ls --access-key=foobar --secret-key=abcd1234
...
secret key hex: 6162636431323334
cleartext hex: 4745540a0a0a4672692c2031322044656320323030382031303a30383a353120474d542b30303a30300a2f
digest hex: c0da50050c451847de7ed055c5286de584527a22
encoded: wNpQBQxFGEfeftBVxSht5YRSeiI=

He verificado que la clave secreta y el texto claro son la misma entrada para ambos scripts. La subrutina de codificación es prácticamente idéntica en ambos scripts (excepto por un argumento no utilizado pasado a la subrutina, que elimino de mi versión personalizada).

¿Qué causaría que el resumen HMAC, SHA-1 se calculara de manera diferente en ambos casos, si los bytes de entrada y_encode subrutina son lo mismo?

(También he verificado los dos scripts contra los casos de prueba enRFC 2201.)

Respuestas a la pregunta(4)

Su respuesta a la pregunta