listening to "garoche ta sacoche"

This commit is contained in:
didier.amyot committed 2014-11-01 12:46:45 -07:00
1 parent 0095eb7159
commit d863dc3bd1
7 files changed
+158 -37

No files matched your search

+79
View File
@@ -0,0 +1,79 @@
package contract
import (
"errors"
"strings"
)
type AcceptedContract struct {
Hash string
BlockCipher string
BlockCipherMode string
AsymetricCryptography string
}
func listContains(lst []string, elm string) bool {
for _, elm_ := range lst {
if elm == elm_ {
return true
}
}
return false
}
func joinAsError(msg []string) error {
if len(msg) > 0 {
return errors.New(strings.Join(msg, "\n"))
}
return nil
}
func getFirstItemInList1ThatIsAlsoInList2(lst1, lst2 []string) (string, error) {
for _, elm := range lst1 {
if listContains(lst2, elm) {
return elm, nil
}
}
return "", errors.New("no items in list1 is in list2")
}
func getBestBlockCipher(prvCtr *PrivateContract, pubCtr *PublicContract) (string, error) {
if b, err := getFirstItemInList1ThatIsAlsoInList2(pubCtr.AcceptedBlockCyphers, prvCtr.AcceptedBlockCyphers); err != nil {
return "", errors.New("cannot find a block cypher that satisfy both contracts")
} else {
return b, nil
}
}
func getBestBlockCipherMode(prvCtr *PrivateContract, pubCtr *PublicContract) (string, error) {
if m, err := getFirstItemInList1ThatIsAlsoInList2(pubCtr.AcceptedBlockCypherModes, prvCtr.AcceptedBlockCypherModes); err != nil {
return "", errors.New("cannot find a block cypher mode that satisfy both contracts")
} else {
return m, nil
}
}
func getBestHash(prvCtr *PrivateContract, pubCtr *PublicContract) (string, error) {
if h, err := getFirstItemInList1ThatIsAlsoInList2(pubCtr.AcceptedHashes, prvCtr.AcceptedHashes); err != nil {
return "", errors.New("cannot find a hash that satisfy both contracts")
} else {
return h, nil
}
}
func GetAcceptedContract(prvCtr *PrivateContract, pubCtr *PublicContract) (*AcceptedContract, error) {
ret := new(AcceptedContract)
errs := make([]string, 0, 4)
var err error
if ret.Hash, err = getBestHash(prvCtr, pubCtr); err != nil {
errs = append(errs, err.Error())
}
if ret.BlockCipher, err = getBestBlockCipher(prvCtr, pubCtr); err != nil {
errs = append(errs, err.Error())
}
if ret.BlockCipherMode, err = getBestBlockCipherMode(prvCtr, pubCtr); err != nil {
errs = append(errs, err.Error())
}
return ret, joinAsError(errs)
}
+63
View File
@@ -0,0 +1,63 @@
package contract
import (
"testing"
)
func TestGetBestHash(t *testing.T) {
prvCtr := new(PrivateContract)
pubCtr := new(PublicContract)
pubCtr.AcceptedHashes = []string{"SHA384", "SHA256", "MD5"}
prvCtr.AcceptedHashes = []string{"SHA384", "SHA256"}
if h, err := getBestHash(prvCtr, pubCtr); err != nil {
t.Error(err)
} else if h != "SHA384" {
t.Error("bad choosen hash: ", h)
}
prvCtr.AcceptedHashes = []string{"SHA1", "MD4"}
if h, err := getBestHash(prvCtr, pubCtr); err == nil {
t.Error("should have an error here")
} else if h != "" {
t.Error("should not have choosen any hash function here")
}
}
func TestGetFirstItemInList1ThatIsAlsoInList2(t *testing.T) {
lst1 := []string{"a", "b", "c"}
lst2 := []string{"b", "c"}
if c, err := getFirstItemInList1ThatIsAlsoInList2(lst1, lst2); c != "b" || err != nil {
t.Fail()
}
lst2 = []string{"d", "e"}
if c, err := getFirstItemInList1ThatIsAlsoInList2(lst1, lst2); c != "" || err == nil {
t.Fail()
}
}
func TestGetAcceptedContract(t *testing.T) {
prvCtr := new(PrivateContract)
pubCtr := new(PublicContract)
pubCtr.AcceptedHashes = []string{"SHA384", "SHA256", "MD5"}
prvCtr.AcceptedHashes = []string{"SHA384", "SHA256"}
pubCtr.AcceptedBlockCyphers = []string{"aes", "des"}
prvCtr.AcceptedBlockCyphers = []string{"aes"}
pubCtr.AcceptedBlockCypherModes = []string{"ofb"}
prvCtr.AcceptedBlockCypherModes = []string{"ofb"}
ac, err := GetAcceptedContract(prvCtr, pubCtr)
if err != nil {
t.Error(err)
return
}
if ac.Hash != "SHA384" {
t.Error("bad hash")
}
if ac.BlockCipher != "aes" {
t.Error("bad block cipher")
}
}
+4 -3
View File
@@ -5,7 +5,8 @@ import (
)
type PublicContract struct {
AcceptedHashes []string `yaml:"accepted_hashes" json:"accepted_hashes"`
AcceptedBlockCypher []string `yaml:"accepted_block_cypher" json:"accepted_block_cypher"`
RSAPublicKey []*keys.RSAPublicKey `yaml:"rsa_public_key, omitempty" json:"rsa_public_key,omitempty"`
AcceptedHashes []string `yaml:"accepted_hashes" json:"accepted_hashes"`
AcceptedBlockCyphers []string `yaml:"accepted_block_cypher" json:"accepted_block_cypher"`
AcceptedBlockCypherModes []string `yaml:"accepted_block_cypher_mode" json:"accepted_block_cypher_mode"`
RSAPublicKey []*keys.RSAPublicKey `yaml:"rsa_public_key, omitempty" json:"rsa_public_key,omitempty"`
}
+6 -6
View File
@@ -36,9 +36,9 @@ func expectJson(c *PublicContract, jsonData string) error {
func TestSimpleJsonification(t *testing.T) {
c := &PublicContract{
AcceptedHashes: []string{"sha246"},
AcceptedBlockCypher: []string{"aes"},
RSAPublicKey: []*keys.RSAPublicKey{&keys.RSAPublicKey{helper.B(12), 3}},
AcceptedHashes: []string{"sha246"},
AcceptedBlockCyphers: []string{"aes"},
RSAPublicKey: []*keys.RSAPublicKey{&keys.RSAPublicKey{helper.B(12), 3}},
}
if err := assertJSONMarshalling(c); err != nil {
t.Error(err)
@@ -47,9 +47,9 @@ func TestSimpleJsonification(t *testing.T) {
func TestEmptyRSAPublicKey(t *testing.T) {
c := &PublicContract{
AcceptedHashes: []string{"sha246"},
AcceptedBlockCypher: []string{"aes"},
RSAPublicKey: []*keys.RSAPublicKey{&keys.RSAPublicKey{helper.B(12), 3}},
AcceptedHashes: []string{"sha246"},
AcceptedBlockCyphers: []string{"aes"},
RSAPublicKey: []*keys.RSAPublicKey{&keys.RSAPublicKey{helper.B(12), 3}},
}
jsonData := `{
"accepted_hashes": ["sha246"],