-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
陈桂军
committed
Oct 23, 2020
1 parent
646b3a6
commit bd2d98c
Showing
166 changed files
with
44,681 additions
and
0 deletions.
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
module github.com/guijunchen/cryptogm | ||
|
||
go 1.14 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
// Copyright 2018 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 randutil contains internal randomness utilities for various | ||
// crypto packages. | ||
package randutil | ||
|
||
import ( | ||
"io" | ||
"sync" | ||
) | ||
|
||
var ( | ||
closedChanOnce sync.Once | ||
closedChan chan struct{} | ||
) | ||
|
||
// MaybeReadByte reads a single byte from r with ~50% probability. This is used | ||
// to ensure that callers do not depend on non-guaranteed behaviour, e.g. | ||
// assuming that rsa.GenerateKey is deterministic w.r.t. a given random stream. | ||
// | ||
// This does not affect tests that pass a stream of fixed bytes as the random | ||
// source (e.g. a zeroReader). | ||
func MaybeReadByte(r io.Reader) { | ||
closedChanOnce.Do(func() { | ||
closedChan = make(chan struct{}) | ||
close(closedChan) | ||
}) | ||
|
||
select { | ||
case <-closedChan: | ||
return | ||
case <-closedChan: | ||
var buf [1]byte | ||
r.Read(buf[:]) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
// Copyright 2018 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. | ||
|
||
// +build !appengine | ||
|
||
// Package subtle implements functions that are often useful in cryptographic | ||
// code but require careful thought to use correctly. | ||
// | ||
// This is a mirror of golang.org/x/crypto/internal/subtle. | ||
package subtle | ||
|
||
import "unsafe" | ||
|
||
// AnyOverlap reports whether x and y share memory at any (not necessarily | ||
// corresponding) index. The memory beyond the slice length is ignored. | ||
func AnyOverlap(x, y []byte) bool { | ||
return len(x) > 0 && len(y) > 0 && | ||
uintptr(unsafe.Pointer(&x[0])) <= uintptr(unsafe.Pointer(&y[len(y)-1])) && | ||
uintptr(unsafe.Pointer(&y[0])) <= uintptr(unsafe.Pointer(&x[len(x)-1])) | ||
} | ||
|
||
// InexactOverlap reports whether x and y share memory at any non-corresponding | ||
// index. The memory beyond the slice length is ignored. Note that x and y can | ||
// have different lengths and still not have any inexact overlap. | ||
// | ||
// InexactOverlap can be used to implement the requirements of the crypto/cipher | ||
// AEAD, Block, BlockMode and Stream interfaces. | ||
func InexactOverlap(x, y []byte) bool { | ||
if len(x) == 0 || len(y) == 0 || &x[0] == &y[0] { | ||
return false | ||
} | ||
return AnyOverlap(x, y) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
// Copyright 2018 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. | ||
|
||
// +build appengine | ||
|
||
// Package subtle implements functions that are often useful in cryptographic | ||
// code but require careful thought to use correctly. | ||
// | ||
// This is a mirror of golang.org/x/crypto/internal/subtle. | ||
package subtle // import "crypto/internal/subtle" | ||
|
||
// This is the Google App Engine standard variant based on reflect | ||
// because the unsafe package and cgo are disallowed. | ||
|
||
import "reflect" | ||
|
||
// AnyOverlap reports whether x and y share memory at any (not necessarily | ||
// corresponding) index. The memory beyond the slice length is ignored. | ||
func AnyOverlap(x, y []byte) bool { | ||
return len(x) > 0 && len(y) > 0 && | ||
reflect.ValueOf(&x[0]).Pointer() <= reflect.ValueOf(&y[len(y)-1]).Pointer() && | ||
reflect.ValueOf(&y[0]).Pointer() <= reflect.ValueOf(&x[len(x)-1]).Pointer() | ||
} | ||
|
||
// InexactOverlap reports whether x and y share memory at any non-corresponding | ||
// index. The memory beyond the slice length is ignored. Note that x and y can | ||
// have different lengths and still not have any inexact overlap. | ||
// | ||
// InexactOverlap can be used to implement the requirements of the crypto/cipher | ||
// AEAD, Block, BlockMode and Stream interfaces. | ||
func InexactOverlap(x, y []byte) bool { | ||
if len(x) == 0 || len(y) == 0 || &x[0] == &y[0] { | ||
return false | ||
} | ||
return AnyOverlap(x, y) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
// Copyright 2018 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 subtle_test | ||
|
||
import ( | ||
"testing" | ||
|
||
"crypto/internal/subtle" | ||
) | ||
|
||
var a, b [100]byte | ||
|
||
var aliasingTests = []struct { | ||
x, y []byte | ||
anyOverlap, inexactOverlap bool | ||
}{ | ||
{a[:], b[:], false, false}, | ||
{a[:], b[:0], false, false}, | ||
{a[:], b[:50], false, false}, | ||
{a[40:50], a[50:60], false, false}, | ||
{a[40:50], a[60:70], false, false}, | ||
{a[:51], a[50:], true, true}, | ||
{a[:], a[:], true, false}, | ||
{a[:50], a[:60], true, false}, | ||
{a[:], nil, false, false}, | ||
{nil, nil, false, false}, | ||
{a[:], a[:0], false, false}, | ||
{a[:10], a[:10:20], true, false}, | ||
{a[:10], a[5:10:20], true, true}, | ||
} | ||
|
||
func testAliasing(t *testing.T, i int, x, y []byte, anyOverlap, inexactOverlap bool) { | ||
any := subtle.AnyOverlap(x, y) | ||
if any != anyOverlap { | ||
t.Errorf("%d: wrong AnyOverlap result, expected %v, got %v", i, anyOverlap, any) | ||
} | ||
inexact := subtle.InexactOverlap(x, y) | ||
if inexact != inexactOverlap { | ||
t.Errorf("%d: wrong InexactOverlap result, expected %v, got %v", i, inexactOverlap, any) | ||
} | ||
} | ||
|
||
func TestAliasing(t *testing.T) { | ||
for i, tt := range aliasingTests { | ||
testAliasing(t, i, tt.x, tt.y, tt.anyOverlap, tt.inexactOverlap) | ||
testAliasing(t, i, tt.y, tt.x, tt.anyOverlap, tt.inexactOverlap) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
// Copyright 2015 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 pkcs12 | ||
|
||
import ( | ||
"errors" | ||
"unicode/utf16" | ||
) | ||
|
||
// bmpString returns s encoded in UCS-2 with a zero terminator. | ||
func bmpString(s string) ([]byte, error) { | ||
// References: | ||
// https://tools.ietf.org/html/rfc7292#appendix-B.1 | ||
// https://en.wikipedia.org/wiki/Plane_(Unicode)#Basic_Multilingual_Plane | ||
// - non-BMP characters are encoded in UTF 16 by using a surrogate pair of 16-bit codes | ||
// EncodeRune returns 0xfffd if the rune does not need special encoding | ||
// - the above RFC provides the info that BMPStrings are NULL terminated. | ||
|
||
ret := make([]byte, 0, 2*len(s)+2) | ||
|
||
for _, r := range s { | ||
if t, _ := utf16.EncodeRune(r); t != 0xfffd { | ||
return nil, errors.New("pkcs12: string contains characters that cannot be encoded in UCS-2") | ||
} | ||
ret = append(ret, byte(r/256), byte(r%256)) | ||
} | ||
|
||
return append(ret, 0, 0), nil | ||
} | ||
|
||
func decodeBMPString(bmpString []byte) (string, error) { | ||
if len(bmpString)%2 != 0 { | ||
return "", errors.New("pkcs12: odd-length BMP string") | ||
} | ||
|
||
// strip terminator if present | ||
if l := len(bmpString); l >= 2 && bmpString[l-1] == 0 && bmpString[l-2] == 0 { | ||
bmpString = bmpString[:l-2] | ||
} | ||
|
||
s := make([]uint16, 0, len(bmpString)/2) | ||
for len(bmpString) > 0 { | ||
s = append(s, uint16(bmpString[0])<<8+uint16(bmpString[1])) | ||
bmpString = bmpString[2:] | ||
} | ||
|
||
return string(utf16.Decode(s)), nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,63 @@ | ||
// Copyright 2015 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 pkcs12 | ||
|
||
import ( | ||
"bytes" | ||
"encoding/hex" | ||
"testing" | ||
) | ||
|
||
var bmpStringTests = []struct { | ||
in string | ||
expectedHex string | ||
shouldFail bool | ||
}{ | ||
{"", "0000", false}, | ||
// Example from https://tools.ietf.org/html/rfc7292#appendix-B. | ||
{"Beavis", "0042006500610076006900730000", false}, | ||
// Some characters from the "Letterlike Symbols Unicode block". | ||
{"\u2115 - Double-struck N", "21150020002d00200044006f00750062006c0065002d00730074007200750063006b0020004e0000", false}, | ||
// any character outside the BMP should trigger an error. | ||
{"\U0001f000 East wind (Mahjong)", "", true}, | ||
} | ||
|
||
func TestBMPString(t *testing.T) { | ||
for i, test := range bmpStringTests { | ||
expected, err := hex.DecodeString(test.expectedHex) | ||
if err != nil { | ||
t.Fatalf("#%d: failed to decode expectation", i) | ||
} | ||
|
||
out, err := bmpString(test.in) | ||
if err == nil && test.shouldFail { | ||
t.Errorf("#%d: expected to fail, but produced %x", i, out) | ||
continue | ||
} | ||
|
||
if err != nil && !test.shouldFail { | ||
t.Errorf("#%d: failed unexpectedly: %s", i, err) | ||
continue | ||
} | ||
|
||
if !test.shouldFail { | ||
if !bytes.Equal(out, expected) { | ||
t.Errorf("#%d: expected %s, got %x", i, test.expectedHex, out) | ||
continue | ||
} | ||
|
||
roundTrip, err := decodeBMPString(out) | ||
if err != nil { | ||
t.Errorf("#%d: decoding output gave an error: %s", i, err) | ||
continue | ||
} | ||
|
||
if roundTrip != test.in { | ||
t.Errorf("#%d: decoding output resulted in %q, but it should have been %q", i, roundTrip, test.in) | ||
continue | ||
} | ||
} | ||
} | ||
} |
Oops, something went wrong.