diff --git a/armor.go b/armor.go index 071f4ad..3b7e495 100644 --- a/armor.go +++ b/armor.go @@ -1,4 +1,4 @@ -package pm +package pmcrypto import ( "bytes" diff --git a/attachment.go b/attachment.go index 8e416a2..74a06ee 100644 --- a/attachment.go +++ b/attachment.go @@ -1,4 +1,4 @@ -package pm +package pmcrypto import ( "bytes" diff --git a/common.go b/common.go index e93bfee..1215075 100644 --- a/common.go +++ b/common.go @@ -1,4 +1,4 @@ -package pm +package pmcrypto import ( "regexp" diff --git a/fingerprint.go b/fingerprint.go index b89ddf7..ab52a04 100644 --- a/fingerprint.go +++ b/fingerprint.go @@ -1,4 +1,4 @@ -package pm +package pmcrypto import ( "bytes" diff --git a/glide.lock b/glide.lock index 2491881..fea7de2 100644 --- a/glide.lock +++ b/glide.lock @@ -1,8 +1,10 @@ -hash: 217e5bc8c4d3160eeddd18dda7f8f8785f1b2b7f2ca58779b94ed8fd91ab226d -updated: 2018-06-05T11:36:14.582087-07:00 +hash: 834f29378b80e2f7486b79420679fb1d854c16f2989574090ba80d322a7b71c5 +updated: 2018-09-02T14:56:08.452174+02:00 imports: +- name: github.com/Sirupsen/logrus + version: 78fa2915c1fa231f62e0438da493688c21ca678e - name: golang.org/x/crypto - version: 4dad02e057d03c4f12a519a73d4b4f1837de135d + version: 9e4251120d8c43f10024d798bc6dde21d40704a0 repo: https://github.com/ProtonMail/crypto.git subpackages: - bitcurves @@ -11,6 +13,8 @@ imports: - curve25519 - ed25519 - ed25519/internal/edwards25519 + - internal/randutil + - internal/syscall/unix - openpgp - openpgp/aes/keywrap - openpgp/armor @@ -23,4 +27,23 @@ imports: - openpgp/internal/encoding - openpgp/packet - openpgp/s2k + - rand + - rsa + - ssh/terminal +- name: golang.org/x/sys + version: fa5fdf94c78965f1aa8423f0cc50b8b8d728b05a + subpackages: + - unix + - windows +- name: golang.org/x/text + version: 6e3c4e7365ddcc329f090f96e4348398f6310088 + subpackages: + - encoding + - encoding/charmap + - encoding/internal + - encoding/internal/identifier + - transform +- name: mimeparser + version: f4de8a5a52ecd93189c785c7d87259ac637e1d7c + repo: git@gitlab.protontech.ch:ProtonMail/go-pm-mime.git testImports: [] diff --git a/glide.yaml b/glide.yaml index fb866bb..95ef39c 100644 --- a/glide.yaml +++ b/glide.yaml @@ -1,5 +1,7 @@ -package: pm +package: proton/pmcrypto import: - package: golang.org/x/crypto version: v1.0.0 repo: https://github.com/ProtonMail/crypto.git +- package: mimeparser + repo: git@gitlab.protontech.ch:ProtonMail/go-pm-mime.git diff --git a/key.go b/key.go index 9ff7e9d..3b545e6 100644 --- a/key.go +++ b/key.go @@ -1,4 +1,4 @@ -package pm +package pmcrypto import ( "bytes" diff --git a/message.go b/message.go index ceab76e..418c78e 100644 --- a/message.go +++ b/message.go @@ -1,4 +1,4 @@ -package pm +package pmcrypto import ( "bytes" diff --git a/mime.go b/mime.go new file mode 100644 index 0000000..be8e5d9 --- /dev/null +++ b/mime.go @@ -0,0 +1,65 @@ +package pmcrypto + +import ( + "net/mail" + "strings" + "net/textproto" + "io/ioutil" + "bytes" + "mimeparser" +) + +func parseMIME(mimeBody string) (body *mimeparser.BodyCollector, atts, attHeaders []string, err error) { + + mm, err := mail.ReadMessage(strings.NewReader(mimeBody)) + if err != nil { + return + } + + h := textproto.MIMEHeader(mm.Header) + mmBodyData, err := ioutil.ReadAll(mm.Body) + + printAccepter := mimeparser.NewMIMEPrinter() + bodyCollector := mimeparser.NewBodyCollector(printAccepter) + attachmentsCollector := mimeparser.NewAttachmentsCollector(bodyCollector) + err = mimeparser.VisitAll(bytes.NewReader(mmBodyData), h, attachmentsCollector) + + body = bodyCollector + atts = attachmentsCollector.GetAttachments() + attHeaders = attachmentsCollector.GetAttHeaders() + + return +} + + + +// define call back interface +type MIMECallbacks interface { + onBody(body string, mimetype string) + onAttachment(headers string, data []byte) + // Encrypted headers can be an attachment and thus be placed at the end of the mime structure + onEncryptedHeaders(headers string) +} + +func (o *OpenPGP) decryptMIMEMessage(encryptedText string, verifierKey string, privateKeys []byte, + passphrase string, callbacks MIMECallbacks, verifyTime int64) (verifier int, err error) { + decsignverify, error := o.DecryptMessageVerifyPrivbinkeys(encryptedText, verifierKey, privateKeys, passphrase, verifyTime) + if (error != nil) { + return 0, error + } + + body, attachments, attachmentHeaders, error := parseMIME(decsignverify.Plaintext + if (error != nil) { + return 0, error + }) + bodyContent, bodyMimeType := body.GetBody() + callbacks.onBody(bodyContent, bodyMimeType) + for i := 0; i < len(attachments); i++ { + callbacks.onAttachment(attachmentHeaders[i], []byte(attachments[i])) + } + callbacks.onEncryptedHeaders("") + + // Todo verify the signature included in the attachment + + return verifier, nil +} \ No newline at end of file diff --git a/openpgp.go b/openpgp.go index f812722..4a8f22b 100644 --- a/openpgp.go +++ b/openpgp.go @@ -1,4 +1,4 @@ -package pm +package pmcrypto import "time" diff --git a/session.go b/session.go index 3a10ee5..2300e4f 100644 --- a/session.go +++ b/session.go @@ -1,4 +1,4 @@ -package pm +package pmcrypto import ( "bytes" diff --git a/sign_detached.go b/sign_detached.go index e32ec2a..782aa80 100644 --- a/sign_detached.go +++ b/sign_detached.go @@ -1,4 +1,4 @@ -package pm +package pmcrypto import ( "bytes" diff --git a/time.go b/time.go index 458f452..5251f92 100644 --- a/time.go +++ b/time.go @@ -1,4 +1,4 @@ -package pm +package pmcrypto import ( "time" diff --git a/version.go b/version.go index c8cbd8b..8f12e98 100644 --- a/version.go +++ b/version.go @@ -1,4 +1,4 @@ -package pm +package pmcrypto // Version get current lib version func Version() string {