data.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. package data
  2. /*
  3. Data package: Handles data from text to number,
  4. and vice versa
  5. */
  6. import (
  7. "fmt"
  8. "config"
  9. "strings"
  10. "strconv"
  11. "tools/rsa/integer"
  12. )
  13. type Data string
  14. type DataType int
  15. const (
  16. LL = config.RSA_SIZE
  17. AE = config.AE
  18. OE = config.OE
  19. AA = config.AA
  20. SPACE = config.SPACE
  21. COMMA = config.COMMA
  22. DOT = config.DOT
  23. PAD = SPACE
  24. NUM DataType = 1 << iota
  25. TXT DataType = 1 << iota
  26. )
  27. type Blob struct {
  28. d Data
  29. t DataType
  30. }
  31. func New() *Blob {
  32. return new(Blob)
  33. }
  34. func (b *Blob) Data() *Data {
  35. return &b.d
  36. }
  37. func (b *Blob) Set(t DataType, s Data) *Blob{
  38. b.t = t
  39. b.Data().set(s)
  40. return b
  41. }
  42. func (b *Blob) AsNumbers() *Blob {
  43. if b.t == NUM {
  44. return b
  45. }
  46. b.Set(NUM,
  47. Data(
  48. strings.Map(func (c rune) rune {
  49. switch c {
  50. case 'æ': c = AE
  51. case 'ø': c = OE
  52. case 'å': c = AA
  53. case ' ': c = SPACE
  54. case ',': c = COMMA
  55. case '.': c = DOT
  56. default: c %= 97
  57. }
  58. return c
  59. }, string(b.Data().Get())),
  60. ),
  61. )
  62. b.Data().pad()
  63. return b
  64. }
  65. func (b *Blob) AsText() *Blob {
  66. if b.t == TXT {
  67. return b
  68. }
  69. b.Set(TXT,
  70. Data(
  71. strings.Map(func (c rune) rune {
  72. switch c {
  73. case AE: c = 'æ'
  74. case OE: c = 'ø'
  75. case AA: c = 'å'
  76. case SPACE: c = ' '
  77. case COMMA: c = ','
  78. case DOT: c = '.'
  79. default: c += 97
  80. }
  81. return c
  82. }, string(b.Data().Get())),
  83. ),
  84. )
  85. return b
  86. }
  87. func (b *Blob) ToList() []*integer.RSAInt {
  88. var l []*integer.RSAInt
  89. for s, i := strings.Split(b.Repr(), "\n"), 0; i < len(s); i++ {
  90. rint, _ := integer.New(0).SetString(s[i])
  91. l = append(l, rint)
  92. }
  93. return l
  94. }
  95. func (b *Blob) FromList(l []*integer.RSAInt) {
  96. str := ""
  97. for x := 0; x < len(l); x++ {
  98. if l[x].Len() < LL {
  99. str += "0" + l[x].String()
  100. } else {
  101. str += l[x].String()
  102. }
  103. }
  104. b.Data().SetRaw(str)
  105. }
  106. func (b *Blob) Repr() string {
  107. s := ""
  108. if b.t == TXT {
  109. s = string(b.Data().Get())
  110. } else {
  111. for i := 0; i < b.Data().Len(); i++ {
  112. if (i % (LL / 2)) == 0 {
  113. s += "\n"
  114. }
  115. s += fmt.Sprintf("%.2d", b.Data().Get()[i])
  116. }
  117. }
  118. return strings.Trim(s, "\n")
  119. }
  120. func (d *Data) set(s Data) {
  121. *d = s
  122. }
  123. func (d *Data) SetRaw(s string) {
  124. raw := ""
  125. for y := 0; y < len(s); y += 2 {
  126. yy := y+2
  127. if yy > len(s) {
  128. yy = len(s)
  129. }
  130. a, _ := strconv.Atoi(s[y:yy])
  131. raw += fmt.Sprintf("%c", (rune(a)))
  132. }
  133. d.set(Data(raw))
  134. }
  135. func (d *Data) add(s Data) {
  136. *d += s
  137. }
  138. func (d *Data) Get() Data {
  139. return *d
  140. }
  141. func (d *Data) Len() int {
  142. return len(d.Get())
  143. }
  144. func (d *Data) pad () {
  145. l := d.Len() * 2
  146. ll := l % LL
  147. if ll == 0 {
  148. return
  149. }
  150. for m, i := LL - ll, 0; i < m; i += 2 {
  151. d.add(Data(PAD))
  152. }
  153. }