diff --git a/api/authenticatedChannel.go b/api/authenticatedChannel.go
index 0debb583f3496b945f3601118a5940d69683a3bd..0af89ff00d7f87f5590d55f4b2dfcd2788d013d0 100644
--- a/api/authenticatedChannel.go
+++ b/api/authenticatedChannel.go
@@ -12,7 +12,7 @@ import (
 	jww "github.com/spf13/jwalterweatherman"
 	"gitlab.com/elixxir/client/auth"
 	"gitlab.com/elixxir/client/interfaces"
-	"gitlab.com/elixxir/client/interfaces/contact"
+	"gitlab.com/elixxir/crypto/contact"
 	"gitlab.com/elixxir/primitives/fact"
 	"gitlab.com/xx_network/primitives/id"
 )
diff --git a/auth/callback.go b/auth/callback.go
index 362efcaade20a3ed5e00d0b44c6847855c6471fa..ef21512f88a06c19322c03518bc262d7d2e94ebe 100644
--- a/auth/callback.go
+++ b/auth/callback.go
@@ -11,10 +11,10 @@ import (
 	"github.com/pkg/errors"
 	jww "github.com/spf13/jwalterweatherman"
 	"gitlab.com/elixxir/client/interfaces"
-	"gitlab.com/elixxir/client/interfaces/contact"
 	"gitlab.com/elixxir/client/interfaces/message"
 	"gitlab.com/elixxir/client/stoppable"
 	"gitlab.com/elixxir/client/storage/auth"
+	"gitlab.com/elixxir/crypto/contact"
 	"gitlab.com/elixxir/crypto/cyclic"
 	"gitlab.com/elixxir/crypto/diffieHellman"
 	cAuth "gitlab.com/elixxir/crypto/e2e/auth"
diff --git a/auth/confirm.go b/auth/confirm.go
index d1b88bf99d9a1fe2871850b5d7c810ea39f7f6a6..fee1433a2c22b7323cb5c1ce9d1ea57c6108c9a4 100644
--- a/auth/confirm.go
+++ b/auth/confirm.go
@@ -11,11 +11,11 @@ import (
 	"github.com/pkg/errors"
 	jww "github.com/spf13/jwalterweatherman"
 	"gitlab.com/elixxir/client/interfaces"
-	"gitlab.com/elixxir/client/interfaces/contact"
 	"gitlab.com/elixxir/client/interfaces/params"
 	"gitlab.com/elixxir/client/interfaces/utility"
 	"gitlab.com/elixxir/client/storage"
 	ds "gitlab.com/elixxir/comms/network/dataStructures"
+	"gitlab.com/elixxir/crypto/contact"
 	"gitlab.com/elixxir/crypto/diffieHellman"
 	cAuth "gitlab.com/elixxir/crypto/e2e/auth"
 	"gitlab.com/elixxir/primitives/format"
diff --git a/auth/request.go b/auth/request.go
index be8f08d23532b67e74575f8eb45368ad66c467d7..7c963123b49dd532734871c687277a318887093d 100644
--- a/auth/request.go
+++ b/auth/request.go
@@ -11,13 +11,13 @@ import (
 	"github.com/pkg/errors"
 	jww "github.com/spf13/jwalterweatherman"
 	"gitlab.com/elixxir/client/interfaces"
-	"gitlab.com/elixxir/client/interfaces/contact"
 	"gitlab.com/elixxir/client/interfaces/params"
 	"gitlab.com/elixxir/client/interfaces/utility"
 	"gitlab.com/elixxir/client/storage"
 	"gitlab.com/elixxir/client/storage/auth"
 	"gitlab.com/elixxir/client/storage/e2e"
 	ds "gitlab.com/elixxir/comms/network/dataStructures"
+	"gitlab.com/elixxir/crypto/contact"
 	"gitlab.com/elixxir/crypto/diffieHellman"
 	cAuth "gitlab.com/elixxir/crypto/e2e/auth"
 	"gitlab.com/elixxir/primitives/format"
diff --git a/auth/verify.go b/auth/verify.go
index 76850a17dfc6728c10b5c7304e04d7f2437f2545..66a86df6f125bb0abe7c28be4ecbb408603b0a98 100644
--- a/auth/verify.go
+++ b/auth/verify.go
@@ -8,8 +8,8 @@
 package auth
 
 import (
-	"gitlab.com/elixxir/client/interfaces/contact"
 	"gitlab.com/elixxir/client/storage"
+	"gitlab.com/elixxir/crypto/contact"
 	cAuth "gitlab.com/elixxir/crypto/e2e/auth"
 )
 
diff --git a/bindings/authenticatedChannels.go b/bindings/authenticatedChannels.go
index 70ff0285173740f5ef302e1a678ffe127318a002..28784c87f944bd3d15e43b873194f968dd513971 100644
--- a/bindings/authenticatedChannels.go
+++ b/bindings/authenticatedChannels.go
@@ -10,7 +10,7 @@ package bindings
 import (
 	"errors"
 	"fmt"
-	"gitlab.com/elixxir/client/interfaces/contact"
+	"gitlab.com/elixxir/crypto/contact"
 )
 
 // Create an insecure e2e relationship with a precanned user
diff --git a/bindings/client.go b/bindings/client.go
index 391aa361c6da731a19d2647d6d3aacd003e70208..34fb521076fca455294824ef3104f1c67445669d 100644
--- a/bindings/client.go
+++ b/bindings/client.go
@@ -13,10 +13,10 @@ import (
 	"fmt"
 	jww "github.com/spf13/jwalterweatherman"
 	"gitlab.com/elixxir/client/api"
-	"gitlab.com/elixxir/client/interfaces/contact"
 	"gitlab.com/elixxir/client/interfaces/message"
 	"gitlab.com/elixxir/client/interfaces/params"
 	"gitlab.com/elixxir/comms/mixmessages"
+	"gitlab.com/elixxir/crypto/contact"
 	"gitlab.com/elixxir/primitives/states"
 	"gitlab.com/xx_network/primitives/id"
 	"sync"
@@ -82,7 +82,7 @@ func Login(storageDir string, password []byte, parameters string) (*Client, erro
 	loginMux.Lock()
 	defer loginMux.Unlock()
 
-	if extantClient{
+	if extantClient {
 		return nil, errors.New("cannot login when another session " +
 			"already exists")
 	}
@@ -96,7 +96,7 @@ func Login(storageDir string, password []byte, parameters string) (*Client, erro
 	if err != nil {
 		return nil, errors.New(fmt.Sprintf("Failed to login: %+v", err))
 	}
-	extantClient=true
+	extantClient = true
 	return &Client{api: *client}, nil
 }
 
@@ -140,8 +140,8 @@ func LogLevel(level int) error {
 }
 
 //RegisterLogWriter registers a callback on which logs are written.
-func RegisterLogWriter(writer LogWriter){
-	jww.SetLogOutput(&writerAdapter{lw:writer})
+func RegisterLogWriter(writer LogWriter) {
+	jww.SetLogOutput(&writerAdapter{lw: writer})
 }
 
 //Unmarshals a marshaled contact object, returns an error if it fails
@@ -225,12 +225,12 @@ func (c *Client) StopNetworkFollower(timeoutMS int) error {
 // passed timeout. It will return true if the network is healthy
 func (c *Client) WaitForNetwork(timeoutMS int) bool {
 	start := time.Now()
-	timeout := time.Duration(timeoutMS)*time.Millisecond
-	for time.Now().Sub(start)<timeout{
-		if c.api.GetHealth().IsHealthy(){
+	timeout := time.Duration(timeoutMS) * time.Millisecond
+	for time.Now().Sub(start) < timeout {
+		if c.api.GetHealth().IsHealthy() {
 			return true
 		}
-		time.Sleep(250*time.Millisecond)
+		time.Sleep(250 * time.Millisecond)
 	}
 	return false
 }
diff --git a/bindings/contact.go b/bindings/contact.go
index daa45aa357095fa243c1a8b699198265e027a7f8..47a7a7290e4fec3684523d54312d359643fc3dbb 100644
--- a/bindings/contact.go
+++ b/bindings/contact.go
@@ -8,7 +8,7 @@
 package bindings
 
 import (
-	"gitlab.com/elixxir/client/interfaces/contact"
+	"gitlab.com/elixxir/crypto/contact"
 	"gitlab.com/elixxir/primitives/fact"
 )
 
diff --git a/bindings/list.go b/bindings/list.go
index 382303a3d6e80bc3002bc38a6bc3fba7a5cce0dd..c44fb1679fc0e6492c7c711e7d610bab01198c78 100644
--- a/bindings/list.go
+++ b/bindings/list.go
@@ -9,7 +9,7 @@ package bindings
 
 import (
 	"errors"
-	"gitlab.com/elixxir/client/interfaces/contact"
+	"gitlab.com/elixxir/crypto/contact"
 	"gitlab.com/elixxir/primitives/fact"
 	"gitlab.com/xx_network/primitives/id"
 )
diff --git a/bindings/ud.go b/bindings/ud.go
index a4c3cb5babca0236b546e5cb10fc74b10a98f0f3..91a700d3b5e94316418699396dccf2f68ab00d5a 100644
--- a/bindings/ud.go
+++ b/bindings/ud.go
@@ -9,9 +9,9 @@ package bindings
 
 import (
 	"github.com/pkg/errors"
-	"gitlab.com/elixxir/client/interfaces/contact"
 	"gitlab.com/elixxir/client/single"
 	"gitlab.com/elixxir/client/ud"
+	"gitlab.com/elixxir/crypto/contact"
 	"gitlab.com/elixxir/primitives/fact"
 	"gitlab.com/xx_network/primitives/id"
 	"time"
diff --git a/cmd/getndf.go b/cmd/getndf.go
index e794fb4d38b6f3d7e0ca82b2b3a2576afef0d6d6..914412093c8f1247953473c29a02edcd68346235 100644
--- a/cmd/getndf.go
+++ b/cmd/getndf.go
@@ -13,7 +13,7 @@ import (
 	"github.com/spf13/cobra"
 	jww "github.com/spf13/jwalterweatherman"
 	"github.com/spf13/viper"
-	// "gitlab.com/elixxir/client/interfaces/contact"
+	// "gitlab.com/elixxir/crypto/contact"
 	// "gitlab.com/elixxir/client/interfaces/message"
 	// "gitlab.com/elixxir/client/switchboard"
 	// "gitlab.com/elixxir/client/ud"
diff --git a/cmd/root.go b/cmd/root.go
index 4078f628d38d6b6aee00d72bb18cfb36dfea2595..c6ea6c91425d2cf96f532287dfcbfdc387fc7639 100644
--- a/cmd/root.go
+++ b/cmd/root.go
@@ -17,10 +17,10 @@ import (
 	jww "github.com/spf13/jwalterweatherman"
 	"github.com/spf13/viper"
 	"gitlab.com/elixxir/client/api"
-	"gitlab.com/elixxir/client/interfaces/contact"
 	"gitlab.com/elixxir/client/interfaces/message"
 	"gitlab.com/elixxir/client/interfaces/params"
 	"gitlab.com/elixxir/client/switchboard"
+	"gitlab.com/elixxir/crypto/contact"
 	"gitlab.com/xx_network/primitives/id"
 	"io/ioutil"
 	"os"
diff --git a/cmd/single.go b/cmd/single.go
index 13a61c79a8a3318ccd09d70997b43ca19c0f30ef..7fe8e2038ef34240bd2ee363e6f38d8d94d26ed9 100644
--- a/cmd/single.go
+++ b/cmd/single.go
@@ -14,10 +14,10 @@ import (
 	"github.com/spf13/cobra"
 	jww "github.com/spf13/jwalterweatherman"
 	"github.com/spf13/viper"
-	"gitlab.com/elixxir/client/interfaces/contact"
 	"gitlab.com/elixxir/client/interfaces/message"
 	"gitlab.com/elixxir/client/single"
 	"gitlab.com/elixxir/client/switchboard"
+	"gitlab.com/elixxir/crypto/contact"
 	"gitlab.com/xx_network/primitives/utils"
 	"time"
 )
diff --git a/cmd/ud.go b/cmd/ud.go
index fb9603dd52b18eb096bd3699c87b398dbcc8a7a5..ccefe891a4e87c2053ec62fd95e835115aa21a45 100644
--- a/cmd/ud.go
+++ b/cmd/ud.go
@@ -13,11 +13,11 @@ import (
 	"github.com/spf13/cobra"
 	jww "github.com/spf13/jwalterweatherman"
 	"github.com/spf13/viper"
-	"gitlab.com/elixxir/client/interfaces/contact"
 	"gitlab.com/elixxir/client/interfaces/message"
 	"gitlab.com/elixxir/client/single"
 	"gitlab.com/elixxir/client/switchboard"
 	"gitlab.com/elixxir/client/ud"
+	"gitlab.com/elixxir/crypto/contact"
 	"gitlab.com/elixxir/primitives/fact"
 	"time"
 )
diff --git a/go.mod b/go.mod
index cf0474f9bb8f46c19e7871eda16b6b4091fbab6e..a2fc35a1ab8c0ad2d16566e13f94743a29491e22 100644
--- a/go.mod
+++ b/go.mod
@@ -3,16 +3,13 @@ module gitlab.com/elixxir/client
 go 1.13
 
 require (
-	github.com/aws/aws-lambda-go v1.8.1 // indirect
 	github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3
 	github.com/golang/protobuf v1.4.3
 	github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00 // indirect
-	github.com/liyue201/goqr v0.0.0-20200803022322-df443203d4ea
 	github.com/magiconair/properties v1.8.4 // indirect
 	github.com/mitchellh/mapstructure v1.4.0 // indirect
 	github.com/pelletier/go-toml v1.8.1 // indirect
 	github.com/pkg/errors v0.9.1
-	github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e
 	github.com/smartystreets/assertions v1.0.1 // indirect
 	github.com/spf13/afero v1.5.1 // indirect
 	github.com/spf13/cast v1.3.1 // indirect
@@ -21,7 +18,7 @@ require (
 	github.com/spf13/viper v1.7.1
 	gitlab.com/elixxir/bloomfilter v0.0.0-20200930191214-10e9ac31b228
 	gitlab.com/elixxir/comms v0.0.4-0.20210409192302-249b5af3dbc8
-	gitlab.com/elixxir/crypto v0.0.7-0.20210409192145-eab67f2f8931
+	gitlab.com/elixxir/crypto v0.0.7-0.20210412231025-6f75c577f803
 	gitlab.com/elixxir/ekv v0.1.5
 	gitlab.com/elixxir/primitives v0.0.3-0.20210409190923-7bf3cd8d97e7
 	gitlab.com/xx_network/comms v0.0.4-0.20210406210737-45d1e87d294a
diff --git a/go.sum b/go.sum
index ef0412035b9754434e8c4974338bda8ac183267d..56d8aa511eb8e7a7746598374e1f42ca1ca7557d 100644
--- a/go.sum
+++ b/go.sum
@@ -19,7 +19,6 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF
 github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
 github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
 github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
-github.com/aws/aws-lambda-go v1.8.1/go.mod h1:zUsUQhAUjYzR8AuduJPCfhBuKWUaDbQiPOG+ouzmE1A=
 github.com/badoux/checkmail v1.2.1 h1:TzwYx5pnsV6anJweMx2auXdekBwGr/yt1GgalIx9nBQ=
 github.com/badoux/checkmail v1.2.1/go.mod h1:XroCOBU5zzZJcLvgwU15I+2xXyCdTWXyR9MGfRhBYy0=
 github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
@@ -254,42 +253,20 @@ github.com/zeebo/pcg v1.0.0 h1:dt+dx+HvX8g7Un32rY9XWoYnd0NmKmrIzpHF7qiTDj0=
 github.com/zeebo/pcg v1.0.0/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4=
 gitlab.com/elixxir/bloomfilter v0.0.0-20200930191214-10e9ac31b228 h1:Gi6rj4mAlK0BJIk1HIzBVMjWNjIUfstrsXC2VqLYPcA=
 gitlab.com/elixxir/bloomfilter v0.0.0-20200930191214-10e9ac31b228/go.mod h1:H6jztdm0k+wEV2QGK/KYA+MY9nj9Zzatux/qIvDDv3k=
-gitlab.com/elixxir/comms v0.0.4-0.20210402183711-0350710740e7 h1:JfR2UVZDqAIQeicHq7ZIPuJyPzkcr59OT5uGz4XyFiI=
-gitlab.com/elixxir/comms v0.0.4-0.20210402183711-0350710740e7/go.mod h1:3ikLStVfz4wUMgzL/WkDE9umkeizAKMlO5GQcnDmH5c=
-gitlab.com/elixxir/comms v0.0.4-0.20210402205438-eca60a717c47 h1:w0SarO3yraN81dZJan7lDz6OjexoqP52kRAdlnfCr4o=
-gitlab.com/elixxir/comms v0.0.4-0.20210402205438-eca60a717c47/go.mod h1:Hd9NbUwdRXFcs5ZgukPYsChmM8AqxJRjzMNvQuUXqh4=
-gitlab.com/elixxir/comms v0.0.4-0.20210402205854-0ea056917a98 h1:6GF+txzdbf5EKZKXcwfHagH7G+vmDmMjQZAoMSsHXm4=
-gitlab.com/elixxir/comms v0.0.4-0.20210402205854-0ea056917a98/go.mod h1:Hd9NbUwdRXFcs5ZgukPYsChmM8AqxJRjzMNvQuUXqh4=
-gitlab.com/elixxir/comms v0.0.4-0.20210402222700-7fac5f85c596 h1:jX6H4vu//StDLKZn5lcmxp9S3IhzS/8Uttg0K5r7Iqo=
-gitlab.com/elixxir/comms v0.0.4-0.20210402222700-7fac5f85c596/go.mod h1:jqqUYnsftpfQXJ57BPYp5A+i7qfA5IXhKUE9ZOSrqaE=
-gitlab.com/elixxir/comms v0.0.4-0.20210405224735-cff3ab4d7d66 h1:i9fg2U9pdiJZkKhT7FEipABtN75SjtjJs8S+z4xw40k=
-gitlab.com/elixxir/comms v0.0.4-0.20210405224735-cff3ab4d7d66/go.mod h1:f2LlGnYbYW4VF8h/YVhcZNN5odPbCZO0vQeDIKbo8pM=
-gitlab.com/elixxir/comms v0.0.4-0.20210407162937-a2d7ebd9cacd h1:g14XDx0fcLld8cbiACaKjW2ijvRjXOUqCoAh9P/YT6I=
-gitlab.com/elixxir/comms v0.0.4-0.20210407162937-a2d7ebd9cacd/go.mod h1:W9t2gIAjfRvzlB++k/suuLUHEfvj41Ezq68BKo7FJ40=
-gitlab.com/elixxir/comms v0.0.4-0.20210409164117-ce218393248a h1:exiQEBz1xjFglfwApHLGTTFsv0Av7uRU4l0u/cm/Zow=
-gitlab.com/elixxir/comms v0.0.4-0.20210409164117-ce218393248a/go.mod h1:gHx+JiC7RSRMd1eLb3Tgj2Iz7j5UD2U8Sy2a5NvfJLQ=
-gitlab.com/elixxir/comms v0.0.4-0.20210409190025-e999b1f81f67 h1:8o/6L66J8SbaqWr7Lm/TMgcTY/ZgEAhhcmJvl/iLNfs=
-gitlab.com/elixxir/comms v0.0.4-0.20210409190025-e999b1f81f67/go.mod h1:ZKlb3ClKMEA7mpT24dk+1aRjs4cbY4besFi8I9T/pUk=
 gitlab.com/elixxir/comms v0.0.4-0.20210409192302-249b5af3dbc8 h1:k9BLWNw7CHwH4H3gNWA0Q/BXNg7923AFflWJtYZr5z4=
 gitlab.com/elixxir/comms v0.0.4-0.20210409192302-249b5af3dbc8/go.mod h1:/y5QIivolXMa6TO+ZqFWAV49wxlXXxUCqZH9Zi82kXU=
 gitlab.com/elixxir/crypto v0.0.0-20200804182833-984246dea2c4 h1:28ftZDeYEko7xptCZzeFWS1Iam95dj46TWFVVlKmw6A=
 gitlab.com/elixxir/crypto v0.0.0-20200804182833-984246dea2c4/go.mod h1:ucm9SFKJo+K0N2GwRRpaNr+tKXMIOVWzmyUD0SbOu2c=
 gitlab.com/elixxir/crypto v0.0.3 h1:znCt/x2bL4y8czTPaaFkwzdgSgW3BJc/1+dxyf1jqVw=
 gitlab.com/elixxir/crypto v0.0.3/go.mod h1:ZNgBOblhYToR4m8tj4cMvJ9UsJAUKq+p0gCp07WQmhA=
-gitlab.com/elixxir/crypto v0.0.7-0.20210401210040-b7f1da24ef13 h1:x6oSLhgzhBcXeItHQ7OlDNoyvebgyNdGCaywAP/IkMc=
-gitlab.com/elixxir/crypto v0.0.7-0.20210401210040-b7f1da24ef13/go.mod h1:5k+LGynIQa42jZ/UbNVwBiZGHKvLXbXXkqyuTY6uHs0=
-gitlab.com/elixxir/crypto v0.0.7-0.20210405224356-e2748985102a h1:r2k2zjIX89vYjBFwu6AVOLQQvvs47mxubW726PttL6g=
-gitlab.com/elixxir/crypto v0.0.7-0.20210405224356-e2748985102a/go.mod h1:bNreAI0RMzHToO7uAiYNcrAFfF4tf7NzoKo2wE6FwVM=
-gitlab.com/elixxir/crypto v0.0.7-0.20210407162800-3e6c0c204107 h1:9zR58jujCynJy6LCdtugEy32LATl1A6QMZ0eNK+8Bqs=
-gitlab.com/elixxir/crypto v0.0.7-0.20210407162800-3e6c0c204107/go.mod h1:cwPJWsRNOMMp1pTCuEzKJA4gUuwoBwKoDMLKDo5U9J0=
-gitlab.com/elixxir/crypto v0.0.7-0.20210409164001-5cb03c4d99b4 h1:ey4PVwIYbTrhdOgzC0NnDGf3tlxsh7kCYug/E6OpHrQ=
-gitlab.com/elixxir/crypto v0.0.7-0.20210409164001-5cb03c4d99b4/go.mod h1:0uL6HPmRlxuTm2NEosDfHGmJV3ybQ/5Li8pQ5x3QkU8=
-gitlab.com/elixxir/crypto v0.0.7-0.20210409185910-0d4cea833616 h1:uuhfWgnM9b3ooqj0m12XlbgvGTF24qZiQKrOuiyLDLs=
-gitlab.com/elixxir/crypto v0.0.7-0.20210409185910-0d4cea833616/go.mod h1:EQcmID0funFIQXjRi5GR5HSp1fpg9WfLsQ0h2dyJrs4=
 gitlab.com/elixxir/crypto v0.0.7-0.20210409192145-eab67f2f8931 h1:kY/qBfjrZTFHJnvM1IcxB03+ZQL4+ESUjV4I4kCxoE8=
 gitlab.com/elixxir/crypto v0.0.7-0.20210409192145-eab67f2f8931/go.mod h1:ZktO3MT3oNo+g2Nq0GuC3ebJWJphh7t5KwwDDGBegnY=
-gitlab.com/elixxir/ekv v0.1.4 h1:NLVMwsFEKArWcsDHu2DbXlm9374iSgn7oIA3rVSsvjc=
-gitlab.com/elixxir/ekv v0.1.4/go.mod h1:e6WPUt97taFZe5PFLPb1Dupk7tqmDCTQu1kkstqJvw4=
+gitlab.com/elixxir/crypto v0.0.7-0.20210412193049-f3718fa4facb h1:9CT5f+nV4sisutLx8Z3BAEiqjktcCL2ZpEqcpmgzyqA=
+gitlab.com/elixxir/crypto v0.0.7-0.20210412193049-f3718fa4facb/go.mod h1:ZktO3MT3oNo+g2Nq0GuC3ebJWJphh7t5KwwDDGBegnY=
+gitlab.com/elixxir/crypto v0.0.7-0.20210412195114-be927031747a h1:DSYIXSCWrwkyHUs2fJMliI4+Bd9h+WA5PXI78uvhCj4=
+gitlab.com/elixxir/crypto v0.0.7-0.20210412195114-be927031747a/go.mod h1:HMMRBuv/yMqB5c31G9OPlOAifOOqGypCyD5v6py+4vo=
+gitlab.com/elixxir/crypto v0.0.7-0.20210412231025-6f75c577f803 h1:8sLODlAYRT0Y9NA+uoMoF1qBrBRrW5TikyKAOvyCd+E=
+gitlab.com/elixxir/crypto v0.0.7-0.20210412231025-6f75c577f803/go.mod h1:HMMRBuv/yMqB5c31G9OPlOAifOOqGypCyD5v6py+4vo=
 gitlab.com/elixxir/ekv v0.1.5 h1:R8M1PA5zRU1HVnTyrtwybdABh7gUJSCvt1JZwUSeTzk=
 gitlab.com/elixxir/ekv v0.1.5/go.mod h1:e6WPUt97taFZe5PFLPb1Dupk7tqmDCTQu1kkstqJvw4=
 gitlab.com/elixxir/primitives v0.0.0-20200731184040-494269b53b4d/go.mod h1:OQgUZq7SjnE0b+8+iIAT2eqQF+2IFHn73tOo+aV11mg=
@@ -297,32 +274,14 @@ gitlab.com/elixxir/primitives v0.0.0-20200804170709-a1896d262cd9/go.mod h1:p0Vel
 gitlab.com/elixxir/primitives v0.0.0-20200804182913-788f47bded40/go.mod h1:tzdFFvb1ESmuTCOl1z6+yf6oAICDxH2NPUemVgoNLxc=
 gitlab.com/elixxir/primitives v0.0.1 h1:q61anawANlNAExfkeQEE1NCsNih6vNV1FFLoUQX6txQ=
 gitlab.com/elixxir/primitives v0.0.1/go.mod h1:kNp47yPqja2lHSiS4DddTvFpB/4D9dB2YKnw5c+LJCE=
-gitlab.com/elixxir/primitives v0.0.3-0.20210401175645-9b7b92f74ec4 h1:PFrOIpax1IMXS7jVGFhOF3bSOWh3IWhNUD18n1DzSZM=
-gitlab.com/elixxir/primitives v0.0.3-0.20210401175645-9b7b92f74ec4/go.mod h1:9qqDucNbLP9ArL1VKCXQuqYrcAbJIUcI8uzbP7NmKDw=
-gitlab.com/elixxir/primitives v0.0.3-0.20210405224302-03092a268566 h1:Wu7AXDWlqLu9yFzZ/ovHUaWIUOPi1v26b2QHmNC1bfY=
-gitlab.com/elixxir/primitives v0.0.3-0.20210405224302-03092a268566/go.mod h1:MkG5S32UvI6/ZcTLQxFpvEAnCshR6MNG8d8gUrvKC7g=
-gitlab.com/elixxir/primitives v0.0.3-0.20210406002149-ae7bd4896baf h1:1SPT7Z/9IwDQ+CkdpLPP9QyIX7KFtvgVw7/gxLbWzak=
-gitlab.com/elixxir/primitives v0.0.3-0.20210406002149-ae7bd4896baf/go.mod h1:MkG5S32UvI6/ZcTLQxFpvEAnCshR6MNG8d8gUrvKC7g=
-gitlab.com/elixxir/primitives v0.0.3-0.20210409005800-dcf8c07295b7 h1:X1nhxyige7V/n1Hf3Ggt6AZB7vd9xK9vA7nVybM92Lk=
-gitlab.com/elixxir/primitives v0.0.3-0.20210409005800-dcf8c07295b7/go.mod h1:MkG5S32UvI6/ZcTLQxFpvEAnCshR6MNG8d8gUrvKC7g=
-gitlab.com/elixxir/primitives v0.0.3-0.20210409163616-5e22bc27ea48 h1:regx/2XFZODFTmWCnufnhQ6j1KYjHtvC3pc+PvuHfvg=
-gitlab.com/elixxir/primitives v0.0.3-0.20210409163616-5e22bc27ea48/go.mod h1:MkG5S32UvI6/ZcTLQxFpvEAnCshR6MNG8d8gUrvKC7g=
-gitlab.com/elixxir/primitives v0.0.3-0.20210409183455-a45e87dbea39 h1:dhf2VwmAn0U/4EFb1CnS+b3HKwbV5ZR7m9miZ/y0vLA=
-gitlab.com/elixxir/primitives v0.0.3-0.20210409183455-a45e87dbea39/go.mod h1:MkG5S32UvI6/ZcTLQxFpvEAnCshR6MNG8d8gUrvKC7g=
 gitlab.com/elixxir/primitives v0.0.3-0.20210409190923-7bf3cd8d97e7 h1:q3cw7WVtD6hDqTi8ydky+yiqJ4RkWp/hkTSNirr9Z6Y=
 gitlab.com/elixxir/primitives v0.0.3-0.20210409190923-7bf3cd8d97e7/go.mod h1:h0QHrjrixLNaP24ZXAgDOZXP4eegrQ24BCZPGitg8Jg=
 gitlab.com/xx_network/comms v0.0.0-20200805174823-841427dd5023/go.mod h1:owEcxTRl7gsoM8c3RQ5KAm5GstxrJp5tn+6JfQ4z5Hw=
-gitlab.com/xx_network/comms v0.0.4-0.20210401160731-7b8890cdd8ad h1:0E4wnLoOqODo6K2SwVG18y63sns4WLN3x+nSM9SWfiM=
-gitlab.com/xx_network/comms v0.0.4-0.20210401160731-7b8890cdd8ad/go.mod h1:inre/Ot0UJkxcfF4Oy4jk2A1MXyicRkPZB9FfnCfKQY=
-gitlab.com/xx_network/comms v0.0.4-0.20210405224241-5447394f79d7 h1:PoQJb9ky67US1uB2mscL+bl7o5YxzCq2lptS9RAbkkg=
-gitlab.com/xx_network/comms v0.0.4-0.20210405224241-5447394f79d7/go.mod h1:7ciuA+LTE0GC7upviGbyyb2hrpJG9Pnq2cc5oz2N5Ss=
 gitlab.com/xx_network/comms v0.0.4-0.20210406210737-45d1e87d294a h1:r0mvBjHPBCYEVmhEe6JhLQDc0+dCORf1ejtuZ8IbyKY=
 gitlab.com/xx_network/comms v0.0.4-0.20210406210737-45d1e87d294a/go.mod h1:7ciuA+LTE0GC7upviGbyyb2hrpJG9Pnq2cc5oz2N5Ss=
 gitlab.com/xx_network/crypto v0.0.3/go.mod h1:DF2HYvvCw9wkBybXcXAgQMzX+MiGbFPjwt3t17VRqRE=
 gitlab.com/xx_network/crypto v0.0.4 h1:lpKOL5mTJ2awWMfgBy30oD/UvJVrWZzUimSHlOdZZxo=
 gitlab.com/xx_network/crypto v0.0.4/go.mod h1:+lcQEy+Th4eswFgQDwT0EXKp4AXrlubxalwQFH5O0Mk=
-gitlab.com/xx_network/crypto v0.0.5-0.20210401160648-4f06cace9123 h1:i2PajAamYlacUpAFWqE7g5qtM6Vt/xG9iDfoK1nc2l4=
-gitlab.com/xx_network/crypto v0.0.5-0.20210401160648-4f06cace9123/go.mod h1:CWV349I9Nv1zPCIY/f8Ej6yWs7NG0HLTWnm+Jlz7jKc=
 gitlab.com/xx_network/crypto v0.0.5-0.20210405224157-2b1f387b42c1 h1:4Hrphjtqn3vO8LI872YwVKy5dCFJdD5u0dE4O2QCZqU=
 gitlab.com/xx_network/crypto v0.0.5-0.20210405224157-2b1f387b42c1/go.mod h1:CUhRpioyLaKIylg+LIyZX1rhOmFaEXQQ6esNycx9dcA=
 gitlab.com/xx_network/primitives v0.0.0-20200803231956-9b192c57ea7c/go.mod h1:wtdCMr7DPePz9qwctNoAUzZtbOSHSedcK++3Df3psjA=
@@ -330,12 +289,6 @@ gitlab.com/xx_network/primitives v0.0.0-20200804183002-f99f7a7284da h1:CCVslUwNC
 gitlab.com/xx_network/primitives v0.0.0-20200804183002-f99f7a7284da/go.mod h1:OK9xevzWCaPO7b1wiluVJGk7R5ZsuC7pHY5hteZFQug=
 gitlab.com/xx_network/primitives v0.0.2 h1:r45yKenJ9e7PylI1ZXJ1Es09oYNaYXjxVy9+uYlwo7Y=
 gitlab.com/xx_network/primitives v0.0.2/go.mod h1:cs0QlFpdMDI6lAo61lDRH2JZz+3aVkHy+QogOB6F/qc=
-gitlab.com/xx_network/primitives v0.0.4-0.20210331161816-ed23858bdb93 h1:ZV5ZfSBX7+7moL8pywpCB3HTNXd03tSwMgDA7SDYaFA=
-gitlab.com/xx_network/primitives v0.0.4-0.20210331161816-ed23858bdb93/go.mod h1:9imZHvYwNFobxueSvVtHneZLk9wTK7HQTzxPm+zhFhE=
-gitlab.com/xx_network/primitives v0.0.4-0.20210402183235-e04f174cf8c4 h1:uPTABEykN9moPQjb427tqVFPcxWbYbiqLZ26iwI8Cws=
-gitlab.com/xx_network/primitives v0.0.4-0.20210402183235-e04f174cf8c4/go.mod h1:9imZHvYwNFobxueSvVtHneZLk9wTK7HQTzxPm+zhFhE=
-gitlab.com/xx_network/primitives v0.0.4-0.20210402205313-e9b80f75e701 h1:svcqDo2heNLjmUncmgymwRH3lkV5Jy3PdhvLuqmI39o=
-gitlab.com/xx_network/primitives v0.0.4-0.20210402205313-e9b80f75e701/go.mod h1:9imZHvYwNFobxueSvVtHneZLk9wTK7HQTzxPm+zhFhE=
 gitlab.com/xx_network/primitives v0.0.4-0.20210402222416-37c1c4d3fac4 h1:YPYTKF0zQf08y0eQrjQP01C/EWQTypdqawjZPr5c6rc=
 gitlab.com/xx_network/primitives v0.0.4-0.20210402222416-37c1c4d3fac4/go.mod h1:9imZHvYwNFobxueSvVtHneZLk9wTK7HQTzxPm+zhFhE=
 gitlab.com/xx_network/ring v0.0.2 h1:TlPjlbFdhtJrwvRgIg4ScdngMTaynx/ByHBRZiXCoL0=
@@ -398,8 +351,6 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL
 golang.org/x/net v0.0.0-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgNrpq9mjcfDemuexIKsU=
 golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 golang.org/x/net v0.0.0-20201029221708-28c70e62bb1d/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.0.0-20201224014010-6772e930b67b h1:iFwSg7t5GZmB/Q5TjiEAsdoLDrdJRC1RiF2WhuV29Qw=
-golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 h1:qWPm9rbaAMKs8Bq/9LRpbMqxWRVUAQwMI9fVrssnTfw=
 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
diff --git a/interfaces/auth.go b/interfaces/auth.go
index 68e18be6fc51bb90a67b082f396582bb79b88625..bb3cae74d0a37f0fda2c34e8ce0623af6f8a789f 100644
--- a/interfaces/auth.go
+++ b/interfaces/auth.go
@@ -8,7 +8,7 @@
 package interfaces
 
 import (
-	"gitlab.com/elixxir/client/interfaces/contact"
+	"gitlab.com/elixxir/crypto/contact"
 	"gitlab.com/xx_network/primitives/id"
 )
 
diff --git a/interfaces/contact/contact.go b/interfaces/contact/contact.go
deleted file mode 100644
index 1edf828319c5b0cb14e9bf5698f6a0fba72e94f4..0000000000000000000000000000000000000000
--- a/interfaces/contact/contact.go
+++ /dev/null
@@ -1,251 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////
-// Copyright © 2020 xx network SEZC                                          //
-//                                                                           //
-// Use of this source code is governed by a license that can be found in the //
-// LICENSE file                                                              //
-///////////////////////////////////////////////////////////////////////////////
-
-package contact
-
-import (
-	"bytes"
-	"crypto"
-	"encoding/base64"
-	"encoding/binary"
-	"github.com/pkg/errors"
-	"github.com/skip2/go-qrcode"
-	"gitlab.com/elixxir/crypto/cyclic"
-	"gitlab.com/elixxir/primitives/fact"
-	"gitlab.com/xx_network/primitives/id"
-	"strings"
-)
-
-const (
-	version           = "0"
-	headTag           = "<xxc"
-	footTag           = "xxc>"
-	openVerTag        = "("
-	closeVerTag       = ")"
-	sizeLength        = 2
-	minLength         = (sizeLength * 3) + len(headTag) + len(footTag) + id.ArrIDLen
-	fingerprintLength = 15
-)
-
-// Contact implements the Contact interface defined in interface/contact.go,
-// in go, the structure is meant to be edited directly, the functions are for
-// bindings compatibility.
-type Contact struct {
-	ID             *id.ID
-	DhPubKey       *cyclic.Int
-	OwnershipProof []byte
-	Facts          fact.FactList
-}
-
-// Marshal saves the Contact in a compact binary format with base 64 encoding.
-// The data has a header and footer that specify the format version and allow
-// the data to be recognized in a stream of data. The format has the following
-// structure.
-//
-// +----------------+---------------------------------------------------------------------------------------+--------+
-// |     header     |                                     contact data                                      | footer |
-// +------+---------+----------+----------------+---------+----------+----------+----------------+----------+--------+
-// | Open |         | DhPubKey | OwnershipProof |  Facts  |    ID    |          |                |          | Close  |
-// | Tag  | Version |   size   |      size      |   size  |          | DhPubKey | OwnershipProof | FactList |  Tag   |
-// |      |         |  2 bytes |     2 bytes    | 2 bytes | 33 bytes |          |                |          |        |
-// +------+---------+----------+----------------+---------+----------+----------+----------------+----------+--------+
-// |     string     |                                    base 64 encoded                                    | string |
-// +----------------+---------------------------------------------------------------------------------------+--------+
-func (c Contact) Marshal() []byte {
-	var buff bytes.Buffer
-	b := make([]byte, sizeLength)
-
-	// Write size of DhPubKey
-	var dhPubKey []byte
-	if c.DhPubKey != nil {
-		dhPubKey = c.DhPubKey.BinaryEncode()
-		binary.PutVarint(b, int64(len(dhPubKey)))
-	}
-	buff.Write(b)
-
-	// Write size of OwnershipProof
-	binary.PutVarint(b, int64(len(c.OwnershipProof)))
-	buff.Write(b)
-
-	// Write length of Facts
-	factList := c.Facts.Stringify()
-	binary.PutVarint(b, int64(len(factList)))
-	buff.Write(b)
-
-	// Write ID
-	if c.ID != nil {
-		buff.Write(c.ID.Marshal())
-	} else {
-		// Handle nil ID
-		buff.Write(make([]byte, id.ArrIDLen))
-	}
-
-	// Write DhPubKey
-	buff.Write(dhPubKey)
-
-	// Write OwnershipProof
-	buff.Write(c.OwnershipProof)
-
-	// Write fact list
-	buff.Write([]byte(factList))
-
-	// Base 64 encode buffer
-	encodedBuff := make([]byte, base64.StdEncoding.EncodedLen(buff.Len()))
-	base64.StdEncoding.Encode(encodedBuff, buff.Bytes())
-
-	// Add header tag, version number, and footer tag
-	encodedBuff = append([]byte(headTag+openVerTag+version+closeVerTag), encodedBuff...)
-	encodedBuff = append(encodedBuff, []byte(footTag)...)
-
-	return encodedBuff
-}
-
-// Unmarshal decodes the byte slice produced by Contact.Marshal into a Contact.
-func Unmarshal(b []byte) (Contact, error) {
-	if len(b) < minLength {
-		return Contact{}, errors.Errorf("Length of provided buffer (%d) too "+
-			"short; length must be at least %d.",
-			len(b), minLength)
-	}
-
-	var err error
-
-	// Get data from between the header and footer tags
-	b, err = getTagContents(b, headTag, footTag)
-	if err != nil {
-		return Contact{}, errors.Errorf("data not found: %+v", err)
-	}
-
-	// Check that the version matches
-	currentVersion, err := getTagContents(b, openVerTag, closeVerTag)
-	if string(currentVersion) != version {
-		return Contact{}, errors.Errorf("found version %s incomptible, "+
-			"requires version %s", string(currentVersion), version)
-	}
-
-	// Strip version number
-	b = b[len(currentVersion)+len(openVerTag)+len(closeVerTag):]
-
-	// Create new decoder
-	decoder := base64.NewDecoder(base64.StdEncoding, bytes.NewReader(b))
-
-	// Create a new buffer from the data found between the open and close tags
-	var buff bytes.Buffer
-	_, err = buff.ReadFrom(decoder)
-	if err != nil {
-		return Contact{}, errors.Errorf("failed to read from decoder: %+v", err)
-	}
-
-	// Get size of each field
-	dhPubKeySize, _ := binary.Varint(buff.Next(sizeLength))
-	ownershipProofSize, _ := binary.Varint(buff.Next(sizeLength))
-	factsSize, _ := binary.Varint(buff.Next(sizeLength))
-
-	// Create empty client
-	c := Contact{DhPubKey: &cyclic.Int{}}
-
-	// Get and unmarshal ID
-	c.ID, err = id.Unmarshal(buff.Next(id.ArrIDLen))
-	if err != nil {
-		return Contact{}, errors.Errorf("failed to unmarshal Contact ID: %+v", err)
-	}
-
-	// Handle nil ID
-	if bytes.Equal(c.ID.Marshal(), make([]byte, id.ArrIDLen)) {
-		c.ID = nil
-	}
-
-	// Get and decode DhPubKey
-	if dhPubKeySize == 0 {
-		// Handle nil key
-		c.DhPubKey = nil
-	} else {
-		if err = c.DhPubKey.BinaryDecode(buff.Next(int(dhPubKeySize))); err != nil {
-			return Contact{}, errors.Errorf("failed to binary decode Contact DhPubKey: %+v", err)
-		}
-	}
-
-	// Get OwnershipProof
-	if ownershipProofSize == 0 {
-		// Handle nil OwnershipProof
-		c.OwnershipProof = nil
-	} else {
-		c.OwnershipProof = buff.Next(int(ownershipProofSize))
-	}
-
-	// Get and unstringify fact list
-	c.Facts, _, err = fact.UnstringifyFactList(string(buff.Next(int(factsSize))))
-	if err != nil {
-		return Contact{}, errors.Errorf("failed to unstringify Contact fact list: %+v", err)
-	}
-
-	return c, nil
-}
-
-// GetFingerprint creates a 15 character long fingerprint of the contact off of
-// the ID and DH public key.
-func (c Contact) GetFingerprint() string {
-	// Generate hash
-	sha := crypto.SHA256
-	h := sha.New()
-
-	// Hash ID and DH public key
-	h.Write(c.ID.Bytes())
-	h.Write(c.DhPubKey.Bytes())
-	data := h.Sum(nil)
-
-	// Base64 encode hash and truncate it
-	return base64.StdEncoding.EncodeToString(data)[:fingerprintLength]
-}
-
-// MakeQR generates a QR code PNG of the Contact.
-func (c Contact) MakeQR(size int, level qrcode.RecoveryLevel) ([]byte, error) {
-	qrCode, err := qrcode.Encode(string(c.Marshal()), level, size)
-	if err != nil {
-		return nil, errors.Errorf("failed to encode contact to QR code: %v", err)
-	}
-
-	return qrCode, nil
-}
-
-func (c Contact) String() string {
-	return "ID: " + c.ID.String() +
-		"  DhPubKey: " + c.DhPubKey.Text(10) +
-		"  OwnershipProof: " + base64.StdEncoding.EncodeToString(c.OwnershipProof) +
-		"  Facts: " + c.Facts.Stringify()
-}
-
-// Equal determines if the two contacts have the same values.
-func Equal(a, b Contact) bool {
-	return a.ID.Cmp(b.ID) &&
-		a.DhPubKey.Cmp(b.DhPubKey) == 0 &&
-		bytes.Equal(a.OwnershipProof, b.OwnershipProof) &&
-		a.Facts.Stringify() == b.Facts.Stringify()
-}
-
-// getTagContents returns the bytes between the two tags. An error is returned
-// if one ore more tags cannot be found or closing tag precedes the opening tag.
-func getTagContents(b []byte, openTag, closeTag string) ([]byte, error) {
-	// Search for opening tag
-	openIndex := strings.Index(string(b), openTag)
-	if openIndex < 0 {
-		return nil, errors.New("missing opening tag")
-	}
-
-	// Search for closing tag
-	closeIndex := strings.Index(string(b), closeTag)
-	if closeIndex < 0 {
-		return nil, errors.New("missing closing tag")
-	}
-
-	// Return an error if the closing tag comes first
-	if openIndex > closeIndex {
-		return nil, errors.New("tags in wrong order")
-	}
-
-	return b[openIndex+len(openTag) : closeIndex], nil
-}
diff --git a/interfaces/contact/contact_test.go b/interfaces/contact/contact_test.go
deleted file mode 100644
index 578143c15262ae055b0bb9263f94c5a733c909c9..0000000000000000000000000000000000000000
--- a/interfaces/contact/contact_test.go
+++ /dev/null
@@ -1,542 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////
-// Copyright © 2020 xx network SEZC                                          //
-//                                                                           //
-// Use of this source code is governed by a license that can be found in the //
-// LICENSE file                                                              //
-///////////////////////////////////////////////////////////////////////////////
-
-package contact
-
-import (
-	"bytes"
-	"crypto"
-	"encoding/base64"
-	"encoding/json"
-	"fmt"
-	"github.com/liyue201/goqr"
-	"github.com/skip2/go-qrcode"
-	"gitlab.com/elixxir/crypto/cyclic"
-	"gitlab.com/elixxir/primitives/fact"
-	"gitlab.com/xx_network/crypto/csprng"
-	"gitlab.com/xx_network/crypto/large"
-	"gitlab.com/xx_network/primitives/id"
-	"image"
-	"math/rand"
-	"reflect"
-	"strings"
-	"testing"
-)
-
-// Tests marshaling and unmarshalling of a common Contact.
-func TestContact_Marshal_Unmarshal(t *testing.T) {
-	expectedContact := Contact{
-		ID:       id.NewIdFromUInt(rand.Uint64(), id.User, t),
-		DhPubKey: getCycInt(256),
-		Facts: fact.FactList{
-			{Fact: "myUsername", T: fact.Username},
-			{Fact: "devinputvalidation@elixxir.io", T: fact.Email},
-			{Fact: "6502530000US", T: fact.Phone},
-			{Fact: "6502530001US", T: fact.Phone},
-		},
-	}
-
-	buff := expectedContact.Marshal()
-
-	testContact, err := Unmarshal(buff)
-	if err != nil {
-		t.Errorf("Unmarshal() produced an error: %+v", err)
-	}
-
-	if !reflect.DeepEqual(expectedContact, testContact) {
-		t.Errorf("Unmarshaled Contact does not match expected."+
-			"\nexpected: %s\nreceived: %s", expectedContact, testContact)
-	}
-}
-
-// Tests marshaling and unmarshalling of a Contact with nil fields.
-func TestContact_Marshal_Unmarshal_Nil(t *testing.T) {
-	expectedContact := Contact{}
-
-	buff := expectedContact.Marshal()
-
-	testContact, err := Unmarshal(buff)
-	if err != nil {
-		t.Errorf("Unmarshal() produced an error: %+v", err)
-	}
-
-	if !reflect.DeepEqual(expectedContact, testContact) {
-		t.Errorf("Unmarshaled Contact does not match expected."+
-			"\nexpected: %s\nreceived: %s", expectedContact, testContact)
-	}
-}
-
-// Consistency test.
-func TestUnmarshal_Consistency(t *testing.T) {
-	prng := rand.New(rand.NewSource(42))
-	var contacts []Contact
-	expectedContact := []string{
-		"PHh4YygwKUpBQUFBTHdKcjc5a3NaWi9qRk1BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUQrNlNkZ01lZnhKWHBBUWh5dEV1ZnU1Y2JWVU5rTW1SVmRDOVliVEF4TWxGd2RHaGxaM2xtYm5jd04zQldjMDEzVGxsVlZFbHBSazVaVVdGNUswSjNiWGRrV1VORU9XZ3dNMWM0UVhKUlpEbFFhMXBMWlVkUU1uQTFkbWQxVms5a1NUWkNOVFUxVEhaWEwycFVUbmsyYUVRM2J6RnFOazFVTHpSak5pdHdWV0paSzNORk9UQmhja0ZVVDB4eFMwaG1SbFkxZWpaTVNHcG9jMHh5TmpaSlJ6UkxibFZTUTB0UmRUQTRhMFI1Y1ZFd1dtRmxSMGxIUm5CbFN6ZFJlbXA0YzFSNmNtNTJSRFJGYkdKV2VFd3JMMkkwVFVWRGFVZzBVVVJoZWxNeVNWZ3lhM04wWjJaaFFVdEZZMGhJUW5nc1ZUVTFZV2w1VTAxdFoyODBja0pYTkRSR01sZFBSVWRHU21sVlpqazRNRkpDUkhSVVFrWm5TUzl4VDA1WVlUSXZkRW92SzBwa1RISkJlWFl5WVRCR1lWTnpWRmxhTlhwcFYxUm1NMGh1YnpGVVVUTk9iVWhRTVcweE1DOXpTR2gxU2xOU2NUTkpNalZNWkZOR2FXdE5PSEkyTUV4RWVXbGplV2hYUkhoeGMwSnVlbkZpYjNZd1lsVnhlWFJIWjBWQmMxZzNTME5FYjJoa1RXMUVlRE53WlVObk9WTm5iV3BpTldKRFExVkdNR0pxTjFVd1BTeFZjR3RaZVdWdllUUnpUVTloT0dNdlUzTTNWVk5IWlhBMVZYcHhMMUpKTUhOU05UQjVXVWhWZW10R2ExVjVUWGRqT0VveWFtNW5ObE51VVVwTGRreDVlR0ZVYkRkMGVsUnVOM2R3ZFVGbVIwWlVaWFJtTlVOVUt6azJkMmhEU2tneGJERTBjRXR4U3pSeFoxSTRXV015ZWswelVISTFlWGR1YjBwcVFVbGFabUUxY21ONWR6RklabHB2SzBoVWFYbG1TRTlEWTNGSFFWZzFLMGxZVTBSQkx6bENkMkpKSzBWalUwOHdXRlUxTVc5WU0ySjVjRFZwT0ZwT05FOVlZa3RIVTNseVZIZG5QVDA3eHhjPg==",
-		"PHh4YygwKUpBQUFBSkFHOGZaZzl5M2xsdFlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUQrNlNkZ01lZnhKWHBBVkdrM0tBcFhrYkRWV0pFUlVaVlZDOVpVWEJ6V2xOMVJ6WnVlWEZFYUhFMWVYTXlXV1kyUTNkeGVHc3lMMUpvVlZsS1QwbDNWWGhLYW1aS2JrTjFTREYwT0U0eFpUaHZUbTVIVVdOMFduazVhQ3R4UXl0b2RsSllhMmczUkdaQk5VZEVVRVJZUVRsQ09YaG1WbTFIYTFWQ1RUQkRZV05UZEhGYWNYWllkVzFWYVZSTFNuQmxUbTFzZW0xTUszTlNjVVJxZUZwcFRISldUVGRxTlc1V1UwdGpSMFIzV2swMmExZFhSalJaVHpkalNrZFRNbmMxYzJwWVEySnVXRTlFZFZwUVIyeEtiVlZYZDNOTkwyb3pRemRDTDBwWlVURXJObmh1VVd0WGIyNVJhbmR3TlVWTWR6UjRkM05zVkd4dFJIZFlOMDRyVW1Nd1lqaE1lamhIYWxKelVUQTRVbnAzUWtKaU5sbFhiR0pyWjB4dFp6SlBhSGcwWmpCbFJUUkxOMXA0TkZaclIwVTBWRWg0TlRoblVqZzlMRlYyV1doaWVraHlXRFJrV1c1cVNqazRhSGtyUlVRMU1sVXlaak4wY25CUVlrcEtWbmhxTVdkTWFrazRjamROWVhGa2MwOTNLMVZwZG5adFJXNXdZeTlXWVRoRllsQkRObTlPTmtoSFlXRm5hVGt5YUdzM1EzSm5lbGR6UFRzPXh4Yz4=",
-		"PHh4YygwKUpBQUFBS3dDODU0WnRnb0Z6aG9BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUQrNlNkZ01lZnhKWHBBVmZnL1JqV2xyUEhWUzlrT0doelVsSkZkV3g0Y3pGUU1VNVBVM2xUZEV4SllYbENTVVJSUjB4bWQzZFpObVZ0YUdselVEZDRRbE5yV25keGFEWlRXbFE0U0d0QlpVVmpWMnR1U0RaUGNXVmFaR0pOVVVWYVpqQXhUSGw0UXpkRU1DczVaekl5YkRCQ1VtWmpaR3hMTlRkMk9WSmFWRmR4U0VvNGVqSjRVSFJJTTNKb2RtcG9RazFxUzA1RlJDdElSM1p0T0RCV1NYcDNOVTlZYWpFN3h4Yz4=",
-		"PHh4YygwKUpBQUFBUGdFeU1mS3Z6bCt6QXdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUQrNlNkZ01lZnhKWHBBVFZpTEJjc3ZrS3NWVVU1WVcxemRuSmFRalV4ZERnd1VVWnJRMnh0WlhrMk1FZHJRVUpHTVZaMk5XTjBRVmQ2Um5keVMzbHNlREYxZG1ZemRIYzJSMFpGTURkdlJHRjZjMlpYVURWRFpWWkViakJGT1UxS2RYWm9URGxZYUVrelIxbERTMGxGZFVaSE5tSlFURXRpUldKMGFVSlpkbGhWV0U1MFlVSXlUM1ZtYUdkNkt6TnlabTFLVG5aVlpWUmtjVXRMUlRkNGJXOVhOeXhWYURCT04xRmhZMVU0Y1dkd05HTkpRMFp1VHk5TlRWVk1XalV4VVZadmJGWjVZMGRaUTBveVZqbG5UMWd3Y1RsbWFqaHJVa01yVDNBMFUxaHdVa2xUV0d4M2FsZHhibm80V1hBMlRtdFZabEJNTVNzeWIwWlhVbkUwWVVoUGFEWjBRbUZUYlZwNE1YQlZWbmxFYm1ScGRrOXFjbGhrUVV4R0wxUnhSRzlGV1VseFdXdDZRVU5HYVROVmQyWTVWbEl2VmpGSlJFaDVSV2cwVlVWSmNXeHdXRkpYZVhWclkwVTlPdz09eHhjPg==",
-		"PHh4YygwKUpBQUFBS3dEUzNZbldLdkN0QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUQrNlNkZ01lZnhKWHBBUzNEMVRMS2FGdllWV041YlhSWGN6UXZORmhPUWtGalptdHFPVTR2ZFdaeWFqaE1kRTl0TWpNd1pGTnZkV3RYVkZCQ1psWnZNSE5wWlhCT1dtUmtaMWxQV2tsbFVWZFVTa3gwTVhKaVJrSnZkbVpETDJWbFFrZ3daMk00U1dGcU4wUXlURTR6UVVKTU9VbzJVekpYZDB0MWFGTldkbU15TjJWUWF6TlpWbmxEVm1SaFUwa3hXRkZPVEROS2NGZHNZMDUyZVZwSU9IQllhVTAxV0hVeWN5OHlUblZIZDNwNVJHVmhhRVF2YlZWUWRIbHRLMWQyTUROaE9FRjFaRlE0TVhGNU9YVjZPV3BIVlZWRVYwZHhTMXBaY20xRE1UZHNUMkYwWVRCYU93PT14eGM+",
-		"PHh4YygwKUpBQUFBS1FIVlN4S1dVd1RWYVlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUQrNlNkZ01lZnhKWHBBVHJrVnVlazMydUFWV2xqZVhJNGIwZGtaVlV5WlVWdlREbERia3BWT0dKUFZUbDFjVGhhY1ZwSmRYUXZZbEk1VGxGcGJXczBRelpaVGxndlV6Qk5ibll5VlU5QlZFYzBPVmhrWVRKSGJEWmpNRms0TUc5Q2RXRjFOM1pyY2xod2RpODFRVFpWV25CclVHODJOMEpJYTNBNGRIRTJOMFkzWmlzd2NGVlVNSGczVlM5NE1GYzFkRmRhVm1oc1VsZ3hPVlJvTW10Qk4xRTVOakJtU1RSMWVrNUZRMlZRUWxwS1ZucHdWemxFY1U5SVUwVXpTa2N2UzJKSFRYbFVWVkEwVUhORVZUQjJNV3hDZGpNck4ybElhVkY1VUZsRWJuazBVbVlzVlZFNVNXcEpjSEJPVEVsWWVFeERVMGwyTkdaVE1sTnRaM0JJYld4WE0zUjZOVThyZVZGVlRrOU9kRkpRWmxock5HcGhSMlZZVURaRVNWZE9NVzFEWW1aUFptZDZZVlo1YVV0eFdsSnNWV2xSTEZWMlJIVTNTaTlYT0ZOWWRsZFdSV1JPZVRSWmNYUk9NVzl0TmtKT1JHRTFiMjlKVUZkd1pXZ3dlRUo2YTNKdVlXUXpZbGxvZDFkUmVVOWlNRE5wYVRaU2NXRjZhV1F2VEVGcVdFWk1lV1J1YlV4QlZtbDVhV3gxUlhGa01rWXdWR1IxUTA5dlRIaHRObVpSY0ZOVE1WTlRkUzlqY1hjd056aDFVWEJsTXpJeU9FbGFLeTlOVDNwNVdEWmFiWGxUVW5KRFFqRmtURVpsVHpkM1FVbHpTVEZvYjBwa2EwSlFVWFZ4UTNCSk93PT14eGM+",
-		"PHh4YygwKUpBQUFBRFFBNmpaL0toMmZwVmNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUQrNlNkZ01lZnhKWHBBUldmbFZyVnZLTVhWV012YzA1YVNXVTFaa2RyVFcxRVZFTkxRMjAyYlRsVUx6cz14eGM+",
-		"PHh4YygwKUpBQUFBSWdCdVI0djdFazd5Zk1BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUQrNlNkZ01lZnhKWHBBWDcvZDRoSTVEZUtWWEZZY0hKMlMzcHFOM0ZCWWpFeGJFRkVXV1UxWjB4T1ZIZFNXRXgzVjB0dVpVNHlaVzlGU1RGdVZYZG5MMmxIUzFKdEwyTnhaMk05TEZVNE1GaHhia0U5UFRzPXh4Yz4=",
-		"PHh4YygwKUpBQUFBQUlBcGNGR003NU9TWThBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUQrNlNkZ01lZnhKWHBBUXgzeFpkN2VPMmFPdz09eHhjPg==",
-		"PHh4YygwKUpBQUFBUGdDNkdaSWxBaTIzRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUQrNlNkZ01lZnhKWHBBU012OHNFWE1zTS9WUzlOV2xrNGRUSlVVU3RSSzFod1ZEaHdaVkZKVW5kU2RDdGthVWxCY2pSclJYRkZNRm8zV214V2FUaDVhREJxYTJjNFdIRnRSa1ZxZWtWSmRWUjNQVDBzVldWeWVqTkVlVXRKVFZkelQweHdRa1JVUTNRNGIzTnZUbWxwUVdwS1kyVTBSRXhaTVRaR01qbEplbVJCTVZwT05HOW9TMVpQTTJ0WWVrZzVSakYxZDBKVVVqaE1WMUV4YjNSR1JYcFFRVU5MZVN0VlUwMW1kVUZ1ZVVoTWIwRkJXbFZhU0dwSFRrUjZVMlpQUTBwU00yZFBlbGd4Wm1NNVV6cz14eGM+",
-	}
-
-	// Generate test contacts
-	for i := 0; i < 10; i++ {
-		contacts = append(contacts, Contact{
-			ID:       id.NewIdFromUInt(prng.Uint64(), id.User, t),
-			DhPubKey: getGroup().NewInt(prng.Int63()),
-			Facts:    fact.FactList{},
-		})
-
-		for j := 0; j < prng.Intn(5); j++ {
-			username := make([]byte, prng.Intn(255))
-			prng.Read(username)
-			newFact, err := fact.NewFact(fact.Username, base64.StdEncoding.EncodeToString(username))
-			if err != nil {
-				t.Errorf("Failed to generate new fact (%d %d): %+v", i, j, err)
-			}
-			contacts[i].Facts = append(contacts[i].Facts, newFact)
-		}
-
-		// fmt.Printf("\"%s\",\n", base64.StdEncoding.EncodeToString(contacts[i].Marshal()))
-	}
-
-	for i, c := range contacts {
-		contactBase64 := base64.StdEncoding.EncodeToString(c.Marshal())
-		if expectedContact[i] != contactBase64 {
-			t.Errorf("Contacts %d do not match.\nexpected: %s\nreceived: %s",
-				i, expectedContact[i], contactBase64)
-		}
-	}
-}
-
-// Error path: length of buffer is too small.
-func TestUnmarshal_LengthError(t *testing.T) {
-	buff := make([]byte, minLength-1)
-
-	_, err := Unmarshal(buff)
-	if err == nil || !strings.Contains(err.Error(), "too short") {
-		t.Errorf("Unmarshal() did not produce the expected error: %+v", err)
-	}
-}
-
-// Error path: the opening tag is missing.
-func TestUnmarshal_OpenTagError(t *testing.T) {
-	buff := Contact{
-		ID:       id.NewIdFromUInt(rand.Uint64(), id.User, t),
-		DhPubKey: getCycInt(256),
-		Facts: fact.FactList{
-			{Fact: "myUsername", T: fact.Username},
-		},
-	}.Marshal()
-
-	buff = []byte(strings.Replace(string(buff), headTag, "", 1))
-
-	_, err := Unmarshal(buff)
-	if err == nil || !strings.Contains(err.Error(), "missing opening tag") {
-		t.Errorf("Unmarshal() did not produce the expected error: %+v", err)
-	}
-}
-
-// Error path: the closing tag is missing.
-func TestUnmarshal_CloseTagError(t *testing.T) {
-	buff := Contact{
-		ID:       id.NewIdFromUInt(rand.Uint64(), id.User, t),
-		DhPubKey: getCycInt(256),
-		Facts: fact.FactList{
-			{Fact: "myUsername", T: fact.Username},
-		},
-	}.Marshal()
-
-	buff = []byte(strings.Replace(string(buff), footTag, "", 1))
-
-	_, err := Unmarshal(buff)
-	if err == nil || !strings.Contains(err.Error(), "missing closing tag") {
-		t.Errorf("Unmarshal() did not produce the expected error: %+v", err)
-	}
-}
-
-// Error path: the version is incorrect.
-func TestUnmarshal_IncorrectVersionError(t *testing.T) {
-	buff := Contact{
-		ID:       id.NewIdFromUInt(rand.Uint64(), id.User, t),
-		DhPubKey: getCycInt(256),
-		Facts: fact.FactList{
-			{Fact: "myUsername", T: fact.Username},
-		},
-	}.Marshal()
-
-	buff = []byte(strings.Replace(string(buff), openVerTag+version+closeVerTag,
-		openVerTag+version+"0"+closeVerTag, 1))
-
-	_, err := Unmarshal(buff)
-	if err == nil || !strings.Contains(err.Error(), "requires version") {
-		t.Errorf("Unmarshal() did not produce the expected error: %+v", err)
-	}
-}
-
-// Error path: the version is missing.
-func TestUnmarshal_MissingVersionError(t *testing.T) {
-	buff := Contact{
-		ID:       id.NewIdFromUInt(rand.Uint64(), id.User, t),
-		DhPubKey: getCycInt(256),
-		Facts: fact.FactList{
-			{Fact: "myUsername", T: fact.Username},
-		},
-	}.Marshal()
-
-	buff = []byte(strings.Replace(string(buff), openVerTag+version+closeVerTag, "", 1))
-
-	_, err := Unmarshal(buff)
-	if err == nil || !strings.Contains(err.Error(), "requires version") {
-		t.Errorf("Unmarshal() did not produce the expected error: %+v", err)
-	}
-}
-
-// Tests the size of marshaling and JSON marshaling of a Contact with a large
-// amount of data.
-func TestContact_Marshal_Size(t *testing.T) {
-	expectedContact := Contact{
-		ID:             id.NewIdFromUInt(rand.Uint64(), id.User, t),
-		DhPubKey:       getCycInt(512),
-		OwnershipProof: make([]byte, 1024),
-		Facts: fact.FactList{
-			{Fact: "myVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryLongUsername", T: fact.Username},
-			{Fact: "myVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryLongEmail@elixxir.io", T: fact.Email},
-			{Fact: "6502530000US", T: fact.Phone},
-		},
-	}
-	rand.Read(expectedContact.OwnershipProof)
-
-	buff := expectedContact.Marshal()
-
-	marshalBuff, err := json.Marshal(expectedContact)
-	if err != nil {
-		t.Errorf("Marshal() produced an error: %+v", err)
-	}
-
-	t.Logf("size of buff:        %d", len(buff))
-	t.Logf("size of marshalBuff: %d", len(marshalBuff))
-	t.Logf("ratio: %.2f%%", float32(len(buff))/float32(len(marshalBuff))*100)
-	t.Logf("%s", marshalBuff)
-
-	if len(marshalBuff) < len(buff) {
-		t.Errorf("JSON Contact smaller than marshaled contact."+
-			"\nJSON:    %d\nmarshal: %d", len(marshalBuff), len(buff))
-	}
-}
-
-// Unit test of GetFingerprint.
-func TestContact_GetFingerprint(t *testing.T) {
-	c := Contact{
-		ID:       id.NewIdFromString("Samwise", id.User, t),
-		DhPubKey: getCycInt(512),
-	}
-
-	testFP := c.GetFingerprint()
-	if len(testFP) != fingerprintLength {
-		t.Errorf("GetFingerprint() returned fingerprint with unexpected length."+
-			"\nexpected length: %d\nreceived length: %d",
-			fingerprintLength, len(testFP))
-	}
-
-	// Generate expected fingerprint
-	h := crypto.SHA256.New()
-	h.Write(c.ID.Bytes())
-	h.Write(c.DhPubKey.Bytes())
-	expectedFP := base64.StdEncoding.EncodeToString(h.Sum(nil))[:fingerprintLength]
-
-	if strings.Compare(expectedFP, testFP) != 0 {
-		t.Errorf("GetFingerprint() returned expected fingerprint."+
-			"\nexpected: %s\nreceived: %s", expectedFP, testFP)
-	}
-
-}
-
-// Consistency test for changes in underlying dependencies.
-func TestContact_GetFingerprint_Consistency(t *testing.T) {
-	expected := []string{
-		"rBUw1n4jtH4uEYq", "Z/Jm1OUwDaql5cd", "+vHLzY+yH96zAiy",
-		"cZm5Iz78ViOIlnh", "9LqrcbFEIV4C4LX", "ll4eykGpMWYlxw+",
-		"6YQshWJhdPL6ajx", "Y6gTPVEzow4IHOm", "6f/rT2vWxDC9tdt",
-		"rwqbDT+PoeA6Iww", "YN4IFijP/GZ172O", "ScbHVQc2T9SXQ2m",
-		"50mfbCXQ+LIqiZn", "cyRYdMKXByiFdtC", "7g6ujy7iIbJVl4F",
-	}
-
-	for i := range expected {
-		c := Contact{
-			ID:       id.NewIdFromUInt(uint64(i), id.User, t),
-			DhPubKey: getGroup().NewInt(25),
-		}
-
-		fp := c.GetFingerprint()
-		if expected[i] != fp {
-			t.Errorf("GetFingerprint() did not output the expected fingerprint (%d)."+
-				"\nexpected: %s\nreceived: %s", i, expected[i], fp)
-		}
-	}
-}
-
-// Happy path.
-func TestContact_MakeQR(t *testing.T) {
-	c := Contact{
-		ID:       id.NewIdFromUInt(rand.Uint64(), id.User, t),
-		DhPubKey: getCycInt(256),
-		Facts: fact.FactList{
-			{Fact: "myUsername", T: fact.Username},
-			{Fact: "devinputvalidation@elixxir.io", T: fact.Email},
-			{Fact: "6502530000US", T: fact.Phone},
-			{Fact: "6502530001US", T: fact.Phone},
-		},
-	}
-	qrCode, err := c.MakeQR(512, qrcode.Medium)
-	if err != nil {
-		t.Errorf("MakeQR() returned an error: %+v", err)
-	}
-
-	img, _, err := image.Decode(bytes.NewReader(qrCode))
-	if err != nil {
-		t.Fatalf("Failed to decode image: %+v", err)
-	}
-
-	qrCodes, err := goqr.Recognize(img)
-	if err != nil {
-		t.Fatalf("Failed to recognize QR code: %+v", err)
-	}
-
-	var qrBytes []byte
-	for _, qrCode := range qrCodes {
-		qrBytes = append(qrBytes, qrCode.Payload...)
-	}
-
-	if !bytes.Equal(c.Marshal(), qrBytes) {
-		t.Errorf("Generated QR code data does not match expected."+
-			"\nexpected: %+v\nreceived: %+v", c.Marshal(), qrBytes)
-	}
-}
-
-// Consistency test.
-func TestContact_String(t *testing.T) {
-	prng := rand.New(rand.NewSource(42))
-	var contacts []Contact
-	expectedContact := []string{
-		"ID: r79ksZZ/jFMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD  DhPubKey: 6087471365... in GRP: 6SsQ/HAHUn...  OwnershipProof: CcnZND6SugndnVLf15tNdkKbYXoMn58NO6VbDMDWFEyIhTWEGsvgcJsHWAg/YdN1vAK0HfT5GSnhj9qeb4LlTnSOgeeeS71v40zcuoQ+6NY+jE/+HOvqVG2PrBPdGqwEzi6ih3xVec+ix44bC6+uiBuCp1EQikLtPJA8qkNGWnhiBhaX  Facts: Uiv79vgwQKIfhANrNLYhfaSy2B9oAoRwccHHnlqLcLcJaW3Sy4SlwXic/BckjJoKOKwVuOBdljhBhSYlH/fNEQQ7UwRYCP6jjV2tv7Sf/iXS6wMr9mtBWkrE2Gec4lk39x56NU0NzZhz9ZtdP7B4biUkatyNuS3UhYpDPK+tCw8onMoVg8arAZ86m6L9G1KsrRoBALF+ygg6IXTJg8d6XgoPUoJo2+WwglBdG4+1NpkaprotPp7T8OiC6+hp17TJ6hriww5rxz9KztRIZ6nlTOr9EjSxHnTJgdTOQWRTIzBzw,UtzTn7wpuAfGFTetf5CT+96whCJH1l14pKqK4qgR8Yc2zM3Pr5ywnoJjAIZfa5rcyw1HfZo+HTiyfHOCcqGAX5+IX;",
-		"ID: 7vJ2X2idUxcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD  DhPubKey: 2332036530... in GRP: 6SsQ/HAHUn...  OwnershipProof: SDA/9OY4I0J2WhPWluUt92D2w0ZeKaDcpGrDoNVwEzvCFXH19UpkMQVRP9hCmxlK4bqfKoOGrnKzZh/oLCrGTb9GFRgk4jBTEmN8mcK4fW3w3V7yg2cZBy1nL2H6oL6G9FeSHsN8DkYM8NcD0H3F9WYaRQEzQJpxK2pmq9e6ZSJMoml42aXOYv6xGoOPFmIutUzuPmdVIpwYPBkzqRZYXhg7twkZLbDmyNcJudc4O5k8aUmZRbCwz+PcLsH8lhDX7rGdCRaidCPCnkQvDjHCyVOWYA==  Facts: U8F+zAEFvphaVuSAuaDY6HHh/R4TgrtnHhWQYThMfHnyBH72IW8xnNOiTPzyy8l1S+fjHVHrX4dYnjJ98hy+ED50=,UlCvsxqp2w7D5SK++YSelz9VrwRs8Lqg3ocZpqCL3aGTsKuDNa/3fIbEURHS/03zSBrUazgUKthmex7OW1hj94OGimZpvPZ+LergUn3Leulxs1P1NOSyStLIayBIDQGLfwwY6emhisP7xBSkZwqh6SZT8HkAeEcWknH6OqeZdbMQEZf01LyxC7D0+9g22l0BR,UfcdlK64b44QTIyjRA/hxr5vNFSM8OTl49cFw,UiejzJnpD0QYzA209RrgZFq5G/xPWprL62QedbfNEBZApZnsutBpAARdVb+XLQFsxcKyspcdbr397cOhhRNO6A2s7H1j+QnlQ59BPTCbr4S/V4SNxmAiiBLhRumzyymxG7YgWL11FzbWgdjrn4YM/t635iTb1Hk3aiihO8ZqFu4dDe0EDMFo7OGx9NtktIlSZYKcU8qgp4cICFnO/MMULZ51QVolVycGYCJ2V9gOX0q9fj8kRC+Op4SXpRISXlwjWqnz8Yp6NkUfPL1+2oFWRq4aHOh6tBaSmZx0=;",
-		"ID: NUaggzr9xQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD  DhPubKey: 2333463841... in GRP: 6SsQ/HAHUn...  OwnershipProof: aVFcg1IDHyEh4UEIqlpXRWyukcFzKa1azmHq6bZS3zMAtMKrWCd22FtoyjLVw3PCZHhYO8SPo2vkjWWcP+FzQQHH5I/Tf7n64/C7Tptt9HUqLpFkzwX1aNLInqTWXXYGDmSHkFkyS7da2xQaL3wv3ngR9IHPCGo+w9izdwAS/SektlsCroUlb3Nu3j5N2FcglXWkiNV0DS9yaVpXDb8mR/KV4jOV7trP9jbhsM8g3moQ/5lD7cpvlr9N2vALnU/Nasvbs/YxlFA1hqimWK5gte5TmrWtGfK6I9ymZ9+mVRNMWUosgGvfpOdW5Fi0i65JDQQuB6NV6Wz7icyr8oGdeU2eEoL9CnJU8bOU9uq8ZqZIut/bR9NQimk4C6YNX/S0Mnv2UOATG49Xda2Gl6c0Y80oBuau7vkrXpv/5A6UZpkPo67BHkp8tq67F7f+0pUT0x7U/w==  Facts: U7Q960fI4uzNECePBZJVzpW9DqOHSE3JG/KbGMyTUP4PsDU0v1lBv3+7iHiQyPYDny4RfQ9IjIpqkIRRKJ9u3xEDBx5j5ok0shfEsJIi/h9LZKaCkeaVbe3Pk77JBQ0421E99eTiNoZ5c/oMhY3WYJt85+DNpXKIqplGVSJC83M9mrT1zqOGrn4OHfSY7uyf1vEl71lRHTcuGKrTdaJugTQ2uaKCD1qXodMQc5K52nd22IcFkMjm9N4oukams4nfywI1xS8nZ5iwFYsopbhKndhdE3bgjqC8Zun0KUktUkrv3KsNO/LkKXt9tvCGfvzDs8l+mZsk=;",
-		"ID: lGGNsAgA744AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD  DhPubKey: 3355697978... in GRP: 6SsQ/HAHUn...  OwnershipProof: d32mRwa3SFelnx0qfw==  Facts: UNuDmAwt8AGm5fGkMmDTCKCm6m9T/qa9YGW93XjDzyTtJ7C8eijfkSIh3/2x+JCUf4VDs58xa+yztemu8rOPuoBvXWUANh7mAs1PBFcvBYqd43Z6gQjWdTCD+IYpGb9yqB/NFyUfloJaiP4lnz0/hKL3qnPzGWPLtsSSSnNzPWI9JTr4zRsGa7Xh7l8V3Df7ehFz1sEDctgiU,USGbDl7Oo40e3k0PkPl6U/KXkCEcEbfnYiAK+JBKhNGe2ZVYvModI5IPF6phRI8xCLk96jOl0B1OPYfZ+ga42GtW89w8iiDFrDi6QQ0wrfKLKDYogIyXHuAy2NehdvSM3QNWTeKISlTt5F8x/RdbsAU0fC1kNaLRRMzwAisvlEjH7gJ8hy6AAGVGR4xjQ80nzgiUd4Ds19X3PUrloJgqUXJGcj7k=;",
-		"ID: Tpniy8GkRuMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD  DhPubKey: 5811638083... in GRP: 6SsQ/HAHUn...  OwnershipProof: +436hH1mygRoZHScSATHnMmtZLZ2Bw9hP9+WSKJW3DwiOkvOiRWUK9lrAHMdrZWDfD+v/xpMwQIeW0K7dXiccKP3faU8JeBIuQuqHrARGizMUEcrKECJa840U6mtBJct5H/GZEahdvtaE8Jdy7pWu/Y1Xhsq+GZUMfdHKpZhgWafEB9aVyy0GiAUFyBexvVbintbSsYQjuBFVTHkOGRH9fTJGdxLvuMp8Ei+/A7kCstKbG4QctBDAFCN1fNbLPwGgdnQAZaEWYyCdG1Zk/AB99k9z/INedKtTv1e5OyrKPK5thkEWP42xLd1rK9gwVQjlbaM71aNOWA4Tr2KTqoq6+xmTlY4cNuAPSgOPmJwo7D+A4vILZyDD+hE0lawteli8zEznxPYUpc7KcqgPpAUqIfiAe4BFutxC8au4sJO  Facts: ;",
-		"ID: 1oKcn8YUNmwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD  DhPubKey: 3236160443... in GRP: 6SsQ/HAHUn...  OwnershipProof: XQ==  Facts: ;",
-		"ID: axTLAX4/+QYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD  DhPubKey: 1614413914... in GRP: 6SsQ/HAHUn...  OwnershipProof: kET7EBq5eBYhI2vBK/rFKCQZxqb4PUfN5vH1mzwAd3fIAAtw4cDIkCK52xNm0x0FAN2fAkPW6rUP0gFhx0hJw94sUaubeM+WWRCILcf1O8cyCxz0hHL2SzZB39Npj3NM2Q5cA3hMWMAcrvqWoVNZPxQqYFWLMoCUCnrl2NArseYXnTlaw8HM3BUfxAXR9ykcOirumjokeGAv1lx7Zq3/Nor7+NgAzkvg7A==  Facts: UvJeHltfAZz4b4IuT+oQigYxDRcFmXIeSJhLevueTpWt1dJvStEJQ8fxvrIP9a5Akudp/q8qRN3ROkECcY8qhZZKBX83ad5hGDxWmCMhmu52G4ZphEv7n3VQk8nl1kw5GEQctlA/8ddAcFCGjwC1Oix/aSZ1w5G/Mv150q6KPqRwakPPsQUNT88axEeSzG7Q3;",
-		"ID: 8Yxj1sakWu8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD  DhPubKey: 2695834924... in GRP: 6SsQ/HAHUn...  OwnershipProof: Bueor1WImHOvaWnYzREROrO+15NoXHHkJqxZCTRVQFHmr49s2K1+1o7QoynfRvFoNfdi7Gblzd7rv5fIMh2GwIbkoLsFSzm0XzjvEssVbacG55mYkHQDXf8fw3602l3g8VoU1TsV5r0CW99pCsBtT1gRrBaUdSVHJPjLwXONzIjQZ4Hb8XXRrP9rumYtjB57FlrXFrVdeB5xXutFT0vVGBr/l1P4/CXNcUZEpPBbRmoJaX5SWlfqGwlMwz25Iso0/4OcsBSEGlDOTTE8MH8BYiDseHK+POQUolVYYQ/bJqXlsK1TPBnPDwAmUb3oBYSSNA/s1mNoxAozwKm71rcB/6QIUFrdiSxbhPWEtcvhSbu665AYmk3Qh8dbOqR+lAVnJ0rFlfiEcy1HMYvBiehrQXsL77Gipdj5QEAhFD+Na90HwAFsKBX2N2oPZfNAvBe/wL77U2aUcA6rUPqzatLnvpfTkZgoNRucWlpBUIRuAWdMsZggTFqg4Dy08scD0td+SsKx7bBgs42ROekFcJKcM7bt7YBzWtDdfeQBUfO6AjOE/pmH/9rtGaMPQPCLrMJX0IRFAY7pB3av3sKkXxw411/Sn1JdfBAwzprPX0ZCYRAt62a1  Facts: UqvuMBBw9/qOBX+rjhWrgFRjjutdNVdi4bW4/33JPJ3qimfZueTPThEradJSQt+A58swj0bEQmT/NYorArSzhdwgxbbxXbjZQZymy9IeZMyKOUJu/Z44h0hwzuEhAE8URf/HBT/Ddh1otZUTFHcUISyMCBvjsDPt271DoznXbWrzRYLbpUSl4j/p1+6Er+7E3r9YD1rg1UqSUYB6UuZh1FUKRbffLpeCmEz/SRdf0xLtCYkRK0b8OXQKaa3Snl3euAFxCSQA71dlvckUYW0EcQzi20c2q7pHDI43wmp8QDzMHRdq1DfCKL2WbkMKlv7fmojrx5wxZB/LI+T1X;",
-		"ID: sij0FdgAF1gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD  DhPubKey: 7970589899... in GRP: 6SsQ/HAHUn...  OwnershipProof: FjUO2mXwsCqY6ZgTgKuJ21XgF9J4y0t3ReeI6n3PCDjFLFDZfFinZpfsfzaUFiyJghZ4xPJBP3AfeYY/K6YZyMlfObuNWqZuYBWR8kwWAqaDvxBfHWv91y22LfCbudWqQq4rCl7FmmdH4DD8/VClzFjPOMEYY+09uu1aK0G7bkwY5RC8UcZZz/iose+IdDSUDNw18vsSxh78UwDrSGjtgjl7En7PBZAsmBI95xJx6EcHnQtqaiyDKCDqIxz+zlXoxLMPr4MN  Facts: ;",
-		"ID: Qk08ktHpcTwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD  DhPubKey: 8634899332... in GRP: 6SsQ/HAHUn...  OwnershipProof: C2FxLpJ09wxAzji8zUYo4m9mFEz7A4nSdU9b7RS8tHCjLgjIFbDKheupcpUknOdI0KrwXnoueFNfleBMD9Y1n4WMq8EQR+pd9pAQO7qnK/UJ6Uy+oXMYoDZxyAgw5+5t9axCL+qCA1JXg5ydcWcOuFVreKPSB3ph6BOw/BNTRQJz9lELiUf50YXg2X2J67COYcIwATtZdKohq3QWLP7z7h3UuEdLij8pBdolkZ6ep7EQiuDzA6FlybeM2Ol0JLxzAQnNll+i9YyLkMjai7Uh7ehI/Pjwu9SMF2Acx92JKK6TlZD+B9MUUob7K6YslJw88Xo6OwltKwaSMYl2BmBzQNGVVUxGIxoBskxw8ZYDnpnCfbUGRr/7KLeCpztJCRkbIDeIjz573wi2Y/BfsKqS8ghtePl8pAQF9D4y7YWiIVh765ikj9tGf/uQrx54ZgVXLwA4Xf7jBIj6bjbBvtfTydpCPqhdM10v5l8sC9nJaEizIav6X3DsLuuk+mSgbgkXs4Wn/6MdAQ==  Facts: UrwVSFzs67yCX7w==,UbjwYBN8R5AFUi/hsSHZEa0+E+Bh1xreC7ne1gd5EKq7TVzpT2jFNI4kQNvARtTB+77qyhhm0wcoYRouuoLfaAYcZXKV7J0P81dcBdEpukTouvkq4Q06/,UB4svYp78zmWbHTU5+ClA/W9R/yCwY+xMQDY5JZUK0s8q/MNPwQmmfrt46F9h1mf3Fu1xegZVg8tItYCbeS3Y0I0ewNQXEv/5d5B11w50EAeCWg+CqVSnkZw8Y5Dl0IS/M9tNAfqGeR0hfk8u4q9DittnhjrJ83moTlT6pYalSgms8FksF+vnoPkFwggVcobndU3WOklKgitR29gd4HgveN2F8jNC3K77YoRlenfgkYCRuQRrFARnUY4z+0UPOxaOjz63jGbGEUoldx2u6IhN1DwcpNlgCLUsV4f/re8XrtozQCDeMA==;",
-	}
-
-	// Generate test contacts
-	for i := 0; i < 10; i++ {
-		contacts = append(contacts, Contact{
-			ID:             id.NewIdFromUInt(prng.Uint64(), id.User, t),
-			DhPubKey:       getGroup().NewInt(prng.Int63()),
-			OwnershipProof: make([]byte, prng.Intn(512)),
-			Facts:          fact.FactList{},
-		})
-
-		prng.Read(contacts[i].OwnershipProof)
-
-		for j := 0; j < prng.Intn(5); j++ {
-			username := make([]byte, prng.Intn(255))
-			prng.Read(username)
-			newFact, err := fact.NewFact(fact.Username, base64.StdEncoding.EncodeToString(username))
-			if err != nil {
-				t.Errorf("Failed to generate new fact (%d %d): %+v", i, j, err)
-			}
-			contacts[i].Facts = append(contacts[i].Facts, newFact)
-		}
-
-		fmt.Printf("\"%s\",\n", contacts[i].String())
-	}
-
-	for i, c := range contacts {
-		if expectedContact[i] != c.String() {
-			t.Errorf("Contacts %d do not match.\nexpected: %s\nreceived: %s",
-				i, expectedContact[i], c)
-		}
-	}
-}
-
-// Happy path.
-func TestEqual(t *testing.T) {
-	a := Contact{
-		ID:             id.NewIdFromUInt(rand.Uint64(), id.User, t),
-		DhPubKey:       getCycInt(512),
-		OwnershipProof: make([]byte, 1024),
-		Facts: fact.FactList{
-			{Fact: "myUsername", T: fact.Username},
-			{Fact: "devinputvalidation@elixxir.io", T: fact.Email},
-		},
-	}
-	rand.Read(a.OwnershipProof)
-	b := Contact{
-		ID:             a.ID,
-		DhPubKey:       a.DhPubKey,
-		OwnershipProof: a.OwnershipProof,
-		Facts:          a.Facts,
-	}
-	c := Contact{
-		ID:             id.NewIdFromUInt(rand.Uint64(), id.User, t),
-		DhPubKey:       getCycInt(512),
-		OwnershipProof: make([]byte, 1024),
-	}
-
-	if !Equal(a, b) {
-		t.Errorf("Equal reported two equal contacts as different."+
-			"\na: %s\nb: %s", a, b)
-	}
-
-	if Equal(a, c) {
-		t.Errorf("Equal reported two unequal contacts as the same."+
-			"\na: %s\nc: %s", a, c)
-	}
-}
-
-// Happy path.
-func Test_getTagContents(t *testing.T) {
-	testData := map[string]string{
-		"test1": "adawdawd" + headTag + "test1" + footTag + "awdwdawd",
-		"test2": "adawdawd" + headTag + "test2" + footTag + "awdwdawd" + headTag + "test2" + footTag + "awdwdawd",
-	}
-
-	for expected, str := range testData {
-		received, err := getTagContents([]byte(str), headTag, footTag)
-		if err != nil {
-			t.Errorf("Failed to get tag contents from string %s", str)
-		}
-
-		if expected != string(received) {
-			t.Errorf("Failed to get the expected contents."+
-				"\nexpected: %s\nreceived: %s", expected, received)
-		}
-	}
-}
-
-// Error path.
-func Test_getTagContents_MissingTagsError(t *testing.T) {
-	testData := []string{
-		"adawdawd" + headTag + "test1" + "awdwdawd",
-		"adawdawd" + footTag + "test2" + headTag + "awdwdawd",
-		"adawdawd" + headTag + "test3" + "awdwdawd" + headTag + "test3" + "awdwdawd",
-	}
-
-	for _, str := range testData {
-		_, err := getTagContents([]byte(str), headTag, footTag)
-		if err == nil {
-			t.Errorf("Retrieved tag contents when tags are missing: %s", str)
-		}
-	}
-}
-
-func getCycInt(size int) *cyclic.Int {
-	buff, err := csprng.GenerateInGroup(getGroup().GetPBytes(), size, csprng.NewSystemRNG())
-	if err != nil {
-		panic(err)
-	}
-
-	cycInt := cyclic.NewGroup(large.NewIntFromBigInt(getGroup().GetP().BigInt()),
-		large.NewInt(2)).NewIntFromBytes(buff)
-
-	return cycInt
-}
-
-func getGroup() *cyclic.Group {
-	return cyclic.NewGroup(
-		large.NewIntFromString("E2EE983D031DC1DB6F1A7A67DF0E9A8E5561DB8E8D4941"+
-			"3394C049B7A8ACCEDC298708F121951D9CF920EC5D146727AA4AE535B0922C688"+
-			"B55B3DD2AEDF6C01C94764DAB937935AA83BE36E67760713AB44A6337C20E7861"+
-			"575E745D31F8B9E9AD8412118C62A3E2E29DF46B0864D0C951C394A5CBBDC6ADC"+
-			"718DD2A3E041023DBB5AB23EBB4742DE9C1687B5B34FA48C3521632C4A530E8FF"+
-			"B1BC51DADDF453B0B2717C2BC6669ED76B4BDD5C9FF558E88F26E5785302BEDBC"+
-			"A23EAC5ACE92096EE8A60642FB61E8F3D24990B8CB12EE448EEF78E184C7242DD"+
-			"161C7738F32BF29A841698978825B4111B4BC3E1E198455095958333D776D8B2B"+
-			"EEED3A1A1A221A6E37E664A64B83981C46FFDDC1A45E3D5211AAF8BFBC072768C"+
-			"4F50D7D7803D2D4F278DE8014A47323631D7E064DE81C0C6BFA43EF0E6998860F"+
-			"1390B5D3FEACAF1696015CB79C3F9C2D93D961120CD0E5F12CBB687EAB045241F"+
-			"96789C38E89D796138E6319BE62E35D87B1048CA28BE389B575E994DCA7554715"+
-			"84A09EC723742DC35873847AEF49F66E43873", 16),
-		large.NewIntFromString("2", 16))
-}
-
-// func Test_GenerateContact(t *testing.T) {
-// 	intString := "408f6ed2c7fddc4224df972a305dc7ce974ebf821266cee696cb206d21a3" +
-// 		"1d7c30fbc2d724fb7b16030adb486ac9d89b8b230a3f479f636a0f24fd0465d224608" +
-// 		"cb0a67e5e6682ab14c006330556d10e54447b81acfbd7012a762a95a1c04dd4beb76d" +
-// 		"9f94e712f309ca49b9c566a7545e2c8dea85abd40626a176d371950ccab5442bf5954" +
-// 		"f0f9136d788b1c938e4f4f29927a931e0dc97033ae5d6a8fc9adfbd774aea6230e1d6" +
-// 		"c064c1a995f033d026b050fd955fb1e791d15dd98ee6ff244a5f25c81f753bb82d18c" +
-// 		"e071ce5d79646f306d013d2a86555a0847134173fbf3a9b1eec15934d0af3d0405cac" +
-// 		"fb6425e7d83b20551230f535f87a4ac92c79e615c29571deeeff0d7b7298e1c03b02e" +
-// 		"1bc6e2c56ebea2ec1bffd200358ee52bd330853194632fd5229f08dbcc409b76edb0c" +
-// 		"9c6ed70914aea1be2f0baefff4b4b5578fb1f03b8c49f91498cc4dedf7d51c5c89f9e" +
-// 		"c31d50924ffa972c4e78d3df7649963adfb96cf267f28af15b42a6697635f9c9dc49c" +
-// 		"0ad4b4d45265e8c672643f01b5617a5c35fe24ca1fc92954"
-// 	example := Contact{
-// 		ID:       id.NewIdFromString("MyContactID", id.User, t),
-// 		DhPubKey: getGroup().NewIntFromString(intString, 16),
-// 		Facts: fact.FactList{
-// 			{Fact: "myUsername", T: fact.Username},
-// 			{Fact: "devinputvalidation@elixxir.io", T: fact.Email},
-// 			{Fact: "6502530000US", T: fact.Phone},
-// 		},
-// 	}
-//
-// 	exampleBase64 := base64.StdEncoding.EncodeToString(example.Marshal())
-// 	fmt.Printf("%s\n", example.Marshal())
-// 	fmt.Printf("%s\n", exampleBase64)
-//
-// 	err := utils.WriteFile("testContact.bin", example.Marshal(), utils.FilePerms, utils.DirPerms)
-// 	if err != nil {
-// 		t.Errorf("Failed to save contact file: %+v", err)
-// 	}
-//
-// 	qrCode, err := example.MakeQR(512, qrcode.Medium)
-// 	if err != nil {
-// 		t.Errorf("Failed to generate QR code: %+v", err)
-// 	}
-//
-// 	err = utils.WriteFile("testContactQR.png", qrCode, utils.FilePerms, utils.DirPerms)
-// 	if err != nil {
-// 		t.Errorf("Failed to save contact file: %+v", err)
-// 	}
-//
-// 	path := "newContact.bin"
-//
-// 	if !utils.FileExists(path) {
-// 		return
-// 	}
-//
-// 	newContactData, err := utils.ReadFile(path)
-// 	if err != nil {
-// 		t.Fatalf("Failed to read contact file: %+v", err)
-// 	}
-//
-// 	if !bytes.Equal(example.Marshal(), newContactData) {
-// 		t.Errorf("Contact base64 do not match.\nexpected: %s\nreceived: %s",
-// 			example.Marshal(), newContactData)
-// 	}
-//
-// 	newContact, err := Unmarshal(newContactData)
-// 	if err != nil {
-// 		t.Errorf("Failed to unmarshal contact: %+v", err)
-// 	}
-//
-// 	if !Equal(example, newContact) {
-// 		t.Errorf("Contact files do not match.\nexpected: %s\nreceived: %s",
-// 			example, newContact)
-// 	}
-// }
diff --git a/interfaces/user/user.go b/interfaces/user/user.go
index 1aaea8a31d67d0dd1facb50cbb7170a0055abf92..7d480700e0e1c048b4ac9fcd98edb6fb25112b51 100644
--- a/interfaces/user/user.go
+++ b/interfaces/user/user.go
@@ -8,7 +8,7 @@
 package user
 
 import (
-	"gitlab.com/elixxir/client/interfaces/contact"
+	"gitlab.com/elixxir/crypto/contact"
 	"gitlab.com/elixxir/crypto/cyclic"
 	"gitlab.com/elixxir/primitives/fact"
 	"gitlab.com/xx_network/crypto/signature/rsa"
diff --git a/single/manager_test.go b/single/manager_test.go
index a9718de7c884b0c7135d676c13672a5d97b78587..5ee50ed606ff203253729aae941e248c224df533 100644
--- a/single/manager_test.go
+++ b/single/manager_test.go
@@ -12,7 +12,6 @@ import (
 	"errors"
 	"gitlab.com/elixxir/client/api"
 	"gitlab.com/elixxir/client/interfaces"
-	contact2 "gitlab.com/elixxir/client/interfaces/contact"
 	"gitlab.com/elixxir/client/interfaces/message"
 	"gitlab.com/elixxir/client/interfaces/params"
 	"gitlab.com/elixxir/client/stoppable"
@@ -21,6 +20,7 @@ import (
 	"gitlab.com/elixxir/client/storage/versioned"
 	"gitlab.com/elixxir/client/switchboard"
 	"gitlab.com/elixxir/comms/network"
+	contact2 "gitlab.com/elixxir/crypto/contact"
 	"gitlab.com/elixxir/crypto/e2e"
 	"gitlab.com/elixxir/crypto/e2e/singleUse"
 	"gitlab.com/elixxir/crypto/fastRNG"
diff --git a/single/reception_test.go b/single/reception_test.go
index ffe1991fd9cffaceb78a1308945054b1f8cf3ab6..3266d9904b2fb51dd592c766b61a9c40409e0925 100644
--- a/single/reception_test.go
+++ b/single/reception_test.go
@@ -2,8 +2,8 @@ package single
 
 import (
 	"bytes"
-	contact2 "gitlab.com/elixxir/client/interfaces/contact"
 	"gitlab.com/elixxir/client/interfaces/message"
+	contact2 "gitlab.com/elixxir/crypto/contact"
 	"gitlab.com/elixxir/crypto/e2e/singleUse"
 	"gitlab.com/elixxir/primitives/format"
 	"gitlab.com/xx_network/primitives/id"
diff --git a/single/transmission.go b/single/transmission.go
index 4f7a85048cd4becc8ed4dbb62e39565e505744f8..d5289f339b1120c87256228d87fd7b7514c0a9d7 100644
--- a/single/transmission.go
+++ b/single/transmission.go
@@ -11,11 +11,11 @@ import (
 	"fmt"
 	"github.com/pkg/errors"
 	jww "github.com/spf13/jwalterweatherman"
-	contact2 "gitlab.com/elixxir/client/interfaces/contact"
 	"gitlab.com/elixxir/client/interfaces/params"
 	"gitlab.com/elixxir/client/interfaces/utility"
 	"gitlab.com/elixxir/client/storage/reception"
 	ds "gitlab.com/elixxir/comms/network/dataStructures"
+	contact2 "gitlab.com/elixxir/crypto/contact"
 	"gitlab.com/elixxir/crypto/cyclic"
 	"gitlab.com/elixxir/crypto/e2e/auth"
 	"gitlab.com/elixxir/crypto/e2e/singleUse"
diff --git a/single/transmission_test.go b/single/transmission_test.go
index b3697d4fd3c659edb4863d0a0a6810b605091e7c..367a8b3bfa4bd07df0e266045281624934ea3ee3 100644
--- a/single/transmission_test.go
+++ b/single/transmission_test.go
@@ -2,9 +2,9 @@ package single
 
 import (
 	"bytes"
-	contact2 "gitlab.com/elixxir/client/interfaces/contact"
 	pb "gitlab.com/elixxir/comms/mixmessages"
 	ds "gitlab.com/elixxir/comms/network/dataStructures"
+	contact2 "gitlab.com/elixxir/crypto/contact"
 	"gitlab.com/elixxir/crypto/cyclic"
 	"gitlab.com/elixxir/crypto/e2e/auth"
 	"gitlab.com/elixxir/crypto/e2e/singleUse"
diff --git a/storage/auth/request.go b/storage/auth/request.go
index c33d9b02cbe2477725438903052102fdf18d11ff..b6088352d29a3d0dc584f635ac7d0d26db021bad 100644
--- a/storage/auth/request.go
+++ b/storage/auth/request.go
@@ -8,7 +8,7 @@
 package auth
 
 import (
-	"gitlab.com/elixxir/client/interfaces/contact"
+	"gitlab.com/elixxir/crypto/contact"
 	"sync"
 )
 
diff --git a/storage/auth/store.go b/storage/auth/store.go
index e87a3fe1081a623cb70b014fea70e1b2830b8535..a03dee9eaced47223f597f14d78c6c093ede6cfd 100644
--- a/storage/auth/store.go
+++ b/storage/auth/store.go
@@ -11,9 +11,9 @@ import (
 	"encoding/json"
 	"github.com/pkg/errors"
 	jww "github.com/spf13/jwalterweatherman"
-	"gitlab.com/elixxir/client/interfaces/contact"
 	"gitlab.com/elixxir/client/storage/utility"
 	"gitlab.com/elixxir/client/storage/versioned"
+	"gitlab.com/elixxir/crypto/contact"
 	"gitlab.com/elixxir/crypto/cyclic"
 	"gitlab.com/elixxir/crypto/e2e/auth"
 	"gitlab.com/elixxir/primitives/format"
diff --git a/storage/auth/store_test.go b/storage/auth/store_test.go
index 591cc31b483e05fcee8bb8084416d3dc71b61c0d..94d0318f3d702cd7f9fb58860ada31a1b6f54b17 100644
--- a/storage/auth/store_test.go
+++ b/storage/auth/store_test.go
@@ -8,8 +8,8 @@
 package auth
 
 import (
-	"gitlab.com/elixxir/client/interfaces/contact"
 	"gitlab.com/elixxir/client/storage/versioned"
+	"gitlab.com/elixxir/crypto/contact"
 	"gitlab.com/elixxir/crypto/cyclic"
 	"gitlab.com/elixxir/crypto/e2e/auth"
 	"gitlab.com/elixxir/ekv"
diff --git a/storage/utility/contact.go b/storage/utility/contact.go
index 89b9b31548ce467231e556fb607af106a25dedce..cccfef3483c47fc83579563e29b18e0578a17610 100644
--- a/storage/utility/contact.go
+++ b/storage/utility/contact.go
@@ -9,8 +9,8 @@ package utility
 
 import (
 	"fmt"
-	"gitlab.com/elixxir/client/interfaces/contact"
 	"gitlab.com/elixxir/client/storage/versioned"
+	"gitlab.com/elixxir/crypto/contact"
 	"gitlab.com/xx_network/primitives/id"
 	"gitlab.com/xx_network/primitives/netTime"
 )
diff --git a/ud/lookup.go b/ud/lookup.go
index d7ce0fa69f2addc3bb09419f98ec60b3a6cc2985..e7bdb0da0c0ed10bc8ccaa15c79bc6b9c30b8a9e 100644
--- a/ud/lookup.go
+++ b/ud/lookup.go
@@ -5,7 +5,7 @@ import (
 	"github.com/golang/protobuf/proto"
 	"github.com/pkg/errors"
 	jww "github.com/spf13/jwalterweatherman"
-	"gitlab.com/elixxir/client/interfaces/contact"
+	"gitlab.com/elixxir/crypto/contact"
 	"gitlab.com/xx_network/primitives/id"
 	"time"
 )
diff --git a/ud/lookup_test.go b/ud/lookup_test.go
index 413b85f9d0443411977557937dfd74cee8833d63..8bdb21a1ae0d347b8561da54a52d4c9dcf7bb33e 100644
--- a/ud/lookup_test.go
+++ b/ud/lookup_test.go
@@ -3,9 +3,9 @@ package ud
 import (
 	"github.com/golang/protobuf/proto"
 	"github.com/pkg/errors"
-	"gitlab.com/elixxir/client/interfaces/contact"
 	"gitlab.com/elixxir/client/single"
 	"gitlab.com/elixxir/client/stoppable"
+	"gitlab.com/elixxir/crypto/contact"
 	"gitlab.com/elixxir/crypto/cyclic"
 	"gitlab.com/xx_network/crypto/large"
 	"gitlab.com/xx_network/primitives/id"
diff --git a/ud/manager.go b/ud/manager.go
index d38c5aa5b7f2490e75fc502dd89c131c2faad94a..842d8d353a6d05ab523db2f887c2036d169f976c 100644
--- a/ud/manager.go
+++ b/ud/manager.go
@@ -5,11 +5,11 @@ import (
 	jww "github.com/spf13/jwalterweatherman"
 	"gitlab.com/elixxir/client/api"
 	"gitlab.com/elixxir/client/interfaces"
-	"gitlab.com/elixxir/client/interfaces/contact"
 	"gitlab.com/elixxir/client/single"
 	"gitlab.com/elixxir/client/stoppable"
 	"gitlab.com/elixxir/client/storage"
 	"gitlab.com/elixxir/comms/client"
+	"gitlab.com/elixxir/crypto/contact"
 	"gitlab.com/elixxir/crypto/cyclic"
 	"gitlab.com/elixxir/crypto/fastRNG"
 	"gitlab.com/xx_network/comms/connect"
diff --git a/ud/search.go b/ud/search.go
index 5367fe10c5d65b22814a799f6071584ffeca8e24..8624c778d1be0d6f8443b6fe0ca13153ac82c429 100644
--- a/ud/search.go
+++ b/ud/search.go
@@ -4,7 +4,7 @@ import (
 	"github.com/golang/protobuf/proto"
 	"github.com/pkg/errors"
 	jww "github.com/spf13/jwalterweatherman"
-	"gitlab.com/elixxir/client/interfaces/contact"
+	"gitlab.com/elixxir/crypto/contact"
 	"gitlab.com/elixxir/crypto/factID"
 	"gitlab.com/elixxir/primitives/fact"
 	"gitlab.com/xx_network/primitives/id"
diff --git a/ud/search_test.go b/ud/search_test.go
index bbbb65c0d517f8abaa09df06628a5acecd663e27..ac14e1a63243fc4d0296768c23420cf1adc03f16 100644
--- a/ud/search_test.go
+++ b/ud/search_test.go
@@ -4,9 +4,9 @@ import (
 	"fmt"
 	"github.com/golang/protobuf/proto"
 	errors "github.com/pkg/errors"
-	"gitlab.com/elixxir/client/interfaces/contact"
 	"gitlab.com/elixxir/client/single"
 	"gitlab.com/elixxir/client/stoppable"
+	"gitlab.com/elixxir/crypto/contact"
 	"gitlab.com/elixxir/crypto/cyclic"
 	"gitlab.com/elixxir/crypto/factID"
 	"gitlab.com/elixxir/primitives/fact"