/usr/share/gocode/src/github.com/twstrike/otr3/version.go is in golang-github-twstrike-otr3-dev 0.0~git20161015.0.744856d-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | package otr3
import (
"bytes"
"errors"
"hash"
"math/big"
)
type otrVersion interface {
protocolVersion() uint16
parameterLength() int
isGroupElement(n *big.Int) bool
isFragmented(data []byte) bool
parseFragmentPrefix(c *Conversation, data []byte) (rest []byte, ignore bool, ok bool)
fragmentPrefix(n, total int, itags uint32, itagr uint32) []byte
whitespaceTag() []byte
messageHeader(c *Conversation, msgType byte) ([]byte, error)
parseMessageHeader(c *Conversation, msg []byte) ([]byte, []byte, error)
hash([]byte) []byte
hashInstance() hash.Hash
hashLength() int
hash2([]byte) []byte
hash2Instance() hash.Hash
hash2Length() int
truncateLength() int
keyLength() int
}
func newOtrVersion(v uint16, p policies) (version otrVersion, err error) {
toCheck := policy(0)
switch v {
case 2:
version = otrV2{}
toCheck = allowV2
case 3:
version = otrV3{}
toCheck = allowV3
default:
return nil, errUnsupportedOTRVersion
}
if !p.has(toCheck) {
return nil, errInvalidVersion
}
return
}
func versionFromFragment(fragment []byte) uint16 {
var messageVersion uint16
switch {
case bytes.HasPrefix(fragment, otrv3FragmentationPrefix):
messageVersion = 3
case bytes.HasPrefix(fragment, otrv2FragmentationPrefix):
messageVersion = 2
}
return messageVersion
}
func (c *Conversation) checkVersion(message []byte) (err error) {
_, messageVersion, ok := extractShort(message)
if !ok {
return errInvalidOTRMessage
}
versions := 1 << messageVersion
if err := c.commitToVersionFrom(versions); err != nil {
return err
}
if c.version.protocolVersion() != messageVersion {
return errWrongProtocolVersion
}
return nil
}
// Based on the policy, commit to a version given a set of versions offered by the other peer unless the conversation has already committed to a version.
func (c *Conversation) commitToVersionFrom(versions int) error {
if c.version != nil {
return nil
}
var version otrVersion
switch {
case c.Policies.has(allowV3) && versions&(1<<3) > 0:
version = otrV3{}
case c.Policies.has(allowV2) && versions&(1<<2) > 0:
version = otrV2{}
default:
return errUnsupportedOTRVersion
}
c.version = version
return c.setKeyMatchingVersion()
}
func (c *Conversation) setKeyMatchingVersion() error {
for _, k := range c.ourKeys {
if k.IsAvailableForVersion(c.version.protocolVersion()) {
c.ourCurrentKey = k
return nil
}
}
return errors.New("no possible key for current version")
}
|