Encrypted messaging app
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

305 lines
6.7 KiB

  1. package Seeder
  2. import (
  3. "encoding/base64"
  4. "git.tovijaeschke.xyz/tovi/Envelope/Backend/Database"
  5. "git.tovijaeschke.xyz/tovi/Envelope/Backend/Models"
  6. "github.com/gofrs/uuid"
  7. )
  8. func seedMessage(
  9. primaryUser, secondaryUser Models.User,
  10. primaryUserAssociationKey, secondaryUserAssociationKey string,
  11. i int,
  12. ) error {
  13. var (
  14. message Models.Message
  15. messageData Models.MessageData
  16. key, userKey aesKey
  17. keyCiphertext []byte
  18. plaintext string
  19. dataCiphertext []byte
  20. senderIdCiphertext []byte
  21. err error
  22. )
  23. plaintext = "Test Message"
  24. userKey, err = generateAesKey()
  25. if err != nil {
  26. panic(err)
  27. }
  28. key, err = generateAesKey()
  29. if err != nil {
  30. panic(err)
  31. }
  32. dataCiphertext, err = key.aesEncrypt([]byte(plaintext))
  33. if err != nil {
  34. panic(err)
  35. }
  36. senderIdCiphertext, err = key.aesEncrypt([]byte(primaryUser.ID.String()))
  37. if err != nil {
  38. panic(err)
  39. }
  40. if i%2 == 0 {
  41. senderIdCiphertext, err = key.aesEncrypt([]byte(secondaryUser.ID.String()))
  42. if err != nil {
  43. panic(err)
  44. }
  45. }
  46. keyCiphertext, err = userKey.aesEncrypt(
  47. []byte(base64.StdEncoding.EncodeToString(key.Key)),
  48. )
  49. if err != nil {
  50. panic(err)
  51. }
  52. messageData = Models.MessageData{
  53. Data: base64.StdEncoding.EncodeToString(dataCiphertext),
  54. SenderID: base64.StdEncoding.EncodeToString(senderIdCiphertext),
  55. SymmetricKey: base64.StdEncoding.EncodeToString(keyCiphertext),
  56. }
  57. message = Models.Message{
  58. MessageData: messageData,
  59. SymmetricKey: base64.StdEncoding.EncodeToString(
  60. encryptWithPublicKey(userKey.Key, decodedPublicKey),
  61. ),
  62. AssociationKey: primaryUserAssociationKey,
  63. }
  64. err = Database.CreateMessage(&message)
  65. if err != nil {
  66. return err
  67. }
  68. message = Models.Message{
  69. MessageData: messageData,
  70. SymmetricKey: base64.StdEncoding.EncodeToString(
  71. encryptWithPublicKey(userKey.Key, decodedPublicKey),
  72. ),
  73. AssociationKey: secondaryUserAssociationKey,
  74. }
  75. return Database.CreateMessage(&message)
  76. }
  77. func seedConversationDetail(key aesKey) (Models.ConversationDetail, error) {
  78. var (
  79. messageThread Models.ConversationDetail
  80. name string
  81. nameCiphertext []byte
  82. err error
  83. )
  84. name = "Test Conversation"
  85. nameCiphertext, err = key.aesEncrypt([]byte(name))
  86. if err != nil {
  87. panic(err)
  88. }
  89. messageThread = Models.ConversationDetail{
  90. Name: base64.StdEncoding.EncodeToString(nameCiphertext),
  91. }
  92. err = Database.CreateConversationDetail(&messageThread)
  93. return messageThread, err
  94. }
  95. func seedUserConversation(
  96. user Models.User,
  97. threadID uuid.UUID,
  98. key aesKey,
  99. ) (Models.UserConversation, error) {
  100. var (
  101. messageThreadUser Models.UserConversation
  102. conversationDetailIDCiphertext []byte
  103. adminCiphertext []byte
  104. err error
  105. )
  106. conversationDetailIDCiphertext, err = key.aesEncrypt([]byte(threadID.String()))
  107. if err != nil {
  108. return messageThreadUser, err
  109. }
  110. adminCiphertext, err = key.aesEncrypt([]byte("true"))
  111. if err != nil {
  112. return messageThreadUser, err
  113. }
  114. messageThreadUser = Models.UserConversation{
  115. UserID: user.ID,
  116. ConversationDetailID: base64.StdEncoding.EncodeToString(conversationDetailIDCiphertext),
  117. Admin: base64.StdEncoding.EncodeToString(adminCiphertext),
  118. SymmetricKey: base64.StdEncoding.EncodeToString(
  119. encryptWithPublicKey(key.Key, decodedPublicKey),
  120. ),
  121. }
  122. err = Database.CreateUserConversation(&messageThreadUser)
  123. return messageThreadUser, err
  124. }
  125. func seedConversationDetailUser(
  126. user Models.User,
  127. conversationDetail Models.ConversationDetail,
  128. associationKey uuid.UUID,
  129. admin bool,
  130. key aesKey,
  131. ) (Models.ConversationDetailUser, error) {
  132. var (
  133. conversationDetailUser Models.ConversationDetailUser
  134. adminString string = "false"
  135. userIdCiphertext []byte
  136. usernameCiphertext []byte
  137. adminCiphertext []byte
  138. associationKeyCiphertext []byte
  139. publicKeyCiphertext []byte
  140. err error
  141. )
  142. if admin {
  143. adminString = "true"
  144. }
  145. userIdCiphertext, err = key.aesEncrypt([]byte(user.ID.String()))
  146. if err != nil {
  147. return conversationDetailUser, err
  148. }
  149. usernameCiphertext, err = key.aesEncrypt([]byte(user.Username))
  150. if err != nil {
  151. return conversationDetailUser, err
  152. }
  153. adminCiphertext, err = key.aesEncrypt([]byte(adminString))
  154. if err != nil {
  155. return conversationDetailUser, err
  156. }
  157. associationKeyCiphertext, err = key.aesEncrypt([]byte(associationKey.String()))
  158. if err != nil {
  159. return conversationDetailUser, err
  160. }
  161. publicKeyCiphertext, err = key.aesEncrypt([]byte(user.AsymmetricPublicKey))
  162. if err != nil {
  163. return conversationDetailUser, err
  164. }
  165. conversationDetailUser = Models.ConversationDetailUser{
  166. ConversationDetailID: conversationDetail.ID,
  167. UserID: base64.StdEncoding.EncodeToString(userIdCiphertext),
  168. Username: base64.StdEncoding.EncodeToString(usernameCiphertext),
  169. Admin: base64.StdEncoding.EncodeToString(adminCiphertext),
  170. AssociationKey: base64.StdEncoding.EncodeToString(associationKeyCiphertext),
  171. PublicKey: base64.StdEncoding.EncodeToString(publicKeyCiphertext),
  172. }
  173. err = Database.CreateConversationDetailUser(&conversationDetailUser)
  174. return conversationDetailUser, err
  175. }
  176. func SeedMessages() {
  177. var (
  178. conversationDetail Models.ConversationDetail
  179. key aesKey
  180. primaryUser Models.User
  181. primaryUserAssociationKey uuid.UUID
  182. secondaryUser Models.User
  183. secondaryUserAssociationKey uuid.UUID
  184. i int
  185. err error
  186. )
  187. key, err = generateAesKey()
  188. if err != nil {
  189. panic(err)
  190. }
  191. conversationDetail, err = seedConversationDetail(key)
  192. primaryUserAssociationKey, err = uuid.NewV4()
  193. if err != nil {
  194. panic(err)
  195. }
  196. secondaryUserAssociationKey, err = uuid.NewV4()
  197. if err != nil {
  198. panic(err)
  199. }
  200. primaryUser, err = Database.GetUserByUsername("testUser")
  201. if err != nil {
  202. panic(err)
  203. }
  204. _, err = seedUserConversation(
  205. primaryUser,
  206. conversationDetail.ID,
  207. key,
  208. )
  209. if err != nil {
  210. panic(err)
  211. }
  212. secondaryUser, err = Database.GetUserByUsername("ATestUser2")
  213. if err != nil {
  214. panic(err)
  215. }
  216. _, err = seedUserConversation(
  217. secondaryUser,
  218. conversationDetail.ID,
  219. key,
  220. )
  221. if err != nil {
  222. panic(err)
  223. }
  224. _, err = seedConversationDetailUser(
  225. primaryUser,
  226. conversationDetail,
  227. primaryUserAssociationKey,
  228. true,
  229. key,
  230. )
  231. if err != nil {
  232. panic(err)
  233. }
  234. _, err = seedConversationDetailUser(
  235. secondaryUser,
  236. conversationDetail,
  237. secondaryUserAssociationKey,
  238. false,
  239. key,
  240. )
  241. if err != nil {
  242. panic(err)
  243. }
  244. for i = 0; i <= 20; i++ {
  245. err = seedMessage(
  246. primaryUser,
  247. secondaryUser,
  248. primaryUserAssociationKey.String(),
  249. secondaryUserAssociationKey.String(),
  250. i,
  251. )
  252. if err != nil {
  253. panic(err)
  254. }
  255. }
  256. }