mirror of https://github.com/docker/docs.git
Merge pull request #421 from justincormack/arm
Update jose2go to latest to fix #239
This commit is contained in:
commit
f211b1826d
|
@ -101,7 +101,8 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "github.com/dvsekhvalnov/jose2go",
|
"ImportPath": "github.com/dvsekhvalnov/jose2go",
|
||||||
"Rev": "5307afb3bb6169b0f68cdf519a5964c843344441"
|
"Comment": "v1.2",
|
||||||
|
"Rev": "6387d3c1f5abd8443b223577d5a7e0f4e0e5731f"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "github.com/go-sql-driver/mysql",
|
"ImportPath": "github.com/go-sql-driver/mysql",
|
||||||
|
|
|
@ -10,11 +10,14 @@ Extensively unit tested and cross tested (100+ tests) for compatibility with [jo
|
||||||
|
|
||||||
|
|
||||||
## Status
|
## Status
|
||||||
Used in production. GA ready. Current version is 1.1
|
Used in production. GA ready. Current version is 1.2
|
||||||
|
|
||||||
## Important
|
## Important
|
||||||
v1.2 breaks `jose.Decode` interface by returning 3 values instead of 2.
|
v1.2 breaks `jose.Decode` interface by returning 3 values instead of 2.
|
||||||
|
|
||||||
|
v1.2 deprecates `jose.Compress` method in favor of using configuration options to `jose.Encrypt`,
|
||||||
|
the method will be removed in next release.
|
||||||
|
|
||||||
###Migration to v1.2
|
###Migration to v1.2
|
||||||
Pre v1.2 decoding:
|
Pre v1.2 decoding:
|
||||||
|
|
||||||
|
@ -28,6 +31,17 @@ Should be updated to v1.2:
|
||||||
payload, headers, err := jose.Decode(token,sharedKey)
|
payload, headers, err := jose.Decode(token,sharedKey)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Pre v1.2 compression:
|
||||||
|
|
||||||
|
```Go
|
||||||
|
token,err := jose.Compress(payload,jose.DIR,jose.A128GCM,jose.DEF, key)
|
||||||
|
```
|
||||||
|
|
||||||
|
Should be update to v1.2:
|
||||||
|
|
||||||
|
```Go
|
||||||
|
token, err := jose.Encrypt(payload, jose.DIR, jose.A128GCM, key, jose.Zip(jose.DEF))
|
||||||
|
```
|
||||||
|
|
||||||
## Supported JWA algorithms
|
## Supported JWA algorithms
|
||||||
|
|
||||||
|
@ -372,9 +386,9 @@ func main() {
|
||||||
|
|
||||||
sharedKey := []byte{194, 164, 235, 6, 138, 248, 171, 239, 24, 216, 11, 22, 137, 199, 215, 133}
|
sharedKey := []byte{194, 164, 235, 6, 138, 248, 171, 239, 24, 216, 11, 22, 137, 199, 215, 133}
|
||||||
|
|
||||||
token,err := jose.Compress(payload,jose.DIR,jose.A128GCM,jose.DEF, sharedKey)
|
token, err := jose.Encrypt(payload, jose.DIR, jose.A128GCM, sharedKey, jose.Zip(jose.DEF))
|
||||||
|
|
||||||
if(err==nil) {
|
if err == nil {
|
||||||
//go use token
|
//go use token
|
||||||
fmt.Printf("\nDIR A128GCM DEFLATED= %v\n", token)
|
fmt.Printf("\nDIR A128GCM DEFLATED= %v\n", token)
|
||||||
}
|
}
|
||||||
|
@ -583,6 +597,64 @@ func main() {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Adding extra headers
|
||||||
|
It's possible to pass additional headers while encoding token. **jose2go** provides convenience configuration helpers: `Header(name string, value interface{})` and `Headers(headers map[string]interface{})` that can be passed to `Sign(..)` and `Encrypt(..)` calls.
|
||||||
|
|
||||||
|
Note: **jose2go** do not allow to override `alg`, `enc` and `zip` headers.
|
||||||
|
|
||||||
|
Example of signing with extra headers:
|
||||||
|
```Go
|
||||||
|
token, err := jose.Sign(payload, jose.ES256, key,
|
||||||
|
jose.Header("keyid", "111-222-333"),
|
||||||
|
jose.Header("trans-id", "aaa-bbb"))
|
||||||
|
```
|
||||||
|
|
||||||
|
Encryption with extra headers:
|
||||||
|
```Go
|
||||||
|
token, err := jose.Encrypt(payload, jose.DIR, jose.A128GCM, sharedKey,
|
||||||
|
jose.Headers(map[string]interface{}{"keyid": "111-22-33", "cty": "text/plain"}))
|
||||||
|
```
|
||||||
|
|
||||||
|
### Two phase validation
|
||||||
|
In some cases validation (decoding) key can be unknown prior to examining token content. For instance one can use different keys per token issuer or rely on headers information to determine which key to use, do logging or other things.
|
||||||
|
|
||||||
|
**jose2go** allows to pass `func(headers map[string]interface{}, payload string) key interface{}` callback instead of key to `jose.Decode(..)`. Callback will be executed prior to decoding and integrity validation and will recieve parsed headers and payload as is (for encrypted tokens it will be cipher text). Callback should return key to be used for actual decoding process.
|
||||||
|
|
||||||
|
Example of decoding token with callback:
|
||||||
|
|
||||||
|
```Go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/rsa"
|
||||||
|
"fmt"
|
||||||
|
"github.com/dvsekhvalnov/jose2go"
|
||||||
|
"github.com/dvsekhvalnov/jose2go/keys/rsa"
|
||||||
|
"io/ioutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
|
||||||
|
token := "eyJhbGciOiJSUzI1NiIsImN0eSI6InRleHRcL3BsYWluIn0.eyJoZWxsbyI6ICJ3b3JsZCJ9.NL_dfVpZkhNn4bZpCyMq5TmnXbT4yiyecuB6Kax_lV8Yq2dG8wLfea-T4UKnrjLOwxlbwLwuKzffWcnWv3LVAWfeBxhGTa0c4_0TX_wzLnsgLuU6s9M2GBkAIuSMHY6UTFumJlEeRBeiqZNrlqvmAzQ9ppJHfWWkW4stcgLCLMAZbTqvRSppC1SMxnvPXnZSWn_Fk_q3oGKWw6Nf0-j-aOhK0S0Lcr0PV69ZE4xBYM9PUS1MpMe2zF5J3Tqlc1VBcJ94fjDj1F7y8twmMT3H1PI9RozO-21R0SiXZ_a93fxhE_l_dj5drgOek7jUN9uBDjkXUwJPAyp9YPehrjyLdw"
|
||||||
|
|
||||||
|
payload, _, err := jose.Decode(token,
|
||||||
|
func(headers map[string]interface{}, payload string) interface{} {
|
||||||
|
//log something
|
||||||
|
fmt.Printf("\nHeaders before decoding: %v\n", headers)
|
||||||
|
fmt.Printf("\nPayload before decoding: %v\n", payload)
|
||||||
|
|
||||||
|
//lookup key based on keyid header as en example
|
||||||
|
//or lookup based on something from payload, e.g. 'iss' claim for instance
|
||||||
|
return FindKey(headers['keyid'])
|
||||||
|
})
|
||||||
|
|
||||||
|
if err == nil {
|
||||||
|
//go use token
|
||||||
|
fmt.Printf("\ndecoded payload = %v\n", payload)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
### Dealing with keys
|
### Dealing with keys
|
||||||
**jose2go** provides several helper methods to simplify loading & importing of elliptic and rsa keys. Import `jose2go/keys/rsa` or `jose2go/keys/ecc` respectively:
|
**jose2go** provides several helper methods to simplify loading & importing of elliptic and rsa keys. Import `jose2go/keys/rsa` or `jose2go/keys/ecc` respectively:
|
||||||
|
|
||||||
|
@ -733,6 +805,8 @@ Checkout `jose_test.go` for more examples.
|
||||||
##Changelog
|
##Changelog
|
||||||
### 1.2
|
### 1.2
|
||||||
- interface to access token headers after decoding
|
- interface to access token headers after decoding
|
||||||
|
- interface to provide extra headers for token encoding
|
||||||
|
- two-phase validation support
|
||||||
|
|
||||||
### 1.1
|
### 1.1
|
||||||
- security and bug fixes
|
- security and bug fixes
|
||||||
|
|
|
@ -1,38 +0,0 @@
|
||||||
package aes
|
|
||||||
|
|
||||||
import (
|
|
||||||
// "fmt"
|
|
||||||
"crypto/aes"
|
|
||||||
// "crypto/cipher"
|
|
||||||
. "gopkg.in/check.v1"
|
|
||||||
)
|
|
||||||
|
|
||||||
func (s *TestSuite) TestNewECBEncryptor(c *C) {
|
|
||||||
//given
|
|
||||||
plaintext := []byte{0, 17, 34, 51, 68, 85, 102, 119, 136, 153, 170, 187, 204, 221, 238, 255}
|
|
||||||
kek := []byte{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}
|
|
||||||
block, _ := aes.NewCipher(kek)
|
|
||||||
|
|
||||||
test := make([]byte,len(plaintext))
|
|
||||||
|
|
||||||
//when
|
|
||||||
NewECBEncrypter(block).CryptBlocks(test,plaintext)
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, DeepEquals, []byte{105,196,224,216,106,123,4,48,216,205,183,128,112,180,197,90})
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) TestNewECBDecryptor(c *C) {
|
|
||||||
//given
|
|
||||||
ciphertext := []byte{105,196,224,216,106,123,4,48,216,205,183,128,112,180,197,90}
|
|
||||||
kek := []byte{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}
|
|
||||||
block, _ := aes.NewCipher(kek)
|
|
||||||
|
|
||||||
test := make([]byte,len(ciphertext))
|
|
||||||
|
|
||||||
//when
|
|
||||||
NewECBDecrypter(block).CryptBlocks(test,ciphertext)
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, DeepEquals, []byte{0, 17, 34, 51, 68, 85, 102, 119, 136, 153, 170, 187, 204, 221, 238, 255})
|
|
||||||
}
|
|
|
@ -1,240 +0,0 @@
|
||||||
package aes
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
// "fmt"
|
|
||||||
. "gopkg.in/check.v1"
|
|
||||||
// "github.com/dvsekhvalnov/jose2go/arrays"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test(t *testing.T) { TestingT(t) }
|
|
||||||
type TestSuite struct{}
|
|
||||||
var _ = Suite(&TestSuite{})
|
|
||||||
|
|
||||||
func (s *TestSuite) TestWrap_128Key_128Kek(c *C) {
|
|
||||||
//given (Section 4.1)
|
|
||||||
|
|
||||||
//000102030405060708090A0B0C0D0E0F
|
|
||||||
kek := []byte{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}
|
|
||||||
|
|
||||||
//00112233445566778899AABBCCDDEEFF
|
|
||||||
key := []byte{0,17,34,51,68,85,102,119,136,153,170,187,204,221,238,255}
|
|
||||||
|
|
||||||
//1FA68B0A8112B447AEF34BD8FB5A7B829D3E862371D2CFE5
|
|
||||||
expected := []byte{ 31, 166, 139, 10, 129, 18, 180, 71, 174, 243, 75, 216, 251, 90, 123, 130, 157, 62, 134,35, 113, 210, 207, 229}
|
|
||||||
|
|
||||||
//when
|
|
||||||
test,_ := KeyWrap(key, kek);
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, DeepEquals, expected)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) Test_Unwrap128Key_128Kek(c *C) {
|
|
||||||
//given (Section 4.1)
|
|
||||||
|
|
||||||
//000102030405060708090A0B0C0D0E0F
|
|
||||||
kek := []byte{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }
|
|
||||||
|
|
||||||
//00112233445566778899AABBCCDDEEFF
|
|
||||||
expected := []byte{ 0, 17, 34, 51, 68, 85, 102, 119, 136, 153, 170, 187, 204, 221, 238, 255 }
|
|
||||||
|
|
||||||
//1FA68B0A8112B447AEF34BD8FB5A7B829D3E862371D2CFE5
|
|
||||||
key := []byte{ 31, 166, 139, 10, 129, 18, 180, 71, 174, 243, 75, 216, 251, 90, 123, 130, 157, 62, 134, 35, 113, 210, 207, 229 }
|
|
||||||
|
|
||||||
//when
|
|
||||||
test,_ := KeyUnwrap(key, kek)
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, DeepEquals, expected)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) Test_Wrap_128Key_192Kek(c *C) {
|
|
||||||
//given (Section 4.2)
|
|
||||||
|
|
||||||
//000102030405060708090A0B0C0D0E0F1011121314151617
|
|
||||||
kek := []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23}
|
|
||||||
|
|
||||||
//00112233445566778899AABBCCDDEEFF
|
|
||||||
key := []byte{0, 17, 34, 51, 68, 85, 102, 119, 136, 153, 170, 187, 204, 221, 238, 255}
|
|
||||||
|
|
||||||
//96778B25AE6CA435F92B5B97C050AED2468AB8A17AD84E5D
|
|
||||||
expected := []byte{150, 119, 139, 37, 174, 108, 164, 53, 249, 43, 91, 151, 192, 80, 174, 210, 70, 138, 184, 161, 122, 216, 78, 93}
|
|
||||||
|
|
||||||
//when
|
|
||||||
test,_ := KeyWrap(key, kek);
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, DeepEquals, expected)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) Test_Unwrap128Key_192Kek(c *C) {
|
|
||||||
//given (Section 4.2)
|
|
||||||
|
|
||||||
//000102030405060708090A0B0C0D0E0F1011121314151617
|
|
||||||
kek := []byte{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 }
|
|
||||||
|
|
||||||
//00112233445566778899AABBCCDDEEFF
|
|
||||||
expected := []byte{ 0, 17, 34, 51, 68, 85, 102, 119, 136, 153, 170, 187, 204, 221, 238, 255 }
|
|
||||||
|
|
||||||
//96778B25AE6CA435F92B5B97C050AED2468AB8A17AD84E5D
|
|
||||||
key := []byte{ 150, 119, 139, 37, 174, 108, 164, 53, 249, 43, 91, 151, 192, 80, 174, 210, 70, 138, 184, 161, 122, 216, 78, 93 }
|
|
||||||
|
|
||||||
//when
|
|
||||||
test,_ := KeyUnwrap(key, kek)
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, DeepEquals, expected)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) Test_Wrap_128Key_256Kek(c *C) {
|
|
||||||
//given (Section 4.3)
|
|
||||||
|
|
||||||
//000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
|
|
||||||
kek := []byte{0, 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}
|
|
||||||
|
|
||||||
//00112233445566778899AABBCCDDEEFF
|
|
||||||
key := []byte{0, 17, 34, 51, 68, 85, 102, 119, 136, 153, 170, 187, 204, 221, 238, 255}
|
|
||||||
|
|
||||||
//64E8C3F9CE0F5BA263E9777905818A2A93C8191E7D6E8AE7
|
|
||||||
expected := []byte{100, 232, 195, 249, 206, 15, 91, 162, 99, 233, 119, 121, 5, 129, 138, 42, 147, 200, 25, 30, 125, 110, 138, 231}
|
|
||||||
|
|
||||||
//when
|
|
||||||
test,_ := KeyWrap(key, kek);
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, DeepEquals, expected)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) Test_Unwrap128Key_256Kek(c *C) {
|
|
||||||
//given (Section 4.3)
|
|
||||||
|
|
||||||
//000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
|
|
||||||
kek := []byte{ 0, 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 }
|
|
||||||
|
|
||||||
//00112233445566778899AABBCCDDEEFF
|
|
||||||
expected := []byte{ 0, 17, 34, 51, 68, 85, 102, 119, 136, 153, 170, 187, 204, 221, 238, 255 }
|
|
||||||
|
|
||||||
//64E8C3F9CE0F5BA263E9777905818A2A93C8191E7D6E8AE7
|
|
||||||
key := []byte{ 100, 232, 195, 249, 206, 15, 91, 162, 99, 233, 119, 121, 5, 129, 138, 42, 147, 200, 25, 30, 125, 110, 138, 231 }
|
|
||||||
|
|
||||||
//when
|
|
||||||
test,_ := KeyUnwrap(key, kek)
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, DeepEquals, expected)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) Test_Wrap_192Key_192Kek(c *C) {
|
|
||||||
//given (Section 4.4)
|
|
||||||
|
|
||||||
//000102030405060708090A0B0C0D0E0F1011121314151617
|
|
||||||
kek := []byte{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 }
|
|
||||||
|
|
||||||
//00112233445566778899AABBCCDDEEFF0001020304050607
|
|
||||||
key := []byte{ 0, 17, 34, 51, 68, 85, 102, 119, 136, 153, 170, 187, 204, 221, 238, 255, 0, 1, 2, 3, 4, 5, 6, 7 }
|
|
||||||
|
|
||||||
//031D33264E15D33268F24EC260743EDCE1C6C7DDEE725A936BA814915C6762D2
|
|
||||||
expected := []byte{ 3, 29, 51, 38, 78, 21, 211, 50, 104, 242, 78, 194, 96, 116, 62, 220, 225, 198, 199, 221, 238, 114, 90, 147, 107, 168, 20, 145, 92, 103, 98, 210 }
|
|
||||||
|
|
||||||
//when
|
|
||||||
test,_ := KeyWrap(key, kek);
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, DeepEquals, expected)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) Test_Unwrap192Key_192Kek(c *C) {
|
|
||||||
//given (Section 4.4)
|
|
||||||
|
|
||||||
//000102030405060708090A0B0C0D0E0F1011121314151617
|
|
||||||
kek := []byte{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 }
|
|
||||||
|
|
||||||
//00112233445566778899AABBCCDDEEFF0001020304050607
|
|
||||||
expected := []byte{ 0, 17, 34, 51, 68, 85, 102, 119, 136, 153, 170, 187, 204, 221, 238, 255, 0, 1, 2, 3, 4, 5, 6, 7 }
|
|
||||||
|
|
||||||
//031D33264E15D33268F24EC260743EDCE1C6C7DDEE725A936BA814915C6762D2
|
|
||||||
key := []byte{ 3, 29, 51, 38, 78, 21, 211, 50, 104, 242, 78, 194, 96, 116, 62, 220, 225, 198, 199, 221, 238, 114, 90, 147, 107, 168, 20, 145, 92, 103, 98, 210 }
|
|
||||||
|
|
||||||
//when
|
|
||||||
test,_ := KeyUnwrap(key, kek)
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, DeepEquals, expected)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) Test_Wrap_192Key_256Kek(c *C) {
|
|
||||||
//given (Section 4.5)
|
|
||||||
|
|
||||||
//000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
|
|
||||||
kek := []byte{ 0, 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 }
|
|
||||||
|
|
||||||
//00112233445566778899AABBCCDDEEFF0001020304050607
|
|
||||||
key := []byte{ 0, 17, 34, 51, 68, 85, 102, 119, 136, 153, 170, 187, 204, 221, 238, 255, 0, 1, 2, 3, 4, 5, 6, 7 }
|
|
||||||
|
|
||||||
//A8F9BC1612C68B3FF6E6F4FBE30E71E4769C8B80A32CB8958CD5D17D6B254DA1
|
|
||||||
expected := []byte{ 168, 249, 188, 22, 18, 198, 139, 63, 246, 230, 244, 251, 227, 14, 113, 228, 118, 156, 139, 128, 163, 44, 184, 149, 140, 213, 209, 125, 107, 37, 77, 161 }
|
|
||||||
|
|
||||||
//when
|
|
||||||
test,_ := KeyWrap(key, kek);
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, DeepEquals, expected)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) Test_Unwrap192Key_256Kek(c *C) {
|
|
||||||
//given (Section 4.5)
|
|
||||||
|
|
||||||
//000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
|
|
||||||
kek := []byte{ 0, 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 }
|
|
||||||
|
|
||||||
//00112233445566778899AABBCCDDEEFF0001020304050607
|
|
||||||
expected := []byte{ 0, 17, 34, 51, 68, 85, 102, 119, 136, 153, 170, 187, 204, 221, 238, 255, 0, 1, 2, 3, 4, 5, 6, 7 }
|
|
||||||
|
|
||||||
//A8F9BC1612C68B3FF6E6F4FBE30E71E4769C8B80A32CB8958CD5D17D6B254DA1
|
|
||||||
key := []byte{ 168, 249, 188, 22, 18, 198, 139, 63, 246, 230, 244, 251, 227, 14, 113, 228, 118, 156, 139, 128, 163, 44, 184, 149, 140, 213, 209, 125, 107, 37, 77, 161 }
|
|
||||||
|
|
||||||
//when
|
|
||||||
test,_ := KeyUnwrap(key, kek)
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, DeepEquals, expected)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) Test_Wrap_256Key_256Kek(c *C) {
|
|
||||||
//given (Section 4.6)
|
|
||||||
|
|
||||||
//000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
|
|
||||||
kek := []byte{ 0, 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 }
|
|
||||||
|
|
||||||
//00112233445566778899AABBCCDDEEFF000102030405060708090A0B0C0D0E0F
|
|
||||||
key := []byte{ 0, 17, 34, 51, 68, 85, 102, 119, 136, 153, 170, 187, 204, 221, 238, 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }
|
|
||||||
|
|
||||||
//28C9F404C4B810F4CBCCB35CFB87F8263F5786E2D80ED326CBC7F0E71A99F43BFB988B9B7A02DD21
|
|
||||||
expected := []byte{ 40, 201, 244, 4, 196, 184, 16, 244, 203, 204, 179, 92, 251, 135, 248, 38, 63, 87, 134, 226, 216, 14, 211, 38, 203, 199, 240, 231, 26, 153, 244, 59, 251, 152, 139, 155, 122, 2, 221, 33 }
|
|
||||||
|
|
||||||
//when
|
|
||||||
test,_ := KeyWrap(key, kek);
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, DeepEquals, expected)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) Test_Unwrap256Key_256Kek(c *C) {
|
|
||||||
//given (Section 4.6)
|
|
||||||
|
|
||||||
//000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
|
|
||||||
kek := []byte{ 0, 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 }
|
|
||||||
|
|
||||||
//00112233445566778899AABBCCDDEEFF000102030405060708090A0B0C0D0E0F
|
|
||||||
expected := []byte{ 0, 17, 34, 51, 68, 85, 102, 119, 136, 153, 170, 187, 204, 221, 238, 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }
|
|
||||||
|
|
||||||
//28C9F404C4B810F4CBCCB35CFB87F8263F5786E2D80ED326CBC7F0E71A99F43BFB988B9B7A02DD21
|
|
||||||
key := []byte{ 40, 201, 244, 4, 196, 184, 16, 244, 203, 204, 179, 92, 251, 135, 248, 38, 63, 87, 134, 226, 216, 14, 211, 38, 203, 199, 240, 231, 26, 153, 244, 59, 251, 152, 139, 155, 122, 2, 221, 33 }
|
|
||||||
|
|
||||||
//when
|
|
||||||
test,_ := KeyUnwrap(key, kek)
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, DeepEquals, expected)
|
|
||||||
}
|
|
|
@ -2,11 +2,11 @@
|
||||||
package arrays
|
package arrays
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/binary"
|
|
||||||
"bytes"
|
"bytes"
|
||||||
"github.com/dvsekhvalnov/jose2go/base64url"
|
|
||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
|
"encoding/binary"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/dvsekhvalnov/jose2go/base64url"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Xor is doing byte by byte exclusive or of 2 byte arrays
|
// Xor is doing byte by byte exclusive or of 2 byte arrays
|
||||||
|
@ -23,7 +23,7 @@ func Xor(left,right []byte) []byte {
|
||||||
// Slice is splitting input byte array into slice of subarrays. Each of count length.
|
// Slice is splitting input byte array into slice of subarrays. Each of count length.
|
||||||
func Slice(arr []byte, count int) [][]byte {
|
func Slice(arr []byte, count int) [][]byte {
|
||||||
|
|
||||||
sliceCount := len(arr) / count;
|
sliceCount := len(arr) / count
|
||||||
result := make([][]byte, sliceCount)
|
result := make([][]byte, sliceCount)
|
||||||
|
|
||||||
for i := 0; i < sliceCount; i++ {
|
for i := 0; i < sliceCount; i++ {
|
||||||
|
@ -51,7 +51,7 @@ func Random(byteCount int) ([]byte,error) {
|
||||||
func Concat(arrays ...[]byte) []byte {
|
func Concat(arrays ...[]byte) []byte {
|
||||||
var result []byte = arrays[0]
|
var result []byte = arrays[0]
|
||||||
|
|
||||||
for _,arr := range(arrays[1:]) {
|
for _, arr := range arrays[1:] {
|
||||||
result = append(result, arr...)
|
result = append(result, arr...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,7 +62,7 @@ func Concat(arrays ...[]byte) []byte {
|
||||||
func Unwrap(arrays [][]byte) []byte {
|
func Unwrap(arrays [][]byte) []byte {
|
||||||
var result []byte = arrays[0]
|
var result []byte = arrays[0]
|
||||||
|
|
||||||
for _,arr := range(arrays[1:]) {
|
for _, arr := range arrays[1:] {
|
||||||
result = append(result, arr...)
|
result = append(result, arr...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -93,7 +93,7 @@ func Dump(arr []byte) string {
|
||||||
buf.WriteString(fmt.Sprintf("%v", len(arr)))
|
buf.WriteString(fmt.Sprintf("%v", len(arr)))
|
||||||
buf.WriteString(" bytes)[")
|
buf.WriteString(" bytes)[")
|
||||||
|
|
||||||
for idx,b := range(arr) {
|
for idx, b := range arr {
|
||||||
buf.WriteString(fmt.Sprintf("%v", b))
|
buf.WriteString(fmt.Sprintf("%v", b))
|
||||||
if idx != len(arr)-1 {
|
if idx != len(arr)-1 {
|
||||||
buf.WriteString(", ")
|
buf.WriteString(", ")
|
||||||
|
@ -102,7 +102,7 @@ func Dump(arr []byte) string {
|
||||||
|
|
||||||
buf.WriteString("], Hex: [")
|
buf.WriteString("], Hex: [")
|
||||||
|
|
||||||
for idx,b := range(arr) {
|
for idx, b := range arr {
|
||||||
buf.WriteString(fmt.Sprintf("%X", b))
|
buf.WriteString(fmt.Sprintf("%X", b))
|
||||||
if idx != len(arr)-1 {
|
if idx != len(arr)-1 {
|
||||||
buf.WriteString(" ")
|
buf.WriteString(" ")
|
||||||
|
|
|
@ -1,80 +0,0 @@
|
||||||
package arrays
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
// "fmt"
|
|
||||||
. "gopkg.in/check.v1"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test(t *testing.T) { TestingT(t) }
|
|
||||||
type TestSuite struct{}
|
|
||||||
var _ = Suite(&TestSuite{})
|
|
||||||
|
|
||||||
func (s *TestSuite) TestXor(c *C) {
|
|
||||||
//given
|
|
||||||
data:=[]byte { 0xFF, 0x00, 0xF0, 0x0F, 0x55, 0xAA, 0xBB, 0xCC}
|
|
||||||
|
|
||||||
//when
|
|
||||||
test_1:=Xor(data,[]byte{0x00, 0xFF, 0x0F, 0xF0, 0xAA, 0x55, 0x44, 0x33})
|
|
||||||
test_2:=Xor(data,[]byte{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF})
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test_1, DeepEquals, []byte{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF})
|
|
||||||
c.Assert(test_2, DeepEquals, []byte{0x00, 0xFF, 0x0F, 0xF0, 0xAA, 0x55, 0x44, 0x33})
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) TestSlice(c *C) {
|
|
||||||
//given
|
|
||||||
data:=[]byte{ 0, 1, 2, 3, 4, 5, 6, 7, 8 }
|
|
||||||
|
|
||||||
//when
|
|
||||||
test:=Slice(data,3)
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(len(test), Equals, 3)
|
|
||||||
c.Assert(test[0], DeepEquals, []byte{0,1,2})
|
|
||||||
c.Assert(test[1], DeepEquals, []byte{3,4,5})
|
|
||||||
c.Assert(test[2], DeepEquals, []byte{6,7,8})
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) TestConcat(c *C) {
|
|
||||||
//given
|
|
||||||
a:=[]byte{1,2,3}
|
|
||||||
b:=[]byte{4,5}
|
|
||||||
d:=[]byte{6}
|
|
||||||
e:=[]byte{}
|
|
||||||
f:=[]byte{7,8,9,10}
|
|
||||||
|
|
||||||
//when
|
|
||||||
test:=Concat(a,b,d,e,f)
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, DeepEquals, []byte{1,2,3,4,5,6,7,8,9,10})
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) TestUnwrap(c *C) {
|
|
||||||
//given
|
|
||||||
a:=[]byte{1,2,3}
|
|
||||||
b:=[]byte{4,5}
|
|
||||||
d:=[]byte{6}
|
|
||||||
e:=[]byte{}
|
|
||||||
f:=[]byte{7,8,9,10}
|
|
||||||
|
|
||||||
//when
|
|
||||||
test:=Unwrap([][]byte{a,b,d,e,f})
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, DeepEquals, []byte{1,2,3,4,5,6,7,8,9,10})
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) TestUInt32ToBytes(c *C) {
|
|
||||||
//then
|
|
||||||
c.Assert(UInt32ToBytes(0xFF), DeepEquals, []byte{ 0x00, 0x00, 0x00, 0xFF })
|
|
||||||
c.Assert(UInt32ToBytes(0xFFFFFFFE), DeepEquals, []byte{ 0xff, 0xff, 0xff, 0xfe })
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) TestUInt64ToBytes(c *C) {
|
|
||||||
//then
|
|
||||||
c.Assert(UInt64ToBytes(0xFF), DeepEquals, []byte{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF })
|
|
||||||
c.Assert(UInt64ToBytes(0xFFFFFFFFFFFFFFFE), DeepEquals, []byte{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe })
|
|
||||||
}
|
|
40
Godeps/_workspace/src/github.com/dvsekhvalnov/jose2go/base64url/base64url_test.go
generated
vendored
40
Godeps/_workspace/src/github.com/dvsekhvalnov/jose2go/base64url/base64url_test.go
generated
vendored
|
@ -1,40 +0,0 @@
|
||||||
package base64url
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
"fmt"
|
|
||||||
. "gopkg.in/check.v1"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test(t *testing.T) { TestingT(t) }
|
|
||||||
type TestSuite struct{}
|
|
||||||
var _ = Suite(&TestSuite{})
|
|
||||||
|
|
||||||
func (s *TestSuite) TestEncode(c *C) {
|
|
||||||
//given
|
|
||||||
in:=[]byte{72,101,108,108,111,32,66,97,115,101,54,52,85,114,108,32,101,110,99,111,100,105,110,103,33}
|
|
||||||
|
|
||||||
//when
|
|
||||||
test:=Encode(in)
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, Equals, "SGVsbG8gQmFzZTY0VXJsIGVuY29kaW5nIQ")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) TestDecode(c *C) {
|
|
||||||
//when
|
|
||||||
test,err := Decode("SGVsbG8gQmFzZTY0VXJsIGVuY29kaW5nIQ")
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(err, IsNil)
|
|
||||||
c.Assert(test, DeepEquals, []byte{72,101,108,108,111,32,66,97,115,101,54,52,85,114,108,32,101,110,99,111,100,105,110,103,33})
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) TestDecodeIllegalBase64String(c *C) {
|
|
||||||
//when
|
|
||||||
_,err := Decode("SGVsbG8gQmFzZTY0VXJsIGVuY29kaW5nQ")
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(err,NotNil)
|
|
||||||
fmt.Printf("err = %v\n",err)
|
|
||||||
}
|
|
|
@ -2,24 +2,23 @@
|
||||||
package compact
|
package compact
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"strings"
|
|
||||||
"github.com/dvsekhvalnov/jose2go/base64url"
|
"github.com/dvsekhvalnov/jose2go/base64url"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Parse splitting & decoding compact serialized json web token, returns slice of byte arrays, each representing part of token
|
// Parse splitting & decoding compact serialized json web token, returns slice of byte arrays, each representing part of token
|
||||||
func Parse(token string) [][]byte {
|
func Parse(token string) (result [][]byte, e error) {
|
||||||
parts := strings.Split(token, ".")
|
parts := strings.Split(token, ".")
|
||||||
|
|
||||||
result:=make([][]byte,len(parts))
|
result = make([][]byte, len(parts))
|
||||||
var e error
|
|
||||||
|
|
||||||
for i, part := range parts {
|
for i, part := range parts {
|
||||||
if result[i], e = base64url.Decode(part); e != nil {
|
if result[i], e = base64url.Decode(part); e != nil {
|
||||||
panic(e)
|
return nil, e
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return result
|
return result, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Serialize converts given parts into compact serialization format
|
// Serialize converts given parts into compact serialization format
|
||||||
|
|
|
@ -1,90 +0,0 @@
|
||||||
package compact
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
. "gopkg.in/check.v1"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test(t *testing.T) { TestingT(t) }
|
|
||||||
type TestSuite struct{}
|
|
||||||
var _ = Suite(&TestSuite{})
|
|
||||||
|
|
||||||
func (s *TestSuite) TestParseThreeParts(c *C) {
|
|
||||||
//when
|
|
||||||
test:=Parse("eyJhbGciOiJIUzI1NiIsImN0eSI6InRleHRcL3BsYWluIn0.eyJoZWxsbyI6ICJ3b3JsZCJ9.chIoYWrQMA8XL5nFz6oLDJyvgHk2KA4BrFGrKymjC8E")
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, HasLen, 3)
|
|
||||||
c.Assert(test[0], DeepEquals, []byte{123,34,97,108,103,34,58,34,72,83,50,53,54,34,44,34,99,116,121,34,58,34,116,101,120,116,92,47,112,108,97,105,110,34,125})
|
|
||||||
c.Assert(test[1], DeepEquals, []byte{123,34,104,101,108,108,111,34,58,32,34,119,111,114,108,100,34,125})
|
|
||||||
c.Assert(test[2], DeepEquals, []byte{114,18,40,97,106,208,48,15,23,47,153,197,207,170,11,12,156,175,128,121,54,40,14,1,172,81,171,43,41,163,11,193})
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) TestParseEmptyTrailingPart(c *C) {
|
|
||||||
//when
|
|
||||||
test:=Parse("eyJhbGciOiJub25lIn0.eyJoZWxsbyI6ICJ3b3JsZCJ9.")
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, HasLen, 3)
|
|
||||||
c.Assert(test[0], DeepEquals, []byte{123,34,97,108,103,34,58,34,110,111,110,101,34,125})
|
|
||||||
c.Assert(test[1], DeepEquals, []byte{123,34,104,101,108,108,111,34,58,32,34,119,111,114,108,100,34,125})
|
|
||||||
c.Assert(test[2], DeepEquals, []byte{})
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) TestParseFiveParts(c *C) {
|
|
||||||
//when
|
|
||||||
test:=Parse("eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMTI4R0NNIn0.FojyyzygtFOyNBjzqTRfr9HVHPrvtqbVUt9sXSuU59ZhLlzk7FrirryFnFGtj8YC9lx-IX156Ro9rBaJTCU_dfERd05DhPMffT40rdcDiLxfCLOY0E2PfsMyGQPhI6YtNBtf_sQjXWEBC59zH_VoswFAUstkvXY9eVVecoM-W9HFlIxwUXMVpEPtS96xZX5LMksDgJ9sYDTNa6EQOA0hfzw07fD_FFJShcueqJuoJjILYbad-AHbpnLTV4oTbFTYjskRxpEYQr9plFZsT4_xKiCU89slT9EFhmuaiUI_-NGdX-kNDyQZj2Vtid4LSOVv5kGxyygThuQb6wjr1AGe1g.O92pf8iqwlBIQmXA.YdGjkN7lzeKYIv743XlPRYTd3x4VA0xwa5WVoGf1hiHlhQuXGEg4Jv3elk4JoFJzgVuMMQMex8fpFFL3t5I4H9bH18pbrEo7wLXvGOsP971cuOOaXPxhX6qClkwx5qkWhcTbO_2AuJxzIaU9qBwtwWaxJm9axofAPYgYbdaMZkU4F5sFdaFY8IOe94wUA1Ocn_gxC_DYp9IEAyZut0j5RImmthPgiRO_0pK9OvusE_Xg3iGfdxu70x0KpoItuNwlEf0LUA.uP5jOGMxtDUiT6E3ubucBw")
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, HasLen, 5)
|
|
||||||
c.Assert(test[0], DeepEquals, []byte{123,34,97,108,103,34,58,34,82,83,65,49,95,53,34,44,34,101,110,99,34,58,34,65,49,50,56,71,67,77,34,125})
|
|
||||||
c.Assert(test[1], DeepEquals, []byte{22,136,242,203,60,160,180,83,178,52,24,243,169,52,95,175,209,213,28,250,239,182,166,213,82,223,108,93,43,148,231,214,97,46,92,228,236,90,226,174,188,133,156,81,173,143,198,2,246,92,126,33,125,121,233,26,61,172,22,137,76,37,63,117,241,17,119,78,67,132,243,31,125,62,52,173,215,3,136,188,95,8,179,152,208,77,143,126,195,50,25,3,225,35,166,45,52,27,95,254,196,35,93,97,1,11,159,115,31,245,104,179,1,64,82,203,100,189,118,61,121,85,94,114,131,62,91,209,197,148,140,112,81,115,21,164,67,237,75,222,177,101,126,75,50,75,3,128,159,108,96,52,205,107,161,16,56,13,33,127,60,52,237,240,255,20,82,82,133,203,158,168,155,168,38,50,11,97,182,157,248,1,219,166,114,211,87,138,19,108,84,216,142,201,17,198,145,24,66,191,105,148,86,108,79,143,241,42,32,148,243,219,37,79,209,5,134,107,154,137,66,63,248,209,157,95,233,13,15,36,25,143,101,109,137,222,11,72,229,111,230,65,177,203,40,19,134,228,27,235,8,235,212,1,158,214})
|
|
||||||
c.Assert(test[2], DeepEquals, []byte{59,221,169,127,200,170,194,80,72,66,101,192})
|
|
||||||
c.Assert(test[3], DeepEquals, []byte{97,209,163,144,222,229,205,226,152,34,254,248,221,121,79,69,132,221,223,30,21,3,76,112,107,149,149,160,103,245,134,33,229,133,11,151,24,72,56,38,253,222,150,78,9,160,82,115,129,91,140,49,3,30,199,199,233,20,82,247,183,146,56,31,214,199,215,202,91,172,74,59,192,181,239,24,235,15,247,189,92,184,227,154,92,252,97,95,170,130,150,76,49,230,169,22,133,196,219,59,253,128,184,156,115,33,165,61,168,28,45,193,102,177,38,111,90,198,135,192,61,136,24,109,214,140,102,69,56,23,155,5,117,161,88,240,131,158,247,140,20,3,83,156,159,248,49,11,240,216,167,210,4,3,38,110,183,72,249,68,137,166,182,19,224,137,19,191,210,146,189,58,251,172,19,245,224,222,33,159,119,27,187,211,29,10,166,130,45,184,220,37,17,253,11,80})
|
|
||||||
c.Assert(test[4], DeepEquals, []byte{184,254,99,56,99,49,180,53,34,79,161,55,185,187,156,7})
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) TestParseEmptyMiddlePart(c *C) {
|
|
||||||
//when
|
|
||||||
test:=Parse("eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4R0NNIn0..yVi-LdQQngN0C5WS.1McwSmhZzAtmmLp9y-OdnJwaJFo1nj_4ashmzl2LhubGf0Jl1OTEVJzsHZb7bkup7cGTkuxh6Vfv10ljHsjWf_URXoxP3stQqQeViVcuPV0y2Q_WHYzTNGZpmHGe-hM6gjDhyZyvu3yeXGFSvfPQmp9pWVOgDjI4RC0MQ83rzzn-rRdnZkznWjbmOPxwPrR72Qng0BISsEwbkPn4oO8-vlHkVmPpuDTaYzCT2ZR5K9JnIU8d8QdxEAGb7-s8GEJ1yqtd_w._umbK59DAKA3O89h15VoKQ")
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, HasLen, 5)
|
|
||||||
c.Assert(test[0], DeepEquals, []byte{123,34,97,108,103,34,58,34,100,105,114,34,44,34,101,110,99,34,58,34,65,49,50,56,71,67,77,34,125})
|
|
||||||
c.Assert(test[1], DeepEquals, []byte{})
|
|
||||||
c.Assert(test[2], DeepEquals, []byte{201,88,190,45,212,16,158,3,116,11,149,146})
|
|
||||||
c.Assert(test[3], DeepEquals, []byte{212,199,48,74,104,89,204,11,102,152,186,125,203,227,157,156,156,26,36,90,53,158,63,248,106,200,102,206,93,139,134,230,198,127,66,101,212,228,196,84,156,236,29,150,251,110,75,169,237,193,147,146,236,97,233,87,239,215,73,99,30,200,214,127,245,17,94,140,79,222,203,80,169,7,149,137,87,46,61,93,50,217,15,214,29,140,211,52,102,105,152,113,158,250,19,58,130,48,225,201,156,175,187,124,158,92,97,82,189,243,208,154,159,105,89,83,160,14,50,56,68,45,12,67,205,235,207,57,254,173,23,103,102,76,231,90,54,230,56,252,112,62,180,123,217,9,224,208,18,18,176,76,27,144,249,248,160,239,62,190,81,228,86,99,233,184,52,218,99,48,147,217,148,121,43,210,103,33,79,29,241,7,113,16,1,155,239,235,60,24,66,117,202,171,93,255})
|
|
||||||
c.Assert(test[4], DeepEquals, []byte{254,233,155,43,159,67,0,160,55,59,207,97,215,149,104,41})
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) TestSerialize(c *C) {
|
|
||||||
//when
|
|
||||||
test:=Serialize([]byte{123,34,97,108,103,34,58,34,72,83,50,53,54,34,44,34,99,116,121,34,58,34,116,101,120,116,92,47,112,108,97,105,110,34,125},
|
|
||||||
[]byte{123,34,104,101,108,108,111,34,58,32,34,119,111,114,108,100,34,125},
|
|
||||||
[]byte{114,18,40,97,106,208,48,15,23,47,153,197,207,170,11,12,156,175,128,121,54,40,14,1,172,81,171,43,41,163,11,193})
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, Equals, "eyJhbGciOiJIUzI1NiIsImN0eSI6InRleHRcL3BsYWluIn0.eyJoZWxsbyI6ICJ3b3JsZCJ9.chIoYWrQMA8XL5nFz6oLDJyvgHk2KA4BrFGrKymjC8E")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) TestSerializeEmptyTrailingPart(c *C) {
|
|
||||||
//when
|
|
||||||
test:=Serialize([]byte{123,34,97,108,103,34,58,34,72,83,50,53,54,34,44,34,99,116,121,34,58,34,116,101,120,116,92,47,112,108,97,105,110,34,125},
|
|
||||||
[]byte{123,34,104,101,108,108,111,34,58,32,34,119,111,114,108,100,34,125},
|
|
||||||
[]byte{})
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, Equals, "eyJhbGciOiJIUzI1NiIsImN0eSI6InRleHRcL3BsYWluIn0.eyJoZWxsbyI6ICJ3b3JsZCJ9.")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) TestSerializeEmptyMiddlePart(c *C) {
|
|
||||||
//when
|
|
||||||
test:=Serialize([]byte{123,34,97,108,103,34,58,34,72,83,50,53,54,34,44,34,99,116,121,34,58,34,116,101,120,116,92,47,112,108,97,105,110,34,125},
|
|
||||||
[]byte{},
|
|
||||||
[]byte{114,18,40,97,106,208,48,15,23,47,153,197,207,170,11,12,156,175,128,121,54,40,14,1,172,81,171,43,41,163,11,193})
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, Equals, "eyJhbGciOiJIUzI1NiIsImN0eSI6InRleHRcL3BsYWluIn0..chIoYWrQMA8XL5nFz6oLDJyvgHk2KA4BrFGrKymjC8E")
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -107,24 +107,58 @@ type JwcAlgorithm interface {
|
||||||
Name() string
|
Name() string
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sign produces signed JWT token given arbitrary payload, signature algorithm to use (see constants for list of supported algs) and signing key.
|
func Zip(alg string) func(cfg *joseConfig) {
|
||||||
|
return func(cfg *joseConfig) {
|
||||||
|
cfg.compressionAlg = alg
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func Header(name string, value interface{}) func(cfg *joseConfig) {
|
||||||
|
return func(cfg *joseConfig) {
|
||||||
|
cfg.headers[name] = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func Headers(headers map[string]interface{}) func(cfg *joseConfig) {
|
||||||
|
return func(cfg *joseConfig) {
|
||||||
|
for k, v := range headers {
|
||||||
|
cfg.headers[k] = v
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type joseConfig struct {
|
||||||
|
compressionAlg string
|
||||||
|
headers map[string]interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sign produces signed JWT token given arbitrary payload, signature algorithm to use (see constants for list of supported algs), signing key and extra options (see option functions)
|
||||||
// Signing key is of different type for different signing alg, see specific
|
// Signing key is of different type for different signing alg, see specific
|
||||||
// signing alg implementation documentation.
|
// signing alg implementation documentation.
|
||||||
//
|
//
|
||||||
// It returns 3 parts signed JWT token as string and not nil error if something went wrong.
|
// It returns 3 parts signed JWT token as string and not nil error if something went wrong.
|
||||||
func Sign(payload string, signingAlg string, key interface{}) (token string, err error) {
|
func Sign(payload string, signingAlg string, key interface{}, options ...func(*joseConfig)) (token string, err error) {
|
||||||
if signer, ok := jwsHashers[signingAlg]; ok {
|
if signer, ok := jwsHashers[signingAlg]; ok {
|
||||||
|
|
||||||
jwtHeader := map[string]interface{}{
|
cfg := &joseConfig{compressionAlg: "", headers: make(map[string]interface{})}
|
||||||
"typ": "JWT",
|
|
||||||
"alg": signingAlg,
|
//apply extra options
|
||||||
|
for _, option := range options {
|
||||||
|
option(cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
//make sure defaults and requires are managed by us
|
||||||
|
cfg.headers["alg"] = signingAlg
|
||||||
|
|
||||||
|
if _, typ := cfg.headers["typ"]; !typ {
|
||||||
|
cfg.headers["typ"] = "JWT"
|
||||||
}
|
}
|
||||||
|
|
||||||
paloadBytes := []byte(payload)
|
paloadBytes := []byte(payload)
|
||||||
var header []byte
|
var header []byte
|
||||||
var signature []byte
|
var signature []byte
|
||||||
|
|
||||||
if header, err = json.Marshal(jwtHeader); err == nil {
|
if header, err = json.Marshal(cfg.headers); err == nil {
|
||||||
securedInput := []byte(compact.Serialize(header, paloadBytes))
|
securedInput := []byte(compact.Serialize(header, paloadBytes))
|
||||||
|
|
||||||
if signature, err = signer.Sign(securedInput, key); err == nil {
|
if signature, err = signer.Sign(securedInput, key); err == nil {
|
||||||
|
@ -143,16 +177,39 @@ func Sign(payload string, signingAlg string, key interface{}) (token string, err
|
||||||
// key management alg implementation documentation.
|
// key management alg implementation documentation.
|
||||||
//
|
//
|
||||||
// It returns 5 parts encrypted JWT token as string and not nil error if something went wrong.
|
// It returns 5 parts encrypted JWT token as string and not nil error if something went wrong.
|
||||||
func Encrypt(payload string, alg string, enc string, key interface{}) (token string, err error) {
|
func Encrypt(payload string, alg string, enc string, key interface{}, options ...func(*joseConfig)) (token string, err error) {
|
||||||
|
|
||||||
jwtHeader := map[string]interface{}{
|
cfg := &joseConfig{compressionAlg: "", headers: make(map[string]interface{})}
|
||||||
"enc": enc,
|
|
||||||
"alg": alg,
|
//apply extra options
|
||||||
|
for _, option := range options {
|
||||||
|
option(cfg)
|
||||||
}
|
}
|
||||||
|
|
||||||
return encrypt([]byte(payload), jwtHeader, key)
|
//make sure required headers are managed by us
|
||||||
|
cfg.headers["alg"] = alg
|
||||||
|
cfg.headers["enc"] = enc
|
||||||
|
|
||||||
|
byteContent := []byte(payload)
|
||||||
|
|
||||||
|
if cfg.compressionAlg != "" {
|
||||||
|
if zipAlg, ok := jwcCompressors[cfg.compressionAlg]; ok {
|
||||||
|
byteContent = zipAlg.Compress([]byte(payload))
|
||||||
|
cfg.headers["zip"] = cfg.compressionAlg
|
||||||
|
} else {
|
||||||
|
return "", errors.New(fmt.Sprintf("jwt.Compress(): Unknown compression method '%v'", cfg.compressionAlg))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
delete(cfg.headers, "zip") //we not allow to manage 'zip' header manually for encryption
|
||||||
|
}
|
||||||
|
|
||||||
|
return encrypt(byteContent, cfg.headers, key)
|
||||||
|
}
|
||||||
|
|
||||||
|
// This method is DEPRICATED and subject to be removed in next version.
|
||||||
|
// Use Encrypt(..) with Zip option instead.
|
||||||
|
//
|
||||||
// Compress produces encrypted & comressed JWT token given arbitrary payload, key management , encryption and compression algorithms to use (see constants for list of supported algs) and management key.
|
// Compress produces encrypted & comressed JWT token given arbitrary payload, key management , encryption and compression algorithms to use (see constants for list of supported algs) and management key.
|
||||||
// Management key is of different type for different key management alg, see specific
|
// Management key is of different type for different key management alg, see specific
|
||||||
// key management alg implementation documentation.
|
// key management alg implementation documentation.
|
||||||
|
@ -181,7 +238,11 @@ func Compress(payload string, alg string, enc string, zip string, key interface{
|
||||||
// Returns decoded payload as a string and not nil error if something went wrong.
|
// Returns decoded payload as a string and not nil error if something went wrong.
|
||||||
func Decode(token string, key interface{}) (string, map[string]interface{}, error) {
|
func Decode(token string, key interface{}) (string, map[string]interface{}, error) {
|
||||||
|
|
||||||
parts := compact.Parse(token)
|
parts, err := compact.Parse(token)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return "", nil, err
|
||||||
|
}
|
||||||
|
|
||||||
if len(parts) == 3 {
|
if len(parts) == 3 {
|
||||||
return verify(parts, key)
|
return verify(parts, key)
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -6,6 +6,10 @@ import (
|
||||||
"github.com/dvsekhvalnov/jose2go/arrays"
|
"github.com/dvsekhvalnov/jose2go/arrays"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
MaxInt = int(^uint(0)>>1);
|
||||||
|
)
|
||||||
|
|
||||||
// DeriveConcatKDF implements NIST SP 800-56A Concatenation Key Derivation Function. Derives
|
// DeriveConcatKDF implements NIST SP 800-56A Concatenation Key Derivation Function. Derives
|
||||||
// key material of keydatalen bits size given Z (sharedSecret), OtherInfo (AlgorithmID |
|
// key material of keydatalen bits size given Z (sharedSecret), OtherInfo (AlgorithmID |
|
||||||
// PartyUInfo | PartyVInfo | SuppPubInfo | SuppPrivInfo) and hash function
|
// PartyUInfo | PartyVInfo | SuppPubInfo | SuppPrivInfo) and hash function
|
||||||
|
@ -17,7 +21,7 @@ func DeriveConcatKDF(keydatalen int, sharedSecret, algId, partyUInfo, partyVInfo
|
||||||
|
|
||||||
reps := int(math.Ceil(float64(keyLenBytes) / float64(h.Size())))
|
reps := int(math.Ceil(float64(keyLenBytes) / float64(h.Size())))
|
||||||
|
|
||||||
if reps > 4294967295 {
|
if reps > MaxInt {
|
||||||
panic("kdf.DeriveConcatKDF: too much iterations (more than 2^32-1).")
|
panic("kdf.DeriveConcatKDF: too much iterations (more than 2^32-1).")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
57
Godeps/_workspace/src/github.com/dvsekhvalnov/jose2go/kdf/nist_sp800_56a_test.go
generated
vendored
57
Godeps/_workspace/src/github.com/dvsekhvalnov/jose2go/kdf/nist_sp800_56a_test.go
generated
vendored
|
@ -1,57 +0,0 @@
|
||||||
package kdf
|
|
||||||
|
|
||||||
import (
|
|
||||||
. "gopkg.in/check.v1"
|
|
||||||
"crypto/sha256"
|
|
||||||
"github.com/dvsekhvalnov/jose2go/arrays"
|
|
||||||
"github.com/dvsekhvalnov/jose2go/base64url"
|
|
||||||
)
|
|
||||||
|
|
||||||
var z=[]byte{0,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}
|
|
||||||
var z2=[]byte{0,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}
|
|
||||||
|
|
||||||
var algId=prependDatalen([]byte("alg"))
|
|
||||||
var partyUInfo=datalenFormat("pui")
|
|
||||||
var partyVInfo=datalenFormat("pvi")
|
|
||||||
|
|
||||||
func (s *TestSuite) Test256Secret_256Key(c *C) {
|
|
||||||
//when
|
|
||||||
test:=DeriveConcatKDF(256,z,algId,partyUInfo,partyVInfo,arrays.UInt32ToBytes(256),nil,sha256.New())
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, DeepEquals, []byte{190, 69, 15, 62, 38, 64, 30, 141, 208, 163, 55, 202, 18, 71, 176, 174, 114, 221, 249, 255, 207, 131, 190, 77, 12, 115, 220, 144, 102, 149, 78, 28})
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) Test256Secret_384Key(c *C) {
|
|
||||||
//when
|
|
||||||
test:=DeriveConcatKDF(384,z,algId,partyUInfo,partyVInfo,arrays.UInt32ToBytes(384),nil,sha256.New())
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, DeepEquals, []byte{187, 16, 110, 253, 151, 199, 57, 235, 219, 8, 73, 191, 208, 108, 63, 241, 235, 137, 178, 149, 3, 199, 216, 99, 105, 217, 45, 114, 109, 213, 83, 198, 52, 101, 99, 146, 193, 31, 172, 157, 19, 140, 25, 202, 153, 92, 252, 192})
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) Test256Secret_521Key(c *C) {
|
|
||||||
//when
|
|
||||||
test:=DeriveConcatKDF(521,z,algId,partyUInfo,partyVInfo,arrays.UInt32ToBytes(521),nil,sha256.New())
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, DeepEquals, []byte{245, 40, 159, 13, 25, 70, 170, 74, 210, 240, 242, 224, 37, 215, 23, 201, 126, 90, 108, 103, 205, 180, 48, 193, 131, 40, 86, 183, 97, 144, 1, 150, 154, 186, 196, 127, 6, 19, 17, 230, 75, 144, 229, 195, 61, 240, 20, 173, 167, 159, 50, 103, 133, 177, 241, 145, 134, 84, 50, 246, 157, 252, 51, 24, 35})
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) Test384Secret_256Key(c *C) {
|
|
||||||
//when
|
|
||||||
test:=DeriveConcatKDF(256,z2,algId,partyUInfo,partyVInfo,arrays.UInt32ToBytes(256),nil,sha256.New())
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, DeepEquals, []byte{27, 55, 33, 99, 20, 191, 202, 69, 84, 176, 250, 108, 99, 7, 91, 49, 200, 47, 219, 142, 190, 216, 197, 154, 235, 17, 76, 12, 165, 75, 201, 108})
|
|
||||||
}
|
|
||||||
|
|
||||||
//test utils
|
|
||||||
func datalenFormat(str string) []byte {
|
|
||||||
bytes,_:=base64url.Decode(str)
|
|
||||||
return prependDatalen(bytes)
|
|
||||||
}
|
|
||||||
|
|
||||||
func prependDatalen(bytes []byte) []byte {
|
|
||||||
return arrays.Concat(arrays.UInt32ToBytes(uint32(len(bytes))),bytes)
|
|
||||||
}
|
|
|
@ -20,7 +20,7 @@ func DerivePBKDF2(password, salt []byte, iterationCount, keyBitLength int, h has
|
||||||
r := dkLen - (l-1)*hLen
|
r := dkLen - (l-1)*hLen
|
||||||
|
|
||||||
// 1. If dkLen > (2^32 - 1) * hLen, output "derived key too long" and stop.
|
// 1. If dkLen > (2^32 - 1) * hLen, output "derived key too long" and stop.
|
||||||
if dkLen > 4294967295 {
|
if dkLen > MaxInt {
|
||||||
panic(fmt.Sprintf("kdf.DerivePBKDF2: expects derived key size to be not more that (2^32-1) bits, but was requested %v bits.", keyBitLength))
|
panic(fmt.Sprintf("kdf.DerivePBKDF2: expects derived key size to be not more that (2^32-1) bits, but was requested %v bits.", keyBitLength))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,112 +0,0 @@
|
||||||
package kdf
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
. "gopkg.in/check.v1"
|
|
||||||
"crypto/sha256"
|
|
||||||
"crypto/sha512"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test(t *testing.T) { TestingT(t) }
|
|
||||||
type TestSuite struct{}
|
|
||||||
var _ = Suite(&TestSuite{})
|
|
||||||
|
|
||||||
var password=[]byte("password")
|
|
||||||
var salt=[]byte("salt")
|
|
||||||
|
|
||||||
func (s *TestSuite) TestDerivePbkdf2Sha256Count1(c *C) {
|
|
||||||
//when
|
|
||||||
test:=DerivePBKDF2(password, salt, 1, 256, sha256.New())
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, DeepEquals, []byte{ 18, 15, 182, 207, 252, 248, 179, 44, 67, 231, 34, 82, 86, 196, 248, 55, 168, 101, 72, 201, 44, 204, 53, 72, 8, 5, 152, 124, 183, 11, 225, 123 })
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) TestDerivePbkdf2Sha256Count2(c *C) {
|
|
||||||
//when
|
|
||||||
test:=DerivePBKDF2(password, salt, 2, 256, sha256.New())
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, DeepEquals, []byte{ 174, 77, 12, 149, 175, 107, 70, 211, 45, 10, 223, 249, 40, 240, 109, 208, 42, 48, 63, 142, 243, 194, 81, 223, 214, 226, 216, 90, 149, 71, 76, 67 })
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) TestDerivePbkdf2Sha256Count4096(c *C) {
|
|
||||||
//when
|
|
||||||
test:=DerivePBKDF2(password, salt, 4096, 256, sha256.New())
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, DeepEquals, []byte{ 197, 228, 120, 213, 146, 136, 200, 65, 170, 83, 13, 182, 132, 92, 76, 141, 150, 40, 147, 160, 1, 206, 78, 17, 164, 150, 56, 115, 170, 152, 19, 74 })
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) TestDerivePbkdf2Sha256Count4096Len320(c *C) {
|
|
||||||
//when
|
|
||||||
test:=DerivePBKDF2([]byte("passwordPASSWORDpassword"), []byte("saltSALTsaltSALTsaltSALTsaltSALTsalt"), 4096, 320, sha256.New())
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, DeepEquals, []byte{ 52, 140, 137, 219, 203, 211, 43, 47, 50, 216, 20, 184, 17, 110, 132, 207, 43, 23, 52, 126, 188, 24, 0, 24, 28, 78, 42, 31, 184, 221, 83, 225, 198, 53, 81, 140, 125, 172, 71, 233 })
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) TestDerivePbkdf2Sha384Count1Len384(c *C) {
|
|
||||||
//when
|
|
||||||
test:=DerivePBKDF2(password,salt, 1, 384, sha512.New384())
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, DeepEquals, []byte{ 192, 225, 79, 6, 228, 158, 50, 215, 63, 159, 82, 221, 241, 208, 197, 199, 25, 22, 9, 35, 54, 49, 218, 221, 118, 165, 103, 219, 66, 183, 134, 118, 179, 143, 200, 0, 204, 83, 221, 182, 66, 245, 199, 68, 66, 230, 43, 228 })
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) TestDerivePbkdf2Sha384Count2Len384(c *C) {
|
|
||||||
//when
|
|
||||||
test:=DerivePBKDF2(password,salt, 2, 384, sha512.New384())
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, DeepEquals, []byte{ 84, 247, 117, 198, 215, 144, 242, 25, 48, 69, 145, 98, 252, 83, 93, 191, 4, 169, 57, 24, 81, 39, 1, 106, 4, 23, 106, 7, 48, 198, 241, 244, 251, 72, 131, 42, 209, 38, 27, 170, 221, 44, 237, 213, 8, 20, 177, 200 })
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) TestDerivePbkdf2Sha384Count4096Len384(c *C) {
|
|
||||||
//when
|
|
||||||
test:=DerivePBKDF2(password,salt, 4096, 384, sha512.New384())
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, DeepEquals, []byte{ 85, 151, 38, 190, 56, 219, 18, 91, 200, 94, 215, 137, 95, 110, 60, 245, 116, 199, 160, 28, 8, 12, 52, 71, 219, 30, 138, 118, 118, 77, 235, 60, 48, 123, 148, 133, 63, 190, 66, 79, 100, 136, 197, 244, 241, 40, 150, 38 })
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) TestDerivePbkdf2Sha384Count4096Len768(c *C) {
|
|
||||||
//when
|
|
||||||
test:=DerivePBKDF2([]byte("passwordPASSWORDpassword"), []byte("saltSALTsaltSALTsaltSALTsaltSALTsalt"), 4096, 768, sha512.New384())
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, DeepEquals, []byte{ 129, 145, 67, 173, 102, 223, 154, 85, 37, 89, 185, 225, 49, 197, 42, 230, 197, 193, 176, 238, 209, 143, 77, 40, 59, 140, 92, 158, 174, 185, 43, 57, 44, 20, 124, 194, 210, 134, 157, 88, 255, 226, 247, 218, 19, 209, 95, 141, 146, 87, 33, 240, 237, 26, 250, 250, 36, 72, 13, 85, 207, 96, 96, 177, 127, 17, 42, 61, 231, 76, 174, 37, 253, 243, 86, 158, 36, 127, 41, 228, 219, 184, 68, 33, 132, 120, 34, 234, 153, 189, 32, 40, 60, 58, 37, 166 })
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) TestDerivePbkdf2Sha512Count1Len512(c *C) {
|
|
||||||
//when
|
|
||||||
test:=DerivePBKDF2(password, salt, 1, 512, sha512.New())
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, DeepEquals, []byte{ 134, 127, 112, 207, 26, 222, 2, 207, 243, 117, 37, 153, 163, 165, 61, 196, 175, 52, 199, 166, 105, 129, 90, 229, 213, 19, 85, 78, 28, 140, 242, 82, 192, 45, 71, 10, 40, 90, 5, 1, 186, 217, 153, 191, 233, 67, 192, 143, 5, 2, 53, 215, 214, 139, 29, 165, 94, 99, 247, 59, 96, 165, 127, 206 })
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) TestDerivePbkdf2Sha512Count2Len512(c *C) {
|
|
||||||
//when
|
|
||||||
test:=DerivePBKDF2(password, salt, 2, 512, sha512.New())
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, DeepEquals, []byte{ 225, 217, 193, 106, 166, 129, 112, 138, 69, 245, 199, 196, 226, 21, 206, 182, 110, 1, 26, 46, 159, 0, 64, 113, 63, 24, 174, 253, 184, 102, 213, 60, 247, 108, 171, 40, 104, 163, 155, 159, 120, 64, 237, 206, 79, 239, 90, 130, 190, 103, 51, 92, 119, 166, 6, 142, 4, 17, 39, 84, 242, 124, 207, 78 })
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) TestDerivePbkdf2Sha512Count4096Len512(c *C) {
|
|
||||||
//when
|
|
||||||
test:=DerivePBKDF2(password, salt, 4096, 512, sha512.New())
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, DeepEquals, []byte{ 209, 151, 177, 179, 61, 176, 20, 62, 1, 139, 18, 243, 209, 209, 71, 158, 108, 222, 189, 204, 151, 197, 192, 248, 127, 105, 2, 224, 114, 244, 87, 181, 20, 63, 48, 96, 38, 65, 179, 213, 92, 211, 53, 152, 140, 179, 107, 132, 55, 96, 96, 236, 213, 50, 224, 57, 183, 66, 162, 57, 67, 74, 242, 213 })
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) TestDerivePbkdf2Sha256Count4096Len1024(c *C) {
|
|
||||||
//when
|
|
||||||
test:=DerivePBKDF2([]byte("passwordPASSWORDpassword"), []byte("saltSALTsaltSALTsaltSALTsaltSALTsalt"), 4096, 1024, sha512.New())
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, DeepEquals, []byte{ 140, 5, 17, 244, 198, 229, 151, 198, 172, 99, 21, 216, 240, 54, 46, 34, 95, 60, 80, 20, 149, 186, 35, 184, 104, 192, 5, 23, 77, 196, 238, 113, 17, 91, 89, 249, 230, 12, 217, 83, 47, 163, 62, 15, 117, 174, 254, 48, 34, 92, 88, 58, 24, 108, 216, 43, 212, 218, 234, 151, 36, 163, 211, 184, 4, 247, 91, 221, 65, 73, 79, 163, 36, 202, 178, 75, 204, 104, 15, 179, 185, 106, 48, 207, 93, 33, 250, 195, 194, 135, 89, 19, 145, 159, 51, 153, 177, 217, 206, 126, 181, 76, 149, 186, 73, 17, 133, 150, 207, 116, 101, 113, 155, 190, 2, 196, 236, 171, 27, 21, 65, 41, 140, 50, 29, 19, 198, 246 })
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,113 +0,0 @@
|
||||||
package ecc
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
. "gopkg.in/check.v1"
|
|
||||||
"io/ioutil"
|
|
||||||
"math/big"
|
|
||||||
"crypto/elliptic"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test(t *testing.T) { TestingT(t) }
|
|
||||||
type TestSuite struct{}
|
|
||||||
var _ = Suite(&TestSuite{})
|
|
||||||
|
|
||||||
func (s *TestSuite) TestNewPublic(c *C) {
|
|
||||||
//given
|
|
||||||
x:=[]byte {4, 114, 29, 223, 58, 3, 191, 170, 67, 128, 229, 33, 242, 178, 157, 150, 133, 25, 209, 139, 166, 69, 55, 26, 84, 48, 169, 165, 67, 232, 98, 9}
|
|
||||||
y:=[]byte {131, 116, 8, 14, 22, 150, 18, 75, 24, 181, 159, 78, 90, 51, 71, 159, 214, 186, 250, 47, 207, 246, 142, 127, 54, 183, 72, 72, 253, 21, 88, 53}
|
|
||||||
|
|
||||||
//when
|
|
||||||
test:=NewPublic(x,y)
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test.X, DeepEquals, bigInt("2010878128539620107131539503221291822343443356718189500659356750794038206985"))
|
|
||||||
c.Assert(test.Y, DeepEquals, bigInt("59457993017710823357637488495120101390437944162821778556218889662829000218677"))
|
|
||||||
c.Assert(test.Curve, Equals, elliptic.P256())
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) TestNewPrivate(c *C) {
|
|
||||||
//given
|
|
||||||
x:=[]byte {4, 114, 29, 223, 58, 3, 191, 170, 67, 128, 229, 33, 242, 178, 157, 150, 133, 25, 209, 139, 166, 69, 55, 26, 84, 48, 169, 165, 67, 232, 98, 9}
|
|
||||||
y:=[]byte {131, 116, 8, 14, 22, 150, 18, 75, 24, 181, 159, 78, 90, 51, 71, 159, 214, 186, 250, 47, 207, 246, 142, 127, 54, 183, 72, 72, 253, 21, 88, 53}
|
|
||||||
d:=[]byte{ 42, 148, 231, 48, 225, 196, 166, 201, 23, 190, 229, 199, 20, 39, 226, 70, 209, 148, 29, 70, 125, 14, 174, 66, 9, 198, 80, 251, 95, 107, 98, 206 }
|
|
||||||
|
|
||||||
//when
|
|
||||||
test:=NewPrivate(x,y,d)
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test.X, DeepEquals, bigInt("2010878128539620107131539503221291822343443356718189500659356750794038206985"))
|
|
||||||
c.Assert(test.Y, DeepEquals, bigInt("59457993017710823357637488495120101390437944162821778556218889662829000218677"))
|
|
||||||
c.Assert(test.D, DeepEquals, bigInt("19260228627344101198652694952536756709538941185117188878548538012226554651342"))
|
|
||||||
c.Assert(test.Curve, Equals, elliptic.P256())
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) TestReadPublicPKIX(c *C) {
|
|
||||||
//given
|
|
||||||
keyBytes, _ := ioutil.ReadFile("./ec_public.key")
|
|
||||||
|
|
||||||
//when
|
|
||||||
test,e := ReadPublic(keyBytes)
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(e, IsNil)
|
|
||||||
|
|
||||||
c.Assert(test.X, DeepEquals, bigInt("76939435694210362824363841832595476784225842365248086547769733757874741672069"))
|
|
||||||
c.Assert(test.Y, DeepEquals, bigInt("80047042001812490693675653292813886154388201612539715595028491948003157744818"))
|
|
||||||
c.Assert(test.Curve, Equals, elliptic.P256())
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) TestReadPublicPKCS1(c *C) {
|
|
||||||
//given
|
|
||||||
keyBytes, _ := ioutil.ReadFile("./ec_cert.pem")
|
|
||||||
|
|
||||||
//when
|
|
||||||
test,e := ReadPublic(keyBytes)
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(e, IsNil)
|
|
||||||
|
|
||||||
c.Assert(test.X, DeepEquals, bigInt("76939435694210362824363841832595476784225842365248086547769733757874741672069"))
|
|
||||||
c.Assert(test.Y, DeepEquals, bigInt("80047042001812490693675653292813886154388201612539715595028491948003157744818"))
|
|
||||||
c.Assert(test.Curve, Equals, elliptic.P256())
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) TestReadPrivatePKCS1(c *C) {
|
|
||||||
//given
|
|
||||||
keyBytes, _ := ioutil.ReadFile("./ec_private.key")
|
|
||||||
|
|
||||||
//when
|
|
||||||
test,e := ReadPrivate(keyBytes)
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(e, IsNil)
|
|
||||||
|
|
||||||
c.Assert(test.X, DeepEquals, bigInt("76939435694210362824363841832595476784225842365248086547769733757874741672069"))
|
|
||||||
c.Assert(test.Y, DeepEquals, bigInt("80047042001812490693675653292813886154388201612539715595028491948003157744818"))
|
|
||||||
c.Assert(test.D, DeepEquals, bigInt("7222604869653061109880849859470152714201198955914263913554931724612175399644"))
|
|
||||||
c.Assert(test.Curve, Equals, elliptic.P256())
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) TestReadPrivatePKCS8(c *C) {
|
|
||||||
//given
|
|
||||||
keyBytes, _ := ioutil.ReadFile("./ec_private.pem")
|
|
||||||
|
|
||||||
//when
|
|
||||||
test,e := ReadPrivate(keyBytes)
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(e, IsNil)
|
|
||||||
|
|
||||||
c.Assert(test.X, DeepEquals, bigInt("76939435694210362824363841832595476784225842365248086547769733757874741672069"))
|
|
||||||
c.Assert(test.Y, DeepEquals, bigInt("80047042001812490693675653292813886154388201612539715595028491948003157744818"))
|
|
||||||
c.Assert(test.D, DeepEquals, bigInt("7222604869653061109880849859470152714201198955914263913554931724612175399644"))
|
|
||||||
c.Assert(test.Curve, Equals, elliptic.P256())
|
|
||||||
}
|
|
||||||
|
|
||||||
//utils
|
|
||||||
func bigInt(value string) *big.Int {
|
|
||||||
i:=new (big.Int)
|
|
||||||
i.SetString(value,10)
|
|
||||||
|
|
||||||
return i
|
|
||||||
}
|
|
|
@ -1,85 +0,0 @@
|
||||||
package Rsa
|
|
||||||
|
|
||||||
import (
|
|
||||||
"io/ioutil"
|
|
||||||
"math/big"
|
|
||||||
"testing"
|
|
||||||
. "gopkg.in/check.v1"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test(t *testing.T) { TestingT(t) }
|
|
||||||
type TestSuite struct{}
|
|
||||||
var _ = Suite(&TestSuite{})
|
|
||||||
|
|
||||||
|
|
||||||
func (s *TestSuite) TestNewPrivateRsaKeyPKCS1(c *C) {
|
|
||||||
|
|
||||||
//given
|
|
||||||
keyBytes, _ := ioutil.ReadFile("priv.pem")
|
|
||||||
|
|
||||||
//when
|
|
||||||
test,e := ReadPrivate(keyBytes)
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(e, IsNil)
|
|
||||||
c.Assert(test.D, DeepEquals, bigInt("124664500442337916425629948081980373708538939606058968438393904444884872144817323585651521088406960965803456218656807473171367526874204593887158860695954252405916280866383288176587587469870736553178754458686625418367566925639753001190058223163696966510495553421774149906056482201169970508069587759758018186673"))
|
|
||||||
c.Assert(test.Primes, HasLen, 2)
|
|
||||||
c.Assert(test.Primes[0], DeepEquals, bigInt("12153319500662601635346432957857245055929638609873673015885135318360261418965835817520733410832489021447922460160007366037402643276624674886502627435389593"))
|
|
||||||
c.Assert(test.Primes[1], DeepEquals, bigInt("10891140096045830766355607974974880425030121636560867106153739255802668290122259699296919947637286459736524694263050343032461619592457541146877906031793883"))
|
|
||||||
c.Assert(test.E, Equals, 65537)
|
|
||||||
c.Assert(test.N, DeepEquals, bigInt("132363505313722155184876628715249052276006747427497555521215412160460427148722445294983292629743653314149228192824806664548107146354876411009845771623017501212568714555984634301944063168503260813720165931647377932654326833738173931173570212088015547040743996672392373035728084429156775233489529905624779259619"))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) TestNewPrivateRsaKeyPKCS8(c *C) {
|
|
||||||
|
|
||||||
//given
|
|
||||||
keyBytes, _ := ioutil.ReadFile("priv.pem")
|
|
||||||
|
|
||||||
//when
|
|
||||||
test,e := ReadPrivate(keyBytes)
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(e, IsNil)
|
|
||||||
c.Assert(test.D, DeepEquals, bigInt("124664500442337916425629948081980373708538939606058968438393904444884872144817323585651521088406960965803456218656807473171367526874204593887158860695954252405916280866383288176587587469870736553178754458686625418367566925639753001190058223163696966510495553421774149906056482201169970508069587759758018186673"))
|
|
||||||
c.Assert(test.Primes, HasLen, 2)
|
|
||||||
c.Assert(test.Primes[0], DeepEquals, bigInt("12153319500662601635346432957857245055929638609873673015885135318360261418965835817520733410832489021447922460160007366037402643276624674886502627435389593"))
|
|
||||||
c.Assert(test.Primes[1], DeepEquals, bigInt("10891140096045830766355607974974880425030121636560867106153739255802668290122259699296919947637286459736524694263050343032461619592457541146877906031793883"))
|
|
||||||
c.Assert(test.E, Equals, 65537)
|
|
||||||
c.Assert(test.N, DeepEquals, bigInt("132363505313722155184876628715249052276006747427497555521215412160460427148722445294983292629743653314149228192824806664548107146354876411009845771623017501212568714555984634301944063168503260813720165931647377932654326833738173931173570212088015547040743996672392373035728084429156775233489529905624779259619"))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) TestNewPublicRsaKeyPKCS1(c *C) {
|
|
||||||
|
|
||||||
//given
|
|
||||||
keyBytes, _ := ioutil.ReadFile("pub.pem")
|
|
||||||
|
|
||||||
//when
|
|
||||||
test,e := ReadPublic(keyBytes)
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(e, IsNil)
|
|
||||||
c.Assert(test.E, Equals, 65537)
|
|
||||||
c.Assert(test.N, DeepEquals, bigInt("132363505313722155184876628715249052276006747427497555521215412160460427148722445294983292629743653314149228192824806664548107146354876411009845771623017501212568714555984634301944063168503260813720165931647377932654326833738173931173570212088015547040743996672392373035728084429156775233489529905624779259619"))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) TestNewPublicRsaKeyPKIX(c *C) {
|
|
||||||
|
|
||||||
//given
|
|
||||||
keyBytes, _ := ioutil.ReadFile("pub.key")
|
|
||||||
|
|
||||||
//when
|
|
||||||
test,e := ReadPublic(keyBytes)
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(e, IsNil)
|
|
||||||
c.Assert(test.E, Equals, 65537)
|
|
||||||
c.Assert(test.N, DeepEquals, bigInt("132363505313722155184876628715249052276006747427497555521215412160460427148722445294983292629743653314149228192824806664548107146354876411009845771623017501212568714555984634301944063168503260813720165931647377932654326833738173931173570212088015547040743996672392373035728084429156775233489529905624779259619"))
|
|
||||||
}
|
|
||||||
|
|
||||||
//utils
|
|
||||||
func bigInt(value string) *big.Int {
|
|
||||||
i:=new (big.Int)
|
|
||||||
i.SetString(value,10)
|
|
||||||
|
|
||||||
return i
|
|
||||||
}
|
|
|
@ -1,52 +0,0 @@
|
||||||
package padding
|
|
||||||
|
|
||||||
import (
|
|
||||||
. "gopkg.in/check.v1"
|
|
||||||
)
|
|
||||||
|
|
||||||
func (s *TestSuite) TestAlignOneByte(c *C) {
|
|
||||||
//given
|
|
||||||
data:=[]byte{1,2,3}
|
|
||||||
|
|
||||||
//when
|
|
||||||
test:=Align(data,27)
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, DeepEquals, []byte{0,1,2,3})
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) TestAlignMultiByte(c *C) {
|
|
||||||
//given
|
|
||||||
data:=[]byte{1,2,3}
|
|
||||||
|
|
||||||
//when
|
|
||||||
test:=Align(data,40)
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, DeepEquals, []byte{0,0,1,2,3})
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) TestAlignMultiBytePartial(c *C) {
|
|
||||||
//given
|
|
||||||
data:=[]byte{1,2,3}
|
|
||||||
|
|
||||||
//when
|
|
||||||
test:=Align(data,43)
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, DeepEquals, []byte{0,0,0,1,2,3})
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) TestAlignedArray(c *C) {
|
|
||||||
//given
|
|
||||||
data:=[]byte{1,2,3}
|
|
||||||
|
|
||||||
//when
|
|
||||||
test:=Align(data,24)
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, DeepEquals, []byte{1,2,3})
|
|
||||||
}
|
|
|
@ -1,109 +0,0 @@
|
||||||
package padding
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
. "gopkg.in/check.v1"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test(t *testing.T) { TestingT(t) }
|
|
||||||
type TestSuite struct{}
|
|
||||||
var _ = Suite(&TestSuite{})
|
|
||||||
|
|
||||||
func (s *TestSuite) TestRemovePkcs7NoPadding(c *C) {
|
|
||||||
//given
|
|
||||||
padded:=[]byte{1,2,3,4,5,6,7,8}
|
|
||||||
|
|
||||||
//when
|
|
||||||
test:=RemovePkcs7(padded,8)
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, DeepEquals, []byte{1,2,3,4,5,6,7,8})
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) TestRemovePkcs7(c *C) {
|
|
||||||
//given
|
|
||||||
padded:=[]byte{1,2,3,4,5,3,3,3}
|
|
||||||
|
|
||||||
//when
|
|
||||||
test:=RemovePkcs7(padded,8)
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, DeepEquals, []byte{1,2,3,4,5})
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) TestRemovePkcs7OneBytePadding(c *C) {
|
|
||||||
//given
|
|
||||||
padded:=[]byte{1,2,3,4,5,1}
|
|
||||||
|
|
||||||
//when
|
|
||||||
test:=RemovePkcs7(padded,6)
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, DeepEquals, []byte{1,2,3,4,5})
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) TestRemovePkcs7TrailingZeroByte(c *C) {
|
|
||||||
//given
|
|
||||||
padded:=[]byte{1,2,3,4,5,0}
|
|
||||||
|
|
||||||
//when
|
|
||||||
test:=RemovePkcs7(padded,6)
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, DeepEquals, []byte{1,2,3,4,5,0})
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) TestRemovePkcs7ExtraBlockPadding(c *C) {
|
|
||||||
//given
|
|
||||||
padded:=[]byte{1,2,3,4,5,5,5,5,5,5}
|
|
||||||
|
|
||||||
//when
|
|
||||||
test:=RemovePkcs7(padded,5)
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, DeepEquals, []byte{1,2,3,4,5})
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) TestRemovePkcs7TrailingByteGreaterBlockSize(c *C) {
|
|
||||||
//given
|
|
||||||
padded:=[]byte{1,2,3,4,5,10}
|
|
||||||
|
|
||||||
//when
|
|
||||||
test:=RemovePkcs7(padded,6)
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, DeepEquals, []byte{1,2,3,4,5,10})
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) TestAddPkcs7(c *C) {
|
|
||||||
//given
|
|
||||||
in:=[]byte{1,2,3,4,5}
|
|
||||||
|
|
||||||
//when
|
|
||||||
test := AddPkcs7(in,8)
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, DeepEquals, []byte{1,2,3,4,5,3,3,3})
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) TestAddPkcs7OneBytePadding(c *C) {
|
|
||||||
//given
|
|
||||||
in:=[]byte{1,2,3,4,5}
|
|
||||||
|
|
||||||
//when
|
|
||||||
test := AddPkcs7(in,6)
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, DeepEquals, []byte{1,2,3,4,5,1})
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSuite) TestAddPkcs7ExtraBlockPadding(c *C) {
|
|
||||||
//given
|
|
||||||
in:=[]byte{1,2,3,4,5,6,7,8}
|
|
||||||
|
|
||||||
//when
|
|
||||||
test := AddPkcs7(in,8)
|
|
||||||
|
|
||||||
//then
|
|
||||||
c.Assert(test, DeepEquals, []byte{1,2,3,4,5,6,7,8,8,8,8,8,8,8,8,8})
|
|
||||||
}
|
|
Loading…
Reference in New Issue