fernet.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. // Copyright 2019 Yunion
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package shell
  15. import (
  16. "fmt"
  17. "yunion.io/x/pkg/util/shellutils"
  18. "yunion.io/x/pkg/util/timeutils"
  19. "yunion.io/x/onecloud/pkg/keystone/tokens"
  20. "yunion.io/x/onecloud/pkg/util/fernetool"
  21. )
  22. func init() {
  23. type FernetInitKeysOptions struct {
  24. PATH string `help:"path that stores fernet keys"`
  25. COUNT int `help:"number of keys to init"`
  26. }
  27. shellutils.R(&FernetInitKeysOptions{}, "fernet-initkeys", "Initialze fernet keys", func(args *FernetInitKeysOptions) error {
  28. fm := fernetool.SFernetKeyManager{}
  29. err := fm.InitKeys(args.PATH, args.COUNT)
  30. if err != nil {
  31. return err
  32. }
  33. return nil
  34. })
  35. type FernetEncryptOptions struct {
  36. PATH string `help:"path that stores fernet keys"`
  37. MSG string `help:"message to encrypt"`
  38. }
  39. shellutils.R(&FernetEncryptOptions{}, "fernet-encrypt", "Encrypt message with fernet keys", func(args *FernetEncryptOptions) error {
  40. fm := fernetool.SFernetKeyManager{}
  41. err := fm.LoadKeys(args.PATH)
  42. if err != nil {
  43. return err
  44. }
  45. ret, err := fm.Encrypt([]byte(args.MSG))
  46. if err != nil {
  47. return err
  48. }
  49. fmt.Println(string(ret))
  50. return nil
  51. })
  52. type FernetEncryptTokenOptions struct {
  53. PATH string `help:"path that stores fernet keys"`
  54. USERID string `help:"UserId"`
  55. METHOD string `help:"auth method" choices:"password|token"`
  56. EXPIREAT string `help:"expired time"`
  57. ProjectId string `help:"project Id"`
  58. DomainId string `help:"domainId"`
  59. AUDITID string `help:"audit ID"`
  60. }
  61. shellutils.R(&FernetEncryptTokenOptions{}, "fernet-encrypt-token", "Encrypt auth token with fernet keys", func(args *FernetEncryptTokenOptions) error {
  62. token := tokens.SAuthToken{}
  63. token.UserId = args.USERID
  64. token.Method = args.METHOD
  65. token.ProjectId = args.ProjectId
  66. token.DomainId = args.DomainId
  67. token.ExpiresAt, _ = timeutils.ParseFullIsoTime(args.EXPIREAT)
  68. token.AuditIds = []string{args.AUDITID}
  69. tk, err := token.Encode()
  70. if err != nil {
  71. return err
  72. }
  73. fmt.Println(len(tk))
  74. fmt.Println(string(tk))
  75. fmt.Println(tk)
  76. fmt.Printf("%x\n", tk)
  77. fm := fernetool.SFernetKeyManager{}
  78. err = fm.LoadKeys(args.PATH)
  79. if err != nil {
  80. return err
  81. }
  82. ret, err := fm.Encrypt(tk)
  83. if err != nil {
  84. return err
  85. }
  86. fmt.Println(string(ret))
  87. return nil
  88. })
  89. shellutils.R(&FernetEncryptOptions{}, "fernet-decrypt", "Decrypt message with fernet keys", func(args *FernetEncryptOptions) error {
  90. fm := fernetool.SFernetKeyManager{}
  91. if args.PATH == "empty" {
  92. fm.InitEmpty()
  93. } else {
  94. err := fm.LoadKeys(args.PATH)
  95. if err != nil {
  96. return err
  97. }
  98. }
  99. fmt.Println("primary key hash:", fm.PrimaryKeyHash())
  100. ret := fm.Decrypt([]byte(args.MSG))
  101. if len(ret) == 0 {
  102. return fmt.Errorf("invalid message")
  103. }
  104. fmt.Println(len(ret))
  105. fmt.Println(string(ret))
  106. fmt.Println(ret)
  107. fmt.Printf("%x\n", ret)
  108. token := tokens.SAuthToken{}
  109. err := token.Decode(ret)
  110. if err != nil {
  111. return err
  112. }
  113. fmt.Println(token)
  114. return nil
  115. })
  116. }