github.com/psiphon-labs/psiphon-tunnel-core@v2.0.28+incompatible/psiphon/upstreamproxy/go-ntlm/ntlm/helpers.go (about) 1 //Copyright 2013 Thomson Reuters Global Resources. BSD License please see License file for more information 2 3 package ntlm 4 5 import ( 6 "bytes" 7 "crypto/rand" 8 "unicode/utf16" 9 "encoding/binary" 10 ) 11 12 // Concatenate two byte slices into a new slice 13 func concat(ar ...[]byte) []byte { 14 return bytes.Join(ar, nil) 15 } 16 17 // Create a 0 initialized slice of bytes 18 func zeroBytes(length int) []byte { 19 return make([]byte, length, length) 20 } 21 22 func randomBytes(length int) []byte { 23 randombytes := make([]byte, length) 24 _, err := rand.Read(randombytes) 25 if err != nil { 26 } // TODO: What to do with err here 27 return randombytes 28 } 29 30 // Zero pad the input byte slice to the given size 31 // bytes - input byte slice 32 // offset - where to start taking the bytes from the input slice 33 // size - size of the output byte slize 34 func zeroPaddedBytes(bytes []byte, offset int, size int) []byte { 35 newSlice := zeroBytes(size) 36 for i := 0; i < size && i+offset < len(bytes); i++ { 37 newSlice[i] = bytes[i+offset] 38 } 39 return newSlice 40 } 41 42 func MacsEqual(slice1, slice2 []byte) bool { 43 if len(slice1) != len(slice2) { 44 return false 45 } 46 for i := 0; i < len(slice1); i++ { 47 // bytes between 4 and 7 (inclusive) contains random 48 // data that should be ignored while comparing the 49 // macs 50 if (i < 4 || i > 7) && slice1[i] != slice2[i] { 51 return false 52 } 53 } 54 return true 55 } 56 57 func utf16FromString(s string) []byte { 58 encoded := utf16.Encode([]rune(s)) 59 // TODO: I'm sure there is an easier way to do the conversion from utf16 to bytes 60 result := zeroBytes(len(encoded) * 2) 61 for i := 0; i < len(encoded); i++ { 62 result[i*2] = byte(encoded[i]) 63 result[i*2+1] = byte(encoded[i] << 8) 64 } 65 return result 66 } 67 68 // Convert a UTF16 string to UTF8 string for Go usage 69 func utf16ToString(bytes []byte) string { 70 var data []uint16 71 72 // NOTE: This is definitely not the best way to do this, but when I tried using a buffer.Read I could not get it to work 73 for offset := 0; offset < len(bytes); offset = offset + 2 { 74 i := binary.LittleEndian.Uint16(bytes[offset : offset+2]) 75 data = append(data, i) 76 } 77 78 return string(utf16.Decode(data)) 79 } 80 81 func uint32ToBytes(v uint32) []byte { 82 bytes := make([]byte, 4) 83 bytes[0] = byte(v & 0xff) 84 bytes[1] = byte((v >> 8) & 0xff) 85 bytes[2] = byte((v >> 16) & 0xff) 86 bytes[3] = byte((v >> 24) & 0xff) 87 return bytes 88 } 89