diff --git a/libgm/crypto/ecdsa.go b/libgm/crypto/ecdsa.go index 79ceeeb..12b0d77 100644 --- a/libgm/crypto/ecdsa.go +++ b/libgm/crypto/ecdsa.go @@ -5,6 +5,7 @@ import ( "crypto/elliptic" "crypto/rand" "crypto/sha256" + "crypto/x509" "encoding/base64" "fmt" "math/big" @@ -64,12 +65,12 @@ func (t *JWK) GetPublicKey() (*ecdsa.PublicKey, error) { return pubKey, nil } -func (t *JWK) MarshalPubKey() ([]byte, error) { +func (t *JWK) MarshalX509PublicKey() ([]byte, error) { pubKey, err := t.GetPublicKey() if err != nil { return nil, err } - return elliptic.Marshal(pubKey.Curve, pubKey.X, pubKey.Y), nil + return x509.MarshalPKIXPublicKey(pubKey) } func (t *JWK) SignRequest(requestID string, timestamp int64) ([]byte, error) { diff --git a/libgm/crypto/encode.go b/libgm/crypto/encode.go deleted file mode 100644 index 0b1591f..0000000 --- a/libgm/crypto/encode.go +++ /dev/null @@ -1,45 +0,0 @@ -package crypto - -var SequenceOne = []int{1, 2, 840, 10045, 2, 1} -var SequenceTwo = []int{1, 2, 840, 10045, 3, 1, 7} - -func EncodeValues(a *[]byte, b []int) { - *a = append(*a, 6) - idx := len(*a) - *a = append(*a, 0) - *a = append(*a, byte(40*b[0]+b[1])) - for i := 2; i < len(b); i++ { - d := b[i] - e := make([]byte, 0) - if d > 128 { - e = append(e, byte(d/128)+128) - } - e = append(e, byte(d%128)) - *a = append(*a, e...) - } - (*a)[idx] = byte(len(*a) - idx - 1) -} - -func AppendBytes(a []byte, b []byte) []byte { - newA := make([]byte, len(a)) - copy(newA, a) - - newA = HelperAppendBytes(newA, 48) - newA = HelperAppendBytes(newA, byte(len(b))) - for _, value := range b { - newA = HelperAppendBytes(newA, value) - } - return newA -} - -func HelperAppendBytes(a []byte, b byte) []byte { - return append(a, b) -} - -func AppendByteSequence(byteArr1 []byte, byteArr2 []byte, uncompressedPublicKey []byte) []byte { - copiedByteArray := AppendBytes(byteArr1, byteArr2) - copiedByteArray = HelperAppendBytes(copiedByteArray, 3) - copiedByteArray = HelperAppendBytes(copiedByteArray, uint8(len(uncompressedPublicKey)+1)) - copiedByteArray = HelperAppendBytes(copiedByteArray, 0) - return copiedByteArray -} diff --git a/libgm/payload/registerPhoneRelay.go b/libgm/payload/registerPhoneRelay.go index 3a468a0..41ca218 100644 --- a/libgm/payload/registerPhoneRelay.go +++ b/libgm/payload/registerPhoneRelay.go @@ -11,9 +11,9 @@ import ( func RegisterPhoneRelay(jwk *crypto.JWK) ([]byte, *binary.AuthenticationContainer, error) { id := util.RandomUUIDv4() - encryptedKeys, encryptErr := uncompressKey(jwk) - if encryptErr != nil { - return nil, nil, encryptErr + key, err := jwk.MarshalX509PublicKey() + if err != nil { + return nil, nil, err } payloadData := &binary.AuthenticationContainer{ @@ -27,7 +27,7 @@ func RegisterPhoneRelay(jwk *crypto.JWK) ([]byte, *binary.AuthenticationContaine KeyData: &binary.KeyData{ EcdsaKeys: &binary.ECDSAKeys{ Field1: 2, - EncryptedKeys: encryptedKeys, + EncryptedKeys: key, }, }, }, @@ -38,23 +38,3 @@ func RegisterPhoneRelay(jwk *crypto.JWK) ([]byte, *binary.AuthenticationContaine } return encoded, payloadData, nil } - -func uncompressKey(jwk *crypto.JWK) ([]byte, error) { - uncompressedPublicKey, err3 := jwk.MarshalPubKey() - if err3 != nil { - return nil, err3 - } - var emptyByteArray []byte - crypto.EncodeValues(&emptyByteArray, crypto.SequenceOne) - crypto.EncodeValues(&emptyByteArray, crypto.SequenceTwo) - - var copiedByteArray []byte - copiedByteArray = crypto.AppendByteSequence(copiedByteArray, emptyByteArray, uncompressedPublicKey) - for _, value := range uncompressedPublicKey { - copiedByteArray = crypto.HelperAppendBytes(copiedByteArray, value) - } - - var encryptedKeys []byte - encryptedKeys = crypto.AppendBytes(encryptedKeys, copiedByteArray[0:]) - return encryptedKeys, nil -}