i think this is right but i am not sure
Everything works now.  The problem was...

Forgetting to `clamp()` the input, which was feeding random data into the HMAC scheme.  The signed/unsigned problems I think were a red herring.  It might useful to go back those guys out.