Personally I don't think so. It's a very niche use case AFAICS and I can't find an implementation in any other language that allows you to calculate the hash of an arbitrary number of bits. But this is just my point of view - anyone is free to raise an issue if they like.
On Tue, 16 Apr 2019, 20:34 Skip Tavakkolian, <skip.tavakkol...@gmail.com> wrote: > should this be entered into issue tracker? > > > On Mon, Apr 15, 2019 at 11:38 PM roger peppe <rogpe...@gmail.com> wrote: > >> Yes, you're right. As I said, my solution won't work if you need to >> interoperate with other implementations. >> >> It's interesting that the SHA256 standard is defined to work on an number >> of bits though. I wasn't aware of that. >> >> I had a look around and I didn't find any other language's SHA256 >> implementation that allows input which isn't a multiple of 8 bits. Are you >> aware of one? Which implementation are you needing to interoperate with >> that does allow this? >> >> ISTM that if you do require this, it wouldn't be too hard to copy the >> existing implementation and change the digest.checkSum method so that it >> could pad from an arbitrary number of bits. >> >> cheers, >> rog. >> >> >> On Mon, 15 Apr 2019 at 20:52, Paolo C. <paoca...@gmail.com> wrote: >> >>> Thanks Rog for the answer. >>> But that won't work. >>> SHA-256 is a standard (FIPS180-4) and if one uses it, is for >>> interoperate in most cases. >>> It may happen that you need only to hash 8bit bounded streams, but it >>> also may not be the case. So, any implementation should be careful of being >>> correct. >>> You example is flawed for the reason the if you WRAP the original >>> algorithm, it will anyway 'Finalize' your input padding it again (look at >>> the Sha256 code), so, the checksum that you will obtain will not match with >>> the one of some who has correctly implemented the standard. >>> On the other hand, if your example worked, it would mean that for each >>> 'odd bitted' stream (i.e. 12 bits) there is a sequence that can be >>> deterministically calculated adding a couple of bytes that has the same >>> sha256. This would the demonstration that sha256 is broken. >>> To obtain a correct implementation you should grab the sha256.go code >>> and bring into your own package correcting the limitation, but this has the >>> problem of the usage of some internal packages, which in turn complicates >>> everything. And also change the interface hash.Hash to let it be usable in >>> hmac, for example. >>> Anyway, don't let me be misunderstood, I can live with it, simply I >>> trusted the package declaration >>> >>> // Package sha256 implements the SHA224 and SHA256 hash algorithms as >>> defined >>> >>> // in FIPS 180-4. >>> >>> that revealed partially true. Technically speaking it's not a BUG, because >>> since I can NOT input spare bits, I will never obtain wrong results. But >>> for sure it's not a full and correct implementation. >>> >>> Paolo >>> >>> On Monday, April 15, 2019 at 11:48:23 AM UTC+2, rog wrote: >>>> >>>> The answer depends on what why you want to do this. If you don't need >>>> to interoperate with some other party that needs to arrive at the same >>>> checksum, you could write your own wrapper around sha256 that adds the >>>> necessary information to specify how many bits are significant. Something >>>> like this, perhaps: >>>> >>>> // hashBits returns a hash of the first nbits bits of b, >>>> // starting at the most significant bit of the first >>>> // byte of b. >>>> // >>>> // So hashBits([]byte{0x5a, 0xbc, 0xde}, 12) would >>>> // hash 0x5ab, ignoring the final 0xcde. >>>> // >>>> // It works by hashing an extra 2 bytes that encode >>>> // the final bits and how many there are. >>>> // >>>> // hashBits will panic if nbits is greater than len(b) * 8. >>>> func hashBits(b []byte, nbits int) [sha256.Size]byte { >>>> oddBits := nbits & 7 >>>> blen := nbits >> 3 >>>> b1 := make([]byte, blen+2) >>>> copy(b1, b[0:blen]) >>>> if oddBits > 0 { >>>> b1[blen] = b[blen] & ^(0xff >> uint(oddBits)) >>>> b1[blen+1] = byte(oddBits) >>>> } >>>> return sha256.Sum256(b1) >>>> } >>>> >>>> Note that the code above is almost untested, and there are probably >>>> more standard ways to do it - that was just the first thing that came into >>>> my head. >>>> >>>> cheers, >>>> rog. >>>> >>>> On Sun, 14 Apr 2019 at 22:02, Paolo C. <paoc...@gmail.com> wrote: >>>> >>>>> SHA256 (SHA in general) has a precise behavior if you wanna hash a >>>>> number of bits not multiple of the block (512bit) >>>>> Sha256.go handle this correcty ONLY in the case that you input is at >>>>> least multiple of 8 bits. >>>>> If you wanna hash, say, 20bit (0xABCDE) you cannot obtain a correct >>>>> result. >>>>> Note that Sha256(0xABCDE) is (See FIPS and NIST publications) not the >>>>> same of Sha256 of 0x0ABCDE o 0xABCDE0. >>>>> Any idea or any implementation available on the web? >>>>> A .Write(data []byte, effectciveLenInBits int) would be required, >>>>> while today Write([]byte) assumes that each bit of the last byte is >>>>> meaningful and to be hashed >>>>> >>>>> Thanks, >>>>> >>>>> Paolo >>>>> >>>>> -- >>>>> You received this message because you are subscribed to the Google >>>>> Groups "golang-nuts" group. >>>>> To unsubscribe from this group and stop receiving emails from it, send >>>>> an email to golan...@googlegroups.com. >>>>> For more options, visit https://groups.google.com/d/optout. >>>>> >>>> -- >>> You received this message because you are subscribed to the Google >>> Groups "golang-nuts" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to golang-nuts+unsubscr...@googlegroups.com. >>> For more options, visit https://groups.google.com/d/optout. >>> >> -- >> You received this message because you are subscribed to the Google Groups >> "golang-nuts" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to golang-nuts+unsubscr...@googlegroups.com. >> For more options, visit https://groups.google.com/d/optout. >> > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.