Skip to content

Commit

Permalink
add age support
Browse files Browse the repository at this point in the history
  • Loading branch information
JojiiOfficial committed Jan 19, 2021
1 parent 855c358 commit 06fb210
Show file tree
Hide file tree
Showing 5 changed files with 131 additions and 3 deletions.
98 changes: 96 additions & 2 deletions Crypt.go
Original file line number Diff line number Diff line change
@@ -1,18 +1,22 @@
package libdatamanager

import (
"bytes"
"crypto/aes"
"crypto/cipher"
"crypto/rand"
"errors"
"io"
"os"
"strings"

"filippo.io/age"
)

// EncryptionCiphers supported encryption chipers
// EncryptionCiphers supported encryption method
var EncryptionCiphers = []string{
"aes",
"age",
}

// ChiperToInt cipter to int
Expand Down Expand Up @@ -57,8 +61,48 @@ func IsValidCipher(c string) bool {
return false
}

// EncryptAGE encrypts input stream and writes it to out
func EncryptAGE(out io.Writer, in io.Reader, key, buff []byte, cancel chan bool) (err error) {
recB := bytes.NewBuffer(key)
// TODO get pub key from private key
rec, err := age.ParseRecipients(recB)
if err != nil {
return err
}

enWriter, nil := age.Encrypt(out, rec...)
if err != nil {
return err
}
defer enWriter.Close()

for {
// Stop on cancel
select {
case <-cancel:
return ErrCancelled
default:
}

n, err := in.Read(buff)
if err != nil && err != io.EOF {
return err
}

if n != 0 {
enWriter.Write(buff[:n])
}

if err == io.EOF {
break
}
}

return nil
}

