Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
G
golang
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
go
golang
Commits
ef531c2b
Commit
ef531c2b
authored
Feb 26, 2010
by
Raif S. Naffah
Committed by
Russ Cox
Feb 26, 2010
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
crypto/blowfish: new package
R=rsc CC=golang-dev
https://golang.org/cl/217116
parent
297cddbb
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
386 additions
and
0 deletions
+386
-0
Makefile
src/pkg/Makefile
+1
-0
Makefile
src/pkg/crypto/blowfish/Makefile
+13
-0
block.go
src/pkg/crypto/blowfish/block.go
+101
-0
blowfish_test.go
src/pkg/crypto/blowfish/blowfish_test.go
+192
-0
cipher.go
src/pkg/crypto/blowfish/cipher.go
+79
-0
const.go
src/pkg/crypto/blowfish/const.go
+0
-0
No files found.
src/pkg/Makefile
View file @
ef531c2b
...
...
@@ -35,6 +35,7 @@ DIRS=\
container/vector
\
crypto/aes
\
crypto/block
\
crypto/blowfish
\
crypto/hmac
\
crypto/md4
\
crypto/md5
\
...
...
src/pkg/crypto/blowfish/Makefile
0 → 100644
View file @
ef531c2b
# Copyright 2010 The Go Authors. All rights reserved.
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file.
include
../../../Make.$(GOARCH)
TARG
=
crypto/blowfish
GOFILES
=
\
block.go
\
cipher.go
\
const.go
\
include
../../../Make.pkg
src/pkg/crypto/blowfish/block.go
0 → 100644
View file @
ef531c2b
// Copyright 2010 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package
blowfish
func
expandKey
(
key
[]
byte
,
c
*
Cipher
)
{
copy
(
&
c
.
p
,
&
p
)
copy
(
&
c
.
s0
,
&
s0
)
copy
(
&
c
.
s1
,
&
s1
)
copy
(
&
c
.
s2
,
&
s2
)
copy
(
&
c
.
s3
,
&
s3
)
j
:=
0
for
i
:=
0
;
i
<
18
;
i
++
{
var
d
uint32
for
k
:=
0
;
k
<
4
;
k
++
{
d
=
d
<<
8
|
uint32
(
key
[
j
])
&
0x000000FF
j
++
if
j
>=
len
(
key
)
{
j
=
0
}
}
c
.
p
[
i
]
^=
d
}
var
l
,
r
uint32
for
i
:=
0
;
i
<
18
;
i
+=
2
{
l
,
r
=
encryptBlock
(
l
,
r
,
c
)
c
.
p
[
i
],
c
.
p
[
i
+
1
]
=
l
,
r
}
for
i
:=
0
;
i
<
256
;
i
+=
2
{
l
,
r
=
encryptBlock
(
l
,
r
,
c
)
c
.
s0
[
i
],
c
.
s0
[
i
+
1
]
=
l
,
r
}
for
i
:=
0
;
i
<
256
;
i
+=
2
{
l
,
r
=
encryptBlock
(
l
,
r
,
c
)
c
.
s1
[
i
],
c
.
s1
[
i
+
1
]
=
l
,
r
}
for
i
:=
0
;
i
<
256
;
i
+=
2
{
l
,
r
=
encryptBlock
(
l
,
r
,
c
)
c
.
s2
[
i
],
c
.
s2
[
i
+
1
]
=
l
,
r
}
for
i
:=
0
;
i
<
256
;
i
+=
2
{
l
,
r
=
encryptBlock
(
l
,
r
,
c
)
c
.
s3
[
i
],
c
.
s3
[
i
+
1
]
=
l
,
r
}
}
func
encryptBlock
(
l
,
r
uint32
,
c
*
Cipher
)
(
uint32
,
uint32
)
{
xl
,
xr
:=
l
,
r
xl
^=
c
.
p
[
0
]
xr
^=
((
c
.
s0
[
byte
(
xl
>>
24
)]
+
c
.
s1
[
byte
(
xl
>>
16
)])
^
c
.
s2
[
byte
(
xl
>>
8
)])
+
c
.
s3
[
byte
(
xl
)]
^
c
.
p
[
1
]
xl
^=
((
c
.
s0
[
byte
(
xr
>>
24
)]
+
c
.
s1
[
byte
(
xr
>>
16
)])
^
c
.
s2
[
byte
(
xr
>>
8
)])
+
c
.
s3
[
byte
(
xr
)]
^
c
.
p
[
2
]
xr
^=
((
c
.
s0
[
byte
(
xl
>>
24
)]
+
c
.
s1
[
byte
(
xl
>>
16
)])
^
c
.
s2
[
byte
(
xl
>>
8
)])
+
c
.
s3
[
byte
(
xl
)]
^
c
.
p
[
3
]
xl
^=
((
c
.
s0
[
byte
(
xr
>>
24
)]
+
c
.
s1
[
byte
(
xr
>>
16
)])
^
c
.
s2
[
byte
(
xr
>>
8
)])
+
c
.
s3
[
byte
(
xr
)]
^
c
.
p
[
4
]
xr
^=
((
c
.
s0
[
byte
(
xl
>>
24
)]
+
c
.
s1
[
byte
(
xl
>>
16
)])
^
c
.
s2
[
byte
(
xl
>>
8
)])
+
c
.
s3
[
byte
(
xl
)]
^
c
.
p
[
5
]
xl
^=
((
c
.
s0
[
byte
(
xr
>>
24
)]
+
c
.
s1
[
byte
(
xr
>>
16
)])
^
c
.
s2
[
byte
(
xr
>>
8
)])
+
c
.
s3
[
byte
(
xr
)]
^
c
.
p
[
6
]
xr
^=
((
c
.
s0
[
byte
(
xl
>>
24
)]
+
c
.
s1
[
byte
(
xl
>>
16
)])
^
c
.
s2
[
byte
(
xl
>>
8
)])
+
c
.
s3
[
byte
(
xl
)]
^
c
.
p
[
7
]
xl
^=
((
c
.
s0
[
byte
(
xr
>>
24
)]
+
c
.
s1
[
byte
(
xr
>>
16
)])
^
c
.
s2
[
byte
(
xr
>>
8
)])
+
c
.
s3
[
byte
(
xr
)]
^
c
.
p
[
8
]
xr
^=
((
c
.
s0
[
byte
(
xl
>>
24
)]
+
c
.
s1
[
byte
(
xl
>>
16
)])
^
c
.
s2
[
byte
(
xl
>>
8
)])
+
c
.
s3
[
byte
(
xl
)]
^
c
.
p
[
9
]
xl
^=
((
c
.
s0
[
byte
(
xr
>>
24
)]
+
c
.
s1
[
byte
(
xr
>>
16
)])
^
c
.
s2
[
byte
(
xr
>>
8
)])
+
c
.
s3
[
byte
(
xr
)]
^
c
.
p
[
10
]
xr
^=
((
c
.
s0
[
byte
(
xl
>>
24
)]
+
c
.
s1
[
byte
(
xl
>>
16
)])
^
c
.
s2
[
byte
(
xl
>>
8
)])
+
c
.
s3
[
byte
(
xl
)]
^
c
.
p
[
11
]
xl
^=
((
c
.
s0
[
byte
(
xr
>>
24
)]
+
c
.
s1
[
byte
(
xr
>>
16
)])
^
c
.
s2
[
byte
(
xr
>>
8
)])
+
c
.
s3
[
byte
(
xr
)]
^
c
.
p
[
12
]
xr
^=
((
c
.
s0
[
byte
(
xl
>>
24
)]
+
c
.
s1
[
byte
(
xl
>>
16
)])
^
c
.
s2
[
byte
(
xl
>>
8
)])
+
c
.
s3
[
byte
(
xl
)]
^
c
.
p
[
13
]
xl
^=
((
c
.
s0
[
byte
(
xr
>>
24
)]
+
c
.
s1
[
byte
(
xr
>>
16
)])
^
c
.
s2
[
byte
(
xr
>>
8
)])
+
c
.
s3
[
byte
(
xr
)]
^
c
.
p
[
14
]
xr
^=
((
c
.
s0
[
byte
(
xl
>>
24
)]
+
c
.
s1
[
byte
(
xl
>>
16
)])
^
c
.
s2
[
byte
(
xl
>>
8
)])
+
c
.
s3
[
byte
(
xl
)]
^
c
.
p
[
15
]
xl
^=
((
c
.
s0
[
byte
(
xr
>>
24
)]
+
c
.
s1
[
byte
(
xr
>>
16
)])
^
c
.
s2
[
byte
(
xr
>>
8
)])
+
c
.
s3
[
byte
(
xr
)]
^
c
.
p
[
16
]
xr
^=
c
.
p
[
17
]
return
xr
,
xl
}
func
decryptBlock
(
l
,
r
uint32
,
c
*
Cipher
)
(
uint32
,
uint32
)
{
xl
,
xr
:=
l
,
r
xl
^=
c
.
p
[
17
]
xr
^=
((
c
.
s0
[
byte
(
xl
>>
24
)]
+
c
.
s1
[
byte
(
xl
>>
16
)])
^
c
.
s2
[
byte
(
xl
>>
8
)])
+
c
.
s3
[
byte
(
xl
)]
^
c
.
p
[
16
]
xl
^=
((
c
.
s0
[
byte
(
xr
>>
24
)]
+
c
.
s1
[
byte
(
xr
>>
16
)])
^
c
.
s2
[
byte
(
xr
>>
8
)])
+
c
.
s3
[
byte
(
xr
)]
^
c
.
p
[
15
]
xr
^=
((
c
.
s0
[
byte
(
xl
>>
24
)]
+
c
.
s1
[
byte
(
xl
>>
16
)])
^
c
.
s2
[
byte
(
xl
>>
8
)])
+
c
.
s3
[
byte
(
xl
)]
^
c
.
p
[
14
]
xl
^=
((
c
.
s0
[
byte
(
xr
>>
24
)]
+
c
.
s1
[
byte
(
xr
>>
16
)])
^
c
.
s2
[
byte
(
xr
>>
8
)])
+
c
.
s3
[
byte
(
xr
)]
^
c
.
p
[
13
]
xr
^=
((
c
.
s0
[
byte
(
xl
>>
24
)]
+
c
.
s1
[
byte
(
xl
>>
16
)])
^
c
.
s2
[
byte
(
xl
>>
8
)])
+
c
.
s3
[
byte
(
xl
)]
^
c
.
p
[
12
]
xl
^=
((
c
.
s0
[
byte
(
xr
>>
24
)]
+
c
.
s1
[
byte
(
xr
>>
16
)])
^
c
.
s2
[
byte
(
xr
>>
8
)])
+
c
.
s3
[
byte
(
xr
)]
^
c
.
p
[
11
]
xr
^=
((
c
.
s0
[
byte
(
xl
>>
24
)]
+
c
.
s1
[
byte
(
xl
>>
16
)])
^
c
.
s2
[
byte
(
xl
>>
8
)])
+
c
.
s3
[
byte
(
xl
)]
^
c
.
p
[
10
]
xl
^=
((
c
.
s0
[
byte
(
xr
>>
24
)]
+
c
.
s1
[
byte
(
xr
>>
16
)])
^
c
.
s2
[
byte
(
xr
>>
8
)])
+
c
.
s3
[
byte
(
xr
)]
^
c
.
p
[
9
]
xr
^=
((
c
.
s0
[
byte
(
xl
>>
24
)]
+
c
.
s1
[
byte
(
xl
>>
16
)])
^
c
.
s2
[
byte
(
xl
>>
8
)])
+
c
.
s3
[
byte
(
xl
)]
^
c
.
p
[
8
]
xl
^=
((
c
.
s0
[
byte
(
xr
>>
24
)]
+
c
.
s1
[
byte
(
xr
>>
16
)])
^
c
.
s2
[
byte
(
xr
>>
8
)])
+
c
.
s3
[
byte
(
xr
)]
^
c
.
p
[
7
]
xr
^=
((
c
.
s0
[
byte
(
xl
>>
24
)]
+
c
.
s1
[
byte
(
xl
>>
16
)])
^
c
.
s2
[
byte
(
xl
>>
8
)])
+
c
.
s3
[
byte
(
xl
)]
^
c
.
p
[
6
]
xl
^=
((
c
.
s0
[
byte
(
xr
>>
24
)]
+
c
.
s1
[
byte
(
xr
>>
16
)])
^
c
.
s2
[
byte
(
xr
>>
8
)])
+
c
.
s3
[
byte
(
xr
)]
^
c
.
p
[
5
]
xr
^=
((
c
.
s0
[
byte
(
xl
>>
24
)]
+
c
.
s1
[
byte
(
xl
>>
16
)])
^
c
.
s2
[
byte
(
xl
>>
8
)])
+
c
.
s3
[
byte
(
xl
)]
^
c
.
p
[
4
]
xl
^=
((
c
.
s0
[
byte
(
xr
>>
24
)]
+
c
.
s1
[
byte
(
xr
>>
16
)])
^
c
.
s2
[
byte
(
xr
>>
8
)])
+
c
.
s3
[
byte
(
xr
)]
^
c
.
p
[
3
]
xr
^=
((
c
.
s0
[
byte
(
xl
>>
24
)]
+
c
.
s1
[
byte
(
xl
>>
16
)])
^
c
.
s2
[
byte
(
xl
>>
8
)])
+
c
.
s3
[
byte
(
xl
)]
^
c
.
p
[
2
]
xl
^=
((
c
.
s0
[
byte
(
xr
>>
24
)]
+
c
.
s1
[
byte
(
xr
>>
16
)])
^
c
.
s2
[
byte
(
xr
>>
8
)])
+
c
.
s3
[
byte
(
xr
)]
^
c
.
p
[
1
]
xr
^=
c
.
p
[
0
]
return
xr
,
xl
}
func
zero
(
x
[]
uint32
)
{
for
i
:=
range
x
{
x
[
i
]
=
0
}
}
src/pkg/crypto/blowfish/blowfish_test.go
0 → 100644
View file @
ef531c2b
// Copyright 2010 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package
blowfish
import
(
"testing"
)
type
CryptTest
struct
{
key
[]
byte
in
[]
byte
out
[]
byte
}
// Test vector values are from http://www.schneier.com/code/vectors.txt.
var
encryptTests
=
[]
CryptTest
{
CryptTest
{
[]
byte
{
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
},
[]
byte
{
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
},
[]
byte
{
0x4E
,
0xF9
,
0x97
,
0x45
,
0x61
,
0x98
,
0xDD
,
0x78
}},
CryptTest
{
[]
byte
{
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0xFF
},
[]
byte
{
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0xFF
},
[]
byte
{
0x51
,
0x86
,
0x6F
,
0xD5
,
0xB8
,
0x5E
,
0xCB
,
0x8A
}},
CryptTest
{
[]
byte
{
0x30
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
},
[]
byte
{
0x10
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x01
},
[]
byte
{
0x7D
,
0x85
,
0x6F
,
0x9A
,
0x61
,
0x30
,
0x63
,
0xF2
}},
CryptTest
{
[]
byte
{
0x11
,
0x11
,
0x11
,
0x11
,
0x11
,
0x11
,
0x11
,
0x11
},
[]
byte
{
0x11
,
0x11
,
0x11
,
0x11
,
0x11
,
0x11
,
0x11
,
0x11
},
[]
byte
{
0x24
,
0x66
,
0xDD
,
0x87
,
0x8B
,
0x96
,
0x3C
,
0x9D
}},
CryptTest
{
[]
byte
{
0x01
,
0x23
,
0x45
,
0x67
,
0x89
,
0xAB
,
0xCD
,
0xEF
},
[]
byte
{
0x11
,
0x11
,
0x11
,
0x11
,
0x11
,
0x11
,
0x11
,
0x11
},
[]
byte
{
0x61
,
0xF9
,
0xC3
,
0x80
,
0x22
,
0x81
,
0xB0
,
0x96
}},
CryptTest
{
[]
byte
{
0x11
,
0x11
,
0x11
,
0x11
,
0x11
,
0x11
,
0x11
,
0x11
},
[]
byte
{
0x01
,
0x23
,
0x45
,
0x67
,
0x89
,
0xAB
,
0xCD
,
0xEF
},
[]
byte
{
0x7D
,
0x0C
,
0xC6
,
0x30
,
0xAF
,
0xDA
,
0x1E
,
0xC7
}},
CryptTest
{
[]
byte
{
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
},
[]
byte
{
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
},
[]
byte
{
0x4E
,
0xF9
,
0x97
,
0x45
,
0x61
,
0x98
,
0xDD
,
0x78
}},
CryptTest
{
[]
byte
{
0xFE
,
0xDC
,
0xBA
,
0x98
,
0x76
,
0x54
,
0x32
,
0x10
},
[]
byte
{
0x01
,
0x23
,
0x45
,
0x67
,
0x89
,
0xAB
,
0xCD
,
0xEF
},
[]
byte
{
0x0A
,
0xCE
,
0xAB
,
0x0F
,
0xC6
,
0xA0
,
0xA2
,
0x8D
}},
CryptTest
{
[]
byte
{
0x7C
,
0xA1
,
0x10
,
0x45
,
0x4A
,
0x1A
,
0x6E
,
0x57
},
[]
byte
{
0x01
,
0xA1
,
0xD6
,
0xD0
,
0x39
,
0x77
,
0x67
,
0x42
},
[]
byte
{
0x59
,
0xC6
,
0x82
,
0x45
,
0xEB
,
0x05
,
0x28
,
0x2B
}},
CryptTest
{
[]
byte
{
0x01
,
0x31
,
0xD9
,
0x61
,
0x9D
,
0xC1
,
0x37
,
0x6E
},
[]
byte
{
0x5C
,
0xD5
,
0x4C
,
0xA8
,
0x3D
,
0xEF
,
0x57
,
0xDA
},
[]
byte
{
0xB1
,
0xB8
,
0xCC
,
0x0B
,
0x25
,
0x0F
,
0x09
,
0xA0
}},
CryptTest
{
[]
byte
{
0x07
,
0xA1
,
0x13
,
0x3E
,
0x4A
,
0x0B
,
0x26
,
0x86
},
[]
byte
{
0x02
,
0x48
,
0xD4
,
0x38
,
0x06
,
0xF6
,
0x71
,
0x72
},
[]
byte
{
0x17
,
0x30
,
0xE5
,
0x77
,
0x8B
,
0xEA
,
0x1D
,
0xA4
}},
CryptTest
{
[]
byte
{
0x38
,
0x49
,
0x67
,
0x4C
,
0x26
,
0x02
,
0x31
,
0x9E
},
[]
byte
{
0x51
,
0x45
,
0x4B
,
0x58
,
0x2D
,
0xDF
,
0x44
,
0x0A
},
[]
byte
{
0xA2
,
0x5E
,
0x78
,
0x56
,
0xCF
,
0x26
,
0x51
,
0xEB
}},
CryptTest
{
[]
byte
{
0x04
,
0xB9
,
0x15
,
0xBA
,
0x43
,
0xFE
,
0xB5
,
0xB6
},
[]
byte
{
0x42
,
0xFD
,
0x44
,
0x30
,
0x59
,
0x57
,
0x7F
,
0xA2
},
[]
byte
{
0x35
,
0x38
,
0x82
,
0xB1
,
0x09
,
0xCE
,
0x8F
,
0x1A
}},
CryptTest
{
[]
byte
{
0x01
,
0x13
,
0xB9
,
0x70
,
0xFD
,
0x34
,
0xF2
,
0xCE
},
[]
byte
{
0x05
,
0x9B
,
0x5E
,
0x08
,
0x51
,
0xCF
,
0x14
,
0x3A
},
[]
byte
{
0x48
,
0xF4
,
0xD0
,
0x88
,
0x4C
,
0x37
,
0x99
,
0x18
}},
CryptTest
{
[]
byte
{
0x01
,
0x70
,
0xF1
,
0x75
,
0x46
,
0x8F
,
0xB5
,
0xE6
},
[]
byte
{
0x07
,
0x56
,
0xD8
,
0xE0
,
0x77
,
0x47
,
0x61
,
0xD2
},
[]
byte
{
0x43
,
0x21
,
0x93
,
0xB7
,
0x89
,
0x51
,
0xFC
,
0x98
}},
CryptTest
{
[]
byte
{
0x43
,
0x29
,
0x7F
,
0xAD
,
0x38
,
0xE3
,
0x73
,
0xFE
},
[]
byte
{
0x76
,
0x25
,
0x14
,
0xB8
,
0x29
,
0xBF
,
0x48
,
0x6A
},
[]
byte
{
0x13
,
0xF0
,
0x41
,
0x54
,
0xD6
,
0x9D
,
0x1A
,
0xE5
}},
CryptTest
{
[]
byte
{
0x07
,
0xA7
,
0x13
,
0x70
,
0x45
,
0xDA
,
0x2A
,
0x16
},
[]
byte
{
0x3B
,
0xDD
,
0x11
,
0x90
,
0x49
,
0x37
,
0x28
,
0x02
},
[]
byte
{
0x2E
,
0xED
,
0xDA
,
0x93
,
0xFF
,
0xD3
,
0x9C
,
0x79
}},
CryptTest
{
[]
byte
{
0x04
,
0x68
,
0x91
,
0x04
,
0xC2
,
0xFD
,
0x3B
,
0x2F
},
[]
byte
{
0x26
,
0x95
,
0x5F
,
0x68
,
0x35
,
0xAF
,
0x60
,
0x9A
},
[]
byte
{
0xD8
,
0x87
,
0xE0
,
0x39
,
0x3C
,
0x2D
,
0xA6
,
0xE3
}},
CryptTest
{
[]
byte
{
0x37
,
0xD0
,
0x6B
,
0xB5
,
0x16
,
0xCB
,
0x75
,
0x46
},
[]
byte
{
0x16
,
0x4D
,
0x5E
,
0x40
,
0x4F
,
0x27
,
0x52
,
0x32
},
[]
byte
{
0x5F
,
0x99
,
0xD0
,
0x4F
,
0x5B
,
0x16
,
0x39
,
0x69
}},
CryptTest
{
[]
byte
{
0x1F
,
0x08
,
0x26
,
0x0D
,
0x1A
,
0xC2
,
0x46
,
0x5E
},
[]
byte
{
0x6B
,
0x05
,
0x6E
,
0x18
,
0x75
,
0x9F
,
0x5C
,
0xCA
},
[]
byte
{
0x4A
,
0x05
,
0x7A
,
0x3B
,
0x24
,
0xD3
,
0x97
,
0x7B
}},
CryptTest
{
[]
byte
{
0x58
,
0x40
,
0x23
,
0x64
,
0x1A
,
0xBA
,
0x61
,
0x76
},
[]
byte
{
0x00
,
0x4B
,
0xD6
,
0xEF
,
0x09
,
0x17
,
0x60
,
0x62
},
[]
byte
{
0x45
,
0x20
,
0x31
,
0xC1
,
0xE4
,
0xFA
,
0xDA
,
0x8E
}},
CryptTest
{
[]
byte
{
0x02
,
0x58
,
0x16
,
0x16
,
0x46
,
0x29
,
0xB0
,
0x07
},
[]
byte
{
0x48
,
0x0D
,
0x39
,
0x00
,
0x6E
,
0xE7
,
0x62
,
0xF2
},
[]
byte
{
0x75
,
0x55
,
0xAE
,
0x39
,
0xF5
,
0x9B
,
0x87
,
0xBD
}},
CryptTest
{
[]
byte
{
0x49
,
0x79
,
0x3E
,
0xBC
,
0x79
,
0xB3
,
0x25
,
0x8F
},
[]
byte
{
0x43
,
0x75
,
0x40
,
0xC8
,
0x69
,
0x8F
,
0x3C
,
0xFA
},
[]
byte
{
0x53
,
0xC5
,
0x5F
,
0x9C
,
0xB4
,
0x9F
,
0xC0
,
0x19
}},
CryptTest
{
[]
byte
{
0x4F
,
0xB0
,
0x5E
,
0x15
,
0x15
,
0xAB
,
0x73
,
0xA7
},
[]
byte
{
0x07
,
0x2D
,
0x43
,
0xA0
,
0x77
,
0x07
,
0x52
,
0x92
},
[]
byte
{
0x7A
,
0x8E
,
0x7B
,
0xFA
,
0x93
,
0x7E
,
0x89
,
0xA3
}},
CryptTest
{
[]
byte
{
0x49
,
0xE9
,
0x5D
,
0x6D
,
0x4C
,
0xA2
,
0x29
,
0xBF
},
[]
byte
{
0x02
,
0xFE
,
0x55
,
0x77
,
0x81
,
0x17
,
0xF1
,
0x2A
},
[]
byte
{
0xCF
,
0x9C
,
0x5D
,
0x7A
,
0x49
,
0x86
,
0xAD
,
0xB5
}},
CryptTest
{
[]
byte
{
0x01
,
0x83
,
0x10
,
0xDC
,
0x40
,
0x9B
,
0x26
,
0xD6
},
[]
byte
{
0x1D
,
0x9D
,
0x5C
,
0x50
,
0x18
,
0xF7
,
0x28
,
0xC2
},
[]
byte
{
0xD1
,
0xAB
,
0xB2
,
0x90
,
0x65
,
0x8B
,
0xC7
,
0x78
}},
CryptTest
{
[]
byte
{
0x1C
,
0x58
,
0x7F
,
0x1C
,
0x13
,
0x92
,
0x4F
,
0xEF
},
[]
byte
{
0x30
,
0x55
,
0x32
,
0x28
,
0x6D
,
0x6F
,
0x29
,
0x5A
},
[]
byte
{
0x55
,
0xCB
,
0x37
,
0x74
,
0xD1
,
0x3E
,
0xF2
,
0x01
}},
CryptTest
{
[]
byte
{
0x01
,
0x01
,
0x01
,
0x01
,
0x01
,
0x01
,
0x01
,
0x01
},
[]
byte
{
0x01
,
0x23
,
0x45
,
0x67
,
0x89
,
0xAB
,
0xCD
,
0xEF
},
[]
byte
{
0xFA
,
0x34
,
0xEC
,
0x48
,
0x47
,
0xB2
,
0x68
,
0xB2
}},
CryptTest
{
[]
byte
{
0x1F
,
0x1F
,
0x1F
,
0x1F
,
0x0E
,
0x0E
,
0x0E
,
0x0E
},
[]
byte
{
0x01
,
0x23
,
0x45
,
0x67
,
0x89
,
0xAB
,
0xCD
,
0xEF
},
[]
byte
{
0xA7
,
0x90
,
0x79
,
0x51
,
0x08
,
0xEA
,
0x3C
,
0xAE
}},
CryptTest
{
[]
byte
{
0xE0
,
0xFE
,
0xE0
,
0xFE
,
0xF1
,
0xFE
,
0xF1
,
0xFE
},
[]
byte
{
0x01
,
0x23
,
0x45
,
0x67
,
0x89
,
0xAB
,
0xCD
,
0xEF
},
[]
byte
{
0xC3
,
0x9E
,
0x07
,
0x2D
,
0x9F
,
0xAC
,
0x63
,
0x1D
}},
CryptTest
{
[]
byte
{
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
},
[]
byte
{
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0xFF
},
[]
byte
{
0x01
,
0x49
,
0x33
,
0xE0
,
0xCD
,
0xAF
,
0xF6
,
0xE4
}},
CryptTest
{
[]
byte
{
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0xFF
},
[]
byte
{
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
},
[]
byte
{
0xF2
,
0x1E
,
0x9A
,
0x77
,
0xB7
,
0x1C
,
0x49
,
0xBC
}},
CryptTest
{
[]
byte
{
0x01
,
0x23
,
0x45
,
0x67
,
0x89
,
0xAB
,
0xCD
,
0xEF
},
[]
byte
{
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
},
[]
byte
{
0x24
,
0x59
,
0x46
,
0x88
,
0x57
,
0x54
,
0x36
,
0x9A
}},
CryptTest
{
[]
byte
{
0xFE
,
0xDC
,
0xBA
,
0x98
,
0x76
,
0x54
,
0x32
,
0x10
},
[]
byte
{
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0xFF
},
[]
byte
{
0x6B
,
0x5C
,
0x5A
,
0x9C
,
0x5D
,
0x9E
,
0x0A
,
0x5A
}},
}
func
TestCipherEncrypt
(
t
*
testing
.
T
)
{
for
i
,
tt
:=
range
encryptTests
{
c
,
err
:=
NewCipher
(
tt
.
key
)
if
err
!=
nil
{
t
.
Errorf
(
"NewCipher(%d bytes) = %s"
,
len
(
tt
.
key
),
err
)
continue
}
ct
:=
make
([]
byte
,
len
(
tt
.
out
))
c
.
Encrypt
(
tt
.
in
,
ct
)
for
j
,
v
:=
range
ct
{
if
v
!=
tt
.
out
[
j
]
{
t
.
Errorf
(
"Cipher.Encrypt, test vector #%d: cipher-text[%d] = %#x, expected %#x"
,
i
,
j
,
v
,
tt
.
out
[
j
])
break
}
}
}
}
func
TestCipherDecrypt
(
t
*
testing
.
T
)
{
for
i
,
tt
:=
range
encryptTests
{
c
,
err
:=
NewCipher
(
tt
.
key
)
if
err
!=
nil
{
t
.
Errorf
(
"NewCipher(%d bytes) = %s"
,
len
(
tt
.
key
),
err
)
continue
}
pt
:=
make
([]
byte
,
len
(
tt
.
in
))
c
.
Decrypt
(
tt
.
out
,
pt
)
for
j
,
v
:=
range
pt
{
if
v
!=
tt
.
in
[
j
]
{
t
.
Errorf
(
"Cipher.Decrypt, test vector #%d: plain-text[%d] = %#x, expected %#x"
,
i
,
j
,
v
,
tt
.
in
[
j
])
break
}
}
}
}
src/pkg/crypto/blowfish/cipher.go
0 → 100644
View file @
ef531c2b
// Copyright 2010 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// This package implements Bruce Schneier's Blowfish encryption algorithm.
package
blowfish
// The code is a port of Bruce Schneier's C implementation.
// See http://www.schneier.com/blowfish.html.
import
(
"os"
"strconv"
)
// The Blowfish block size in bytes.
const
BlockSize
=
8
// A Cipher is an instance of Blowfish encryption using a particular key.
type
Cipher
struct
{
p
[
18
]
uint32
s0
,
s1
,
s2
,
s3
[
256
]
uint32
}
type
KeySizeError
int
func
(
k
KeySizeError
)
String
()
string
{
return
"crypto/blowfish: invalid key size "
+
strconv
.
Itoa
(
int
(
k
))
}
// NewCipher creates and returns a Cipher.
// The key argument should be the Blowfish key, 4 to 56 bytes.
func
NewCipher
(
key
[]
byte
)
(
*
Cipher
,
os
.
Error
)
{
k
:=
len
(
key
)
if
k
<
4
||
k
>
56
{
return
nil
,
KeySizeError
(
k
)
}
var
result
Cipher
expandKey
(
key
,
&
result
)
return
&
result
,
nil
}
// BlockSize returns the Blowfish block size, 8 bytes.
// It is necessary to satisfy the Cipher interface in the
// package "crypto/block".
func
(
c
*
Cipher
)
BlockSize
()
int
{
return
BlockSize
}
// Encrypt encrypts the 8-byte buffer src using the key k
// and stores the result in dst.
// Note that for amounts of data larger than a block,
// it is not safe to just call Encrypt on successive blocks;
// instead, use an encryption mode like CBC (see crypto/block/cbc.go).
func
(
c
*
Cipher
)
Encrypt
(
src
,
dst
[]
byte
)
{
l
:=
uint32
(
src
[
0
])
<<
24
|
uint32
(
src
[
1
])
<<
16
|
uint32
(
src
[
2
])
<<
8
|
uint32
(
src
[
3
])
r
:=
uint32
(
src
[
4
])
<<
24
|
uint32
(
src
[
5
])
<<
16
|
uint32
(
src
[
6
])
<<
8
|
uint32
(
src
[
7
])
l
,
r
=
encryptBlock
(
l
,
r
,
c
)
dst
[
0
],
dst
[
1
],
dst
[
2
],
dst
[
3
]
=
byte
(
l
>>
24
),
byte
(
l
>>
16
),
byte
(
l
>>
8
),
byte
(
l
)
dst
[
4
],
dst
[
5
],
dst
[
6
],
dst
[
7
]
=
byte
(
r
>>
24
),
byte
(
r
>>
16
),
byte
(
r
>>
8
),
byte
(
r
)
}
// Decrypt decrypts the 8-byte buffer src using the key k
// and stores the result in dst.
func
(
c
*
Cipher
)
Decrypt
(
src
,
dst
[]
byte
)
{
l
:=
uint32
(
src
[
0
])
<<
24
|
uint32
(
src
[
1
])
<<
16
|
uint32
(
src
[
2
])
<<
8
|
uint32
(
src
[
3
])
r
:=
uint32
(
src
[
4
])
<<
24
|
uint32
(
src
[
5
])
<<
16
|
uint32
(
src
[
6
])
<<
8
|
uint32
(
src
[
7
])
l
,
r
=
decryptBlock
(
l
,
r
,
c
)
dst
[
0
],
dst
[
1
],
dst
[
2
],
dst
[
3
]
=
byte
(
l
>>
24
),
byte
(
l
>>
16
),
byte
(
l
>>
8
),
byte
(
l
)
dst
[
4
],
dst
[
5
],
dst
[
6
],
dst
[
7
]
=
byte
(
r
>>
24
),
byte
(
r
>>
16
),
byte
(
r
>>
8
),
byte
(
r
)
}
// Reset zeros the key data, so that it will no longer
// appear in the process's memory.
func
(
c
*
Cipher
)
Reset
()
{
zero
(
&
c
.
p
)
zero
(
&
c
.
s0
)
zero
(
&
c
.
s1
)
zero
(
&
c
.
s2
)
zero
(
&
c
.
s3
)
}
src/pkg/crypto/blowfish/const.go
0 → 100644
View file @
ef531c2b
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment