|
|
- package Seeder
-
- import (
- "bytes"
- "crypto/aes"
- "crypto/cipher"
- "crypto/rand"
- "crypto/rsa"
- "crypto/sha512"
- "encoding/pem"
- "hash"
-
- "git.tovijaeschke.xyz/tovi/Envelope/Backend/Database"
- "git.tovijaeschke.xyz/tovi/Envelope/Backend/Models"
- "github.com/gofrs/uuid"
- )
-
- // EncryptWithPublicKey encrypts data with public key
- func encryptWithPublicKey(msg []byte, pub *rsa.PublicKey) []byte {
- var (
- hash hash.Hash
- )
-
- hash = sha512.New()
- ciphertext, err := rsa.EncryptOAEP(hash, rand.Reader, pub, msg, nil)
- if err != nil {
- panic(err)
- }
- return ciphertext
- }
-
- func PKCS5Padding(ciphertext []byte, blockSize int, after int) []byte {
- var (
- padding int
- padtext []byte
- )
- padding = (blockSize - len(ciphertext)%blockSize)
- padtext = bytes.Repeat([]byte{byte(padding)}, padding)
- return append(ciphertext, padtext...)
- }
-
- func seedMessage(primaryUser, secondaryUser Models.User, threadID uuid.UUID, i int) error {
- var (
- messageKey Models.Message
- messageData Models.MessageData
-
- block cipher.Block
- mode cipher.BlockMode
- pemBlock *pem.Block
-
- plaintext string
- ciphertext []byte
-
- bKey []byte
- bIV []byte
- bPlaintext []byte
-
- err error
- )
-
- plaintext = "Test Message"
-
- bKey = make([]byte, 32)
- _, err = rand.Read(bKey)
- if err != nil {
- panic(err)
- }
- bIV = make([]byte, 16)
- _, err = rand.Read(bIV)
- if err != nil {
- panic(err)
- }
- bPlaintext = PKCS5Padding([]byte(plaintext), aes.BlockSize, len(plaintext))
-
- pemBlock = &pem.Block{
- Type: "AES KEY",
- Bytes: bKey,
- }
-
- block, err = aes.NewCipher(bKey)
- if err != nil {
- panic(err)
- }
-
- ciphertext = make([]byte, len(bPlaintext))
-
- mode = cipher.NewCBCEncrypter(block, bIV)
-
- mode.CryptBlocks(ciphertext, bPlaintext)
-
- messageData = Models.MessageData{
- Data: ciphertext,
- }
-
- messageKey = Models.Message{
- UserID: primaryUser.ID,
- MessageData: messageData,
- MessageType: "sender",
- RelationalUserId: encryptWithPublicKey(secondaryUser.ID.Bytes(), decodedPublicKey),
- SymmetricKey: string(pem.EncodeToMemory(pemBlock)),
- }
-
- return Database.CreateMessage(&messageKey)
- }
-
- func SeedMessages() {
- var (
- primaryUser Models.User
- secondaryUser Models.User
- threadID uuid.UUID
- i int
- err error
- )
-
- primaryUser, err = Database.GetUserByUsername("testUser")
- if err != nil {
- panic(err)
- }
-
- secondaryUser, err = Database.GetUserByUsername("testUser2")
- if err != nil {
- panic(err)
- }
-
- threadID, err = uuid.NewV4()
- if err != nil {
- panic(err)
- }
-
- for i = 0; i <= 20; i++ {
- err = seedMessage(primaryUser, secondaryUser, threadID, i)
- if err != nil {
- panic(err)
- }
- }
- }
|