@ -19,8 +19,8 @@ import (
"github.com/mattn/go-xmpp" // BSD-3-Clause
)
func oxDecrypt ( m xmpp . Chat , client * xmpp . Client , user string ,
oxPrivKey * crypto . Key ) ( string , time . Time , error ) {
func oxDecrypt ( m xmpp . Chat , client * xmpp . Client , iqc chan xmpp . IQ ,
user string , oxPrivKey * crypto . Key ) ( string , time . Time , error ) {
var cryptMsgByte [ ] byte
var err error
sender := strings . Split ( m . Remote , "/" ) [ 0 ]
@ -39,7 +39,7 @@ func oxDecrypt(m xmpp.Chat, client *xmpp.Client, user string,
if err != nil {
return "error" , time . Now ( ) , err
}
senderKeyRing , err := oxGetPublicKeyRing ( client , sender)
senderKeyRing , err := oxGetPublicKeyRing ( client , iqc, sender)
if err != nil {
return "error" , time . Now ( ) , err
}
@ -103,7 +103,8 @@ func isOxMsg(m xmpp.Chat) bool {
return false
}
func oxImportPrivKey ( jid string , privKeyLocation string , client * xmpp . Client ) error {
func oxImportPrivKey ( jid string , privKeyLocation string , client * xmpp . Client ,
iqc chan xmpp . IQ ) error {
xmppURI := "xmpp:" + jid
buffer , err := readFile ( privKeyLocation )
if err != nil {
@ -129,7 +130,7 @@ func oxImportPrivKey(jid string, privKeyLocation string, client *xmpp.Client) er
return err
}
fingerprint := strings . ToUpper ( pubKey . GetFingerprint ( ) )
_ , err = oxRecvPublicKeys ( client , jid, fingerprint )
_ , err = oxRecvPublicKeys ( client , iqc, jid, fingerprint )
if err != nil {
return errors . New ( "Key not found in pubsub: " + fingerprint )
}
@ -146,7 +147,7 @@ func oxImportPrivKey(jid string, privKeyLocation string, client *xmpp.Client) er
if err != nil {
log . Fatal ( err )
}
pubKeyRing , err := oxGetPublicKeyRing ( client , jid)
pubKeyRing , err := oxGetPublicKeyRing ( client , iqc, jid)
if err == nil {
pubKeys := pubKeyRing . GetKeys ( )
for _ , r := range pubKeys {
@ -155,14 +156,15 @@ func oxImportPrivKey(jid string, privKeyLocation string, client *xmpp.Client) er
}
}
}
err = oxPublishPubKey ( jid , client , pubKey)
err = oxPublishPubKey ( jid , client , iqc, pubKey)
if err != nil {
return err
}
return nil
}
func oxPublishPubKey ( jid string , client * xmpp . Client , pubKey * crypto . Key ) error {
func oxPublishPubKey ( jid string , client * xmpp . Client , iqc chan xmpp . IQ ,
pubKey * crypto . Key ) error {
keyCreated := time . Now ( ) . UTC ( ) . Format ( "2006-01-02T15:04:05Z" )
fingerprint := strings . ToUpper ( pubKey . GetFingerprint ( ) )
keySerialized , err := pubKey . Serialize ( )
@ -198,14 +200,14 @@ func oxPublishPubKey(jid string, client *xmpp.Client, pubKey *crypto.Key) error
if err != nil {
return err
}
iqReply , err := sendIQ ( client , jid, "set" , xmlstring )
iqReply , err := sendIQ ( client , iqc, jid, "set" , xmlstring )
if err != nil {
return err
}
if iqReply . Type != "result" {
return errors . New ( "Error while publishing public key" )
}
ownPubKeyRingFromPubsub , err := oxRecvPublicKeys ( client , jid, fingerprint )
ownPubKeyRingFromPubsub , err := oxRecvPublicKeys ( client , iqc, jid, fingerprint )
if err != nil {
return errors . New ( "Couldn't successfully verify public key upload" )
}
@ -245,7 +247,7 @@ func oxPublishPubKey(jid string, client *xmpp.Client, pubKey *crypto.Key) error
if err != nil {
return err
}
iqReply , err = sendIQ ( client , jid, "set" , xmlstring )
iqReply , err = sendIQ ( client , iqc, jid, "set" , xmlstring )
if err != nil {
return err
}
@ -377,8 +379,8 @@ func oxStoreKey(location string, key string) error {
return nil
}
func oxGenPrivKey ( jid string , client * xmpp . Client , passphrase string ,
keyType string ) error {
func oxGenPrivKey ( jid string , client * xmpp . Client , iqc chan xmpp . IQ ,
passphrase string , keyType string ) error {
xmppURI := "xmpp:" + jid
key , err := crypto . GenerateKey ( xmppURI , "" , keyType , 4096 )
if err != nil {
@ -411,14 +413,14 @@ func oxGenPrivKey(jid string, client *xmpp.Client, passphrase string,
if err != nil {
return err
}
err = oxPublishPubKey ( jid , client , pubKey)
err = oxPublishPubKey ( jid , client , iqc, pubKey)
if err != nil {
return err
}
return nil
}
func oxRecvPublicKeys ( client * xmpp . Client , recipient string ,
func oxRecvPublicKeys ( client * xmpp . Client , iqc chan xmpp . IQ , recipient string ,
fingerprint string ) ( * crypto . KeyRing , error ) {
opkr := etree . NewDocument ( )
opkrPs := opkr . CreateElement ( "pubsub" )
@ -430,7 +432,7 @@ func oxRecvPublicKeys(client *xmpp.Client, recipient string,
if err != nil {
return nil , err
}
oxPublicKey , err := sendIQ ( client , recipient, "get" , opkrString )
oxPublicKey , err := sendIQ ( client , iqc, recipient, "get" , opkrString )
if err != nil {
return nil , err
}
@ -472,7 +474,8 @@ func oxRecvPublicKeys(client *xmpp.Client, recipient string,
return keyring , nil
}
func oxGetPublicKeyRing ( client * xmpp . Client , recipient string ) ( * crypto . KeyRing , error ) {
func oxGetPublicKeyRing ( client * xmpp . Client , iqc chan xmpp . IQ ,
recipient string ) ( * crypto . KeyRing , error ) {
publicKeyRing , err := crypto . NewKeyRing ( nil )
if err != nil {
return nil , err
@ -488,7 +491,7 @@ func oxGetPublicKeyRing(client *xmpp.Client, recipient string) (*crypto.KeyRing,
if err != nil {
log . Fatal ( err )
}
oxPublicKeyList , err := sendIQ ( client , recipient, "get" , opkl )
oxPublicKeyList , err := sendIQ ( client , iqc, recipient, "get" , opkl )
if err != nil {
log . Fatal ( err )
}
@ -571,7 +574,7 @@ func oxGetPublicKeyRing(client *xmpp.Client, recipient string) (*crypto.KeyRing,
}
}
}
pubKeyRing , err := oxRecvPublicKeys ( client , recipient, pubKeyRingID )
pubKeyRing , err := oxRecvPublicKeys ( client , iqc, recipient, pubKeyRingID )
if err != nil {
return nil , err
}
@ -596,8 +599,8 @@ func oxGetPublicKeyRing(client *xmpp.Client, recipient string) (*crypto.KeyRing,
return pubKeyRing , nil
}
func oxEncrypt ( client * xmpp . Client , oxPrivKey * crypto . Key , recipient string ,
keyRing * crypto . KeyRing , message string ) ( string , error ) {
func oxEncrypt ( client * xmpp . Client , iqc chan xmpp . IQ , oxPrivKey * crypto . Key ,
recipient string , keyRing * crypto . KeyRing , message string ) ( string , error ) {
privKeyRing , err := crypto . NewKeyRing ( oxPrivKey )
if err != nil {
return "error" , err