| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- package rfc4757
- import (
- "bytes"
- "encoding/hex"
- "errors"
- "fmt"
- "io"
- "golang.org/x/crypto/md4"
- )
- // StringToKey returns a key derived from the string provided according to the definition in RFC 4757.
- func StringToKey(secret string) ([]byte, error) {
- b := make([]byte, len(secret)*2, len(secret)*2)
- for i, r := range secret {
- u := fmt.Sprintf("%04x", r)
- c, err := hex.DecodeString(u)
- if err != nil {
- return []byte{}, errors.New("character could not be encoded")
- }
- // Swap round the two bytes to make little endian as we put into byte slice
- b[2*i] = c[1]
- b[2*i+1] = c[0]
- }
- r := bytes.NewReader(b)
- h := md4.New()
- _, err := io.Copy(h, r)
- if err != nil {
- return []byte{}, err
- }
- return h.Sum(nil), nil
- }
- func deriveKeys(key, checksum []byte, usage uint32, export bool) (k1, k2, k3 []byte) {
- //if export {
- // L40 := make([]byte, 14, 14)
- // copy(L40, []byte(`fortybits`))
- // k1 = HMAC(key, L40)
- //} else {
- // tb := MessageTypeBytes(usage)
- // k1 = HMAC(key, tb)
- //}
- //k2 = k1[:16]
- //if export {
- // mask := []byte{0xAB,0xAB,0xAB,0xAB,0xAB,0xAB,0xAB,0xAB,0xAB}
- // copy(k1[7:16], mask)
- //}
- //k3 = HMAC(k1, checksum)
- //return
- k1 = key
- k2 = HMAC(k1, UsageToMSMsgType(usage))
- k3 = HMAC(k2, checksum)
- return
- }
|