// EncryptAES encrypts input stream and writes it to out
func EncryptAES(in io.Reader, out io.Writer, keyAes, buff []byte, cancel chan bool) (err error) {
func EncryptAES(out io.Writer, in io.Reader, keyAes, buff []byte, cancel chan bool) (err error) {
iv := make([]byte, 16)

// Create random iv
Expand Down Expand Up @@ -93,7 +137,9 @@ func EncryptAES(in io.Reader, out io.Writer, keyAes, buff []byte, cancel chan bo
}

if n != 0 {
// TODO can we outsource this?
outBuf := make([]byte, n)

ctr.XORKeyStream(outBuf, buff[:n])
out.Write(outBuf)
}
Expand All @@ -106,6 +152,52 @@ func EncryptAES(in io.Reader, out io.Writer, keyAes, buff []byte, cancel chan bo
return nil
}

// DecryptAGE decrypt stuff
func DecryptAGE(in io.Reader, out, hashwriter io.Writer, key, buff []byte, cancelChan chan bool) (err error) {
id, err := age.ParseIdentities(bytes.NewBuffer(key))
if err != nil {
return err
}

decReader, err := age.Decrypt(in, id...)
if err != nil {
return err
}

for {
// return on cancel
select {
case <-cancelChan:
return ErrCancelled
default:
}

n, err := decReader.Read(buff)
if err != nil && err != io.EOF {
return err
}

if n != 0 {
_, err = out.Write(buff[:n])
if err != nil {
return err
}

if hashwriter != nil {
hashwriter.Write(buff[:n])
}
}

// Treat eof as stop condition, not as
// an error
if err == io.EOF {
break
}
}

return nil
}

// DecryptAES decrypt stuff
func DecryptAES(in io.Reader, out, hashwriter *io.Writer, keyAes, buff []byte, cancelChan chan bool) (err error) {
// Iv is always 16 bytes
Expand Down Expand Up @@ -154,7 +246,9 @@ func DecryptAES(in io.Reader, out, hashwriter *io.Writer, keyAes, buff []byte, c
}

if n != 0 {
// TODO can we outsource this?
outBuf := make([]byte, n)

ctr.XORKeyStream(outBuf, buff[:n])

(*out).Write(outBuf)
Expand Down
5 changes: 5 additions & 0 deletions FileDownload.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package libdatamanager
import (
"encoding/hex"
"errors"
"fmt"
"hash/crc32"
"io"
"net/http"
Expand Down Expand Up @@ -285,6 +286,7 @@ func (fileresponse *FileDownloadResponse) SaveTo(w io.Writer, cancelChan chan bo
}

w = fileresponse.DownloadRequest.GetWriterProxy()(w)
fmt.Println(fileresponse.Encryption)

// If decryption is requested and required
if fileresponse.DownloadRequest.Decrypt && len(fileresponse.Encryption) > 0 {
Expand All @@ -297,6 +299,9 @@ func (fileresponse *FileDownloadResponse) SaveTo(w io.Writer, cancelChan chan bo
case EncryptionCiphers[0]:
// Decrypt aes
err = DecryptAES(reader, &w, nil, fileresponse.DownloadRequest.Key, buff, fileresponse.DownloadRequest.CancelDownload)
case EncryptionCiphers[1]:
// Decrypt aes
err = DecryptAGE(reader, w, nil, fileresponse.DownloadRequest.Key, buff, fileresponse.DownloadRequest.CancelDownload)
default:
return ErrCipherNotSupported
}
Expand Down
11 changes: 10 additions & 1 deletion FileUpload.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"encoding/hex"
"encoding/json"
"errors"
"fmt"
"hash/crc32"
"io"
"mime/multipart"
Expand Down Expand Up @@ -183,6 +184,10 @@ func (uploadRequest *UploadRequest) UploadFromReader(r io.Reader, size int64, up
request := uploadRequest.BuildRequestStruct(FileUploadType)
body, contenttype, size := uploadRequest.UploadBodyBuilder(r, size, uploadDone, cancel)

if body == nil {
return nil, fmt.Errorf("body is nil")
}

// Run filesize callback if set
if uploadRequest.fileSizeCallback != nil {
uploadRequest.fileSizeCallback(size)
Expand Down Expand Up @@ -293,6 +298,8 @@ func (uploadRequest *UploadRequest) UploadBodyBuilder(reader io.Reader, inpSize
switch uploadRequest.Encryption {
case EncryptionCiphers[0]:
size = inpSize + aes.BlockSize
case EncryptionCiphers[1]:
size = inpSize
case "":
size = inpSize
default:
Expand Down Expand Up @@ -337,7 +344,9 @@ func (uploadRequest *UploadRequest) UploadBodyBuilder(reader io.Reader, inpSize
// to support encryption
switch uploadRequest.Encryption {
case EncryptionCiphers[0]:
err = EncryptAES(reader, writer, uploadRequest.EncryptionKey, buf, cancel)
err = EncryptAES(writer, reader, uploadRequest.EncryptionKey, buf, cancel)
case EncryptionCiphers[1]:
err = EncryptAGE(writer, reader, uploadRequest.EncryptionKey, buf, cancel)
case "":
err = cancelledCopy(writer, reader, buf, cancel)
}
Expand Down
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ module github.com/DataManager-Go/libdatamanager
go 1.14

require (
filippo.io/age v1.0.0-beta6
github.com/JojiiOfficial/gaw v1.2.8
github.com/jinzhu/gorm v1.9.14
github.com/klauspost/compress v1.10.10 // indirect
Expand Down
19 changes: 19 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
filippo.io/age v1.0.0-beta6 h1:hlH225v0JvuqPLAd4bmuJ3rDJ1p1VJdk7I6jYDsNEi0=
filippo.io/age v1.0.0-beta6/go.mod h1:chAuTrTb0FTTmKtvs6fQTGhYTvH9AigjN1uEUsvLdZ0=
filippo.io/edwards25519 v1.0.0-alpha.2/go.mod h1:X+pm78QAUPtFLi1z9PYIlS/bdDnvbCOGKtZ+ACWEf7o=
github.com/JojiiOfficial/gaw v1.2.8 h1:crLd2hrRvTlCClZDtwqnr8AoVKs3uQAk8B2AdOfUCsg=
github.com/JojiiOfficial/gaw v1.2.8/go.mod h1:fPm2wG1z8xSCmfkqq9V5iHdlgLUpkRx73tSO9efhJP0=
github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc=
github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd h1:83Wprp6ROGeiHFAP8WJdI2RoxALQYgdllERc3N5N2DM=
github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 h1:Yzb9+7DPaBjB8zlTR87/ElzFsnQfuHnVUVqpZZIcV5Y=
Expand All @@ -20,19 +25,33 @@ github.com/klauspost/compress v1.10.10 h1:a/y8CglcM7gLGYmlbP/stPE5sR3hbhFRUjCBfd
github.com/klauspost/compress v1.10.10/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
github.com/klauspost/pgzip v1.2.5 h1:qnWYvvKqedOF2ulHpMG72XQol4ILEJ8k2wwRl/Km8oE=
github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/lib/pq v1.1.1 h1:sJZmqHoEaY7f+NPP8pgLB/WxulyR3fewgCM2qaSlBb4=
github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/mattn/go-sqlite3 v1.14.0 h1:mLyGNKR8+Vv9CAU7PphKa2hkEqxxhn8i32J6FPj1/QA=
github.com/mattn/go-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd h1:GGJVjV8waZKRHrgwvtH66z9ZGVurTD1MT0n1Bb+q4aM=
golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59 h1:3zb4D3T4G8jdExgVU/95+vQXfpEPiMdCaZgmGVxjNHM=
golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=

0 comments on commit 06fb210

Please sign in to comment.