-
Notifications
You must be signed in to change notification settings - Fork 1
/
cryptopals_set04_test.go
91 lines (74 loc) · 2.84 KB
/
cryptopals_set04_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package cryptopals_test
import (
"bytes"
"crypto/aes"
"github.com/kieron-pivotal/cryptopals/conversion"
"github.com/kieron-pivotal/cryptopals/ctr"
"github.com/kieron-pivotal/cryptopals/md4"
md4example "github.com/kieron-pivotal/cryptopals/md4/example"
"github.com/kieron-pivotal/cryptopals/operations"
"github.com/kieron-pivotal/cryptopals/sha1"
"github.com/kieron-pivotal/cryptopals/sha1/example"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
var _ = Describe("CryptopalsSet04", func() {
It("question 25", func() {
enc, err := conversion.ReadBase64File("./assets/04_25.txt")
Expect(err).NotTo(HaveOccurred())
key := []byte("YELLOW SUBMARINE")
clear, err := operations.AES128ECBDecode(enc, key)
Expect(err).NotTo(HaveOccurred())
key = operations.RandomSlice(16)
nonce := operations.RandomSlice(8)
c := ctr.Counter{Nonce: nonce}
enc = ctr.Encode(clear, key, c)
newtext := bytes.Repeat([]byte{0}, len(enc))
stream := ctr.Edit(enc, key, 0, newtext, c)
newclear := operations.Xor(stream, enc)
Expect(newclear).To(Equal(clear))
})
It("question 26 - can bit fiddle in CTR", func() {
enc := ctr.ExampleToken(" admin true ")
pos, err := ctr.GetVarInputPos()
Expect(err).NotTo(HaveOccurred())
enc[pos] ^= ' ' ^ ';'
enc[pos+6] ^= ' ' ^ '='
enc[pos+11] ^= ' ' ^ ';'
Expect(ctr.CheckForAdmin(enc)).To(BeTrue())
})
It("question 27 - CBC key and iv the same", func() {
key := operations.RandomSlice(16)
clear := "Some day. Some day. Some day. Dominion. Come a time. Some say prayers. I'll say mine"
enc, err := operations.AES128CBCEncode([]byte(clear), key, key)
Expect(err).NotTo(HaveOccurred())
for i := 0; i < 16; i++ {
enc[aes.BlockSize+i] = 0
enc[2*aes.BlockSize+i] = enc[i]
}
ok, out := operations.AES128CBCSaneDecode(enc, key, key)
Expect(ok).To(BeFalse())
k := operations.Xor(out[:16], out[32:48])
Expect(k).To(Equal(key))
})
It("question 29 - break SHA1 key prefix MAC", func() {
clear, hash := example.GenerateCookie()
keyLen, err := sha1.GetKeyLen(clear, hash, example.VerifyCookie)
Expect(err).NotTo(HaveOccurred())
padding := sha1.GetSHA1Padding(keyLen + len(clear))
ext := ";admin=true"
newSum := sha1.ExtendSum([]byte(ext), hash, uint64(keyLen+len(clear)+len(padding)))
newContent := clear + string(padding) + ext
Expect(example.IsAdmin(newContent, newSum)).To(BeTrue(), "is admin")
})
It("question 30 - break MD4 key prefix MAC", func() {
clear, hash := md4example.GenerateCookie()
keyLen, err := md4.GetKeyLen(clear, hash, md4example.VerifyCookie)
Expect(err).NotTo(HaveOccurred())
padding := md4.GetMD4Padding(keyLen + len(clear))
ext := ";admin=true"
newSum := md4.ExtendSum([]byte(ext), hash, uint64(keyLen+len(clear)+len(padding)))
newContent := clear + string(padding) + ext
Expect(md4example.IsAdmin(newContent, newSum)).To(BeTrue(), "is admin")
})
})