Project Moscato Team Messaging Middleware Implemetation Message Middleware by Golang Operate as Secure, Effectively
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.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package modules
  2. import (
  3. "fmt"
  4. "strconv"
  5. )
  6. // 키관리 부분, 노드 입력받고 키 반환하는 부분 구현
  7. type Security struct {
  8. KeyMap map[string]string
  9. }
  10. //Security 생성자
  11. func NewSecurity() *Security {
  12. logger := NewMyLogger()
  13. defer logger.Sync()
  14. security := &Security{map[string]string{}}
  15. defer logger.Debug("security setting complete.")
  16. return security
  17. }
  18. type SecurityManager interface {
  19. RegKey(rm RegisterMsg)
  20. GetNodeKey(nodeName string) int64
  21. ReEncrypt(fromKey int64, toKey int64, target []int64) []int64
  22. ReEncPubMsg(fromPubMsg PublishMsg, nodeName string) PublishMsg
  23. RemoveSecureKey(nodeName string) bool
  24. //CompareTopic(topic1 []int64, topic2 []int64) int
  25. //CompareDigit(topic1 int64, topic2 int64) int
  26. //CompareAlpha(topic1 []int64, topic2 []int64) int
  27. }
  28. /*
  29. keyShareMsg 에서 각 노드의 private 키를 받아 keyMap 에 저장
  30. */
  31. func (sc Security) RegKey(rm RegisterMsg) {
  32. sc.KeyMap[rm.Message.From] = strconv.FormatInt(rm.PrivateKey, 10)
  33. }
  34. /**
  35. 각 노드의 키를 주소를 이용하여 맵에서 가져옴
  36. */
  37. func (sc Security) GetNodeKey(nodeName string) int64 {
  38. messageStringKey := sc.KeyMap[nodeName]
  39. mKey, err := strconv.ParseInt(messageStringKey, 10, 64)
  40. if err != nil {
  41. fmt.Println("GetNodeKey Error: key string to int64 parsing error.")
  42. }
  43. return mKey
  44. }
  45. /*
  46. reEncrypt 해서 슬라이스 반환
  47. */
  48. func (sc Security) ReEncrypt(fromKey int64, toKey int64, target []int64) []int64 {
  49. var tmpTarget []int64
  50. for index := range target {
  51. tmpTarget = append(tmpTarget, target[index]-fromKey+toKey)
  52. }
  53. return tmpTarget
  54. }
  55. func (sc Security) ReEncryptWithoutPrivateKey(toKey int64, target []int64) []int64 {
  56. var tmpTarget []int64
  57. for index := range target {
  58. tmpTarget = append(tmpTarget, target[index]+toKey)
  59. }
  60. return tmpTarget
  61. }
  62. // topic과 value는 m+k로만 존재하므로 ReEnc과정에서 subscriber의 개인키만 더해주면 된다.
  63. func (sc Security) ReEncPubMsg(fromPubMsg PublishMsg, nodeName string) PublishMsg {
  64. toKey := sc.GetNodeKey(nodeName)
  65. fromKey := sc.GetNodeKey(fromPubMsg.Message.From)
  66. toPubMsg := PublishMsg{}
  67. toPubMsg.Message = fromPubMsg.Message
  68. toPubMsg.Topic = sc.ReEncryptWithoutPrivateKey(toKey, fromPubMsg.Topic)
  69. toPubMsg.Value = sc.ReEncryptWithoutPrivateKey(toKey, fromPubMsg.Value)
  70. toPubMsg.Content = sc.ReEncrypt(fromKey, toKey, fromPubMsg.Content)
  71. return toPubMsg
  72. }
  73. //Key제거 함수
  74. func (sc *Security) RemoveSecureKey(nodeName string) bool {
  75. logger := NewMyLogger()
  76. logger.Sync()
  77. //삭제 전 존재여부 확인
  78. _, exists := sc.KeyMap[nodeName]
  79. if exists {
  80. delete(sc.KeyMap, nodeName)
  81. logger.Debug("[" + nodeName + "] : delete Key successful")
  82. return true
  83. } else {
  84. return false
  85. }
  86. }