mirror of https://github.com/minio/minio.git
Full restructure in accordance with
- pkg/{subsystem}/{package} style - modify Makefile to reflect the new style, consolidate various entries - add a dummy ``main.go`` at top level
This commit is contained in:
parent
033ad56a61
commit
432275e966
|
@ -1,3 +1,4 @@
|
||||||
**/*.swp
|
**/*.swp
|
||||||
cover.out
|
cover.out
|
||||||
*~
|
*~
|
||||||
|
minio
|
|
@ -10,15 +10,12 @@ $ ln -s ${PWD} $GOPATH/src/github.com/minio-io/
|
||||||
### Compiling Minio from source
|
### Compiling Minio from source
|
||||||
Minio uses ``Makefile`` to wrap around some of the limitations of ``go build``. To compile Minio source, simply change to your workspace folder and type ``make``.
|
Minio uses ``Makefile`` to wrap around some of the limitations of ``go build``. To compile Minio source, simply change to your workspace folder and type ``make``.
|
||||||
```sh
|
```sh
|
||||||
$ cd $GOPATH/src/github.com/$USER_ID/minio/
|
|
||||||
$ make
|
$ make
|
||||||
Checking if proper environment variables are set.. Done
|
Checking if proper environment variables are set.. Done
|
||||||
...
|
...
|
||||||
Checking dependencies for Minio.. Done
|
Checking dependencies for Minio.. Done
|
||||||
...
|
...
|
||||||
...
|
...
|
||||||
Installed minio into /home/userid/work/minio/gopath/bin
|
|
||||||
Installed new-cmd into /home/userid/work/minio/gopath/bin
|
|
||||||
```
|
```
|
||||||
### Developer Guidelines
|
### Developer Guidelines
|
||||||
``Minio`` community welcomes your contribution. To make the process as seamless as possible, we ask for the following:
|
``Minio`` community welcomes your contribution. To make the process as seamless as possible, we ask for the following:
|
||||||
|
|
48
Makefile
48
Makefile
|
@ -1,7 +1,7 @@
|
||||||
#GOPATH := $(CURDIR)/tmp/gopath
|
#GOPATH := $(CURDIR)/tmp/gopath
|
||||||
MAKE_OPTIONS := -s
|
MAKE_OPTIONS := -s
|
||||||
|
|
||||||
all: getdeps cover install
|
all: getdeps install
|
||||||
|
|
||||||
checkdeps:
|
checkdeps:
|
||||||
@./checkdeps.sh
|
@./checkdeps.sh
|
||||||
|
@ -10,39 +10,31 @@ getdeps: checkdeps
|
||||||
@go get github.com/tools/godep && echo "Installed godep"
|
@go get github.com/tools/godep && echo "Installed godep"
|
||||||
@go get golang.org/x/tools/cmd/cover && echo "Installed cover"
|
@go get golang.org/x/tools/cmd/cover && echo "Installed cover"
|
||||||
|
|
||||||
build-erasure:
|
build-utils:
|
||||||
@$(MAKE) $(MAKE_OPTIONS) -C pkg/erasure/isal lib
|
@godep go test -race -coverprofile=cover.out github.com/minio-io/minio/pkg/utils/cpu
|
||||||
@godep go test -race -coverprofile=cover.out github.com/minio-io/minio/pkg/erasure
|
@godep go test -race -coverprofile=cover.out github.com/minio-io/minio/pkg/utils/unitconv
|
||||||
|
|
||||||
build-cpu:
|
build-crypto:
|
||||||
@godep go test -race -coverprofile=cover.out github.com/minio-io/minio/pkg/cpu
|
|
||||||
|
|
||||||
build-md5:
|
|
||||||
@godep go test -race -coverprofile=cover.out github.com/minio-io/minio/pkg/crypto/md5/
|
@godep go test -race -coverprofile=cover.out github.com/minio-io/minio/pkg/crypto/md5/
|
||||||
@godep go test -race -coverprofile=cover.out github.com/minio-io/minio/pkg/crypto/md5c/
|
|
||||||
|
|
||||||
build-sha1:
|
|
||||||
@godep go test -race -coverprofile=cover.out github.com/minio-io/minio/pkg/crypto/sha1/
|
@godep go test -race -coverprofile=cover.out github.com/minio-io/minio/pkg/crypto/sha1/
|
||||||
|
|
||||||
build-sha256:
|
|
||||||
@godep go test -race -coverprofile=cover.out github.com/minio-io/minio/pkg/crypto/sha256/
|
@godep go test -race -coverprofile=cover.out github.com/minio-io/minio/pkg/crypto/sha256/
|
||||||
|
|
||||||
build-sha512:
|
|
||||||
@godep go test -race -coverprofile=cover.out github.com/minio-io/minio/pkg/crypto/sha512/
|
@godep go test -race -coverprofile=cover.out github.com/minio-io/minio/pkg/crypto/sha512/
|
||||||
|
|
||||||
build-crc32c:
|
build-checksum:
|
||||||
@godep go test -race -coverprofile=cover.out github.com/minio-io/minio/pkg/checksum/crc32c
|
@godep go test -race -coverprofile=cover.out github.com/minio-io/minio/pkg/checksum/crc32c
|
||||||
|
|
||||||
build-scsi:
|
build-os:
|
||||||
@godep go test -race -coverprofile=cover.out github.com/minio-io/minio/pkg/scsi
|
@godep go test -race -coverprofile=cover.out github.com/minio-io/minio/pkg/os/scsi
|
||||||
|
@godep go test -race -coverprofile=cover.out github.com/minio-io/minio/pkg/os/sysctl
|
||||||
|
|
||||||
build-split: build-strbyteconv
|
build-fileutils: build-utils
|
||||||
@godep go test -race -coverprofile=cover.out github.com/minio-io/minio/pkg/split
|
@godep go test -race -coverprofile=cover.out github.com/minio-io/minio/pkg/fileutils/split
|
||||||
|
|
||||||
build-strbyteconv:
|
build-storage: build-erasure build-storage-append build-storage-encoded
|
||||||
@godep go test -race -coverprofile=cover.out github.com/minio-io/minio/pkg/strbyteconv
|
|
||||||
|
|
||||||
build-storage: build-storage-append build-storage-encoded
|
build-erasure:
|
||||||
|
@$(MAKE) $(MAKE_OPTIONS) -C pkg/storage/erasure/isal lib
|
||||||
|
@godep go test -race -coverprofile=cover.out github.com/minio-io/minio/pkg/storage/erasure
|
||||||
|
|
||||||
build-storage-append:
|
build-storage-append:
|
||||||
@godep go test -race -coverprofile=cover.out github.com/minio-io/minio/pkg/storage/appendstorage
|
@godep go test -race -coverprofile=cover.out github.com/minio-io/minio/pkg/storage/appendstorage
|
||||||
|
@ -50,15 +42,9 @@ build-storage-append:
|
||||||
build-storage-encoded:
|
build-storage-encoded:
|
||||||
@godep go test -race -coverprofile=cover.out github.com/minio-io/minio/pkg/storage/encodedstorage
|
@godep go test -race -coverprofile=cover.out github.com/minio-io/minio/pkg/storage/encodedstorage
|
||||||
|
|
||||||
cover: build-erasure build-split build-crc32c build-cpu build-scsi build-storage build-md5 build-sha1 build-sha256 build-sha512
|
cover: build-fileutils build-checksum build-os build-storage build-crypto
|
||||||
@godep go test -race -coverprofile=cover.out github.com/minio-io/minio/pkg/gateway
|
|
||||||
|
|
||||||
install: build-erasure
|
install: cover
|
||||||
@godep go install github.com/minio-io/minio/cmd/minio && echo "Installed minio into ${GOPATH}/bin"
|
|
||||||
@godep go install github.com/minio-io/minio/cmd/new-cmd && echo "Installed new-cmd into ${GOPATH}/bin"
|
|
||||||
@godep go install github.com/minio-io/minio/cmd/crypto && echo "Installed crypto into ${GOPATH}/bin"
|
|
||||||
@godep go install github.com/minio-io/minio/cmd/split && echo "Installed split into ${GOPATH}/bin"
|
|
||||||
@godep go install github.com/minio-io/minio/cmd/index && echo "Installed index into ${GOPATH}/bin"
|
|
||||||
|
|
||||||
save: restore
|
save: restore
|
||||||
@godep save ./...
|
@godep save ./...
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
crypto
|
|
|
@ -1,127 +0,0 @@
|
||||||
/*
|
|
||||||
* Mini Object Storage, (C) 2014 Minio, Inc.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"log"
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"github.com/codegangsta/cli"
|
|
||||||
"github.com/minio-io/minio/pkg/crypto/md5"
|
|
||||||
"github.com/minio-io/minio/pkg/crypto/sha1"
|
|
||||||
"github.com/minio-io/minio/pkg/crypto/sha256"
|
|
||||||
"github.com/minio-io/minio/pkg/crypto/sha512"
|
|
||||||
)
|
|
||||||
|
|
||||||
var Options = []cli.Command{
|
|
||||||
Md5sum,
|
|
||||||
Sha1sum,
|
|
||||||
// Sha1sumFast, // TODO
|
|
||||||
Sha256sum,
|
|
||||||
Sha512sum,
|
|
||||||
}
|
|
||||||
|
|
||||||
var Md5sum = cli.Command{
|
|
||||||
Name: "md5sum",
|
|
||||||
Usage: "",
|
|
||||||
Description: `
|
|
||||||
`,
|
|
||||||
Action: doMd5sum,
|
|
||||||
}
|
|
||||||
|
|
||||||
var Sha1sum = cli.Command{
|
|
||||||
Name: "sha1sum",
|
|
||||||
Usage: "",
|
|
||||||
Description: `
|
|
||||||
`,
|
|
||||||
Action: doSha1sum,
|
|
||||||
}
|
|
||||||
|
|
||||||
/* TODO
|
|
||||||
var Sha1sumFast = cli.Command{
|
|
||||||
Name: "sha1sum-fast",
|
|
||||||
Usage: "",
|
|
||||||
Description: `
|
|
||||||
`,
|
|
||||||
Action: doSha1sumFast,
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
var Sha256sum = cli.Command{
|
|
||||||
Name: "sha256sum",
|
|
||||||
Usage: "",
|
|
||||||
Description: `
|
|
||||||
`,
|
|
||||||
Action: doSha256sum,
|
|
||||||
}
|
|
||||||
|
|
||||||
var Sha512sum = cli.Command{
|
|
||||||
Name: "sha512sum",
|
|
||||||
Usage: "",
|
|
||||||
Description: `
|
|
||||||
`,
|
|
||||||
Action: doSha512sum,
|
|
||||||
}
|
|
||||||
|
|
||||||
func doMd5sum(c *cli.Context) {
|
|
||||||
hash, err := md5.Sum(os.Stdin)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
fmt.Printf("%x", hash)
|
|
||||||
}
|
|
||||||
|
|
||||||
func doSha1sum(c *cli.Context) {
|
|
||||||
hash, err := sha1.Sum(os.Stdin)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
fmt.Printf("%x", hash)
|
|
||||||
}
|
|
||||||
|
|
||||||
/* TODO
|
|
||||||
func doSha1sumFast(c *cli.Context) {
|
|
||||||
buffer, err := ioutil.ReadAll(os.Stdin)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
hash, err := sha1.Sha1(buffer)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
var bytesBuffer bytes.Buffer
|
|
||||||
binary.Write(&bytesBuffer, binary.LittleEndian, hash)
|
|
||||||
fmt.Printf("%x", bytesBuffer.Bytes())
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
func doSha256sum(c *cli.Context) {
|
|
||||||
hash, err := sha256.Sum(os.Stdin)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
fmt.Printf("%x", hash)
|
|
||||||
}
|
|
||||||
|
|
||||||
func doSha512sum(c *cli.Context) {
|
|
||||||
hash, err := sha512.Sum(os.Stdin)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
fmt.Printf("%x", hash)
|
|
||||||
}
|
|
|
@ -1,31 +0,0 @@
|
||||||
/*
|
|
||||||
* Mini Object Storage, (C) 2014 Minio, Inc.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"github.com/codegangsta/cli"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
app := cli.NewApp()
|
|
||||||
app.Name = "crypto"
|
|
||||||
app.Usage = "calculate cryptosum on a given stream"
|
|
||||||
app.Commands = Options
|
|
||||||
app.Run(os.Args)
|
|
||||||
}
|
|
|
@ -1,33 +0,0 @@
|
||||||
% MINIO(1) Minio Manual
|
|
||||||
% Minio community
|
|
||||||
% December 2014
|
|
||||||
# NAME
|
|
||||||
crypto - calculate crypto sum on a stream
|
|
||||||
|
|
||||||
# SYNOPSIS
|
|
||||||
|
|
||||||
# DESCRIPTION
|
|
||||||
```sh
|
|
||||||
NAME:
|
|
||||||
crypto - calculate cryptosum on a given stream
|
|
||||||
|
|
||||||
USAGE:
|
|
||||||
crypto [global options] command [command options] [arguments...]
|
|
||||||
|
|
||||||
VERSION:
|
|
||||||
0.0.0
|
|
||||||
|
|
||||||
COMMANDS:
|
|
||||||
md5sum
|
|
||||||
sha1sum
|
|
||||||
sha256sum
|
|
||||||
sha512sum
|
|
||||||
help, h Shows a list of commands or help for one command
|
|
||||||
|
|
||||||
GLOBAL OPTIONS:
|
|
||||||
--help, -h show help
|
|
||||||
--version, -v print the version
|
|
||||||
```
|
|
||||||
# EXAMPLES
|
|
||||||
|
|
||||||
# AUTHORS
|
|
|
@ -1,188 +0,0 @@
|
||||||
/*
|
|
||||||
* Mini Object Storage, (C) 2014 Minio, Inc.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/gob"
|
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
|
||||||
"log"
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"github.com/codegangsta/cli"
|
|
||||||
"github.com/minio-io/go-patricia/patricia"
|
|
||||||
"github.com/minio-io/minio/pkg/storage"
|
|
||||||
)
|
|
||||||
|
|
||||||
var Options = []cli.Command{
|
|
||||||
Add,
|
|
||||||
Get,
|
|
||||||
List,
|
|
||||||
Remove,
|
|
||||||
}
|
|
||||||
|
|
||||||
var Add = cli.Command{
|
|
||||||
Name: "add",
|
|
||||||
Usage: "",
|
|
||||||
Description: "",
|
|
||||||
Action: doAdd,
|
|
||||||
Flags: []cli.Flag{
|
|
||||||
cli.StringFlag{
|
|
||||||
Name: "path",
|
|
||||||
Value: "objects.trie",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
var Get = cli.Command{
|
|
||||||
Name: "get",
|
|
||||||
Usage: "",
|
|
||||||
Description: "",
|
|
||||||
Action: doGet,
|
|
||||||
Flags: []cli.Flag{
|
|
||||||
cli.StringFlag{
|
|
||||||
Name: "path",
|
|
||||||
Value: "objects.trie",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
var List = cli.Command{
|
|
||||||
Name: "list",
|
|
||||||
Usage: "",
|
|
||||||
Description: "",
|
|
||||||
Flags: []cli.Flag{
|
|
||||||
cli.StringFlag{
|
|
||||||
Name: "path",
|
|
||||||
Value: "objects.trie",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
Action: doList,
|
|
||||||
}
|
|
||||||
|
|
||||||
var Remove = cli.Command{
|
|
||||||
Name: "remove",
|
|
||||||
Usage: "",
|
|
||||||
Description: "",
|
|
||||||
Action: doRemove,
|
|
||||||
Flags: []cli.Flag{
|
|
||||||
cli.StringFlag{
|
|
||||||
Name: "path",
|
|
||||||
Value: "objects.trie",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func doAdd(c *cli.Context) {
|
|
||||||
// register patricia for gob
|
|
||||||
registerPatriciaWithGob()
|
|
||||||
|
|
||||||
trie, err := readTrie(c.String("path"))
|
|
||||||
if err != nil {
|
|
||||||
log.Panic("err: ", trie, err)
|
|
||||||
}
|
|
||||||
log.Println("trie: ", trie, err)
|
|
||||||
|
|
||||||
var object storage.ObjectDescription
|
|
||||||
object.Name = c.Args().Get(1)
|
|
||||||
object.Md5sum = "md5sum"
|
|
||||||
object.Murmur3 = "murmur3"
|
|
||||||
|
|
||||||
key := []byte(c.Args().Get(0))
|
|
||||||
|
|
||||||
trie.Insert(key, object)
|
|
||||||
log.Println("newTrie:", trie)
|
|
||||||
saveTrie(c.String("path"), trie)
|
|
||||||
}
|
|
||||||
|
|
||||||
func doGet(c *cli.Context) {
|
|
||||||
registerPatriciaWithGob()
|
|
||||||
|
|
||||||
trie, err := readTrie(c.String("path"))
|
|
||||||
if err != nil {
|
|
||||||
log.Panic("err: ", trie, err)
|
|
||||||
}
|
|
||||||
description := trie.Get([]byte(c.Args().Get(0)))
|
|
||||||
log.Println(trie)
|
|
||||||
log.Println(description)
|
|
||||||
|
|
||||||
}
|
|
||||||
func doList(c *cli.Context) {
|
|
||||||
registerPatriciaWithGob()
|
|
||||||
trie, err := readTrie(c.String("path"))
|
|
||||||
if err != nil {
|
|
||||||
log.Panic("err: ", trie, err)
|
|
||||||
}
|
|
||||||
prefix := patricia.Prefix(c.Args().Get(0))
|
|
||||||
trie.VisitSubtree(prefix, func(prefix patricia.Prefix, item patricia.Item) error {
|
|
||||||
fmt.Println(string(prefix))
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func doRemove(c *cli.Context) {
|
|
||||||
registerPatriciaWithGob()
|
|
||||||
trie, err := readTrie(c.String("path"))
|
|
||||||
if err != nil {
|
|
||||||
log.Panic("err: ", trie, err)
|
|
||||||
}
|
|
||||||
prefix := patricia.Prefix(c.Args().Get(0))
|
|
||||||
trie.Delete(prefix)
|
|
||||||
saveTrie(c.String("path"), trie)
|
|
||||||
}
|
|
||||||
|
|
||||||
func readTrie(path string) (*patricia.Trie, error) {
|
|
||||||
if _, err := os.Stat(path); err != nil {
|
|
||||||
if os.IsNotExist(err) {
|
|
||||||
return patricia.NewTrie(), nil
|
|
||||||
} else {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
file, err := os.Open(path)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
decoder := gob.NewDecoder(file)
|
|
||||||
trie := patricia.NewTrie()
|
|
||||||
if err = decoder.Decode(trie); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return trie, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func saveTrie(path string, trie *patricia.Trie) error {
|
|
||||||
// file, err := os.OpenFile(path, os.O_CREATE|os.O_TRUNC, 0600)
|
|
||||||
// if err != nil {
|
|
||||||
// return err
|
|
||||||
// }
|
|
||||||
var buffer bytes.Buffer
|
|
||||||
encoder := gob.NewEncoder(&buffer)
|
|
||||||
if err := encoder.Encode(trie); err != nil {
|
|
||||||
log.Panic(err)
|
|
||||||
}
|
|
||||||
log.Println("marshalled trie:", buffer.Bytes())
|
|
||||||
err := ioutil.WriteFile(path, buffer.Bytes(), 0600)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func registerPatriciaWithGob() {
|
|
||||||
gob.Register(storage.ObjectDescription{})
|
|
||||||
gob.Register(&patricia.SparseChildList{})
|
|
||||||
gob.Register(&patricia.DenseChildList{})
|
|
||||||
}
|
|
|
@ -1,32 +0,0 @@
|
||||||
/*
|
|
||||||
* Mini Object Storage, (C) 2014 Minio, Inc.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"github.com/codegangsta/cli"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
app := cli.NewApp()
|
|
||||||
app.Name = "index"
|
|
||||||
app.Usage = ""
|
|
||||||
app.Commands = Options
|
|
||||||
app.Author = "Minio"
|
|
||||||
app.Run(os.Args)
|
|
||||||
}
|
|
|
@ -1,14 +0,0 @@
|
||||||
|
|
||||||
% MINIO(1) Minio Manual
|
|
||||||
% Minio community
|
|
||||||
% January 2015
|
|
||||||
# NAME
|
|
||||||
index -
|
|
||||||
|
|
||||||
# SYNOPSIS
|
|
||||||
|
|
||||||
# DESCRIPTION
|
|
||||||
|
|
||||||
# EXAMPLES
|
|
||||||
|
|
||||||
# AUTHORS
|
|
|
@ -1,43 +0,0 @@
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"log"
|
|
||||||
"os"
|
|
||||||
"path"
|
|
||||||
|
|
||||||
"github.com/codegangsta/cli"
|
|
||||||
)
|
|
||||||
|
|
||||||
func add(c *cli.Context) {
|
|
||||||
config, err := parseInput(c)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
var filePath, objectName string
|
|
||||||
switch len(c.Args()) {
|
|
||||||
case 1:
|
|
||||||
objectName = path.Base(c.Args().Get(0))
|
|
||||||
filePath = c.Args().Get(0)
|
|
||||||
case 2:
|
|
||||||
objectName = c.Args().Get(0)
|
|
||||||
filePath = c.Args().Get(1)
|
|
||||||
default:
|
|
||||||
log.Fatal("Please specify a valid object name \n # erasure-demo put [OBJECTNAME] [FILENAME]")
|
|
||||||
}
|
|
||||||
inputFile, err := os.Open(filePath)
|
|
||||||
defer inputFile.Close()
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Staging parity
|
|
||||||
stagingConfig := config
|
|
||||||
stagingConfig.k = 2
|
|
||||||
stagingConfig.m = 1
|
|
||||||
stagingConfig.rootDir = config.stagingDir
|
|
||||||
|
|
||||||
if err := erasurePut(stagingConfig, objectName, inputFile); err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,57 +0,0 @@
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"io/ioutil"
|
|
||||||
"log"
|
|
||||||
"os"
|
|
||||||
"path"
|
|
||||||
|
|
||||||
"github.com/codegangsta/cli"
|
|
||||||
)
|
|
||||||
|
|
||||||
func cleanupStagingDir(stagingDir string) {
|
|
||||||
filelist, err := ioutil.ReadDir(stagingDir)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, file := range filelist {
|
|
||||||
_file := path.Join(stagingDir, file.Name())
|
|
||||||
if err := os.Remove(_file); err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func commit(c *cli.Context) {
|
|
||||||
config, err := parseInput(c)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
var objectName string
|
|
||||||
switch len(c.Args()) {
|
|
||||||
case 1:
|
|
||||||
objectName = c.Args().Get(0)
|
|
||||||
default:
|
|
||||||
log.Fatal("Please specify a valid object name \n # erasure-demo encode [OBJECTNAME]")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get from staging area
|
|
||||||
stagingConfig := config
|
|
||||||
stagingConfig.k = 2
|
|
||||||
stagingConfig.m = 1
|
|
||||||
stagingConfig.rootDir = config.stagingDir
|
|
||||||
reader, err := erasureGet(stagingConfig, objectName)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Increase parity to user defined or default 10,6
|
|
||||||
err = erasurePut(config, objectName, reader)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Cleanup stagingDir
|
|
||||||
cleanupStagingDir(config.stagingDir)
|
|
||||||
}
|
|
|
@ -1,103 +0,0 @@
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"log"
|
|
||||||
"os"
|
|
||||||
"os/user"
|
|
||||||
"path"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/codegangsta/cli"
|
|
||||||
"github.com/minio-io/minio/pkg/strbyteconv"
|
|
||||||
)
|
|
||||||
|
|
||||||
// config representing cli input
|
|
||||||
type inputConfig struct {
|
|
||||||
k int
|
|
||||||
m int
|
|
||||||
blockSize uint64
|
|
||||||
rootDir string
|
|
||||||
stagingDir string
|
|
||||||
}
|
|
||||||
|
|
||||||
// parses input and returns an inputConfig with parsed input
|
|
||||||
func parseInput(c *cli.Context) (inputConfig, error) {
|
|
||||||
var k, m int
|
|
||||||
if c.String("protection-level") != "" {
|
|
||||||
protectionLevel := c.String("protection-level")
|
|
||||||
protectionLevelSplit := strings.Split(protectionLevel, ",")
|
|
||||||
if len(protectionLevelSplit) != 2 {
|
|
||||||
return inputConfig{}, errors.New("Malformed input for protection-level")
|
|
||||||
}
|
|
||||||
|
|
||||||
var err error
|
|
||||||
k, err = strconv.Atoi(protectionLevelSplit[0])
|
|
||||||
if err != nil {
|
|
||||||
return inputConfig{}, err
|
|
||||||
}
|
|
||||||
m, err = strconv.Atoi(protectionLevelSplit[1])
|
|
||||||
if err != nil {
|
|
||||||
return inputConfig{}, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var blockSize uint64
|
|
||||||
blockSize = 0
|
|
||||||
if c.String("block-size") != "" {
|
|
||||||
if c.String("block-size") != "full" {
|
|
||||||
var err error
|
|
||||||
blockSize, err = strbyteconv.StringToBytes(c.String("block-size"))
|
|
||||||
if err != nil {
|
|
||||||
return inputConfig{}, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var rootDir string
|
|
||||||
if c.String("root") != "" {
|
|
||||||
rootDir = c.String("root")
|
|
||||||
}
|
|
||||||
|
|
||||||
var stagingDir string
|
|
||||||
if c.String("staging") != "" {
|
|
||||||
stagingDir = c.String("staging")
|
|
||||||
}
|
|
||||||
|
|
||||||
config := inputConfig{
|
|
||||||
k: k,
|
|
||||||
m: m,
|
|
||||||
blockSize: blockSize,
|
|
||||||
rootDir: rootDir,
|
|
||||||
stagingDir: stagingDir,
|
|
||||||
}
|
|
||||||
return config, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func getObjectdir(basename string) string {
|
|
||||||
user, err := user.Current()
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
homePath := user.HomeDir
|
|
||||||
minioPath := path.Join(homePath, basename)
|
|
||||||
err = _initDir(minioPath)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
return minioPath
|
|
||||||
}
|
|
||||||
|
|
||||||
func _initDir(dirPath string) error {
|
|
||||||
_, err := os.Lstat(dirPath)
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("%s not found, creating a new-one for the first time",
|
|
||||||
dirPath)
|
|
||||||
err = os.MkdirAll(dirPath, 0700)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
|
@ -1,58 +0,0 @@
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"io"
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"github.com/minio-io/minio/pkg/storage"
|
|
||||||
es "github.com/minio-io/minio/pkg/storage/encodedstorage"
|
|
||||||
)
|
|
||||||
|
|
||||||
func erasureGetList(config inputConfig, objectPath string) (io.Reader, error) {
|
|
||||||
var objectStorage storage.ObjectStorage
|
|
||||||
objectStorage, err := es.NewStorage(config.rootDir, config.k, config.m, config.blockSize)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
objectDescList, err := objectStorage.List(objectPath)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
var objectDescListBytes []byte
|
|
||||||
if objectDescListBytes, err = json.Marshal(objectDescList); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
objectDescListBuffer := bytes.NewBuffer(objectDescListBytes)
|
|
||||||
|
|
||||||
return objectDescListBuffer, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func erasureGet(config inputConfig, objectPath string) (io.Reader, error) {
|
|
||||||
var objectStorage storage.ObjectStorage
|
|
||||||
objectStorage, err := es.NewStorage(config.rootDir, config.k, config.m, config.blockSize)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
object, err := objectStorage.Get(objectPath)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return object, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func erasurePut(config inputConfig, objectPath string, reader io.Reader) error {
|
|
||||||
var err error
|
|
||||||
if err := os.MkdirAll(config.rootDir, 0700); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
var objectStorage storage.ObjectStorage
|
|
||||||
if objectStorage, err = es.NewStorage(config.rootDir, config.k, config.m, config.blockSize); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err = objectStorage.Put(objectPath, reader); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
|
@ -1,33 +0,0 @@
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"io"
|
|
||||||
"log"
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"github.com/codegangsta/cli"
|
|
||||||
)
|
|
||||||
|
|
||||||
func get(c *cli.Context) {
|
|
||||||
config, err := parseInput(c)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
var objectName string
|
|
||||||
var objectReader io.Reader
|
|
||||||
switch len(c.Args()) {
|
|
||||||
case 1:
|
|
||||||
objectName = c.Args().Get(0)
|
|
||||||
default:
|
|
||||||
log.Fatal("Please specify a valid object name \n # erasure-demo get [OBJECTNAME]")
|
|
||||||
}
|
|
||||||
|
|
||||||
getConfig := config
|
|
||||||
getConfig.k = 10
|
|
||||||
getConfig.m = 6
|
|
||||||
if objectReader, err = erasureGet(getConfig, objectName); err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
io.Copy(os.Stdout, objectReader)
|
|
||||||
}
|
|
|
@ -1 +0,0 @@
|
||||||
package main
|
|
|
@ -1,24 +0,0 @@
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"io"
|
|
||||||
"log"
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"github.com/codegangsta/cli"
|
|
||||||
)
|
|
||||||
|
|
||||||
func list(c *cli.Context) {
|
|
||||||
config, err := parseInput(c)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
config.k = 10
|
|
||||||
config.m = 6
|
|
||||||
reader, err := erasureGetList(config, "")
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
io.Copy(os.Stdout, reader)
|
|
||||||
}
|
|
|
@ -1,89 +0,0 @@
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"github.com/codegangsta/cli"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
app := cli.NewApp()
|
|
||||||
app.Name = "minio"
|
|
||||||
app.Usage = "minio - object storage"
|
|
||||||
app.Commands = []cli.Command{
|
|
||||||
{
|
|
||||||
Name: "commit",
|
|
||||||
Usage: "provide higher protection for uploaded object",
|
|
||||||
Action: commit,
|
|
||||||
Flags: []cli.Flag{
|
|
||||||
cli.StringFlag{
|
|
||||||
Name: "root",
|
|
||||||
Value: getObjectdir(".minio/erasure"),
|
|
||||||
Usage: "",
|
|
||||||
},
|
|
||||||
cli.StringFlag{
|
|
||||||
Name: "staging",
|
|
||||||
Value: getObjectdir(".minio/staging"),
|
|
||||||
Usage: "",
|
|
||||||
},
|
|
||||||
cli.StringFlag{
|
|
||||||
Name: "protection-level",
|
|
||||||
Value: "10,6",
|
|
||||||
Usage: "data,parity",
|
|
||||||
},
|
|
||||||
cli.StringFlag{
|
|
||||||
Name: "block-size",
|
|
||||||
Value: "1M",
|
|
||||||
Usage: "Size of blocks. Examples: 1K, 1M, full",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Name: "get",
|
|
||||||
Usage: "get an object",
|
|
||||||
Action: get,
|
|
||||||
Flags: []cli.Flag{
|
|
||||||
cli.StringFlag{
|
|
||||||
Name: "root",
|
|
||||||
Value: getObjectdir(".minio/erasure"),
|
|
||||||
Usage: "",
|
|
||||||
},
|
|
||||||
cli.StringFlag{
|
|
||||||
Name: "block-size",
|
|
||||||
Value: "1M",
|
|
||||||
Usage: "Size of blocks. Examples: 1K, 1M, full",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Name: "add",
|
|
||||||
Usage: "add an object",
|
|
||||||
Action: add,
|
|
||||||
Flags: []cli.Flag{
|
|
||||||
cli.StringFlag{
|
|
||||||
Name: "staging",
|
|
||||||
Value: getObjectdir(".minio/staging"),
|
|
||||||
Usage: "",
|
|
||||||
},
|
|
||||||
cli.StringFlag{
|
|
||||||
Name: "block-size",
|
|
||||||
Value: "1M",
|
|
||||||
Usage: "Size of blocks. Examples: 1K, 1M, full",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Name: "list",
|
|
||||||
Usage: "list objects",
|
|
||||||
Action: list,
|
|
||||||
Flags: []cli.Flag{
|
|
||||||
cli.StringFlag{
|
|
||||||
Name: "root",
|
|
||||||
Value: getObjectdir(".minio/erasure"),
|
|
||||||
Usage: "",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
app.Run(os.Args)
|
|
||||||
}
|
|
|
@ -1 +0,0 @@
|
||||||
package main
|
|
|
@ -1 +0,0 @@
|
||||||
new-cmd
|
|
|
@ -1,25 +0,0 @@
|
||||||
## Introduction
|
|
||||||
|
|
||||||
`new-cmd` is a stub builder for new commands,options on top of [codegangsta/cli](https://github.com/codegangsta/cli),
|
|
||||||
|
|
||||||
Idea behind providing a simple tool for rapid prototyping and encouraging new contributors to the project
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
You just need to set its command name and options:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ new-cmd --options option1,option2,option3 --usage "This command is best" [commandname]
|
|
||||||
```
|
|
||||||
|
|
||||||
Generates three files [commandname].go, [commandname]-options.go, [commandname].md respectively
|
|
||||||
|
|
||||||
## Example
|
|
||||||
|
|
||||||
If you want to start to building `bucket` command which has options `get`, `put`, `list`:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ new-cmd --options get,put,list --usage "Bucket operations" bucket
|
|
||||||
$ ls bucket/
|
|
||||||
bucket-options.go bucket.go bucket.md
|
|
||||||
```
|
|
|
@ -1,89 +0,0 @@
|
||||||
// this code is from gofmt, modified for our internal usage - http://golang.org/src/cmd/gofmt/gofmt.go
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"go/ast"
|
|
||||||
"go/parser"
|
|
||||||
"go/printer"
|
|
||||||
"go/token"
|
|
||||||
"io"
|
|
||||||
"io/ioutil"
|
|
||||||
"os"
|
|
||||||
"path/filepath"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
func processFile(filename string, in io.Reader, out io.Writer, stdin bool) error {
|
|
||||||
if in == nil {
|
|
||||||
f, err := os.Open(filename)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer f.Close()
|
|
||||||
in = f
|
|
||||||
}
|
|
||||||
|
|
||||||
src, err := ioutil.ReadAll(in)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
fileSet := token.NewFileSet()
|
|
||||||
file, err := parser.ParseFile(fileSet, filename, src, parser.ParseComments)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
ast.SortImports(fileSet, file)
|
|
||||||
|
|
||||||
var buf bytes.Buffer
|
|
||||||
tabWidth := 8
|
|
||||||
printerMode := printer.UseSpaces | printer.TabIndent
|
|
||||||
err = (&printer.Config{Mode: printerMode, Tabwidth: tabWidth}).Fprint(&buf, fileSet, file)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
res := buf.Bytes()
|
|
||||||
if !bytes.Equal(src, res) {
|
|
||||||
err = ioutil.WriteFile(filename, res, 0)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func isGofile(f os.FileInfo) bool {
|
|
||||||
name := f.Name()
|
|
||||||
return !f.IsDir() && !strings.HasPrefix(name, ".") && strings.HasSuffix(name, ".go")
|
|
||||||
}
|
|
||||||
|
|
||||||
func visitFile(pathName string, f os.FileInfo, err error) error {
|
|
||||||
|
|
||||||
if err == nil && isGofile(f) {
|
|
||||||
err = processFile(pathName, nil, os.Stdout, false)
|
|
||||||
}
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func walkDir(pathName string) {
|
|
||||||
filepath.Walk(pathName, visitFile)
|
|
||||||
}
|
|
||||||
|
|
||||||
func GoFormat(pathName string) error {
|
|
||||||
dir, err := os.Stat(pathName)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if dir.IsDir() {
|
|
||||||
walkDir(pathName)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
|
@ -1,70 +0,0 @@
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"log"
|
|
||||||
"os"
|
|
||||||
"strings"
|
|
||||||
"text/template"
|
|
||||||
|
|
||||||
"github.com/codegangsta/cli"
|
|
||||||
"github.com/minio-io/minio/pkg/utils"
|
|
||||||
)
|
|
||||||
|
|
||||||
func parseInput(c *cli.Context) {
|
|
||||||
var commandName string
|
|
||||||
switch len(c.Args()) {
|
|
||||||
case 1:
|
|
||||||
commandName = c.Args()[0]
|
|
||||||
default:
|
|
||||||
log.Fatal("command name must not be blank\n")
|
|
||||||
}
|
|
||||||
|
|
||||||
var inputOptions []string
|
|
||||||
if c.String("options") != "" {
|
|
||||||
inputOptions = strings.Split(c.String("options"), ",")
|
|
||||||
}
|
|
||||||
|
|
||||||
if inputOptions[0] == "" {
|
|
||||||
log.Fatal("options cannot be empty with a command name")
|
|
||||||
}
|
|
||||||
|
|
||||||
var commandUsage string
|
|
||||||
if c.String("usage") != "" {
|
|
||||||
commandUsage = c.String("usage")
|
|
||||||
}
|
|
||||||
|
|
||||||
var mainObject = template.Must(template.New("main").Parse(commandTemplate))
|
|
||||||
var optionsObject = template.Must(template.New("options").Parse(optionsTemplate))
|
|
||||||
var readmeObject = template.Must(template.New("readme").Parse(readmeTemplate))
|
|
||||||
|
|
||||||
err := os.Mkdir(commandName, 0755)
|
|
||||||
utils.Assert(err)
|
|
||||||
|
|
||||||
command := initCommand(commandName, commandUsage, inputOptions)
|
|
||||||
|
|
||||||
optionsGo := source{
|
|
||||||
Name: commandName + "-options.go",
|
|
||||||
TempLate: *optionsObject,
|
|
||||||
}
|
|
||||||
|
|
||||||
readmeMd := source{
|
|
||||||
Name: commandName + ".md",
|
|
||||||
TempLate: *readmeObject,
|
|
||||||
}
|
|
||||||
|
|
||||||
mainGo := source{
|
|
||||||
Name: commandName + ".go",
|
|
||||||
TempLate: *mainObject,
|
|
||||||
}
|
|
||||||
|
|
||||||
err = readmeMd.get(commandName, command)
|
|
||||||
utils.Assert(err)
|
|
||||||
|
|
||||||
mainGo.get(commandName, command)
|
|
||||||
utils.Assert(err)
|
|
||||||
|
|
||||||
optionsGo.get(commandName, command)
|
|
||||||
|
|
||||||
err = GoFormat(commandName)
|
|
||||||
utils.Assert(err)
|
|
||||||
}
|
|
|
@ -1,92 +0,0 @@
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"os"
|
|
||||||
"path"
|
|
||||||
"text/template"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/codegangsta/cli"
|
|
||||||
"github.com/minio-io/minio/pkg/utils"
|
|
||||||
)
|
|
||||||
|
|
||||||
type source struct {
|
|
||||||
Name string
|
|
||||||
TempLate template.Template
|
|
||||||
}
|
|
||||||
|
|
||||||
type option struct {
|
|
||||||
Name string
|
|
||||||
Definename string
|
|
||||||
Functionname string
|
|
||||||
}
|
|
||||||
|
|
||||||
type command struct {
|
|
||||||
Name string
|
|
||||||
Usage string
|
|
||||||
Month string
|
|
||||||
Year int
|
|
||||||
Options []option
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f source) get(commandName string, definition command) error {
|
|
||||||
wr, err := os.Create(path.Join(commandName, f.Name))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer wr.Close()
|
|
||||||
return f.TempLate.Execute(wr, definition)
|
|
||||||
}
|
|
||||||
|
|
||||||
func initCommand(commandname, usage string, inputOptions []string) command {
|
|
||||||
year, month, _ := time.Now().Date()
|
|
||||||
return command{
|
|
||||||
Name: commandname,
|
|
||||||
Usage: usage,
|
|
||||||
Month: month.String(),
|
|
||||||
Year: year,
|
|
||||||
Options: initOptions(inputOptions),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func initOptions(inputOptions []string) []option {
|
|
||||||
var options []option
|
|
||||||
|
|
||||||
if inputOptions[0] == "" {
|
|
||||||
return options
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, name := range inputOptions {
|
|
||||||
option := option{
|
|
||||||
Name: name,
|
|
||||||
Definename: utils.FirstUpper(name),
|
|
||||||
Functionname: "do" + utils.FirstUpper(name),
|
|
||||||
}
|
|
||||||
options = append(options, option)
|
|
||||||
}
|
|
||||||
|
|
||||||
return options
|
|
||||||
}
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
app := cli.NewApp()
|
|
||||||
app.Name = "new-cmd"
|
|
||||||
app.Usage = "Is a stub builder for new commands, options"
|
|
||||||
var flags = []cli.Flag{
|
|
||||||
cli.StringFlag{
|
|
||||||
Name: "options",
|
|
||||||
Value: "",
|
|
||||||
Usage: "Command-separated list of options to build",
|
|
||||||
},
|
|
||||||
cli.StringFlag{
|
|
||||||
Name: "usage",
|
|
||||||
Value: "",
|
|
||||||
Usage: "A one liner explaining the new command being built",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
app.Flags = flags
|
|
||||||
app.Action = parseInput
|
|
||||||
app.Author = "Minio"
|
|
||||||
app.Run(os.Args)
|
|
||||||
}
|
|
|
@ -1,95 +0,0 @@
|
||||||
package main
|
|
||||||
|
|
||||||
const (
|
|
||||||
commandTemplate = `
|
|
||||||
/*
|
|
||||||
* Mini Object Storage, (C) 2014 Minio, Inc.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"github.com/codegangsta/cli"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
app := cli.NewApp()
|
|
||||||
app.Name = "{{.Name}}"
|
|
||||||
app.Usage = "{{.Usage}}"
|
|
||||||
app.Commands = Options
|
|
||||||
app.Author = "Minio"
|
|
||||||
app.Run(os.Args)
|
|
||||||
}
|
|
||||||
`
|
|
||||||
optionsTemplate = `
|
|
||||||
/*
|
|
||||||
* Mini Object Storage, (C) 2014 Minio, Inc.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/codegangsta/cli"
|
|
||||||
)
|
|
||||||
|
|
||||||
var Options = []cli.Command{
|
|
||||||
{{range .Options}}{{.Definename}},
|
|
||||||
{{end}}
|
|
||||||
}
|
|
||||||
|
|
||||||
{{range .Options}}
|
|
||||||
var {{.Definename}} = cli.Command{
|
|
||||||
Name: "{{.Name}}",
|
|
||||||
Usage: "",
|
|
||||||
Description: "",
|
|
||||||
Action: {{.Functionname}},
|
|
||||||
}
|
|
||||||
{{end}}
|
|
||||||
|
|
||||||
{{range .Options}}
|
|
||||||
func {{.Functionname}}(c *cli.Context) {
|
|
||||||
}
|
|
||||||
{{end}}
|
|
||||||
`
|
|
||||||
readmeTemplate = `
|
|
||||||
% MINIO(1) Minio Manual
|
|
||||||
% Minio community
|
|
||||||
% {{.Month}} {{.Year}}
|
|
||||||
# NAME
|
|
||||||
{{.Name}} - {{.Usage}}
|
|
||||||
|
|
||||||
# SYNOPSIS
|
|
||||||
|
|
||||||
# DESCRIPTION
|
|
||||||
|
|
||||||
# EXAMPLES
|
|
||||||
|
|
||||||
# AUTHORS
|
|
||||||
`
|
|
||||||
)
|
|
|
@ -1 +0,0 @@
|
||||||
split
|
|
|
@ -1,80 +0,0 @@
|
||||||
/*
|
|
||||||
* Mini Object Storage, (C) 2014 Minio, Inc.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"io"
|
|
||||||
"log"
|
|
||||||
"os"
|
|
||||||
"path"
|
|
||||||
|
|
||||||
"github.com/codegangsta/cli"
|
|
||||||
"github.com/minio-io/minio/pkg/split"
|
|
||||||
"github.com/minio-io/minio/pkg/strbyteconv"
|
|
||||||
)
|
|
||||||
|
|
||||||
var Options = []cli.Command{
|
|
||||||
Split,
|
|
||||||
Merge,
|
|
||||||
}
|
|
||||||
|
|
||||||
var Split = cli.Command{
|
|
||||||
Name: "split",
|
|
||||||
Usage: "Describes how large each split should be",
|
|
||||||
Description: "",
|
|
||||||
Action: doFileSplit,
|
|
||||||
Flags: []cli.Flag{
|
|
||||||
cli.StringFlag{
|
|
||||||
Name: "size,s",
|
|
||||||
Value: "2M",
|
|
||||||
Usage: "",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
var Merge = cli.Command{
|
|
||||||
Name: "merge",
|
|
||||||
Usage: "Describes how large each split should be",
|
|
||||||
Description: "",
|
|
||||||
Action: doFileMerge,
|
|
||||||
}
|
|
||||||
|
|
||||||
func doFileSplit(c *cli.Context) {
|
|
||||||
chunkSize, err := strbyteconv.StringToBytes(c.String("size"))
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
err = split.SplitFileWithPrefix(c.Args().Get(0), chunkSize, c.Args().Get(1))
|
|
||||||
if err != nil {
|
|
||||||
// TODO cleanup?
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func doFileMerge(c *cli.Context) {
|
|
||||||
prefix := c.Args().Get(0)
|
|
||||||
output := c.Args().Get(1)
|
|
||||||
prefix = path.Clean(prefix)
|
|
||||||
log.Println(path.Dir(prefix), path.Base(prefix))
|
|
||||||
reader := split.JoinFiles(path.Dir(prefix), path.Base(prefix))
|
|
||||||
file, err := os.OpenFile(output, os.O_WRONLY|os.O_CREATE, 0600)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
defer file.Close()
|
|
||||||
io.Copy(file, reader)
|
|
||||||
}
|
|
|
@ -1,32 +0,0 @@
|
||||||
/*
|
|
||||||
* Mini Object Storage, (C) 2014 Minio, Inc.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"github.com/codegangsta/cli"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
app := cli.NewApp()
|
|
||||||
app.Name = "split"
|
|
||||||
app.Usage = ""
|
|
||||||
app.Commands = Options
|
|
||||||
app.Author = "Minio"
|
|
||||||
app.Run(os.Args)
|
|
||||||
}
|
|
|
@ -1,14 +0,0 @@
|
||||||
|
|
||||||
% MINIO(1) Minio Manual
|
|
||||||
% Minio community
|
|
||||||
% January 2015
|
|
||||||
# NAME
|
|
||||||
split -
|
|
||||||
|
|
||||||
# SYNOPSIS
|
|
||||||
|
|
||||||
# DESCRIPTION
|
|
||||||
|
|
||||||
# EXAMPLES
|
|
||||||
|
|
||||||
# AUTHORS
|
|
2
doc.go
2
doc.go
|
@ -1,2 +1,2 @@
|
||||||
// Minio - Object storage inspired by Amazon S3 and Facebook Haystack.
|
// Minio - Object storage inspired by Amazon S3 and Facebook Haystack.
|
||||||
package minio
|
package main
|
||||||
|
|
|
@ -1,300 +0,0 @@
|
||||||
/*
|
|
||||||
* This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.
|
|
||||||
* MD5 Message-Digest Algorithm (RFC 1321).
|
|
||||||
*
|
|
||||||
* Homepage:
|
|
||||||
* http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5
|
|
||||||
*
|
|
||||||
* Author:
|
|
||||||
* Alexander Peslyak, better known as Solar Designer <solar at openwall.com>
|
|
||||||
*
|
|
||||||
* This software was written by Alexander Peslyak in 2001. No copyright is
|
|
||||||
* claimed, and the software is hereby placed in the public domain.
|
|
||||||
* In case this attempt to disclaim copyright and place the software in the
|
|
||||||
* public domain is deemed null and void, then the software is
|
|
||||||
* Copyright (c) 2001 Alexander Peslyak and it is hereby released to the
|
|
||||||
* general public under the following terms:
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted.
|
|
||||||
*
|
|
||||||
* There's ABSOLUTELY NO WARRANTY, express or implied.
|
|
||||||
*
|
|
||||||
* (This is a heavily cut-down "BSD license".)
|
|
||||||
*
|
|
||||||
* This differs from Colin Plumb's older public domain implementation in that
|
|
||||||
* no exactly 32-bit integer data type is required (any 32-bit or wider
|
|
||||||
* unsigned integer data type will do), there's no compile-time endianness
|
|
||||||
* configuration, and the function prototypes match OpenSSL's. No code from
|
|
||||||
* Colin Plumb's implementation has been reused; this comment merely compares
|
|
||||||
* the properties of the two independent implementations.
|
|
||||||
*
|
|
||||||
* The primary goals of this implementation are portability and ease of use.
|
|
||||||
* It is meant to be fast, but not as fast as possible. Some known
|
|
||||||
* optimizations are not included to reduce source code size and avoid
|
|
||||||
* compile-time configuration.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
/* Any 32-bit or wider unsigned integer data type will do */
|
|
||||||
typedef unsigned int MD5_u32plus;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
MD5_u32plus lo, hi;
|
|
||||||
MD5_u32plus a, b, c, d;
|
|
||||||
unsigned char buffer[64];
|
|
||||||
MD5_u32plus block[16];
|
|
||||||
} MD5_CTX;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The basic MD5 functions.
|
|
||||||
*
|
|
||||||
* F and G are optimized compared to their RFC 1321 definitions for
|
|
||||||
* architectures that lack an AND-NOT instruction, just like in Colin Plumb's
|
|
||||||
* implementation.
|
|
||||||
*/
|
|
||||||
#define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z))))
|
|
||||||
#define G(x, y, z) ((y) ^ ((z) & ((x) ^ (y))))
|
|
||||||
#define H(x, y, z) (((x) ^ (y)) ^ (z))
|
|
||||||
#define H2(x, y, z) ((x) ^ ((y) ^ (z)))
|
|
||||||
#define I(x, y, z) ((y) ^ ((x) | ~(z)))
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The MD5 transformation for all four rounds.
|
|
||||||
*/
|
|
||||||
#define STEP(f, a, b, c, d, x, t, s) \
|
|
||||||
(a) += f((b), (c), (d)) + (x) + (t); \
|
|
||||||
(a) = (((a) << (s)) | (((a) & 0xffffffff) >> (32 - (s)))); \
|
|
||||||
(a) += (b);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* SET reads 4 input bytes in little-endian byte order and stores them
|
|
||||||
* in a properly aligned word in host byte order.
|
|
||||||
*
|
|
||||||
* The check for little-endian architectures that tolerate unaligned
|
|
||||||
* memory accesses is just an optimization. Nothing will break if it
|
|
||||||
* doesn't work.
|
|
||||||
*/
|
|
||||||
#if defined(__i386__) || defined(__x86_64__) || defined(__vax__)
|
|
||||||
#define SET(n) \
|
|
||||||
(*(MD5_u32plus *)&ptr[(n) * 4])
|
|
||||||
#define GET(n) \
|
|
||||||
SET(n)
|
|
||||||
#else
|
|
||||||
#define SET(n) \
|
|
||||||
(ctx->block[(n)] = \
|
|
||||||
(MD5_u32plus)ptr[(n) * 4] | \
|
|
||||||
((MD5_u32plus)ptr[(n) * 4 + 1] << 8) | \
|
|
||||||
((MD5_u32plus)ptr[(n) * 4 + 2] << 16) | \
|
|
||||||
((MD5_u32plus)ptr[(n) * 4 + 3] << 24))
|
|
||||||
#define GET(n) \
|
|
||||||
(ctx->block[(n)])
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This processes one or more 64-byte data blocks, but does NOT update
|
|
||||||
* the bit counters. There are no alignment requirements.
|
|
||||||
*/
|
|
||||||
static const void *body(MD5_CTX *ctx, const void *data, unsigned long size)
|
|
||||||
{
|
|
||||||
const unsigned char *ptr;
|
|
||||||
MD5_u32plus a, b, c, d;
|
|
||||||
MD5_u32plus saved_a, saved_b, saved_c, saved_d;
|
|
||||||
|
|
||||||
ptr = (const unsigned char *)data;
|
|
||||||
|
|
||||||
a = ctx->a;
|
|
||||||
b = ctx->b;
|
|
||||||
c = ctx->c;
|
|
||||||
d = ctx->d;
|
|
||||||
|
|
||||||
do {
|
|
||||||
saved_a = a;
|
|
||||||
saved_b = b;
|
|
||||||
saved_c = c;
|
|
||||||
saved_d = d;
|
|
||||||
|
|
||||||
/* Round 1 */
|
|
||||||
STEP(F, a, b, c, d, SET(0), 0xd76aa478, 7)
|
|
||||||
STEP(F, d, a, b, c, SET(1), 0xe8c7b756, 12)
|
|
||||||
STEP(F, c, d, a, b, SET(2), 0x242070db, 17)
|
|
||||||
STEP(F, b, c, d, a, SET(3), 0xc1bdceee, 22)
|
|
||||||
STEP(F, a, b, c, d, SET(4), 0xf57c0faf, 7)
|
|
||||||
STEP(F, d, a, b, c, SET(5), 0x4787c62a, 12)
|
|
||||||
STEP(F, c, d, a, b, SET(6), 0xa8304613, 17)
|
|
||||||
STEP(F, b, c, d, a, SET(7), 0xfd469501, 22)
|
|
||||||
STEP(F, a, b, c, d, SET(8), 0x698098d8, 7)
|
|
||||||
STEP(F, d, a, b, c, SET(9), 0x8b44f7af, 12)
|
|
||||||
STEP(F, c, d, a, b, SET(10), 0xffff5bb1, 17)
|
|
||||||
STEP(F, b, c, d, a, SET(11), 0x895cd7be, 22)
|
|
||||||
STEP(F, a, b, c, d, SET(12), 0x6b901122, 7)
|
|
||||||
STEP(F, d, a, b, c, SET(13), 0xfd987193, 12)
|
|
||||||
STEP(F, c, d, a, b, SET(14), 0xa679438e, 17)
|
|
||||||
STEP(F, b, c, d, a, SET(15), 0x49b40821, 22)
|
|
||||||
|
|
||||||
/* Round 2 */
|
|
||||||
STEP(G, a, b, c, d, GET(1), 0xf61e2562, 5)
|
|
||||||
STEP(G, d, a, b, c, GET(6), 0xc040b340, 9)
|
|
||||||
STEP(G, c, d, a, b, GET(11), 0x265e5a51, 14)
|
|
||||||
STEP(G, b, c, d, a, GET(0), 0xe9b6c7aa, 20)
|
|
||||||
STEP(G, a, b, c, d, GET(5), 0xd62f105d, 5)
|
|
||||||
STEP(G, d, a, b, c, GET(10), 0x02441453, 9)
|
|
||||||
STEP(G, c, d, a, b, GET(15), 0xd8a1e681, 14)
|
|
||||||
STEP(G, b, c, d, a, GET(4), 0xe7d3fbc8, 20)
|
|
||||||
STEP(G, a, b, c, d, GET(9), 0x21e1cde6, 5)
|
|
||||||
STEP(G, d, a, b, c, GET(14), 0xc33707d6, 9)
|
|
||||||
STEP(G, c, d, a, b, GET(3), 0xf4d50d87, 14)
|
|
||||||
STEP(G, b, c, d, a, GET(8), 0x455a14ed, 20)
|
|
||||||
STEP(G, a, b, c, d, GET(13), 0xa9e3e905, 5)
|
|
||||||
STEP(G, d, a, b, c, GET(2), 0xfcefa3f8, 9)
|
|
||||||
STEP(G, c, d, a, b, GET(7), 0x676f02d9, 14)
|
|
||||||
STEP(G, b, c, d, a, GET(12), 0x8d2a4c8a, 20)
|
|
||||||
|
|
||||||
/* Round 3 */
|
|
||||||
STEP(H, a, b, c, d, GET(5), 0xfffa3942, 4)
|
|
||||||
STEP(H2, d, a, b, c, GET(8), 0x8771f681, 11)
|
|
||||||
STEP(H, c, d, a, b, GET(11), 0x6d9d6122, 16)
|
|
||||||
STEP(H2, b, c, d, a, GET(14), 0xfde5380c, 23)
|
|
||||||
STEP(H, a, b, c, d, GET(1), 0xa4beea44, 4)
|
|
||||||
STEP(H2, d, a, b, c, GET(4), 0x4bdecfa9, 11)
|
|
||||||
STEP(H, c, d, a, b, GET(7), 0xf6bb4b60, 16)
|
|
||||||
STEP(H2, b, c, d, a, GET(10), 0xbebfbc70, 23)
|
|
||||||
STEP(H, a, b, c, d, GET(13), 0x289b7ec6, 4)
|
|
||||||
STEP(H2, d, a, b, c, GET(0), 0xeaa127fa, 11)
|
|
||||||
STEP(H, c, d, a, b, GET(3), 0xd4ef3085, 16)
|
|
||||||
STEP(H2, b, c, d, a, GET(6), 0x04881d05, 23)
|
|
||||||
STEP(H, a, b, c, d, GET(9), 0xd9d4d039, 4)
|
|
||||||
STEP(H2, d, a, b, c, GET(12), 0xe6db99e5, 11)
|
|
||||||
STEP(H, c, d, a, b, GET(15), 0x1fa27cf8, 16)
|
|
||||||
STEP(H2, b, c, d, a, GET(2), 0xc4ac5665, 23)
|
|
||||||
|
|
||||||
/* Round 4 */
|
|
||||||
STEP(I, a, b, c, d, GET(0), 0xf4292244, 6)
|
|
||||||
STEP(I, d, a, b, c, GET(7), 0x432aff97, 10)
|
|
||||||
STEP(I, c, d, a, b, GET(14), 0xab9423a7, 15)
|
|
||||||
STEP(I, b, c, d, a, GET(5), 0xfc93a039, 21)
|
|
||||||
STEP(I, a, b, c, d, GET(12), 0x655b59c3, 6)
|
|
||||||
STEP(I, d, a, b, c, GET(3), 0x8f0ccc92, 10)
|
|
||||||
STEP(I, c, d, a, b, GET(10), 0xffeff47d, 15)
|
|
||||||
STEP(I, b, c, d, a, GET(1), 0x85845dd1, 21)
|
|
||||||
STEP(I, a, b, c, d, GET(8), 0x6fa87e4f, 6)
|
|
||||||
STEP(I, d, a, b, c, GET(15), 0xfe2ce6e0, 10)
|
|
||||||
STEP(I, c, d, a, b, GET(6), 0xa3014314, 15)
|
|
||||||
STEP(I, b, c, d, a, GET(13), 0x4e0811a1, 21)
|
|
||||||
STEP(I, a, b, c, d, GET(4), 0xf7537e82, 6)
|
|
||||||
STEP(I, d, a, b, c, GET(11), 0xbd3af235, 10)
|
|
||||||
STEP(I, c, d, a, b, GET(2), 0x2ad7d2bb, 15)
|
|
||||||
STEP(I, b, c, d, a, GET(9), 0xeb86d391, 21)
|
|
||||||
|
|
||||||
a += saved_a;
|
|
||||||
b += saved_b;
|
|
||||||
c += saved_c;
|
|
||||||
d += saved_d;
|
|
||||||
|
|
||||||
ptr += 64;
|
|
||||||
} while (size -= 64);
|
|
||||||
|
|
||||||
ctx->a = a;
|
|
||||||
ctx->b = b;
|
|
||||||
ctx->c = c;
|
|
||||||
ctx->d = d;
|
|
||||||
|
|
||||||
return ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MD5_Init(MD5_CTX *ctx)
|
|
||||||
{
|
|
||||||
ctx->a = 0x67452301;
|
|
||||||
ctx->b = 0xefcdab89;
|
|
||||||
ctx->c = 0x98badcfe;
|
|
||||||
ctx->d = 0x10325476;
|
|
||||||
|
|
||||||
ctx->lo = 0;
|
|
||||||
ctx->hi = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MD5_Update(MD5_CTX *ctx, const void *data, unsigned long size)
|
|
||||||
{
|
|
||||||
MD5_u32plus saved_lo;
|
|
||||||
unsigned long used, available;
|
|
||||||
|
|
||||||
saved_lo = ctx->lo;
|
|
||||||
if ((ctx->lo = (saved_lo + size) & 0x1fffffff) < saved_lo)
|
|
||||||
ctx->hi++;
|
|
||||||
ctx->hi += size >> 29;
|
|
||||||
|
|
||||||
used = saved_lo & 0x3f;
|
|
||||||
|
|
||||||
if (used) {
|
|
||||||
available = 64 - used;
|
|
||||||
|
|
||||||
if (size < available) {
|
|
||||||
memcpy(&ctx->buffer[used], data, size);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(&ctx->buffer[used], data, available);
|
|
||||||
data = (const unsigned char *)data + available;
|
|
||||||
size -= available;
|
|
||||||
body(ctx, ctx->buffer, 64);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (size >= 64) {
|
|
||||||
data = body(ctx, data, size & ~(unsigned long)0x3f);
|
|
||||||
size &= 0x3f;
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(ctx->buffer, data, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MD5_Final(unsigned char *result, MD5_CTX *ctx)
|
|
||||||
{
|
|
||||||
unsigned long used, available;
|
|
||||||
|
|
||||||
used = ctx->lo & 0x3f;
|
|
||||||
|
|
||||||
ctx->buffer[used++] = 0x80;
|
|
||||||
|
|
||||||
available = 64 - used;
|
|
||||||
|
|
||||||
if (available < 8) {
|
|
||||||
memset(&ctx->buffer[used], 0, available);
|
|
||||||
body(ctx, ctx->buffer, 64);
|
|
||||||
used = 0;
|
|
||||||
available = 64;
|
|
||||||
}
|
|
||||||
|
|
||||||
memset(&ctx->buffer[used], 0, available - 8);
|
|
||||||
|
|
||||||
ctx->lo <<= 3;
|
|
||||||
ctx->buffer[56] = ctx->lo;
|
|
||||||
ctx->buffer[57] = ctx->lo >> 8;
|
|
||||||
ctx->buffer[58] = ctx->lo >> 16;
|
|
||||||
ctx->buffer[59] = ctx->lo >> 24;
|
|
||||||
ctx->buffer[60] = ctx->hi;
|
|
||||||
ctx->buffer[61] = ctx->hi >> 8;
|
|
||||||
ctx->buffer[62] = ctx->hi >> 16;
|
|
||||||
ctx->buffer[63] = ctx->hi >> 24;
|
|
||||||
|
|
||||||
body(ctx, ctx->buffer, 64);
|
|
||||||
|
|
||||||
result[0] = ctx->a;
|
|
||||||
result[1] = ctx->a >> 8;
|
|
||||||
result[2] = ctx->a >> 16;
|
|
||||||
result[3] = ctx->a >> 24;
|
|
||||||
result[4] = ctx->b;
|
|
||||||
result[5] = ctx->b >> 8;
|
|
||||||
result[6] = ctx->b >> 16;
|
|
||||||
result[7] = ctx->b >> 24;
|
|
||||||
result[8] = ctx->c;
|
|
||||||
result[9] = ctx->c >> 8;
|
|
||||||
result[10] = ctx->c >> 16;
|
|
||||||
result[11] = ctx->c >> 24;
|
|
||||||
result[12] = ctx->d;
|
|
||||||
result[13] = ctx->d >> 8;
|
|
||||||
result[14] = ctx->d >> 16;
|
|
||||||
result[15] = ctx->d >> 24;
|
|
||||||
|
|
||||||
memset(ctx, 0, sizeof(*ctx));
|
|
||||||
}
|
|
|
@ -1,23 +0,0 @@
|
||||||
package md5c
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/hex"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
. "gopkg.in/check.v1"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test(t *testing.T) { TestingT(t) }
|
|
||||||
|
|
||||||
type MySuite struct{}
|
|
||||||
|
|
||||||
var _ = Suite(&MySuite{})
|
|
||||||
|
|
||||||
func (s *MySuite) TestMd5sum(c *C) {
|
|
||||||
testString := []byte("Test string")
|
|
||||||
expectedHash, _ := hex.DecodeString("0fd3dbec9730101bff92acc820befc34")
|
|
||||||
hash, err := Sum(bytes.NewBuffer(testString))
|
|
||||||
c.Assert(err, IsNil)
|
|
||||||
c.Assert(bytes.Equal(expectedHash, hash), Equals, true)
|
|
||||||
}
|
|
|
@ -1,60 +0,0 @@
|
||||||
// !build linux,amd64
|
|
||||||
|
|
||||||
package md5c
|
|
||||||
|
|
||||||
// /* Any 32-bit or wider unsigned integer data type will do */
|
|
||||||
// typedef unsigned int MD5_u32plus;
|
|
||||||
//
|
|
||||||
// typedef struct {
|
|
||||||
// MD5_u32plus lo, hi;
|
|
||||||
// MD5_u32plus a, b, c, d;
|
|
||||||
// unsigned char buffer[64];
|
|
||||||
// MD5_u32plus block[16];
|
|
||||||
// } MD5_CTX;
|
|
||||||
//
|
|
||||||
// void MD5_Init(MD5_CTX *ctx);
|
|
||||||
// void MD5_Update(MD5_CTX *ctx, const void *data, unsigned long size);
|
|
||||||
// void MD5_Final(unsigned char *result, MD5_CTX *ctx);
|
|
||||||
import "C"
|
|
||||||
import (
|
|
||||||
"io"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
func context() *C.MD5_CTX {
|
|
||||||
var ctx C.MD5_CTX
|
|
||||||
C.MD5_Init(&ctx)
|
|
||||||
return &ctx
|
|
||||||
}
|
|
||||||
|
|
||||||
func write(buffer []byte, ctx *C.MD5_CTX) {
|
|
||||||
size := len(buffer)
|
|
||||||
data := unsafe.Pointer(&buffer[0])
|
|
||||||
C.MD5_Update(ctx, data, C.ulong(size))
|
|
||||||
}
|
|
||||||
|
|
||||||
func Sum(reader io.Reader) ([]byte, error) {
|
|
||||||
ctx := context()
|
|
||||||
var err error
|
|
||||||
var length int
|
|
||||||
for err == nil {
|
|
||||||
byteBuffer := make([]byte, 1024*1024)
|
|
||||||
length, err = reader.Read(byteBuffer)
|
|
||||||
// break here since byteBuffer will go out of range
|
|
||||||
// when invoking subsequent write() call
|
|
||||||
if length == 0 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
byteBuffer = byteBuffer[0:length]
|
|
||||||
write(byteBuffer, ctx)
|
|
||||||
}
|
|
||||||
|
|
||||||
if err != io.EOF {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
outputBuffer := make([]byte, 16)
|
|
||||||
coutputbuff := (*C.uchar)(unsafe.Pointer(&outputBuffer[0]))
|
|
||||||
C.MD5_Final(coutputbuff, ctx)
|
|
||||||
return outputBuffer, nil
|
|
||||||
}
|
|
|
@ -1,8 +0,0 @@
|
||||||
all: build
|
|
||||||
.PHONY: all
|
|
||||||
|
|
||||||
libsignify/libsignify_static.a:
|
|
||||||
@$(MAKE) -C libsignify libsignify_static.a
|
|
||||||
|
|
||||||
build: libsignify/libsignify_static.a
|
|
||||||
@godep go build
|
|
|
@ -1,4 +0,0 @@
|
||||||
*.o
|
|
||||||
signify
|
|
||||||
*.a
|
|
||||||
*.so*
|
|
|
@ -1,81 +0,0 @@
|
||||||
signify - sign and verify
|
|
||||||
|
|
||||||
One of the things OpenBSD has never done is sign releases, for whatever
|
|
||||||
reasons. But 2014 is a new year, time to make a change. The first thing
|
|
||||||
you need to start signing OS releases (besides the release itself) is a
|
|
||||||
signing tool. Other projects use a variety of tools for this, but
|
|
||||||
unfortunately none of them were invented here. signify is a small tool I
|
|
||||||
wrote to fill that gap. Here's a few notes about it, working from the
|
|
||||||
top down.
|
|
||||||
|
|
||||||
There are only two useful portmanteaus to be made from the words sign
|
|
||||||
and verify. Verisign charges a lot of money, so we went with the free
|
|
||||||
option.
|
|
||||||
|
|
||||||
The UI/UX is pretty spartan. It does lots of error checking, but makes
|
|
||||||
no effort at error recovery. Early versions of signify refused to
|
|
||||||
overwrite existing files, based on the theory that we're going to stick
|
|
||||||
this in a careful workflow and not make mistakes; i.e., overwriting a
|
|
||||||
signature file by signing the same file twice indicates the workflow has
|
|
||||||
failed. This was later changed, based on feedback from the poor souls
|
|
||||||
who had to use the thing.
|
|
||||||
|
|
||||||
The signify file format is also really simple. At its core, it consists
|
|
||||||
of a two byte algorithm identifier ("Ed") and the signature or key data,
|
|
||||||
plus a bit more data in secret keys to support encrypting them. The core
|
|
||||||
data is base64 encoded (so you don't poke your eye out) and appended
|
|
||||||
after a one line comment. The comment is ignored and just there so you
|
|
||||||
can tell the files apart if you accidentally rename them.
|
|
||||||
|
|
||||||
Initially, I resisted adding identifiers to the keys. One way signature
|
|
||||||
schemes break is user error, as in the evil people trick the user into
|
|
||||||
believing their evil key is legit. By omitting identifying information,
|
|
||||||
you can't be tricked into believing a key is OpenBSD official just
|
|
||||||
because it says "OpenBSD official". Does this matter? Probably not, but
|
|
||||||
since signify itself would never use such identifiers for verification,
|
|
||||||
there wasn't any reason to add them. Soon after we started using signify
|
|
||||||
however, we had too many keys running around and so a compromise was
|
|
||||||
reached: keys have 64-bit random fingerprints to enable differentiation
|
|
||||||
between the data being compromised and the wrong key being used. (I
|
|
||||||
think we would have been ok without the identifiers eventually; it was
|
|
||||||
only that first week with people experimenting and also the version
|
|
||||||
changing from 5.4 to 5.5 when we were drowning in keys. Once more of the
|
|
||||||
process was worked out, things settled down and key mismatches went
|
|
||||||
away.)
|
|
||||||
|
|
||||||
Moving on to the fun crypto bits, we wanted a tool that would fit on
|
|
||||||
installation media, which meant minimizing code size and external
|
|
||||||
dependencies.
|
|
||||||
|
|
||||||
-rw-r--r-- 1 anonftp wheel 1474560 Jul 30 12:27 floppy54.fs
|
|
||||||
-rw-r--r-- 1 anonftp wheel 2728452 Jul 22 18:40 gnupg-2.0.19p3.tgz
|
|
||||||
|
|
||||||
The one and only supported algorithm is Ed25519. It has a lot of very
|
|
||||||
nice properties, though I really like the deterministic signatures.
|
|
||||||
Anything that makes it harder to screw up is great. The implementation,
|
|
||||||
currently built by reaching over into the ssh directory, is small and
|
|
||||||
independent with a simple interface that's hard to screw up.
|
|
||||||
|
|
||||||
Ed25519 keys are really small. This makes them easy to work with. Public
|
|
||||||
keys, in particular, are only 32 bytes. With some additional data
|
|
||||||
signify adds and base64 encoded, the relevant figure is still 56 bytes,
|
|
||||||
small enough to fit on a tshirt or even the back of your hand.
|
|
||||||
|
|
||||||
I did run into one downside in the Ed25519 implementation interface. It
|
|
||||||
signs messages by creating a complete copy of the message. Verification
|
|
||||||
creates another complete copy of the message. The rationale for this
|
|
||||||
decision is pretty obvious: You sign a message and get back a
|
|
||||||
(theoretically opaque) string which you transmit; then the receiver
|
|
||||||
verifies it to get back the original message. You can't accidentally use
|
|
||||||
a message that fails verification because they are transmitted as part
|
|
||||||
of the same bundle. Unfortunately, this design works better for small
|
|
||||||
network packets than large files. We would prefer to keep the signatures
|
|
||||||
detached from the message (this means it's now our responsibility to not
|
|
||||||
accidentally use an unverified message.) signify deals with this
|
|
||||||
internally by creating lots of copies. In the future we may open up the
|
|
||||||
implementation for surgery, but that voids the manufacturer's warranty,
|
|
||||||
so for now we're using the code exactly as it is with the workarounds in
|
|
||||||
our code.
|
|
||||||
|
|
||||||
--Ted Unangst
|
|
||||||
(excerpted from http://www.tedunangst.com/flak/post/signify)
|
|
|
@ -1,44 +0,0 @@
|
||||||
mini-HOWTO
|
|
||||||
|
|
||||||
1. Create a keypair
|
|
||||||
|
|
||||||
$ signify -G -p key.pub -s key.sec -c "my first key"
|
|
||||||
|
|
||||||
2. Create a stand-alone (or "detached") signature
|
|
||||||
|
|
||||||
$ signify -S -s key.sec -m file.txt
|
|
||||||
|
|
||||||
3. Create a combined signature (message embedded after sig)
|
|
||||||
|
|
||||||
$ signify -S -e -s key.sec -m file.txt
|
|
||||||
|
|
||||||
4. Verify a signature
|
|
||||||
|
|
||||||
$ signify -V -p key.pub -m file.txt
|
|
||||||
|
|
||||||
5. Verify a signed sha256 digest list*
|
|
||||||
|
|
||||||
$ sha256sum --tag linux-signify.tar.bz2 > SHA256SUMS
|
|
||||||
$ signify -S -e -s key.sec -m SHA256SUMS
|
|
||||||
$ signify -C -p key.pub -x SHA256SUMS.sig
|
|
||||||
|
|
||||||
* signify expects a BSD-style digest list which can be created on
|
|
||||||
Linux using the "--tag" flag of sha256sum(1) (from coreutils)
|
|
||||||
|
|
||||||
6. Inspect a key and print its 64-bit base64-encoded fingerprint
|
|
||||||
|
|
||||||
$ signify -I -p key.pub
|
|
||||||
$ signify -I -s key.sec
|
|
||||||
|
|
||||||
7. Add or change a passphrase on a secret key (requires passphrase patch)
|
|
||||||
|
|
||||||
$ signify -P -s key.sec
|
|
||||||
|
|
||||||
8. Remove a passphrase on a secret key (requires passphrase patch)
|
|
||||||
|
|
||||||
$ signify -P -n -s key.sec
|
|
||||||
|
|
||||||
For more information, refer to the manpage.
|
|
||||||
|
|
||||||
--mancha 20140902
|
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
To install signify-portable:
|
|
||||||
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
|
|
||||||
This will install the signify binary in /usr/bin and the manpage to
|
|
||||||
/usr/man/man1. The makefile understands DESTDIR for those using
|
|
||||||
a staging directory for packaging.
|
|
||||||
|
|
|
@ -1,50 +0,0 @@
|
||||||
# OpenBSD signify - portable version
|
|
||||||
# mancha <mancha1@zoho.com>
|
|
||||||
|
|
||||||
prefix=/usr
|
|
||||||
bindir=${prefix}/bin
|
|
||||||
mandir=${prefix}/man
|
|
||||||
|
|
||||||
DESTDIR=
|
|
||||||
|
|
||||||
CC=gcc
|
|
||||||
AR=ar
|
|
||||||
INSTALL=/usr/bin/install -c
|
|
||||||
|
|
||||||
CFLAGS=-O2 -D_FORTIFY_SOURCE=2 -fPIC -ftrapv -fPIE -fstack-protector-all \
|
|
||||||
-Wno-attributes -Wno-unused-result -Ibsd-compat -I.
|
|
||||||
|
|
||||||
TARGET = signify
|
|
||||||
|
|
||||||
SIGNIFY_STATIC_LIB = libsignify_static.a
|
|
||||||
SIGNIFY_SHARED_LIB = libsignify_shared.so
|
|
||||||
|
|
||||||
SIGNIFY_OBJS = fe25519.o sc25519.o smult_curve25519_ref.o \
|
|
||||||
mod_ed25519.o mod_ge25519.o crypto_api.o base64.o bcrypt_pbkdf.o \
|
|
||||||
explicit_bzero.o arc4random.o timingsafe_bcmp.o sha2.o blowfish.o \
|
|
||||||
readpassphrase.o strlcpy.o helpers.o ohash.o
|
|
||||||
|
|
||||||
all: $(TARGET) $(TARGET_LIB)
|
|
||||||
|
|
||||||
%.o: %.c
|
|
||||||
$(CC) $(CFLAGS) -c $<
|
|
||||||
|
|
||||||
$(SIGNIFY_STATIC_LIB): $(SIGNIFY_OBJS)
|
|
||||||
$(AR) crs $@ $(SIGNIFY_OBJS)
|
|
||||||
|
|
||||||
$(SIGNIFY_SHARED_LIB): $(SIGNIFY_STATIC_LIB)
|
|
||||||
$(CC) -shared -o $@ $(SIGNIFY_STATIC_LIB)
|
|
||||||
|
|
||||||
$(TARGET): $(SIGNIFY_STATIC_LIB) $(SIGNIFY_STATIC_LIB)
|
|
||||||
$(CC) $(CFLAGS) -o $(TARGET) signify.c $(SIGNIFY_STATIC_LIB)
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f *.o *.so *.a signify
|
|
||||||
|
|
||||||
install:
|
|
||||||
$(INSTALL) -c -D -m 0755 signify $(DESTDIR)/$(bindir)/signify
|
|
||||||
$(INSTALL) -c -D -m 644 signify.1 $(DESTDIR)/$(mandir)/man1/signify.1
|
|
||||||
|
|
||||||
uninstall:
|
|
||||||
@rm -f $(DESTDIR)/$(bindir)/signify
|
|
||||||
@rm -f $(DESTDIR)/$(mandir)/man1/signify.1
|
|
|
@ -1,24 +0,0 @@
|
||||||
This is a self-contained port of OpenBSD's signify to Linux and other
|
|
||||||
Unixes.
|
|
||||||
|
|
||||||
Like on OpenBSD, this version of signify uses the Ed25519 primitive for
|
|
||||||
signing/verification, ChaCha for random number generation, and a
|
|
||||||
bcrypt-based KDF to protect secret keys.
|
|
||||||
|
|
||||||
Signatures and keys are 100% compatible with OpenBSD.
|
|
||||||
|
|
||||||
passphrase-20140902.diff adds the ability to add, change, or remove
|
|
||||||
secret key passphrases. This function is not currently available on
|
|
||||||
OpenBSD but in no way undermines compatibility of keys and signatures.
|
|
||||||
|
|
||||||
HOWTO and the manpage contain sample usage.
|
|
||||||
|
|
||||||
mancha <mancha1 AT zoho DOT com>
|
|
||||||
|
|
||||||
Based on http://sourceforge.net/projects/slackdepot/files/signify/,
|
|
||||||
this fork builds libsignify in static and shared mode.
|
|
||||||
|
|
||||||
This also exposes signify as a library for other people to use and
|
|
||||||
embed it in their codebase.
|
|
||||||
|
|
||||||
Harshavardhana <harsha AT harshavardhana DOT net>
|
|
|
@ -1,304 +0,0 @@
|
||||||
/* OPENBSD ORIGINAL: lib/libc/crypto/arc4random.c */
|
|
||||||
|
|
||||||
/* $OpenBSD: arc4random.c,v 1.25 2013/10/01 18:34:57 markus Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 1996, David Mazieres <dm@uun.org>
|
|
||||||
* Copyright (c) 2008, Damien Miller <djm@openbsd.org>
|
|
||||||
* Copyright (c) 2013, Markus Friedl <markus@openbsd.org>
|
|
||||||
*
|
|
||||||
* Permission to use, copy, modify, and distribute this software for any
|
|
||||||
* purpose with or without fee is hereby granted, provided that the above
|
|
||||||
* copyright notice and this permission notice appear in all copies.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
||||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ChaCha based random number generator for OpenBSD.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <err.h>
|
|
||||||
|
|
||||||
#ifndef HAVE_ARC4RANDOM
|
|
||||||
|
|
||||||
#define KEYSTREAM_ONLY
|
|
||||||
#include "chacha_private.h"
|
|
||||||
|
|
||||||
#ifdef __GNUC__
|
|
||||||
#define inline __inline
|
|
||||||
#else /* !__GNUC__ */
|
|
||||||
#define inline
|
|
||||||
#endif /* !__GNUC__ */
|
|
||||||
|
|
||||||
#ifndef MAX
|
|
||||||
# define MAX(a,b) (((a)>(b))?(a):(b))
|
|
||||||
# define MIN(a,b) (((a)<(b))?(a):(b))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Not multithreaded */
|
|
||||||
#define _ARC4_LOCK()
|
|
||||||
#define _ARC4_UNLOCK()
|
|
||||||
|
|
||||||
#define RANDOMDEV "/dev/urandom"
|
|
||||||
|
|
||||||
#define KEYSZ 32
|
|
||||||
#define IVSZ 8
|
|
||||||
#define BLOCKSZ 64
|
|
||||||
#define RSBUFSZ (16*BLOCKSZ)
|
|
||||||
static int rs_initialized;
|
|
||||||
static pid_t rs_stir_pid;
|
|
||||||
static chacha_ctx rs; /* chacha context for random keystream */
|
|
||||||
static u_char rs_buf[RSBUFSZ]; /* keystream blocks */
|
|
||||||
static size_t rs_have; /* valid bytes at end of rs_buf */
|
|
||||||
static size_t rs_count; /* bytes till reseed */
|
|
||||||
|
|
||||||
static inline void _rs_rekey(u_char *dat, size_t datlen);
|
|
||||||
|
|
||||||
static inline void
|
|
||||||
_rs_init(u_char *buf, size_t n)
|
|
||||||
{
|
|
||||||
if (n < KEYSZ + IVSZ)
|
|
||||||
return;
|
|
||||||
chacha_keysetup(&rs, buf, KEYSZ * 8, 0);
|
|
||||||
chacha_ivsetup(&rs, buf + KEYSZ);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
_rs_stir(void)
|
|
||||||
{
|
|
||||||
u_char rnd[KEYSZ + IVSZ];
|
|
||||||
int fd, bytes;
|
|
||||||
|
|
||||||
if((fd = open(RANDOMDEV, O_RDONLY | O_NOFOLLOW)) == -1)
|
|
||||||
errx(1, "Couldn't obtain random bytes");
|
|
||||||
|
|
||||||
bytes = read(fd, rnd, sizeof(rnd));
|
|
||||||
|
|
||||||
close(fd);
|
|
||||||
|
|
||||||
if(bytes != sizeof(rnd))
|
|
||||||
errx(1, "Couldn't obtain random bytes");
|
|
||||||
|
|
||||||
if (!rs_initialized) {
|
|
||||||
rs_initialized = 1;
|
|
||||||
_rs_init(rnd, sizeof(rnd));
|
|
||||||
} else
|
|
||||||
_rs_rekey(rnd, sizeof(rnd));
|
|
||||||
explicit_bzero(rnd, sizeof(rnd));
|
|
||||||
|
|
||||||
/* invalidate rs_buf */
|
|
||||||
rs_have = 0;
|
|
||||||
memset(rs_buf, 0, RSBUFSZ);
|
|
||||||
|
|
||||||
rs_count = 1600000;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void
|
|
||||||
_rs_stir_if_needed(size_t len)
|
|
||||||
{
|
|
||||||
pid_t pid = getpid();
|
|
||||||
|
|
||||||
if (rs_count <= len || !rs_initialized || rs_stir_pid != pid) {
|
|
||||||
rs_stir_pid = pid;
|
|
||||||
_rs_stir();
|
|
||||||
} else
|
|
||||||
rs_count -= len;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void
|
|
||||||
_rs_rekey(u_char *dat, size_t datlen)
|
|
||||||
{
|
|
||||||
#ifndef KEYSTREAM_ONLY
|
|
||||||
memset(rs_buf, 0,RSBUFSZ);
|
|
||||||
#endif
|
|
||||||
/* fill rs_buf with the keystream */
|
|
||||||
chacha_encrypt_bytes(&rs, rs_buf, rs_buf, RSBUFSZ);
|
|
||||||
/* mix in optional user provided data */
|
|
||||||
if (dat) {
|
|
||||||
size_t i, m;
|
|
||||||
|
|
||||||
m = MIN(datlen, KEYSZ + IVSZ);
|
|
||||||
for (i = 0; i < m; i++)
|
|
||||||
rs_buf[i] ^= dat[i];
|
|
||||||
}
|
|
||||||
/* immediately reinit for backtracking resistance */
|
|
||||||
_rs_init(rs_buf, KEYSZ + IVSZ);
|
|
||||||
memset(rs_buf, 0, KEYSZ + IVSZ);
|
|
||||||
rs_have = RSBUFSZ - KEYSZ - IVSZ;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void
|
|
||||||
_rs_random_buf(void *_buf, size_t n)
|
|
||||||
{
|
|
||||||
u_char *buf = (u_char *)_buf;
|
|
||||||
size_t m;
|
|
||||||
|
|
||||||
_rs_stir_if_needed(n);
|
|
||||||
while (n > 0) {
|
|
||||||
if (rs_have > 0) {
|
|
||||||
m = MIN(n, rs_have);
|
|
||||||
memcpy(buf, rs_buf + RSBUFSZ - rs_have, m);
|
|
||||||
memset(rs_buf + RSBUFSZ - rs_have, 0, m);
|
|
||||||
buf += m;
|
|
||||||
n -= m;
|
|
||||||
rs_have -= m;
|
|
||||||
}
|
|
||||||
if (rs_have == 0)
|
|
||||||
_rs_rekey(NULL, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void
|
|
||||||
_rs_random_u32(u_int32_t *val)
|
|
||||||
{
|
|
||||||
_rs_stir_if_needed(sizeof(*val));
|
|
||||||
if (rs_have < sizeof(*val))
|
|
||||||
_rs_rekey(NULL, 0);
|
|
||||||
memcpy(val, rs_buf + RSBUFSZ - rs_have, sizeof(*val));
|
|
||||||
memset(rs_buf + RSBUFSZ - rs_have, 0, sizeof(*val));
|
|
||||||
rs_have -= sizeof(*val);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
arc4random_stir(void)
|
|
||||||
{
|
|
||||||
_ARC4_LOCK();
|
|
||||||
_rs_stir();
|
|
||||||
_ARC4_UNLOCK();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
arc4random_addrandom(u_char *dat, int datlen)
|
|
||||||
{
|
|
||||||
int m;
|
|
||||||
|
|
||||||
_ARC4_LOCK();
|
|
||||||
if (!rs_initialized)
|
|
||||||
_rs_stir();
|
|
||||||
while (datlen > 0) {
|
|
||||||
m = MIN(datlen, KEYSZ + IVSZ);
|
|
||||||
_rs_rekey(dat, m);
|
|
||||||
dat += m;
|
|
||||||
datlen -= m;
|
|
||||||
}
|
|
||||||
_ARC4_UNLOCK();
|
|
||||||
}
|
|
||||||
|
|
||||||
u_int32_t
|
|
||||||
arc4random(void)
|
|
||||||
{
|
|
||||||
u_int32_t val;
|
|
||||||
|
|
||||||
_ARC4_LOCK();
|
|
||||||
_rs_random_u32(&val);
|
|
||||||
_ARC4_UNLOCK();
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If we are providing arc4random, then we can provide a more efficient
|
|
||||||
* arc4random_buf().
|
|
||||||
*/
|
|
||||||
# ifndef HAVE_ARC4RANDOM_BUF
|
|
||||||
void
|
|
||||||
arc4random_buf(void *buf, size_t n)
|
|
||||||
{
|
|
||||||
_ARC4_LOCK();
|
|
||||||
_rs_random_buf(buf, n);
|
|
||||||
_ARC4_UNLOCK();
|
|
||||||
}
|
|
||||||
# endif /* !HAVE_ARC4RANDOM_BUF */
|
|
||||||
#endif /* !HAVE_ARC4RANDOM */
|
|
||||||
|
|
||||||
/* arc4random_buf() that uses platform arc4random() */
|
|
||||||
#if !defined(HAVE_ARC4RANDOM_BUF) && defined(HAVE_ARC4RANDOM)
|
|
||||||
void
|
|
||||||
arc4random_buf(void *_buf, size_t n)
|
|
||||||
{
|
|
||||||
size_t i;
|
|
||||||
u_int32_t r = 0;
|
|
||||||
char *buf = (char *)_buf;
|
|
||||||
|
|
||||||
for (i = 0; i < n; i++) {
|
|
||||||
if (i % 4 == 0)
|
|
||||||
r = arc4random();
|
|
||||||
buf[i] = r & 0xff;
|
|
||||||
r >>= 8;
|
|
||||||
}
|
|
||||||
explicit_bzero(&r, sizeof(r));
|
|
||||||
}
|
|
||||||
#endif /* !defined(HAVE_ARC4RANDOM_BUF) && defined(HAVE_ARC4RANDOM) */
|
|
||||||
|
|
||||||
#ifndef HAVE_ARC4RANDOM_UNIFORM
|
|
||||||
/*
|
|
||||||
* Calculate a uniformly distributed random number less than upper_bound
|
|
||||||
* avoiding "modulo bias".
|
|
||||||
*
|
|
||||||
* Uniformity is achieved by generating new random numbers until the one
|
|
||||||
* returned is outside the range [0, 2**32 % upper_bound). This
|
|
||||||
* guarantees the selected random number will be inside
|
|
||||||
* [2**32 % upper_bound, 2**32) which maps back to [0, upper_bound)
|
|
||||||
* after reduction modulo upper_bound.
|
|
||||||
*/
|
|
||||||
u_int32_t
|
|
||||||
arc4random_uniform(u_int32_t upper_bound)
|
|
||||||
{
|
|
||||||
u_int32_t r, min;
|
|
||||||
|
|
||||||
if (upper_bound < 2)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* 2**32 % x == (2**32 - x) % x */
|
|
||||||
min = -upper_bound % upper_bound;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This could theoretically loop forever but each retry has
|
|
||||||
* p > 0.5 (worst case, usually far better) of selecting a
|
|
||||||
* number inside the range we need, so it should rarely need
|
|
||||||
* to re-roll.
|
|
||||||
*/
|
|
||||||
for (;;) {
|
|
||||||
r = arc4random();
|
|
||||||
if (r >= min)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return r % upper_bound;
|
|
||||||
}
|
|
||||||
#endif /* !HAVE_ARC4RANDOM_UNIFORM */
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
/*-------- Test code for i386 --------*/
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <machine/pctr.h>
|
|
||||||
int
|
|
||||||
main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
const int iter = 1000000;
|
|
||||||
int i;
|
|
||||||
pctrval v;
|
|
||||||
|
|
||||||
v = rdtsc();
|
|
||||||
for (i = 0; i < iter; i++)
|
|
||||||
arc4random();
|
|
||||||
v = rdtsc() - v;
|
|
||||||
v /= iter;
|
|
||||||
|
|
||||||
printf("%qd cycles\n", v);
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
#endif
|
|
|
@ -1,316 +0,0 @@
|
||||||
/* $OpenBSD: base64.c,v 1.7 2013/12/31 02:32:56 tedu Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 1996 by Internet Software Consortium.
|
|
||||||
*
|
|
||||||
* Permission to use, copy, modify, and distribute this software for any
|
|
||||||
* purpose with or without fee is hereby granted, provided that the above
|
|
||||||
* copyright notice and this permission notice appear in all copies.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
|
|
||||||
* ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
|
|
||||||
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
|
|
||||||
* CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
|
|
||||||
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
|
|
||||||
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
|
|
||||||
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
|
||||||
* SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Portions Copyright (c) 1995 by International Business Machines, Inc.
|
|
||||||
*
|
|
||||||
* International Business Machines, Inc. (hereinafter called IBM) grants
|
|
||||||
* permission under its copyrights to use, copy, modify, and distribute this
|
|
||||||
* Software with or without fee, provided that the above copyright notice and
|
|
||||||
* all paragraphs of this notice appear in all copies, and that the name of IBM
|
|
||||||
* not be used in connection with the marketing of any product incorporating
|
|
||||||
* the Software or modifications thereof, without specific, written prior
|
|
||||||
* permission.
|
|
||||||
*
|
|
||||||
* To the extent it has a right to do so, IBM grants an immunity from suit
|
|
||||||
* under its patents, if any, for the use, sale or manufacture of products to
|
|
||||||
* the extent that such products are used for performing Domain Name System
|
|
||||||
* dynamic updates in TCP/IP networks by means of the Software. No immunity is
|
|
||||||
* granted for any product per se or for any other function of any product.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES,
|
|
||||||
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
|
||||||
* PARTICULAR PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL,
|
|
||||||
* DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN
|
|
||||||
* IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/param.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <netinet/in.h>
|
|
||||||
#include <arpa/inet.h>
|
|
||||||
#include <arpa/nameser.h>
|
|
||||||
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <resolv.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
static const char Base64[] =
|
|
||||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
||||||
static const char Pad64 = '=';
|
|
||||||
|
|
||||||
/* (From RFC1521 and draft-ietf-dnssec-secext-03.txt)
|
|
||||||
The following encoding technique is taken from RFC 1521 by Borenstein
|
|
||||||
and Freed. It is reproduced here in a slightly edited form for
|
|
||||||
convenience.
|
|
||||||
|
|
||||||
A 65-character subset of US-ASCII is used, enabling 6 bits to be
|
|
||||||
represented per printable character. (The extra 65th character, "=",
|
|
||||||
is used to signify a special processing function.)
|
|
||||||
|
|
||||||
The encoding process represents 24-bit groups of input bits as output
|
|
||||||
strings of 4 encoded characters. Proceeding from left to right, a
|
|
||||||
24-bit input group is formed by concatenating 3 8-bit input groups.
|
|
||||||
These 24 bits are then treated as 4 concatenated 6-bit groups, each
|
|
||||||
of which is translated into a single digit in the base64 alphabet.
|
|
||||||
|
|
||||||
Each 6-bit group is used as an index into an array of 64 printable
|
|
||||||
characters. The character referenced by the index is placed in the
|
|
||||||
output string.
|
|
||||||
|
|
||||||
Table 1: The Base64 Alphabet
|
|
||||||
|
|
||||||
Value Encoding Value Encoding Value Encoding Value Encoding
|
|
||||||
0 A 17 R 34 i 51 z
|
|
||||||
1 B 18 S 35 j 52 0
|
|
||||||
2 C 19 T 36 k 53 1
|
|
||||||
3 D 20 U 37 l 54 2
|
|
||||||
4 E 21 V 38 m 55 3
|
|
||||||
5 F 22 W 39 n 56 4
|
|
||||||
6 G 23 X 40 o 57 5
|
|
||||||
7 H 24 Y 41 p 58 6
|
|
||||||
8 I 25 Z 42 q 59 7
|
|
||||||
9 J 26 a 43 r 60 8
|
|
||||||
10 K 27 b 44 s 61 9
|
|
||||||
11 L 28 c 45 t 62 +
|
|
||||||
12 M 29 d 46 u 63 /
|
|
||||||
13 N 30 e 47 v
|
|
||||||
14 O 31 f 48 w (pad) =
|
|
||||||
15 P 32 g 49 x
|
|
||||||
16 Q 33 h 50 y
|
|
||||||
|
|
||||||
Special processing is performed if fewer than 24 bits are available
|
|
||||||
at the end of the data being encoded. A full encoding quantum is
|
|
||||||
always completed at the end of a quantity. When fewer than 24 input
|
|
||||||
bits are available in an input group, zero bits are added (on the
|
|
||||||
right) to form an integral number of 6-bit groups. Padding at the
|
|
||||||
end of the data is performed using the '=' character.
|
|
||||||
|
|
||||||
Since all base64 input is an integral number of octets, only the
|
|
||||||
-------------------------------------------------
|
|
||||||
following cases can arise:
|
|
||||||
|
|
||||||
(1) the final quantum of encoding input is an integral
|
|
||||||
multiple of 24 bits; here, the final unit of encoded
|
|
||||||
output will be an integral multiple of 4 characters
|
|
||||||
with no "=" padding,
|
|
||||||
(2) the final quantum of encoding input is exactly 8 bits;
|
|
||||||
here, the final unit of encoded output will be two
|
|
||||||
characters followed by two "=" padding characters, or
|
|
||||||
(3) the final quantum of encoding input is exactly 16 bits;
|
|
||||||
here, the final unit of encoded output will be three
|
|
||||||
characters followed by one "=" padding character.
|
|
||||||
*/
|
|
||||||
|
|
||||||
int
|
|
||||||
b64_ntop(src, srclength, target, targsize)
|
|
||||||
u_char const *src;
|
|
||||||
size_t srclength;
|
|
||||||
char *target;
|
|
||||||
size_t targsize;
|
|
||||||
{
|
|
||||||
size_t datalength = 0;
|
|
||||||
u_char input[3];
|
|
||||||
u_char output[4];
|
|
||||||
int i;
|
|
||||||
|
|
||||||
while (2 < srclength) {
|
|
||||||
input[0] = *src++;
|
|
||||||
input[1] = *src++;
|
|
||||||
input[2] = *src++;
|
|
||||||
srclength -= 3;
|
|
||||||
|
|
||||||
output[0] = input[0] >> 2;
|
|
||||||
output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4);
|
|
||||||
output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6);
|
|
||||||
output[3] = input[2] & 0x3f;
|
|
||||||
|
|
||||||
if (datalength + 4 > targsize)
|
|
||||||
return (-1);
|
|
||||||
target[datalength++] = Base64[output[0]];
|
|
||||||
target[datalength++] = Base64[output[1]];
|
|
||||||
target[datalength++] = Base64[output[2]];
|
|
||||||
target[datalength++] = Base64[output[3]];
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Now we worry about padding. */
|
|
||||||
if (0 != srclength) {
|
|
||||||
/* Get what's left. */
|
|
||||||
input[0] = input[1] = input[2] = '\0';
|
|
||||||
for (i = 0; i < srclength; i++)
|
|
||||||
input[i] = *src++;
|
|
||||||
|
|
||||||
output[0] = input[0] >> 2;
|
|
||||||
output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4);
|
|
||||||
output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6);
|
|
||||||
|
|
||||||
if (datalength + 4 > targsize)
|
|
||||||
return (-1);
|
|
||||||
target[datalength++] = Base64[output[0]];
|
|
||||||
target[datalength++] = Base64[output[1]];
|
|
||||||
if (srclength == 1)
|
|
||||||
target[datalength++] = Pad64;
|
|
||||||
else
|
|
||||||
target[datalength++] = Base64[output[2]];
|
|
||||||
target[datalength++] = Pad64;
|
|
||||||
}
|
|
||||||
if (datalength >= targsize)
|
|
||||||
return (-1);
|
|
||||||
target[datalength] = '\0'; /* Returned value doesn't count \0. */
|
|
||||||
return (datalength);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* skips all whitespace anywhere.
|
|
||||||
converts characters, four at a time, starting at (or after)
|
|
||||||
src from base - 64 numbers into three 8 bit bytes in the target area.
|
|
||||||
it returns the number of data bytes stored at the target, or -1 on error.
|
|
||||||
*/
|
|
||||||
|
|
||||||
int
|
|
||||||
b64_pton(src, target, targsize)
|
|
||||||
char const *src;
|
|
||||||
u_char *target;
|
|
||||||
size_t targsize;
|
|
||||||
{
|
|
||||||
int tarindex, state, ch;
|
|
||||||
u_char nextbyte;
|
|
||||||
char *pos;
|
|
||||||
|
|
||||||
state = 0;
|
|
||||||
tarindex = 0;
|
|
||||||
|
|
||||||
while ((ch = (unsigned char)*src++) != '\0') {
|
|
||||||
if (isspace(ch)) /* Skip whitespace anywhere. */
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (ch == Pad64)
|
|
||||||
break;
|
|
||||||
|
|
||||||
pos = strchr(Base64, ch);
|
|
||||||
if (pos == 0) /* A non-base64 character. */
|
|
||||||
return (-1);
|
|
||||||
|
|
||||||
switch (state) {
|
|
||||||
case 0:
|
|
||||||
if (target) {
|
|
||||||
if (tarindex >= targsize)
|
|
||||||
return (-1);
|
|
||||||
target[tarindex] = (pos - Base64) << 2;
|
|
||||||
}
|
|
||||||
state = 1;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
if (target) {
|
|
||||||
if (tarindex >= targsize)
|
|
||||||
return (-1);
|
|
||||||
target[tarindex] |= (pos - Base64) >> 4;
|
|
||||||
nextbyte = ((pos - Base64) & 0x0f) << 4;
|
|
||||||
if (tarindex + 1 < targsize)
|
|
||||||
target[tarindex+1] = nextbyte;
|
|
||||||
else if (nextbyte)
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
tarindex++;
|
|
||||||
state = 2;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
if (target) {
|
|
||||||
if (tarindex >= targsize)
|
|
||||||
return (-1);
|
|
||||||
target[tarindex] |= (pos - Base64) >> 2;
|
|
||||||
nextbyte = ((pos - Base64) & 0x03) << 6;
|
|
||||||
if (tarindex + 1 < targsize)
|
|
||||||
target[tarindex+1] = nextbyte;
|
|
||||||
else if (nextbyte)
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
tarindex++;
|
|
||||||
state = 3;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
if (target) {
|
|
||||||
if (tarindex >= targsize)
|
|
||||||
return (-1);
|
|
||||||
target[tarindex] |= (pos - Base64);
|
|
||||||
}
|
|
||||||
tarindex++;
|
|
||||||
state = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We are done decoding Base-64 chars. Let's see if we ended
|
|
||||||
* on a byte boundary, and/or with erroneous trailing characters.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (ch == Pad64) { /* We got a pad char. */
|
|
||||||
ch = (unsigned char)*src++; /* Skip it, get next. */
|
|
||||||
switch (state) {
|
|
||||||
case 0: /* Invalid = in first position */
|
|
||||||
case 1: /* Invalid = in second position */
|
|
||||||
return (-1);
|
|
||||||
|
|
||||||
case 2: /* Valid, means one byte of info */
|
|
||||||
/* Skip any number of spaces. */
|
|
||||||
for (; ch != '\0'; ch = (unsigned char)*src++)
|
|
||||||
if (!isspace(ch))
|
|
||||||
break;
|
|
||||||
/* Make sure there is another trailing = sign. */
|
|
||||||
if (ch != Pad64)
|
|
||||||
return (-1);
|
|
||||||
ch = (unsigned char)*src++; /* Skip the = */
|
|
||||||
/* Fall through to "single trailing =" case. */
|
|
||||||
/* FALLTHROUGH */
|
|
||||||
|
|
||||||
case 3: /* Valid, means two bytes of info */
|
|
||||||
/*
|
|
||||||
* We know this char is an =. Is there anything but
|
|
||||||
* whitespace after it?
|
|
||||||
*/
|
|
||||||
for (; ch != '\0'; ch = (unsigned char)*src++)
|
|
||||||
if (!isspace(ch))
|
|
||||||
return (-1);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Now make sure for cases 2 and 3 that the "extra"
|
|
||||||
* bits that slopped past the last full byte were
|
|
||||||
* zeros. If we don't check them, they become a
|
|
||||||
* subliminal channel.
|
|
||||||
*/
|
|
||||||
if (target && tarindex < targsize &&
|
|
||||||
target[tarindex] != 0)
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
/*
|
|
||||||
* We ended by seeing the end of the string. Make sure we
|
|
||||||
* have no partial bytes lying around.
|
|
||||||
*/
|
|
||||||
if (state != 0)
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (tarindex);
|
|
||||||
}
|
|
|
@ -1,167 +0,0 @@
|
||||||
/* $OpenBSD: bcrypt_pbkdf.c,v 1.9 2014/07/13 21:21:25 tedu Exp $ */
|
|
||||||
/*
|
|
||||||
* Copyright (c) 2013 Ted Unangst <tedu@openbsd.org>
|
|
||||||
*
|
|
||||||
* Permission to use, copy, modify, and distribute this software for any
|
|
||||||
* purpose with or without fee is hereby granted, provided that the above
|
|
||||||
* copyright notice and this permission notice appear in all copies.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
||||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <sys/param.h>
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <blf.h>
|
|
||||||
#include <sha2.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <util.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
* pkcs #5 pbkdf2 implementation using the "bcrypt" hash
|
|
||||||
*
|
|
||||||
* The bcrypt hash function is derived from the bcrypt password hashing
|
|
||||||
* function with the following modifications:
|
|
||||||
* 1. The input password and salt are preprocessed with SHA512.
|
|
||||||
* 2. The output length is expanded to 256 bits.
|
|
||||||
* 3. Subsequently the magic string to be encrypted is lengthened and modifed
|
|
||||||
* to "OxychromaticBlowfishSwatDynamite"
|
|
||||||
* 4. The hash function is defined to perform 64 rounds of initial state
|
|
||||||
* expansion. (More rounds are performed by iterating the hash.)
|
|
||||||
*
|
|
||||||
* Note that this implementation pulls the SHA512 operations into the caller
|
|
||||||
* as a performance optimization.
|
|
||||||
*
|
|
||||||
* One modification from official pbkdf2. Instead of outputting key material
|
|
||||||
* linearly, we mix it. pbkdf2 has a known weakness where if one uses it to
|
|
||||||
* generate (e.g.) 512 bits of key material for use as two 256 bit keys, an
|
|
||||||
* attacker can merely run once through the outer loop, but the user
|
|
||||||
* always runs it twice. Shuffling output bytes requires computing the
|
|
||||||
* entirety of the key material to assemble any subkey. This is something a
|
|
||||||
* wise caller could do; we just do it for you.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define BCRYPT_BLOCKS 8
|
|
||||||
#define BCRYPT_HASHSIZE (BCRYPT_BLOCKS * 4)
|
|
||||||
|
|
||||||
static void
|
|
||||||
bcrypt_hash(uint8_t *sha2pass, uint8_t *sha2salt, uint8_t *out)
|
|
||||||
{
|
|
||||||
blf_ctx state;
|
|
||||||
uint8_t ciphertext[BCRYPT_HASHSIZE] =
|
|
||||||
"OxychromaticBlowfishSwatDynamite";
|
|
||||||
uint32_t cdata[BCRYPT_BLOCKS];
|
|
||||||
int i;
|
|
||||||
uint16_t j;
|
|
||||||
size_t shalen = SHA512_DIGEST_LENGTH;
|
|
||||||
|
|
||||||
/* key expansion */
|
|
||||||
Blowfish_initstate(&state);
|
|
||||||
Blowfish_expandstate(&state, sha2salt, shalen, sha2pass, shalen);
|
|
||||||
for (i = 0; i < 64; i++) {
|
|
||||||
Blowfish_expand0state(&state, sha2salt, shalen);
|
|
||||||
Blowfish_expand0state(&state, sha2pass, shalen);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* encryption */
|
|
||||||
j = 0;
|
|
||||||
for (i = 0; i < BCRYPT_BLOCKS; i++)
|
|
||||||
cdata[i] = Blowfish_stream2word(ciphertext, sizeof(ciphertext),
|
|
||||||
&j);
|
|
||||||
for (i = 0; i < 64; i++)
|
|
||||||
blf_enc(&state, cdata, sizeof(cdata) / sizeof(uint64_t));
|
|
||||||
|
|
||||||
/* copy out */
|
|
||||||
for (i = 0; i < BCRYPT_BLOCKS; i++) {
|
|
||||||
out[4 * i + 3] = (cdata[i] >> 24) & 0xff;
|
|
||||||
out[4 * i + 2] = (cdata[i] >> 16) & 0xff;
|
|
||||||
out[4 * i + 1] = (cdata[i] >> 8) & 0xff;
|
|
||||||
out[4 * i + 0] = cdata[i] & 0xff;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* zap */
|
|
||||||
explicit_bzero(ciphertext, sizeof(ciphertext));
|
|
||||||
explicit_bzero(cdata, sizeof(cdata));
|
|
||||||
explicit_bzero(&state, sizeof(state));
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
bcrypt_pbkdf(const char *pass, size_t passlen, const uint8_t *salt, size_t saltlen,
|
|
||||||
uint8_t *key, size_t keylen, unsigned int rounds)
|
|
||||||
{
|
|
||||||
SHA2_CTX ctx;
|
|
||||||
uint8_t sha2pass[SHA512_DIGEST_LENGTH];
|
|
||||||
uint8_t sha2salt[SHA512_DIGEST_LENGTH];
|
|
||||||
uint8_t out[BCRYPT_HASHSIZE];
|
|
||||||
uint8_t tmpout[BCRYPT_HASHSIZE];
|
|
||||||
uint8_t countsalt[4];
|
|
||||||
size_t i, j, amt, stride;
|
|
||||||
uint32_t count;
|
|
||||||
size_t origkeylen = keylen;
|
|
||||||
|
|
||||||
/* nothing crazy */
|
|
||||||
if (rounds < 1)
|
|
||||||
return -1;
|
|
||||||
if (passlen == 0 || saltlen == 0 || keylen == 0 ||
|
|
||||||
keylen > sizeof(out) * sizeof(out))
|
|
||||||
return -1;
|
|
||||||
stride = (keylen + sizeof(out) - 1) / sizeof(out);
|
|
||||||
amt = (keylen + stride - 1) / stride;
|
|
||||||
|
|
||||||
/* collapse password */
|
|
||||||
SHA512Init(&ctx);
|
|
||||||
SHA512Update(&ctx, pass, passlen);
|
|
||||||
SHA512Final(sha2pass, &ctx);
|
|
||||||
|
|
||||||
|
|
||||||
/* generate key, sizeof(out) at a time */
|
|
||||||
for (count = 1; keylen > 0; count++) {
|
|
||||||
countsalt[0] = (count >> 24) & 0xff;
|
|
||||||
countsalt[1] = (count >> 16) & 0xff;
|
|
||||||
countsalt[2] = (count >> 8) & 0xff;
|
|
||||||
countsalt[3] = count & 0xff;
|
|
||||||
|
|
||||||
/* first round, salt is salt */
|
|
||||||
SHA512Init(&ctx);
|
|
||||||
SHA512Update(&ctx, salt, saltlen);
|
|
||||||
SHA512Update(&ctx, countsalt, sizeof(countsalt));
|
|
||||||
SHA512Final(sha2salt, &ctx);
|
|
||||||
bcrypt_hash(sha2pass, sha2salt, tmpout);
|
|
||||||
memcpy(out, tmpout, sizeof(out));
|
|
||||||
|
|
||||||
for (i = 1; i < rounds; i++) {
|
|
||||||
/* subsequent rounds, salt is previous output */
|
|
||||||
SHA512Init(&ctx);
|
|
||||||
SHA512Update(&ctx, tmpout, sizeof(tmpout));
|
|
||||||
SHA512Final(sha2salt, &ctx);
|
|
||||||
bcrypt_hash(sha2pass, sha2salt, tmpout);
|
|
||||||
for (j = 0; j < sizeof(out); j++)
|
|
||||||
out[j] ^= tmpout[j];
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* pbkdf2 deviation: ouput the key material non-linearly.
|
|
||||||
*/
|
|
||||||
amt = MIN(amt, keylen);
|
|
||||||
for (i = 0; i < amt; i++) {
|
|
||||||
size_t dest = i * stride + (count - 1);
|
|
||||||
if (dest >= origkeylen)
|
|
||||||
break;
|
|
||||||
key[dest] = out[i];
|
|
||||||
}
|
|
||||||
keylen -= i;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* zap */
|
|
||||||
explicit_bzero(&ctx, sizeof(ctx));
|
|
||||||
explicit_bzero(out, sizeof(out));
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,685 +0,0 @@
|
||||||
/* $OpenBSD: src/lib/libc/crypt/blowfish.c,v 1.18 2004/11/02 17:23:26 hshoexer Exp $ */
|
|
||||||
/*
|
|
||||||
* Blowfish block cipher for OpenBSD
|
|
||||||
* Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de>
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Implementation advice by David Mazieres <dm@lcs.mit.edu>.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* 3. All advertising materials mentioning features or use of this software
|
|
||||||
* must display the following acknowledgement:
|
|
||||||
* This product includes software developed by Niels Provos.
|
|
||||||
* 4. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
||||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
||||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
||||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
||||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This code is derived from section 14.3 and the given source
|
|
||||||
* in section V of Applied Cryptography, second edition.
|
|
||||||
* Blowfish is an unpatented fast block cipher designed by
|
|
||||||
* Bruce Schneier.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
#include <stdio.h> /* used for debugging */
|
|
||||||
#include <string.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <blf.h>
|
|
||||||
|
|
||||||
#undef inline
|
|
||||||
#ifdef __GNUC__
|
|
||||||
#define inline __inline
|
|
||||||
#else /* !__GNUC__ */
|
|
||||||
#define inline
|
|
||||||
#endif /* !__GNUC__ */
|
|
||||||
|
|
||||||
/* Function for Feistel Networks */
|
|
||||||
|
|
||||||
#define F(s, x) ((((s)[ (((x)>>24)&0xFF)] \
|
|
||||||
+ (s)[0x100 + (((x)>>16)&0xFF)]) \
|
|
||||||
^ (s)[0x200 + (((x)>> 8)&0xFF)]) \
|
|
||||||
+ (s)[0x300 + ( (x) &0xFF)])
|
|
||||||
|
|
||||||
#define BLFRND(s,p,i,j,n) (i ^= F(s,j) ^ (p)[n])
|
|
||||||
|
|
||||||
void
|
|
||||||
Blowfish_encipher(blf_ctx *c, u_int32_t *xl, u_int32_t *xr)
|
|
||||||
{
|
|
||||||
u_int32_t Xl;
|
|
||||||
u_int32_t Xr;
|
|
||||||
u_int32_t *s = c->S[0];
|
|
||||||
u_int32_t *p = c->P;
|
|
||||||
|
|
||||||
Xl = *xl;
|
|
||||||
Xr = *xr;
|
|
||||||
|
|
||||||
Xl ^= p[0];
|
|
||||||
BLFRND(s, p, Xr, Xl, 1); BLFRND(s, p, Xl, Xr, 2);
|
|
||||||
BLFRND(s, p, Xr, Xl, 3); BLFRND(s, p, Xl, Xr, 4);
|
|
||||||
BLFRND(s, p, Xr, Xl, 5); BLFRND(s, p, Xl, Xr, 6);
|
|
||||||
BLFRND(s, p, Xr, Xl, 7); BLFRND(s, p, Xl, Xr, 8);
|
|
||||||
BLFRND(s, p, Xr, Xl, 9); BLFRND(s, p, Xl, Xr, 10);
|
|
||||||
BLFRND(s, p, Xr, Xl, 11); BLFRND(s, p, Xl, Xr, 12);
|
|
||||||
BLFRND(s, p, Xr, Xl, 13); BLFRND(s, p, Xl, Xr, 14);
|
|
||||||
BLFRND(s, p, Xr, Xl, 15); BLFRND(s, p, Xl, Xr, 16);
|
|
||||||
|
|
||||||
*xl = Xr ^ p[17];
|
|
||||||
*xr = Xl;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
Blowfish_decipher(blf_ctx *c, u_int32_t *xl, u_int32_t *xr)
|
|
||||||
{
|
|
||||||
u_int32_t Xl;
|
|
||||||
u_int32_t Xr;
|
|
||||||
u_int32_t *s = c->S[0];
|
|
||||||
u_int32_t *p = c->P;
|
|
||||||
|
|
||||||
Xl = *xl;
|
|
||||||
Xr = *xr;
|
|
||||||
|
|
||||||
Xl ^= p[17];
|
|
||||||
BLFRND(s, p, Xr, Xl, 16); BLFRND(s, p, Xl, Xr, 15);
|
|
||||||
BLFRND(s, p, Xr, Xl, 14); BLFRND(s, p, Xl, Xr, 13);
|
|
||||||
BLFRND(s, p, Xr, Xl, 12); BLFRND(s, p, Xl, Xr, 11);
|
|
||||||
BLFRND(s, p, Xr, Xl, 10); BLFRND(s, p, Xl, Xr, 9);
|
|
||||||
BLFRND(s, p, Xr, Xl, 8); BLFRND(s, p, Xl, Xr, 7);
|
|
||||||
BLFRND(s, p, Xr, Xl, 6); BLFRND(s, p, Xl, Xr, 5);
|
|
||||||
BLFRND(s, p, Xr, Xl, 4); BLFRND(s, p, Xl, Xr, 3);
|
|
||||||
BLFRND(s, p, Xr, Xl, 2); BLFRND(s, p, Xl, Xr, 1);
|
|
||||||
|
|
||||||
*xl = Xr ^ p[0];
|
|
||||||
*xr = Xl;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
Blowfish_initstate(blf_ctx *c)
|
|
||||||
{
|
|
||||||
/* P-box and S-box tables initialized with digits of Pi */
|
|
||||||
|
|
||||||
static const blf_ctx initstate =
|
|
||||||
{ {
|
|
||||||
{
|
|
||||||
0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7,
|
|
||||||
0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,
|
|
||||||
0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,
|
|
||||||
0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,
|
|
||||||
0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee,
|
|
||||||
0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,
|
|
||||||
0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef,
|
|
||||||
0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e,
|
|
||||||
0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,
|
|
||||||
0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,
|
|
||||||
0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce,
|
|
||||||
0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,
|
|
||||||
0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e,
|
|
||||||
0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677,
|
|
||||||
0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,
|
|
||||||
0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032,
|
|
||||||
0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88,
|
|
||||||
0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,
|
|
||||||
0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e,
|
|
||||||
0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,
|
|
||||||
0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,
|
|
||||||
0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98,
|
|
||||||
0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88,
|
|
||||||
0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,
|
|
||||||
0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6,
|
|
||||||
0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d,
|
|
||||||
0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,
|
|
||||||
0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7,
|
|
||||||
0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba,
|
|
||||||
0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
|
|
||||||
0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f,
|
|
||||||
0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09,
|
|
||||||
0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,
|
|
||||||
0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb,
|
|
||||||
0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279,
|
|
||||||
0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,
|
|
||||||
0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab,
|
|
||||||
0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82,
|
|
||||||
0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,
|
|
||||||
0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,
|
|
||||||
0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0,
|
|
||||||
0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,
|
|
||||||
0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790,
|
|
||||||
0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8,
|
|
||||||
0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,
|
|
||||||
0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0,
|
|
||||||
0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7,
|
|
||||||
0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,
|
|
||||||
0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad,
|
|
||||||
0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,
|
|
||||||
0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,
|
|
||||||
0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9,
|
|
||||||
0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477,
|
|
||||||
0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,
|
|
||||||
0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49,
|
|
||||||
0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af,
|
|
||||||
0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,
|
|
||||||
0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5,
|
|
||||||
0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41,
|
|
||||||
0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
|
|
||||||
0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400,
|
|
||||||
0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915,
|
|
||||||
0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,
|
|
||||||
0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a},
|
|
||||||
{
|
|
||||||
0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623,
|
|
||||||
0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,
|
|
||||||
0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1,
|
|
||||||
0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e,
|
|
||||||
0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,
|
|
||||||
0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,
|
|
||||||
0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e,
|
|
||||||
0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,
|
|
||||||
0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737,
|
|
||||||
0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8,
|
|
||||||
0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,
|
|
||||||
0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,
|
|
||||||
0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701,
|
|
||||||
0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,
|
|
||||||
0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41,
|
|
||||||
0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,
|
|
||||||
0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,
|
|
||||||
0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,
|
|
||||||
0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e,
|
|
||||||
0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,
|
|
||||||
0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c,
|
|
||||||
0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2,
|
|
||||||
0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,
|
|
||||||
0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,
|
|
||||||
0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b,
|
|
||||||
0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
|
|
||||||
0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e,
|
|
||||||
0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3,
|
|
||||||
0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,
|
|
||||||
0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,
|
|
||||||
0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4,
|
|
||||||
0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,
|
|
||||||
0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66,
|
|
||||||
0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28,
|
|
||||||
0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,
|
|
||||||
0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,
|
|
||||||
0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510,
|
|
||||||
0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,
|
|
||||||
0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14,
|
|
||||||
0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e,
|
|
||||||
0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,
|
|
||||||
0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7,
|
|
||||||
0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8,
|
|
||||||
0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,
|
|
||||||
0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99,
|
|
||||||
0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,
|
|
||||||
0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,
|
|
||||||
0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,
|
|
||||||
0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0,
|
|
||||||
0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,
|
|
||||||
0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105,
|
|
||||||
0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250,
|
|
||||||
0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,
|
|
||||||
0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,
|
|
||||||
0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00,
|
|
||||||
0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
|
|
||||||
0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb,
|
|
||||||
0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e,
|
|
||||||
0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,
|
|
||||||
0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,
|
|
||||||
0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9,
|
|
||||||
0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,
|
|
||||||
0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20,
|
|
||||||
0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7},
|
|
||||||
{
|
|
||||||
0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,
|
|
||||||
0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,
|
|
||||||
0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af,
|
|
||||||
0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,
|
|
||||||
0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45,
|
|
||||||
0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,
|
|
||||||
0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,
|
|
||||||
0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb,
|
|
||||||
0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee,
|
|
||||||
0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,
|
|
||||||
0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42,
|
|
||||||
0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,
|
|
||||||
0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,
|
|
||||||
0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb,
|
|
||||||
0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527,
|
|
||||||
0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,
|
|
||||||
0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33,
|
|
||||||
0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,
|
|
||||||
0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,
|
|
||||||
0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc,
|
|
||||||
0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17,
|
|
||||||
0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
|
|
||||||
0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b,
|
|
||||||
0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,
|
|
||||||
0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,
|
|
||||||
0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728,
|
|
||||||
0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,
|
|
||||||
0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,
|
|
||||||
0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37,
|
|
||||||
0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,
|
|
||||||
0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,
|
|
||||||
0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,
|
|
||||||
0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3,
|
|
||||||
0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,
|
|
||||||
0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d,
|
|
||||||
0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,
|
|
||||||
0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,
|
|
||||||
0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9,
|
|
||||||
0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a,
|
|
||||||
0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,
|
|
||||||
0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d,
|
|
||||||
0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,
|
|
||||||
0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,
|
|
||||||
0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61,
|
|
||||||
0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2,
|
|
||||||
0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,
|
|
||||||
0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2,
|
|
||||||
0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c,
|
|
||||||
0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,
|
|
||||||
0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633,
|
|
||||||
0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10,
|
|
||||||
0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
|
|
||||||
0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52,
|
|
||||||
0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,
|
|
||||||
0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,
|
|
||||||
0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62,
|
|
||||||
0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634,
|
|
||||||
0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,
|
|
||||||
0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24,
|
|
||||||
0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc,
|
|
||||||
0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,
|
|
||||||
0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,
|
|
||||||
0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837,
|
|
||||||
0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0},
|
|
||||||
{
|
|
||||||
0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b,
|
|
||||||
0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe,
|
|
||||||
0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,
|
|
||||||
0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4,
|
|
||||||
0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8,
|
|
||||||
0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,
|
|
||||||
0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304,
|
|
||||||
0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,
|
|
||||||
0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,
|
|
||||||
0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6,
|
|
||||||
0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9,
|
|
||||||
0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,
|
|
||||||
0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593,
|
|
||||||
0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,
|
|
||||||
0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,
|
|
||||||
0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c,
|
|
||||||
0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b,
|
|
||||||
0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
|
|
||||||
0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c,
|
|
||||||
0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd,
|
|
||||||
0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,
|
|
||||||
0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,
|
|
||||||
0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,
|
|
||||||
0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,
|
|
||||||
0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991,
|
|
||||||
0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,
|
|
||||||
0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,
|
|
||||||
0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,
|
|
||||||
0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae,
|
|
||||||
0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
|
|
||||||
0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5,
|
|
||||||
0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,
|
|
||||||
0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,
|
|
||||||
0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d,
|
|
||||||
0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84,
|
|
||||||
0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
|
|
||||||
0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8,
|
|
||||||
0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,
|
|
||||||
0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,
|
|
||||||
0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7,
|
|
||||||
0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38,
|
|
||||||
0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,
|
|
||||||
0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c,
|
|
||||||
0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525,
|
|
||||||
0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,
|
|
||||||
0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,
|
|
||||||
0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964,
|
|
||||||
0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
|
|
||||||
0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8,
|
|
||||||
0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,
|
|
||||||
0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,
|
|
||||||
0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299,
|
|
||||||
0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02,
|
|
||||||
0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,
|
|
||||||
0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614,
|
|
||||||
0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a,
|
|
||||||
0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,
|
|
||||||
0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,
|
|
||||||
0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0,
|
|
||||||
0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
|
|
||||||
0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e,
|
|
||||||
0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,
|
|
||||||
0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,
|
|
||||||
0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,
|
|
||||||
0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,
|
|
||||||
0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
|
|
||||||
0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917,
|
|
||||||
0x9216d5d9, 0x8979fb1b
|
|
||||||
} };
|
|
||||||
|
|
||||||
*c = initstate;
|
|
||||||
}
|
|
||||||
|
|
||||||
u_int32_t
|
|
||||||
Blowfish_stream2word(const u_int8_t *data, u_int16_t databytes,
|
|
||||||
u_int16_t *current)
|
|
||||||
{
|
|
||||||
u_int8_t i;
|
|
||||||
u_int16_t j;
|
|
||||||
u_int32_t temp;
|
|
||||||
|
|
||||||
temp = 0x00000000;
|
|
||||||
j = *current;
|
|
||||||
|
|
||||||
for (i = 0; i < 4; i++, j++) {
|
|
||||||
if (j >= databytes)
|
|
||||||
j = 0;
|
|
||||||
temp = (temp << 8) | data[j];
|
|
||||||
}
|
|
||||||
|
|
||||||
*current = j;
|
|
||||||
return temp;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
Blowfish_expand0state(blf_ctx *c, const u_int8_t *key, u_int16_t keybytes)
|
|
||||||
{
|
|
||||||
u_int16_t i;
|
|
||||||
u_int16_t j;
|
|
||||||
u_int16_t k;
|
|
||||||
u_int32_t temp;
|
|
||||||
u_int32_t datal;
|
|
||||||
u_int32_t datar;
|
|
||||||
|
|
||||||
j = 0;
|
|
||||||
for (i = 0; i < BLF_N + 2; i++) {
|
|
||||||
/* Extract 4 int8 to 1 int32 from keystream */
|
|
||||||
temp = Blowfish_stream2word(key, keybytes, &j);
|
|
||||||
c->P[i] = c->P[i] ^ temp;
|
|
||||||
}
|
|
||||||
|
|
||||||
j = 0;
|
|
||||||
datal = 0x00000000;
|
|
||||||
datar = 0x00000000;
|
|
||||||
for (i = 0; i < BLF_N + 2; i += 2) {
|
|
||||||
Blowfish_encipher(c, &datal, &datar);
|
|
||||||
|
|
||||||
c->P[i] = datal;
|
|
||||||
c->P[i + 1] = datar;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < 4; i++) {
|
|
||||||
for (k = 0; k < 256; k += 2) {
|
|
||||||
Blowfish_encipher(c, &datal, &datar);
|
|
||||||
|
|
||||||
c->S[i][k] = datal;
|
|
||||||
c->S[i][k + 1] = datar;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
Blowfish_expandstate(blf_ctx *c, const u_int8_t *data, u_int16_t databytes,
|
|
||||||
const u_int8_t *key, u_int16_t keybytes)
|
|
||||||
{
|
|
||||||
u_int16_t i;
|
|
||||||
u_int16_t j;
|
|
||||||
u_int16_t k;
|
|
||||||
u_int32_t temp;
|
|
||||||
u_int32_t datal;
|
|
||||||
u_int32_t datar;
|
|
||||||
|
|
||||||
j = 0;
|
|
||||||
for (i = 0; i < BLF_N + 2; i++) {
|
|
||||||
/* Extract 4 int8 to 1 int32 from keystream */
|
|
||||||
temp = Blowfish_stream2word(key, keybytes, &j);
|
|
||||||
c->P[i] = c->P[i] ^ temp;
|
|
||||||
}
|
|
||||||
|
|
||||||
j = 0;
|
|
||||||
datal = 0x00000000;
|
|
||||||
datar = 0x00000000;
|
|
||||||
for (i = 0; i < BLF_N + 2; i += 2) {
|
|
||||||
datal ^= Blowfish_stream2word(data, databytes, &j);
|
|
||||||
datar ^= Blowfish_stream2word(data, databytes, &j);
|
|
||||||
Blowfish_encipher(c, &datal, &datar);
|
|
||||||
|
|
||||||
c->P[i] = datal;
|
|
||||||
c->P[i + 1] = datar;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < 4; i++) {
|
|
||||||
for (k = 0; k < 256; k += 2) {
|
|
||||||
datal ^= Blowfish_stream2word(data, databytes, &j);
|
|
||||||
datar ^= Blowfish_stream2word(data, databytes, &j);
|
|
||||||
Blowfish_encipher(c, &datal, &datar);
|
|
||||||
|
|
||||||
c->S[i][k] = datal;
|
|
||||||
c->S[i][k + 1] = datar;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
blf_key(blf_ctx *c, const u_int8_t *k, u_int16_t len)
|
|
||||||
{
|
|
||||||
/* Initialize S-boxes and subkeys with Pi */
|
|
||||||
Blowfish_initstate(c);
|
|
||||||
|
|
||||||
/* Transform S-boxes and subkeys with key */
|
|
||||||
Blowfish_expand0state(c, k, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
blf_enc(blf_ctx *c, u_int32_t *data, u_int16_t blocks)
|
|
||||||
{
|
|
||||||
u_int32_t *d;
|
|
||||||
u_int16_t i;
|
|
||||||
|
|
||||||
d = data;
|
|
||||||
for (i = 0; i < blocks; i++) {
|
|
||||||
Blowfish_encipher(c, d, d + 1);
|
|
||||||
d += 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
blf_dec(blf_ctx *c, u_int32_t *data, u_int16_t blocks)
|
|
||||||
{
|
|
||||||
u_int32_t *d;
|
|
||||||
u_int16_t i;
|
|
||||||
|
|
||||||
d = data;
|
|
||||||
for (i = 0; i < blocks; i++) {
|
|
||||||
Blowfish_decipher(c, d, d + 1);
|
|
||||||
d += 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
blf_ecb_encrypt(blf_ctx *c, u_int8_t *data, u_int32_t len)
|
|
||||||
{
|
|
||||||
u_int32_t l, r;
|
|
||||||
u_int32_t i;
|
|
||||||
|
|
||||||
for (i = 0; i < len; i += 8) {
|
|
||||||
l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
|
|
||||||
r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
|
|
||||||
Blowfish_encipher(c, &l, &r);
|
|
||||||
data[0] = l >> 24 & 0xff;
|
|
||||||
data[1] = l >> 16 & 0xff;
|
|
||||||
data[2] = l >> 8 & 0xff;
|
|
||||||
data[3] = l & 0xff;
|
|
||||||
data[4] = r >> 24 & 0xff;
|
|
||||||
data[5] = r >> 16 & 0xff;
|
|
||||||
data[6] = r >> 8 & 0xff;
|
|
||||||
data[7] = r & 0xff;
|
|
||||||
data += 8;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
blf_ecb_decrypt(blf_ctx *c, u_int8_t *data, u_int32_t len)
|
|
||||||
{
|
|
||||||
u_int32_t l, r;
|
|
||||||
u_int32_t i;
|
|
||||||
|
|
||||||
for (i = 0; i < len; i += 8) {
|
|
||||||
l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
|
|
||||||
r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
|
|
||||||
Blowfish_decipher(c, &l, &r);
|
|
||||||
data[0] = l >> 24 & 0xff;
|
|
||||||
data[1] = l >> 16 & 0xff;
|
|
||||||
data[2] = l >> 8 & 0xff;
|
|
||||||
data[3] = l & 0xff;
|
|
||||||
data[4] = r >> 24 & 0xff;
|
|
||||||
data[5] = r >> 16 & 0xff;
|
|
||||||
data[6] = r >> 8 & 0xff;
|
|
||||||
data[7] = r & 0xff;
|
|
||||||
data += 8;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
blf_cbc_encrypt(blf_ctx *c, u_int8_t *iv, u_int8_t *data, u_int32_t len)
|
|
||||||
{
|
|
||||||
u_int32_t l, r;
|
|
||||||
u_int32_t i, j;
|
|
||||||
|
|
||||||
for (i = 0; i < len; i += 8) {
|
|
||||||
for (j = 0; j < 8; j++)
|
|
||||||
data[j] ^= iv[j];
|
|
||||||
l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
|
|
||||||
r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
|
|
||||||
Blowfish_encipher(c, &l, &r);
|
|
||||||
data[0] = l >> 24 & 0xff;
|
|
||||||
data[1] = l >> 16 & 0xff;
|
|
||||||
data[2] = l >> 8 & 0xff;
|
|
||||||
data[3] = l & 0xff;
|
|
||||||
data[4] = r >> 24 & 0xff;
|
|
||||||
data[5] = r >> 16 & 0xff;
|
|
||||||
data[6] = r >> 8 & 0xff;
|
|
||||||
data[7] = r & 0xff;
|
|
||||||
iv = data;
|
|
||||||
data += 8;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
blf_cbc_decrypt(blf_ctx *c, u_int8_t *iva, u_int8_t *data, u_int32_t len)
|
|
||||||
{
|
|
||||||
u_int32_t l, r;
|
|
||||||
u_int8_t *iv;
|
|
||||||
u_int32_t i, j;
|
|
||||||
|
|
||||||
iv = data + len - 16;
|
|
||||||
data = data + len - 8;
|
|
||||||
for (i = len - 8; i >= 8; i -= 8) {
|
|
||||||
l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
|
|
||||||
r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
|
|
||||||
Blowfish_decipher(c, &l, &r);
|
|
||||||
data[0] = l >> 24 & 0xff;
|
|
||||||
data[1] = l >> 16 & 0xff;
|
|
||||||
data[2] = l >> 8 & 0xff;
|
|
||||||
data[3] = l & 0xff;
|
|
||||||
data[4] = r >> 24 & 0xff;
|
|
||||||
data[5] = r >> 16 & 0xff;
|
|
||||||
data[6] = r >> 8 & 0xff;
|
|
||||||
data[7] = r & 0xff;
|
|
||||||
for (j = 0; j < 8; j++)
|
|
||||||
data[j] ^= iv[j];
|
|
||||||
iv -= 8;
|
|
||||||
data -= 8;
|
|
||||||
}
|
|
||||||
l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
|
|
||||||
r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
|
|
||||||
Blowfish_decipher(c, &l, &r);
|
|
||||||
data[0] = l >> 24 & 0xff;
|
|
||||||
data[1] = l >> 16 & 0xff;
|
|
||||||
data[2] = l >> 8 & 0xff;
|
|
||||||
data[3] = l & 0xff;
|
|
||||||
data[4] = r >> 24 & 0xff;
|
|
||||||
data[5] = r >> 16 & 0xff;
|
|
||||||
data[6] = r >> 8 & 0xff;
|
|
||||||
data[7] = r & 0xff;
|
|
||||||
for (j = 0; j < 8; j++)
|
|
||||||
data[j] ^= iva[j];
|
|
||||||
}
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
void
|
|
||||||
report(u_int32_t data[], u_int16_t len)
|
|
||||||
{
|
|
||||||
u_int16_t i;
|
|
||||||
for (i = 0; i < len; i += 2)
|
|
||||||
printf("Block %0hd: %08lx %08lx.\n",
|
|
||||||
i / 2, data[i], data[i + 1]);
|
|
||||||
}
|
|
||||||
void
|
|
||||||
main(void)
|
|
||||||
{
|
|
||||||
|
|
||||||
blf_ctx c;
|
|
||||||
char key[] = "AAAAA";
|
|
||||||
char key2[] = "abcdefghijklmnopqrstuvwxyz";
|
|
||||||
|
|
||||||
u_int32_t data[10];
|
|
||||||
u_int32_t data2[] =
|
|
||||||
{0x424c4f57l, 0x46495348l};
|
|
||||||
|
|
||||||
u_int16_t i;
|
|
||||||
|
|
||||||
/* First test */
|
|
||||||
for (i = 0; i < 10; i++)
|
|
||||||
data[i] = i;
|
|
||||||
|
|
||||||
blf_key(&c, (u_int8_t *) key, 5);
|
|
||||||
blf_enc(&c, data, 5);
|
|
||||||
blf_dec(&c, data, 1);
|
|
||||||
blf_dec(&c, data + 2, 4);
|
|
||||||
printf("Should read as 0 - 9.\n");
|
|
||||||
report(data, 10);
|
|
||||||
|
|
||||||
/* Second test */
|
|
||||||
blf_key(&c, (u_int8_t *) key2, strlen(key2));
|
|
||||||
blf_enc(&c, data2, 1);
|
|
||||||
printf("\nShould read as: 0x324ed0fe 0xf413a203.\n");
|
|
||||||
report(data2, 2);
|
|
||||||
blf_dec(&c, data2, 1);
|
|
||||||
report(data2, 2);
|
|
||||||
}
|
|
||||||
#endif
|
|
|
@ -1,82 +0,0 @@
|
||||||
/* $OpenBSD: src/include/blf.h,v 1.7 2007/03/14 17:59:41 grunk Exp $ */
|
|
||||||
/*
|
|
||||||
* Blowfish - a fast block cipher designed by Bruce Schneier
|
|
||||||
*
|
|
||||||
* Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de>
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* 3. All advertising materials mentioning features or use of this software
|
|
||||||
* must display the following acknowledgement:
|
|
||||||
* This product includes software developed by Niels Provos.
|
|
||||||
* 4. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
||||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
||||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
||||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
||||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _BLF_H_
|
|
||||||
#define _BLF_H_
|
|
||||||
|
|
||||||
/* Schneier specifies a maximum key length of 56 bytes.
|
|
||||||
* This ensures that every key bit affects every cipher
|
|
||||||
* bit. However, the subkeys can hold up to 72 bytes.
|
|
||||||
* Warning: For normal blowfish encryption only 56 bytes
|
|
||||||
* of the key affect all cipherbits.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define BLF_N 16 /* Number of Subkeys */
|
|
||||||
#define BLF_MAXKEYLEN ((BLF_N-2)*4) /* 448 bits */
|
|
||||||
#define BLF_MAXUTILIZED ((BLF_N+2)*4) /* 576 bits */
|
|
||||||
|
|
||||||
/* Blowfish context */
|
|
||||||
typedef struct BlowfishContext {
|
|
||||||
u_int32_t S[4][256]; /* S-Boxes */
|
|
||||||
u_int32_t P[BLF_N + 2]; /* Subkeys */
|
|
||||||
} blf_ctx;
|
|
||||||
|
|
||||||
/* Raw access to customized Blowfish
|
|
||||||
* blf_key is just:
|
|
||||||
* Blowfish_initstate( state )
|
|
||||||
* Blowfish_expand0state( state, key, keylen )
|
|
||||||
*/
|
|
||||||
|
|
||||||
void Blowfish_encipher(blf_ctx *, u_int32_t *, u_int32_t *);
|
|
||||||
void Blowfish_decipher(blf_ctx *, u_int32_t *, u_int32_t *);
|
|
||||||
void Blowfish_initstate(blf_ctx *);
|
|
||||||
void Blowfish_expand0state(blf_ctx *, const u_int8_t *, u_int16_t);
|
|
||||||
void Blowfish_expandstate
|
|
||||||
(blf_ctx *, const u_int8_t *, u_int16_t, const u_int8_t *, u_int16_t);
|
|
||||||
|
|
||||||
/* Standard Blowfish */
|
|
||||||
|
|
||||||
void blf_key(blf_ctx *, const u_int8_t *, u_int16_t);
|
|
||||||
void blf_enc(blf_ctx *, u_int32_t *, u_int16_t);
|
|
||||||
void blf_dec(blf_ctx *, u_int32_t *, u_int16_t);
|
|
||||||
|
|
||||||
void blf_ecb_encrypt(blf_ctx *, u_int8_t *, u_int32_t);
|
|
||||||
void blf_ecb_decrypt(blf_ctx *, u_int8_t *, u_int32_t);
|
|
||||||
|
|
||||||
void blf_cbc_encrypt(blf_ctx *, u_int8_t *, u_int8_t *, u_int32_t);
|
|
||||||
void blf_cbc_decrypt(blf_ctx *, u_int8_t *, u_int8_t *, u_int32_t);
|
|
||||||
|
|
||||||
/* Converts u_int8_t to u_int32_t */
|
|
||||||
u_int32_t Blowfish_stream2word(const u_int8_t *, u_int16_t , u_int16_t *);
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,222 +0,0 @@
|
||||||
/*
|
|
||||||
chacha-merged.c version 20080118
|
|
||||||
D. J. Bernstein
|
|
||||||
Public domain.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* $OpenBSD: src/lib/libc/crypt/chacha_private.h,v 1.2 2013/10/04 07:02:27 djm Exp $ */
|
|
||||||
|
|
||||||
typedef unsigned char u8;
|
|
||||||
typedef unsigned int u32;
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
u32 input[16]; /* could be compressed */
|
|
||||||
} chacha_ctx;
|
|
||||||
|
|
||||||
#define U8C(v) (v##U)
|
|
||||||
#define U32C(v) (v##U)
|
|
||||||
|
|
||||||
#define U8V(v) ((u8)(v) & U8C(0xFF))
|
|
||||||
#define U32V(v) ((u32)(v) & U32C(0xFFFFFFFF))
|
|
||||||
|
|
||||||
#define ROTL32(v, n) \
|
|
||||||
(U32V((v) << (n)) | ((v) >> (32 - (n))))
|
|
||||||
|
|
||||||
#define U8TO32_LITTLE(p) \
|
|
||||||
(((u32)((p)[0]) ) | \
|
|
||||||
((u32)((p)[1]) << 8) | \
|
|
||||||
((u32)((p)[2]) << 16) | \
|
|
||||||
((u32)((p)[3]) << 24))
|
|
||||||
|
|
||||||
#define U32TO8_LITTLE(p, v) \
|
|
||||||
do { \
|
|
||||||
(p)[0] = U8V((v) ); \
|
|
||||||
(p)[1] = U8V((v) >> 8); \
|
|
||||||
(p)[2] = U8V((v) >> 16); \
|
|
||||||
(p)[3] = U8V((v) >> 24); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define ROTATE(v,c) (ROTL32(v,c))
|
|
||||||
#define XOR(v,w) ((v) ^ (w))
|
|
||||||
#define PLUS(v,w) (U32V((v) + (w)))
|
|
||||||
#define PLUSONE(v) (PLUS((v),1))
|
|
||||||
|
|
||||||
#define QUARTERROUND(a,b,c,d) \
|
|
||||||
a = PLUS(a,b); d = ROTATE(XOR(d,a),16); \
|
|
||||||
c = PLUS(c,d); b = ROTATE(XOR(b,c),12); \
|
|
||||||
a = PLUS(a,b); d = ROTATE(XOR(d,a), 8); \
|
|
||||||
c = PLUS(c,d); b = ROTATE(XOR(b,c), 7);
|
|
||||||
|
|
||||||
static const char sigma[16] = "expand 32-byte k";
|
|
||||||
static const char tau[16] = "expand 16-byte k";
|
|
||||||
|
|
||||||
static void
|
|
||||||
chacha_keysetup(chacha_ctx *x,const u8 *k,u32 kbits,u32 ivbits)
|
|
||||||
{
|
|
||||||
const char *constants;
|
|
||||||
|
|
||||||
x->input[4] = U8TO32_LITTLE(k + 0);
|
|
||||||
x->input[5] = U8TO32_LITTLE(k + 4);
|
|
||||||
x->input[6] = U8TO32_LITTLE(k + 8);
|
|
||||||
x->input[7] = U8TO32_LITTLE(k + 12);
|
|
||||||
if (kbits == 256) { /* recommended */
|
|
||||||
k += 16;
|
|
||||||
constants = sigma;
|
|
||||||
} else { /* kbits == 128 */
|
|
||||||
constants = tau;
|
|
||||||
}
|
|
||||||
x->input[8] = U8TO32_LITTLE(k + 0);
|
|
||||||
x->input[9] = U8TO32_LITTLE(k + 4);
|
|
||||||
x->input[10] = U8TO32_LITTLE(k + 8);
|
|
||||||
x->input[11] = U8TO32_LITTLE(k + 12);
|
|
||||||
x->input[0] = U8TO32_LITTLE(constants + 0);
|
|
||||||
x->input[1] = U8TO32_LITTLE(constants + 4);
|
|
||||||
x->input[2] = U8TO32_LITTLE(constants + 8);
|
|
||||||
x->input[3] = U8TO32_LITTLE(constants + 12);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
chacha_ivsetup(chacha_ctx *x,const u8 *iv)
|
|
||||||
{
|
|
||||||
x->input[12] = 0;
|
|
||||||
x->input[13] = 0;
|
|
||||||
x->input[14] = U8TO32_LITTLE(iv + 0);
|
|
||||||
x->input[15] = U8TO32_LITTLE(iv + 4);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
chacha_encrypt_bytes(chacha_ctx *x,const u8 *m,u8 *c,u32 bytes)
|
|
||||||
{
|
|
||||||
u32 x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15;
|
|
||||||
u32 j0, j1, j2, j3, j4, j5, j6, j7, j8, j9, j10, j11, j12, j13, j14, j15;
|
|
||||||
u8 *ctarget = NULL;
|
|
||||||
u8 tmp[64];
|
|
||||||
u_int i;
|
|
||||||
|
|
||||||
if (!bytes) return;
|
|
||||||
|
|
||||||
j0 = x->input[0];
|
|
||||||
j1 = x->input[1];
|
|
||||||
j2 = x->input[2];
|
|
||||||
j3 = x->input[3];
|
|
||||||
j4 = x->input[4];
|
|
||||||
j5 = x->input[5];
|
|
||||||
j6 = x->input[6];
|
|
||||||
j7 = x->input[7];
|
|
||||||
j8 = x->input[8];
|
|
||||||
j9 = x->input[9];
|
|
||||||
j10 = x->input[10];
|
|
||||||
j11 = x->input[11];
|
|
||||||
j12 = x->input[12];
|
|
||||||
j13 = x->input[13];
|
|
||||||
j14 = x->input[14];
|
|
||||||
j15 = x->input[15];
|
|
||||||
|
|
||||||
for (;;) {
|
|
||||||
if (bytes < 64) {
|
|
||||||
for (i = 0;i < bytes;++i) tmp[i] = m[i];
|
|
||||||
m = tmp;
|
|
||||||
ctarget = c;
|
|
||||||
c = tmp;
|
|
||||||
}
|
|
||||||
x0 = j0;
|
|
||||||
x1 = j1;
|
|
||||||
x2 = j2;
|
|
||||||
x3 = j3;
|
|
||||||
x4 = j4;
|
|
||||||
x5 = j5;
|
|
||||||
x6 = j6;
|
|
||||||
x7 = j7;
|
|
||||||
x8 = j8;
|
|
||||||
x9 = j9;
|
|
||||||
x10 = j10;
|
|
||||||
x11 = j11;
|
|
||||||
x12 = j12;
|
|
||||||
x13 = j13;
|
|
||||||
x14 = j14;
|
|
||||||
x15 = j15;
|
|
||||||
for (i = 20;i > 0;i -= 2) {
|
|
||||||
QUARTERROUND( x0, x4, x8,x12)
|
|
||||||
QUARTERROUND( x1, x5, x9,x13)
|
|
||||||
QUARTERROUND( x2, x6,x10,x14)
|
|
||||||
QUARTERROUND( x3, x7,x11,x15)
|
|
||||||
QUARTERROUND( x0, x5,x10,x15)
|
|
||||||
QUARTERROUND( x1, x6,x11,x12)
|
|
||||||
QUARTERROUND( x2, x7, x8,x13)
|
|
||||||
QUARTERROUND( x3, x4, x9,x14)
|
|
||||||
}
|
|
||||||
x0 = PLUS(x0,j0);
|
|
||||||
x1 = PLUS(x1,j1);
|
|
||||||
x2 = PLUS(x2,j2);
|
|
||||||
x3 = PLUS(x3,j3);
|
|
||||||
x4 = PLUS(x4,j4);
|
|
||||||
x5 = PLUS(x5,j5);
|
|
||||||
x6 = PLUS(x6,j6);
|
|
||||||
x7 = PLUS(x7,j7);
|
|
||||||
x8 = PLUS(x8,j8);
|
|
||||||
x9 = PLUS(x9,j9);
|
|
||||||
x10 = PLUS(x10,j10);
|
|
||||||
x11 = PLUS(x11,j11);
|
|
||||||
x12 = PLUS(x12,j12);
|
|
||||||
x13 = PLUS(x13,j13);
|
|
||||||
x14 = PLUS(x14,j14);
|
|
||||||
x15 = PLUS(x15,j15);
|
|
||||||
|
|
||||||
#ifndef KEYSTREAM_ONLY
|
|
||||||
x0 = XOR(x0,U8TO32_LITTLE(m + 0));
|
|
||||||
x1 = XOR(x1,U8TO32_LITTLE(m + 4));
|
|
||||||
x2 = XOR(x2,U8TO32_LITTLE(m + 8));
|
|
||||||
x3 = XOR(x3,U8TO32_LITTLE(m + 12));
|
|
||||||
x4 = XOR(x4,U8TO32_LITTLE(m + 16));
|
|
||||||
x5 = XOR(x5,U8TO32_LITTLE(m + 20));
|
|
||||||
x6 = XOR(x6,U8TO32_LITTLE(m + 24));
|
|
||||||
x7 = XOR(x7,U8TO32_LITTLE(m + 28));
|
|
||||||
x8 = XOR(x8,U8TO32_LITTLE(m + 32));
|
|
||||||
x9 = XOR(x9,U8TO32_LITTLE(m + 36));
|
|
||||||
x10 = XOR(x10,U8TO32_LITTLE(m + 40));
|
|
||||||
x11 = XOR(x11,U8TO32_LITTLE(m + 44));
|
|
||||||
x12 = XOR(x12,U8TO32_LITTLE(m + 48));
|
|
||||||
x13 = XOR(x13,U8TO32_LITTLE(m + 52));
|
|
||||||
x14 = XOR(x14,U8TO32_LITTLE(m + 56));
|
|
||||||
x15 = XOR(x15,U8TO32_LITTLE(m + 60));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
j12 = PLUSONE(j12);
|
|
||||||
if (!j12) {
|
|
||||||
j13 = PLUSONE(j13);
|
|
||||||
/* stopping at 2^70 bytes per nonce is user's responsibility */
|
|
||||||
}
|
|
||||||
|
|
||||||
U32TO8_LITTLE(c + 0,x0);
|
|
||||||
U32TO8_LITTLE(c + 4,x1);
|
|
||||||
U32TO8_LITTLE(c + 8,x2);
|
|
||||||
U32TO8_LITTLE(c + 12,x3);
|
|
||||||
U32TO8_LITTLE(c + 16,x4);
|
|
||||||
U32TO8_LITTLE(c + 20,x5);
|
|
||||||
U32TO8_LITTLE(c + 24,x6);
|
|
||||||
U32TO8_LITTLE(c + 28,x7);
|
|
||||||
U32TO8_LITTLE(c + 32,x8);
|
|
||||||
U32TO8_LITTLE(c + 36,x9);
|
|
||||||
U32TO8_LITTLE(c + 40,x10);
|
|
||||||
U32TO8_LITTLE(c + 44,x11);
|
|
||||||
U32TO8_LITTLE(c + 48,x12);
|
|
||||||
U32TO8_LITTLE(c + 52,x13);
|
|
||||||
U32TO8_LITTLE(c + 56,x14);
|
|
||||||
U32TO8_LITTLE(c + 60,x15);
|
|
||||||
|
|
||||||
if (bytes <= 64) {
|
|
||||||
if (bytes < 64) {
|
|
||||||
for (i = 0;i < bytes;++i) ctarget[i] = c[i];
|
|
||||||
}
|
|
||||||
x->input[12] = j12;
|
|
||||||
x->input[13] = j13;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
bytes -= 64;
|
|
||||||
c += 64;
|
|
||||||
#ifndef KEYSTREAM_ONLY
|
|
||||||
m += 64;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,46 +0,0 @@
|
||||||
/* $OpenBSD: readpassphrase.h,v 1.5 2003/06/17 21:56:23 millert Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 2000, 2002 Todd C. Miller <Todd.Miller@courtesan.com>
|
|
||||||
*
|
|
||||||
* Permission to use, copy, modify, and distribute this software for any
|
|
||||||
* purpose with or without fee is hereby granted, provided that the above
|
|
||||||
* copyright notice and this permission notice appear in all copies.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
||||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
*
|
|
||||||
* Sponsored in part by the Defense Advanced Research Projects
|
|
||||||
* Agency (DARPA) and Air Force Research Laboratory, Air Force
|
|
||||||
* Materiel Command, USAF, under agreement number F39502-99-1-0512.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* OPENBSD ORIGINAL: include/readpassphrase.h */
|
|
||||||
|
|
||||||
#ifndef _PATH_TTY
|
|
||||||
# define _PATH_TTY "/dev/tty"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef _READPASSPHRASE_H_
|
|
||||||
#define _READPASSPHRASE_H_
|
|
||||||
|
|
||||||
#ifndef HAVE_READPASSPHRASE
|
|
||||||
|
|
||||||
#define RPP_ECHO_OFF 0x00 /* Turn off echo (default). */
|
|
||||||
#define RPP_ECHO_ON 0x01 /* Leave echo on. */
|
|
||||||
#define RPP_REQUIRE_TTY 0x02 /* Fail if there is no tty. */
|
|
||||||
#define RPP_FORCELOWER 0x04 /* Force input to lower case. */
|
|
||||||
#define RPP_FORCEUPPER 0x08 /* Force input to upper case. */
|
|
||||||
#define RPP_SEVENBIT 0x10 /* Strip the high bit from input. */
|
|
||||||
#define RPP_STDIN 0x20 /* Read from stdin, not /dev/tty */
|
|
||||||
|
|
||||||
char * readpassphrase(const char *, char *, size_t, int);
|
|
||||||
|
|
||||||
#endif /* HAVE_READPASSPHRASE */
|
|
||||||
|
|
||||||
#endif /* !_READPASSPHRASE_H_ */
|
|
|
@ -1,110 +0,0 @@
|
||||||
/* $OpenBSD: src/include/sha2.h,v 1.9 2013/04/15 15:54:17 millert Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* FILE: sha2.h
|
|
||||||
* AUTHOR: Aaron D. Gifford <me@aarongifford.com>
|
|
||||||
*
|
|
||||||
* Copyright (c) 2000-2001, Aaron D. Gifford
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* 3. Neither the name of the copyright holder nor the names of contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTOR(S) ``AS IS'' AND
|
|
||||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTOR(S) BE LIABLE
|
|
||||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
||||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
* SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
* $From: sha2.h,v 1.1 2001/11/08 00:02:01 adg Exp adg $
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* minor edits by mancha1@zoho.com */
|
|
||||||
|
|
||||||
#ifndef _SHA2_H
|
|
||||||
#define _SHA2_H
|
|
||||||
|
|
||||||
|
|
||||||
/*** SHA-256/384/512 Various Length Definitions ***********************/
|
|
||||||
#define SHA224_BLOCK_LENGTH 64
|
|
||||||
#define SHA224_DIGEST_LENGTH 28
|
|
||||||
#define SHA224_DIGEST_STRING_LENGTH (SHA224_DIGEST_LENGTH * 2 + 1)
|
|
||||||
#define SHA256_BLOCK_LENGTH 64
|
|
||||||
#define SHA256_DIGEST_LENGTH 32
|
|
||||||
#define SHA256_DIGEST_STRING_LENGTH (SHA256_DIGEST_LENGTH * 2 + 1)
|
|
||||||
#define SHA384_BLOCK_LENGTH 128
|
|
||||||
#define SHA384_DIGEST_LENGTH 48
|
|
||||||
#define SHA384_DIGEST_STRING_LENGTH (SHA384_DIGEST_LENGTH * 2 + 1)
|
|
||||||
#define SHA512_BLOCK_LENGTH 128
|
|
||||||
#define SHA512_DIGEST_LENGTH 64
|
|
||||||
#define SHA512_DIGEST_STRING_LENGTH (SHA512_DIGEST_LENGTH * 2 + 1)
|
|
||||||
|
|
||||||
|
|
||||||
/*** SHA-224/256/384/512 Context Structure *******************************/
|
|
||||||
typedef struct _SHA2_CTX {
|
|
||||||
union {
|
|
||||||
u_int32_t st32[8];
|
|
||||||
u_int64_t st64[8];
|
|
||||||
} state;
|
|
||||||
u_int64_t bitcount[2];
|
|
||||||
u_int8_t buffer[SHA512_BLOCK_LENGTH];
|
|
||||||
} SHA2_CTX;
|
|
||||||
|
|
||||||
__BEGIN_DECLS
|
|
||||||
void SHA224Init(SHA2_CTX *);
|
|
||||||
void SHA224Transform(u_int32_t state[8], const u_int8_t [SHA224_BLOCK_LENGTH]);
|
|
||||||
void SHA224Update(SHA2_CTX *, const u_int8_t *, size_t);
|
|
||||||
void SHA224Pad(SHA2_CTX *);
|
|
||||||
void SHA224Final(u_int8_t [SHA224_DIGEST_LENGTH], SHA2_CTX *);
|
|
||||||
char *SHA224End(SHA2_CTX *, char *);
|
|
||||||
char *SHA224File(const char *, char *);
|
|
||||||
char *SHA224FileChunk(const char *, char *, off_t, off_t);
|
|
||||||
char *SHA224Data(const u_int8_t *, size_t, char *);
|
|
||||||
|
|
||||||
void SHA256Init(SHA2_CTX *);
|
|
||||||
void SHA256Transform(u_int32_t state[8], const u_int8_t [SHA256_BLOCK_LENGTH]);
|
|
||||||
void SHA256Update(SHA2_CTX *, const u_int8_t *, size_t);
|
|
||||||
void SHA256Pad(SHA2_CTX *);
|
|
||||||
void SHA256Final(u_int8_t [SHA256_DIGEST_LENGTH], SHA2_CTX *);
|
|
||||||
char *SHA256End(SHA2_CTX *, char *);
|
|
||||||
char *SHA256File(const char *, char *);
|
|
||||||
char *SHA256FileChunk(const char *, char *, off_t, off_t);
|
|
||||||
char *SHA256Data(const u_int8_t *, size_t, char *);
|
|
||||||
|
|
||||||
void SHA384Init(SHA2_CTX *);
|
|
||||||
void SHA384Transform(u_int64_t state[8], const u_int8_t [SHA384_BLOCK_LENGTH]);
|
|
||||||
void SHA384Update(SHA2_CTX *, const u_int8_t *, size_t);
|
|
||||||
void SHA384Pad(SHA2_CTX *);
|
|
||||||
void SHA384Final(u_int8_t [SHA384_DIGEST_LENGTH], SHA2_CTX *);
|
|
||||||
char *SHA384End(SHA2_CTX *, char *);
|
|
||||||
char *SHA384File(const char *, char *);
|
|
||||||
char *SHA384FileChunk(const char *, char *, off_t, off_t);
|
|
||||||
char *SHA384Data(const u_int8_t *, size_t, char *);
|
|
||||||
|
|
||||||
void SHA512Init(SHA2_CTX *);
|
|
||||||
void SHA512Transform(u_int64_t state[8], const u_int8_t [SHA512_BLOCK_LENGTH]);
|
|
||||||
void SHA512Update(SHA2_CTX *, const u_int8_t *, size_t);
|
|
||||||
void SHA512Pad(SHA2_CTX *);
|
|
||||||
void SHA512Final(u_int8_t [SHA512_DIGEST_LENGTH], SHA2_CTX *);
|
|
||||||
char *SHA512End(SHA2_CTX *, char *);
|
|
||||||
char *SHA512File(const char *, char *);
|
|
||||||
char *SHA512FileChunk(const char *, char *, off_t, off_t);
|
|
||||||
char *SHA512Data(const u_int8_t *, size_t, char *);
|
|
||||||
__END_DECLS
|
|
||||||
|
|
||||||
#endif /* _SHA2_H */
|
|
|
@ -1,29 +0,0 @@
|
||||||
/* $OpenBSD: crypto_api.c,v 1.1 2014/01/08 03:59:46 tedu Exp $ */
|
|
||||||
/*
|
|
||||||
* Public domain. Author: Ted Unangst <tedu@openbsd.org>
|
|
||||||
* API compatible reimplementation of functions from nacl
|
|
||||||
*/
|
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <sha2.h>
|
|
||||||
|
|
||||||
#include "crypto_api.h"
|
|
||||||
|
|
||||||
int
|
|
||||||
crypto_hash_sha512(unsigned char *out, const unsigned char *in,
|
|
||||||
unsigned long long inlen)
|
|
||||||
{
|
|
||||||
SHA2_CTX ctx;
|
|
||||||
|
|
||||||
SHA512Init(&ctx);
|
|
||||||
SHA512Update(&ctx, in, inlen);
|
|
||||||
SHA512Final(out, &ctx);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
crypto_verify_32(const unsigned char *x, const unsigned char *y)
|
|
||||||
{
|
|
||||||
return timingsafe_bcmp(x, y, 32) ? -1 : 0;
|
|
||||||
}
|
|
|
@ -1,42 +0,0 @@
|
||||||
/* $OpenBSD: crypto_api.h,v 1.3 2013/12/17 10:36:38 markus Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Assembled from generated headers and source files by Markus Friedl.
|
|
||||||
* Placed in the public domain.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef crypto_api_h
|
|
||||||
#define crypto_api_h
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
typedef int32_t crypto_int32;
|
|
||||||
typedef uint32_t crypto_uint32;
|
|
||||||
|
|
||||||
#define randombytes(buf, buf_len) arc4random_buf((buf), (buf_len))
|
|
||||||
|
|
||||||
#define crypto_hashblocks_sha512_STATEBYTES 64U
|
|
||||||
#define crypto_hashblocks_sha512_BLOCKBYTES 128U
|
|
||||||
|
|
||||||
int crypto_hashblocks_sha512(unsigned char *, const unsigned char *,
|
|
||||||
unsigned long long);
|
|
||||||
|
|
||||||
#define crypto_hash_sha512_BYTES 64U
|
|
||||||
|
|
||||||
int crypto_hash_sha512(unsigned char *, const unsigned char *,
|
|
||||||
unsigned long long);
|
|
||||||
|
|
||||||
int crypto_verify_32(const unsigned char *, const unsigned char *);
|
|
||||||
|
|
||||||
#define crypto_sign_ed25519_SECRETKEYBYTES 64U
|
|
||||||
#define crypto_sign_ed25519_PUBLICKEYBYTES 32U
|
|
||||||
#define crypto_sign_ed25519_BYTES 64U
|
|
||||||
|
|
||||||
int crypto_sign_ed25519(unsigned char *, unsigned long long *,
|
|
||||||
const unsigned char *, unsigned long long, const unsigned char *);
|
|
||||||
int crypto_sign_ed25519_open(unsigned char *, unsigned long long *,
|
|
||||||
const unsigned char *, unsigned long long, const unsigned char *);
|
|
||||||
int crypto_sign_ed25519_keypair(unsigned char *, unsigned char *);
|
|
||||||
|
|
||||||
#endif /* crypto_api_h */
|
|
|
@ -1,20 +0,0 @@
|
||||||
/* $OpenBSD: explicit_bzero.c,v 1.1 2014/01/22 21:06:45 tedu Exp $ */
|
|
||||||
/*
|
|
||||||
* Public domain.
|
|
||||||
* Written by Ted Unangst
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include "util.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* explicit_bzero - don't let the compiler optimize away bzero
|
|
||||||
*/
|
|
||||||
|
|
||||||
static void (* volatile signify_bzero)(void *, size_t) = bzero;
|
|
||||||
|
|
||||||
void
|
|
||||||
explicit_bzero(void *p, size_t n)
|
|
||||||
{
|
|
||||||
signify_bzero(p, n);
|
|
||||||
}
|
|
|
@ -1,335 +0,0 @@
|
||||||
/* $OpenBSD: fe25519.c,v 1.3 2013/12/09 11:03:45 markus Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Public Domain, Authors: Daniel J. Bernstein, Niels Duif, Tanja Lange,
|
|
||||||
* Peter Schwabe, Bo-Yin Yang.
|
|
||||||
* Copied from supercop-20130419/crypto_sign/ed25519/ref/fe25519.c
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define WINDOWSIZE 1 /* Should be 1,2, or 4 */
|
|
||||||
#define WINDOWMASK ((1<<WINDOWSIZE)-1)
|
|
||||||
|
|
||||||
#include "fe25519.h"
|
|
||||||
|
|
||||||
static crypto_uint32 equal(crypto_uint32 a,crypto_uint32 b) /* 16-bit inputs */
|
|
||||||
{
|
|
||||||
crypto_uint32 x = a ^ b; /* 0: yes; 1..65535: no */
|
|
||||||
x -= 1; /* 4294967295: yes; 0..65534: no */
|
|
||||||
x >>= 31; /* 1: yes; 0: no */
|
|
||||||
return x;
|
|
||||||
}
|
|
||||||
|
|
||||||
static crypto_uint32 ge(crypto_uint32 a,crypto_uint32 b) /* 16-bit inputs */
|
|
||||||
{
|
|
||||||
unsigned int x = a;
|
|
||||||
x -= (unsigned int) b; /* 0..65535: yes; 4294901761..4294967295: no */
|
|
||||||
x >>= 31; /* 0: yes; 1: no */
|
|
||||||
x ^= 1; /* 1: yes; 0: no */
|
|
||||||
return x;
|
|
||||||
}
|
|
||||||
|
|
||||||
static crypto_uint32 times19(crypto_uint32 a)
|
|
||||||
{
|
|
||||||
return (a << 4) + (a << 1) + a;
|
|
||||||
}
|
|
||||||
|
|
||||||
static crypto_uint32 times38(crypto_uint32 a)
|
|
||||||
{
|
|
||||||
return (a << 5) + (a << 2) + (a << 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void reduce_add_sub(fe25519 *r)
|
|
||||||
{
|
|
||||||
crypto_uint32 t;
|
|
||||||
int i,rep;
|
|
||||||
|
|
||||||
for(rep=0;rep<4;rep++)
|
|
||||||
{
|
|
||||||
t = r->v[31] >> 7;
|
|
||||||
r->v[31] &= 127;
|
|
||||||
t = times19(t);
|
|
||||||
r->v[0] += t;
|
|
||||||
for(i=0;i<31;i++)
|
|
||||||
{
|
|
||||||
t = r->v[i] >> 8;
|
|
||||||
r->v[i+1] += t;
|
|
||||||
r->v[i] &= 255;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void reduce_mul(fe25519 *r)
|
|
||||||
{
|
|
||||||
crypto_uint32 t;
|
|
||||||
int i,rep;
|
|
||||||
|
|
||||||
for(rep=0;rep<2;rep++)
|
|
||||||
{
|
|
||||||
t = r->v[31] >> 7;
|
|
||||||
r->v[31] &= 127;
|
|
||||||
t = times19(t);
|
|
||||||
r->v[0] += t;
|
|
||||||
for(i=0;i<31;i++)
|
|
||||||
{
|
|
||||||
t = r->v[i] >> 8;
|
|
||||||
r->v[i+1] += t;
|
|
||||||
r->v[i] &= 255;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* reduction modulo 2^255-19 */
|
|
||||||
void fe25519_freeze(fe25519 *r)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
crypto_uint32 m = equal(r->v[31],127);
|
|
||||||
for(i=30;i>0;i--)
|
|
||||||
m &= equal(r->v[i],255);
|
|
||||||
m &= ge(r->v[0],237);
|
|
||||||
|
|
||||||
m = -m;
|
|
||||||
|
|
||||||
r->v[31] -= m&127;
|
|
||||||
for(i=30;i>0;i--)
|
|
||||||
r->v[i] -= m&255;
|
|
||||||
r->v[0] -= m&237;
|
|
||||||
}
|
|
||||||
|
|
||||||
void fe25519_unpack(fe25519 *r, const unsigned char x[32])
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for(i=0;i<32;i++) r->v[i] = x[i];
|
|
||||||
r->v[31] &= 127;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Assumes input x being reduced below 2^255 */
|
|
||||||
void fe25519_pack(unsigned char r[32], const fe25519 *x)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
fe25519 y = *x;
|
|
||||||
fe25519_freeze(&y);
|
|
||||||
for(i=0;i<32;i++)
|
|
||||||
r[i] = y.v[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
int fe25519_iszero(const fe25519 *x)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
int r;
|
|
||||||
fe25519 t = *x;
|
|
||||||
fe25519_freeze(&t);
|
|
||||||
r = equal(t.v[0],0);
|
|
||||||
for(i=1;i<32;i++)
|
|
||||||
r &= equal(t.v[i],0);
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
int fe25519_iseq_vartime(const fe25519 *x, const fe25519 *y)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
fe25519 t1 = *x;
|
|
||||||
fe25519 t2 = *y;
|
|
||||||
fe25519_freeze(&t1);
|
|
||||||
fe25519_freeze(&t2);
|
|
||||||
for(i=0;i<32;i++)
|
|
||||||
if(t1.v[i] != t2.v[i]) return 0;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void fe25519_cmov(fe25519 *r, const fe25519 *x, unsigned char b)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
crypto_uint32 mask = b;
|
|
||||||
mask = -mask;
|
|
||||||
for(i=0;i<32;i++) r->v[i] ^= mask & (x->v[i] ^ r->v[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char fe25519_getparity(const fe25519 *x)
|
|
||||||
{
|
|
||||||
fe25519 t = *x;
|
|
||||||
fe25519_freeze(&t);
|
|
||||||
return t.v[0] & 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void fe25519_setone(fe25519 *r)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
r->v[0] = 1;
|
|
||||||
for(i=1;i<32;i++) r->v[i]=0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void fe25519_setzero(fe25519 *r)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for(i=0;i<32;i++) r->v[i]=0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void fe25519_neg(fe25519 *r, const fe25519 *x)
|
|
||||||
{
|
|
||||||
fe25519 t;
|
|
||||||
int i;
|
|
||||||
for(i=0;i<32;i++) t.v[i]=x->v[i];
|
|
||||||
fe25519_setzero(r);
|
|
||||||
fe25519_sub(r, r, &t);
|
|
||||||
}
|
|
||||||
|
|
||||||
void fe25519_add(fe25519 *r, const fe25519 *x, const fe25519 *y)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for(i=0;i<32;i++) r->v[i] = x->v[i] + y->v[i];
|
|
||||||
reduce_add_sub(r);
|
|
||||||
}
|
|
||||||
|
|
||||||
void fe25519_sub(fe25519 *r, const fe25519 *x, const fe25519 *y)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
crypto_uint32 t[32];
|
|
||||||
t[0] = x->v[0] + 0x1da;
|
|
||||||
t[31] = x->v[31] + 0xfe;
|
|
||||||
for(i=1;i<31;i++) t[i] = x->v[i] + 0x1fe;
|
|
||||||
for(i=0;i<32;i++) r->v[i] = t[i] - y->v[i];
|
|
||||||
reduce_add_sub(r);
|
|
||||||
}
|
|
||||||
|
|
||||||
void fe25519_mul(fe25519 *r, const fe25519 *x, const fe25519 *y)
|
|
||||||
{
|
|
||||||
int i,j;
|
|
||||||
crypto_uint32 t[63];
|
|
||||||
for(i=0;i<63;i++)t[i] = 0;
|
|
||||||
|
|
||||||
for(i=0;i<32;i++)
|
|
||||||
for(j=0;j<32;j++)
|
|
||||||
t[i+j] += x->v[i] * y->v[j];
|
|
||||||
|
|
||||||
for(i=32;i<63;i++)
|
|
||||||
r->v[i-32] = t[i-32] + times38(t[i]);
|
|
||||||
r->v[31] = t[31]; /* result now in r[0]...r[31] */
|
|
||||||
|
|
||||||
reduce_mul(r);
|
|
||||||
}
|
|
||||||
|
|
||||||
void fe25519_square(fe25519 *r, const fe25519 *x)
|
|
||||||
{
|
|
||||||
fe25519_mul(r, x, x);
|
|
||||||
}
|
|
||||||
|
|
||||||
void fe25519_invert(fe25519 *r, const fe25519 *x)
|
|
||||||
{
|
|
||||||
fe25519 z2;
|
|
||||||
fe25519 z9;
|
|
||||||
fe25519 z11;
|
|
||||||
fe25519 z2_5_0;
|
|
||||||
fe25519 z2_10_0;
|
|
||||||
fe25519 z2_20_0;
|
|
||||||
fe25519 z2_50_0;
|
|
||||||
fe25519 z2_100_0;
|
|
||||||
fe25519 t0;
|
|
||||||
fe25519 t1;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
/* 2 */ fe25519_square(&z2,x);
|
|
||||||
/* 4 */ fe25519_square(&t1,&z2);
|
|
||||||
/* 8 */ fe25519_square(&t0,&t1);
|
|
||||||
/* 9 */ fe25519_mul(&z9,&t0,x);
|
|
||||||
/* 11 */ fe25519_mul(&z11,&z9,&z2);
|
|
||||||
/* 22 */ fe25519_square(&t0,&z11);
|
|
||||||
/* 2^5 - 2^0 = 31 */ fe25519_mul(&z2_5_0,&t0,&z9);
|
|
||||||
|
|
||||||
/* 2^6 - 2^1 */ fe25519_square(&t0,&z2_5_0);
|
|
||||||
/* 2^7 - 2^2 */ fe25519_square(&t1,&t0);
|
|
||||||
/* 2^8 - 2^3 */ fe25519_square(&t0,&t1);
|
|
||||||
/* 2^9 - 2^4 */ fe25519_square(&t1,&t0);
|
|
||||||
/* 2^10 - 2^5 */ fe25519_square(&t0,&t1);
|
|
||||||
/* 2^10 - 2^0 */ fe25519_mul(&z2_10_0,&t0,&z2_5_0);
|
|
||||||
|
|
||||||
/* 2^11 - 2^1 */ fe25519_square(&t0,&z2_10_0);
|
|
||||||
/* 2^12 - 2^2 */ fe25519_square(&t1,&t0);
|
|
||||||
/* 2^20 - 2^10 */ for (i = 2;i < 10;i += 2) { fe25519_square(&t0,&t1); fe25519_square(&t1,&t0); }
|
|
||||||
/* 2^20 - 2^0 */ fe25519_mul(&z2_20_0,&t1,&z2_10_0);
|
|
||||||
|
|
||||||
/* 2^21 - 2^1 */ fe25519_square(&t0,&z2_20_0);
|
|
||||||
/* 2^22 - 2^2 */ fe25519_square(&t1,&t0);
|
|
||||||
/* 2^40 - 2^20 */ for (i = 2;i < 20;i += 2) { fe25519_square(&t0,&t1); fe25519_square(&t1,&t0); }
|
|
||||||
/* 2^40 - 2^0 */ fe25519_mul(&t0,&t1,&z2_20_0);
|
|
||||||
|
|
||||||
/* 2^41 - 2^1 */ fe25519_square(&t1,&t0);
|
|
||||||
/* 2^42 - 2^2 */ fe25519_square(&t0,&t1);
|
|
||||||
/* 2^50 - 2^10 */ for (i = 2;i < 10;i += 2) { fe25519_square(&t1,&t0); fe25519_square(&t0,&t1); }
|
|
||||||
/* 2^50 - 2^0 */ fe25519_mul(&z2_50_0,&t0,&z2_10_0);
|
|
||||||
|
|
||||||
/* 2^51 - 2^1 */ fe25519_square(&t0,&z2_50_0);
|
|
||||||
/* 2^52 - 2^2 */ fe25519_square(&t1,&t0);
|
|
||||||
/* 2^100 - 2^50 */ for (i = 2;i < 50;i += 2) { fe25519_square(&t0,&t1); fe25519_square(&t1,&t0); }
|
|
||||||
/* 2^100 - 2^0 */ fe25519_mul(&z2_100_0,&t1,&z2_50_0);
|
|
||||||
|
|
||||||
/* 2^101 - 2^1 */ fe25519_square(&t1,&z2_100_0);
|
|
||||||
/* 2^102 - 2^2 */ fe25519_square(&t0,&t1);
|
|
||||||
/* 2^200 - 2^100 */ for (i = 2;i < 100;i += 2) { fe25519_square(&t1,&t0); fe25519_square(&t0,&t1); }
|
|
||||||
/* 2^200 - 2^0 */ fe25519_mul(&t1,&t0,&z2_100_0);
|
|
||||||
|
|
||||||
/* 2^201 - 2^1 */ fe25519_square(&t0,&t1);
|
|
||||||
/* 2^202 - 2^2 */ fe25519_square(&t1,&t0);
|
|
||||||
/* 2^250 - 2^50 */ for (i = 2;i < 50;i += 2) { fe25519_square(&t0,&t1); fe25519_square(&t1,&t0); }
|
|
||||||
/* 2^250 - 2^0 */ fe25519_mul(&t0,&t1,&z2_50_0);
|
|
||||||
|
|
||||||
/* 2^251 - 2^1 */ fe25519_square(&t1,&t0);
|
|
||||||
/* 2^252 - 2^2 */ fe25519_square(&t0,&t1);
|
|
||||||
/* 2^253 - 2^3 */ fe25519_square(&t1,&t0);
|
|
||||||
/* 2^254 - 2^4 */ fe25519_square(&t0,&t1);
|
|
||||||
/* 2^255 - 2^5 */ fe25519_square(&t1,&t0);
|
|
||||||
/* 2^255 - 21 */ fe25519_mul(r,&t1,&z11);
|
|
||||||
}
|
|
||||||
|
|
||||||
void fe25519_pow2523(fe25519 *r, const fe25519 *x)
|
|
||||||
{
|
|
||||||
fe25519 z2;
|
|
||||||
fe25519 z9;
|
|
||||||
fe25519 z11;
|
|
||||||
fe25519 z2_5_0;
|
|
||||||
fe25519 z2_10_0;
|
|
||||||
fe25519 z2_20_0;
|
|
||||||
fe25519 z2_50_0;
|
|
||||||
fe25519 z2_100_0;
|
|
||||||
fe25519 t;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
/* 2 */ fe25519_square(&z2,x);
|
|
||||||
/* 4 */ fe25519_square(&t,&z2);
|
|
||||||
/* 8 */ fe25519_square(&t,&t);
|
|
||||||
/* 9 */ fe25519_mul(&z9,&t,x);
|
|
||||||
/* 11 */ fe25519_mul(&z11,&z9,&z2);
|
|
||||||
/* 22 */ fe25519_square(&t,&z11);
|
|
||||||
/* 2^5 - 2^0 = 31 */ fe25519_mul(&z2_5_0,&t,&z9);
|
|
||||||
|
|
||||||
/* 2^6 - 2^1 */ fe25519_square(&t,&z2_5_0);
|
|
||||||
/* 2^10 - 2^5 */ for (i = 1;i < 5;i++) { fe25519_square(&t,&t); }
|
|
||||||
/* 2^10 - 2^0 */ fe25519_mul(&z2_10_0,&t,&z2_5_0);
|
|
||||||
|
|
||||||
/* 2^11 - 2^1 */ fe25519_square(&t,&z2_10_0);
|
|
||||||
/* 2^20 - 2^10 */ for (i = 1;i < 10;i++) { fe25519_square(&t,&t); }
|
|
||||||
/* 2^20 - 2^0 */ fe25519_mul(&z2_20_0,&t,&z2_10_0);
|
|
||||||
|
|
||||||
/* 2^21 - 2^1 */ fe25519_square(&t,&z2_20_0);
|
|
||||||
/* 2^40 - 2^20 */ for (i = 1;i < 20;i++) { fe25519_square(&t,&t); }
|
|
||||||
/* 2^40 - 2^0 */ fe25519_mul(&t,&t,&z2_20_0);
|
|
||||||
|
|
||||||
/* 2^41 - 2^1 */ fe25519_square(&t,&t);
|
|
||||||
/* 2^50 - 2^10 */ for (i = 1;i < 10;i++) { fe25519_square(&t,&t); }
|
|
||||||
/* 2^50 - 2^0 */ fe25519_mul(&z2_50_0,&t,&z2_10_0);
|
|
||||||
|
|
||||||
/* 2^51 - 2^1 */ fe25519_square(&t,&z2_50_0);
|
|
||||||
/* 2^100 - 2^50 */ for (i = 1;i < 50;i++) { fe25519_square(&t,&t); }
|
|
||||||
/* 2^100 - 2^0 */ fe25519_mul(&z2_100_0,&t,&z2_50_0);
|
|
||||||
|
|
||||||
/* 2^101 - 2^1 */ fe25519_square(&t,&z2_100_0);
|
|
||||||
/* 2^200 - 2^100 */ for (i = 1;i < 100;i++) { fe25519_square(&t,&t); }
|
|
||||||
/* 2^200 - 2^0 */ fe25519_mul(&t,&t,&z2_100_0);
|
|
||||||
|
|
||||||
/* 2^201 - 2^1 */ fe25519_square(&t,&t);
|
|
||||||
/* 2^250 - 2^50 */ for (i = 1;i < 50;i++) { fe25519_square(&t,&t); }
|
|
||||||
/* 2^250 - 2^0 */ fe25519_mul(&t,&t,&z2_50_0);
|
|
||||||
|
|
||||||
/* 2^251 - 2^1 */ fe25519_square(&t,&t);
|
|
||||||
/* 2^252 - 2^2 */ fe25519_square(&t,&t);
|
|
||||||
/* 2^252 - 3 */ fe25519_mul(r,&t,x);
|
|
||||||
}
|
|
|
@ -1,70 +0,0 @@
|
||||||
/* $OpenBSD: fe25519.h,v 1.3 2013/12/09 11:03:45 markus Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Public Domain, Authors: Daniel J. Bernstein, Niels Duif, Tanja Lange,
|
|
||||||
* Peter Schwabe, Bo-Yin Yang.
|
|
||||||
* Copied from supercop-20130419/crypto_sign/ed25519/ref/fe25519.h
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef FE25519_H
|
|
||||||
#define FE25519_H
|
|
||||||
|
|
||||||
#include "crypto_api.h"
|
|
||||||
|
|
||||||
#define fe25519 crypto_sign_ed25519_ref_fe25519
|
|
||||||
#define fe25519_freeze crypto_sign_ed25519_ref_fe25519_freeze
|
|
||||||
#define fe25519_unpack crypto_sign_ed25519_ref_fe25519_unpack
|
|
||||||
#define fe25519_pack crypto_sign_ed25519_ref_fe25519_pack
|
|
||||||
#define fe25519_iszero crypto_sign_ed25519_ref_fe25519_iszero
|
|
||||||
#define fe25519_iseq_vartime crypto_sign_ed25519_ref_fe25519_iseq_vartime
|
|
||||||
#define fe25519_cmov crypto_sign_ed25519_ref_fe25519_cmov
|
|
||||||
#define fe25519_setone crypto_sign_ed25519_ref_fe25519_setone
|
|
||||||
#define fe25519_setzero crypto_sign_ed25519_ref_fe25519_setzero
|
|
||||||
#define fe25519_neg crypto_sign_ed25519_ref_fe25519_neg
|
|
||||||
#define fe25519_getparity crypto_sign_ed25519_ref_fe25519_getparity
|
|
||||||
#define fe25519_add crypto_sign_ed25519_ref_fe25519_add
|
|
||||||
#define fe25519_sub crypto_sign_ed25519_ref_fe25519_sub
|
|
||||||
#define fe25519_mul crypto_sign_ed25519_ref_fe25519_mul
|
|
||||||
#define fe25519_square crypto_sign_ed25519_ref_fe25519_square
|
|
||||||
#define fe25519_invert crypto_sign_ed25519_ref_fe25519_invert
|
|
||||||
#define fe25519_pow2523 crypto_sign_ed25519_ref_fe25519_pow2523
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
crypto_uint32 v[32];
|
|
||||||
}
|
|
||||||
fe25519;
|
|
||||||
|
|
||||||
void fe25519_freeze(fe25519 *r);
|
|
||||||
|
|
||||||
void fe25519_unpack(fe25519 *r, const unsigned char x[32]);
|
|
||||||
|
|
||||||
void fe25519_pack(unsigned char r[32], const fe25519 *x);
|
|
||||||
|
|
||||||
int fe25519_iszero(const fe25519 *x);
|
|
||||||
|
|
||||||
int fe25519_iseq_vartime(const fe25519 *x, const fe25519 *y);
|
|
||||||
|
|
||||||
void fe25519_cmov(fe25519 *r, const fe25519 *x, unsigned char b);
|
|
||||||
|
|
||||||
void fe25519_setone(fe25519 *r);
|
|
||||||
|
|
||||||
void fe25519_setzero(fe25519 *r);
|
|
||||||
|
|
||||||
void fe25519_neg(fe25519 *r, const fe25519 *x);
|
|
||||||
|
|
||||||
unsigned char fe25519_getparity(const fe25519 *x);
|
|
||||||
|
|
||||||
void fe25519_add(fe25519 *r, const fe25519 *x, const fe25519 *y);
|
|
||||||
|
|
||||||
void fe25519_sub(fe25519 *r, const fe25519 *x, const fe25519 *y);
|
|
||||||
|
|
||||||
void fe25519_mul(fe25519 *r, const fe25519 *x, const fe25519 *y);
|
|
||||||
|
|
||||||
void fe25519_square(fe25519 *r, const fe25519 *x);
|
|
||||||
|
|
||||||
void fe25519_invert(fe25519 *r, const fe25519 *x);
|
|
||||||
|
|
||||||
void fe25519_pow2523(fe25519 *r, const fe25519 *x);
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,43 +0,0 @@
|
||||||
/* $OpenBSD: ge25519.h,v 1.3 2013/12/09 11:03:45 markus Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Public Domain, Authors: Daniel J. Bernstein, Niels Duif, Tanja Lange,
|
|
||||||
* Peter Schwabe, Bo-Yin Yang.
|
|
||||||
* Copied from supercop-20130419/crypto_sign/ed25519/ref/ge25519.h
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef GE25519_H
|
|
||||||
#define GE25519_H
|
|
||||||
|
|
||||||
#include "fe25519.h"
|
|
||||||
#include "sc25519.h"
|
|
||||||
|
|
||||||
#define ge25519 crypto_sign_ed25519_ref_ge25519
|
|
||||||
#define ge25519_base crypto_sign_ed25519_ref_ge25519_base
|
|
||||||
#define ge25519_unpackneg_vartime crypto_sign_ed25519_ref_unpackneg_vartime
|
|
||||||
#define ge25519_pack crypto_sign_ed25519_ref_pack
|
|
||||||
#define ge25519_isneutral_vartime crypto_sign_ed25519_ref_isneutral_vartime
|
|
||||||
#define ge25519_double_scalarmult_vartime crypto_sign_ed25519_ref_double_scalarmult_vartime
|
|
||||||
#define ge25519_scalarmult_base crypto_sign_ed25519_ref_scalarmult_base
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
fe25519 x;
|
|
||||||
fe25519 y;
|
|
||||||
fe25519 z;
|
|
||||||
fe25519 t;
|
|
||||||
} ge25519;
|
|
||||||
|
|
||||||
const ge25519 ge25519_base;
|
|
||||||
|
|
||||||
int ge25519_unpackneg_vartime(ge25519 *r, const unsigned char p[32]);
|
|
||||||
|
|
||||||
void ge25519_pack(unsigned char r[32], const ge25519 *p);
|
|
||||||
|
|
||||||
int ge25519_isneutral_vartime(const ge25519 *p);
|
|
||||||
|
|
||||||
void ge25519_double_scalarmult_vartime(ge25519 *r, const ge25519 *p1, const sc25519 *s1, const ge25519 *p2, const sc25519 *s2);
|
|
||||||
|
|
||||||
void ge25519_scalarmult_base(ge25519 *r, const sc25519 *s);
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,858 +0,0 @@
|
||||||
/* $OpenBSD: ge25519_base.data,v 1.3 2013/12/09 11:03:45 markus Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Public Domain, Authors: Daniel J. Bernstein, Niels Duif, Tanja Lange,
|
|
||||||
* Peter Schwabe, Bo-Yin Yang.
|
|
||||||
* Copied from supercop-20130419/crypto_sign/ed25519/ref/ge25519_base.data
|
|
||||||
*/
|
|
||||||
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x1a, 0xd5, 0x25, 0x8f, 0x60, 0x2d, 0x56, 0xc9, 0xb2, 0xa7, 0x25, 0x95, 0x60, 0xc7, 0x2c, 0x69, 0x5c, 0xdc, 0xd6, 0xfd, 0x31, 0xe2, 0xa4, 0xc0, 0xfe, 0x53, 0x6e, 0xcd, 0xd3, 0x36, 0x69, 0x21}} ,
|
|
||||||
{{0x58, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66}}},
|
|
||||||
{{{0x0e, 0xce, 0x43, 0x28, 0x4e, 0xa1, 0xc5, 0x83, 0x5f, 0xa4, 0xd7, 0x15, 0x45, 0x8e, 0x0d, 0x08, 0xac, 0xe7, 0x33, 0x18, 0x7d, 0x3b, 0x04, 0x3d, 0x6c, 0x04, 0x5a, 0x9f, 0x4c, 0x38, 0xab, 0x36}} ,
|
|
||||||
{{0xc9, 0xa3, 0xf8, 0x6a, 0xae, 0x46, 0x5f, 0x0e, 0x56, 0x51, 0x38, 0x64, 0x51, 0x0f, 0x39, 0x97, 0x56, 0x1f, 0xa2, 0xc9, 0xe8, 0x5e, 0xa2, 0x1d, 0xc2, 0x29, 0x23, 0x09, 0xf3, 0xcd, 0x60, 0x22}}},
|
|
||||||
{{{0x5c, 0xe2, 0xf8, 0xd3, 0x5f, 0x48, 0x62, 0xac, 0x86, 0x48, 0x62, 0x81, 0x19, 0x98, 0x43, 0x63, 0x3a, 0xc8, 0xda, 0x3e, 0x74, 0xae, 0xf4, 0x1f, 0x49, 0x8f, 0x92, 0x22, 0x4a, 0x9c, 0xae, 0x67}} ,
|
|
||||||
{{0xd4, 0xb4, 0xf5, 0x78, 0x48, 0x68, 0xc3, 0x02, 0x04, 0x03, 0x24, 0x67, 0x17, 0xec, 0x16, 0x9f, 0xf7, 0x9e, 0x26, 0x60, 0x8e, 0xa1, 0x26, 0xa1, 0xab, 0x69, 0xee, 0x77, 0xd1, 0xb1, 0x67, 0x12}}},
|
|
||||||
{{{0x70, 0xf8, 0xc9, 0xc4, 0x57, 0xa6, 0x3a, 0x49, 0x47, 0x15, 0xce, 0x93, 0xc1, 0x9e, 0x73, 0x1a, 0xf9, 0x20, 0x35, 0x7a, 0xb8, 0xd4, 0x25, 0x83, 0x46, 0xf1, 0xcf, 0x56, 0xdb, 0xa8, 0x3d, 0x20}} ,
|
|
||||||
{{0x2f, 0x11, 0x32, 0xca, 0x61, 0xab, 0x38, 0xdf, 0xf0, 0x0f, 0x2f, 0xea, 0x32, 0x28, 0xf2, 0x4c, 0x6c, 0x71, 0xd5, 0x80, 0x85, 0xb8, 0x0e, 0x47, 0xe1, 0x95, 0x15, 0xcb, 0x27, 0xe8, 0xd0, 0x47}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0xc8, 0x84, 0xa5, 0x08, 0xbc, 0xfd, 0x87, 0x3b, 0x99, 0x8b, 0x69, 0x80, 0x7b, 0xc6, 0x3a, 0xeb, 0x93, 0xcf, 0x4e, 0xf8, 0x5c, 0x2d, 0x86, 0x42, 0xb6, 0x71, 0xd7, 0x97, 0x5f, 0xe1, 0x42, 0x67}} ,
|
|
||||||
{{0xb4, 0xb9, 0x37, 0xfc, 0xa9, 0x5b, 0x2f, 0x1e, 0x93, 0xe4, 0x1e, 0x62, 0xfc, 0x3c, 0x78, 0x81, 0x8f, 0xf3, 0x8a, 0x66, 0x09, 0x6f, 0xad, 0x6e, 0x79, 0x73, 0xe5, 0xc9, 0x00, 0x06, 0xd3, 0x21}}},
|
|
||||||
{{{0xf8, 0xf9, 0x28, 0x6c, 0x6d, 0x59, 0xb2, 0x59, 0x74, 0x23, 0xbf, 0xe7, 0x33, 0x8d, 0x57, 0x09, 0x91, 0x9c, 0x24, 0x08, 0x15, 0x2b, 0xe2, 0xb8, 0xee, 0x3a, 0xe5, 0x27, 0x06, 0x86, 0xa4, 0x23}} ,
|
|
||||||
{{0xeb, 0x27, 0x67, 0xc1, 0x37, 0xab, 0x7a, 0xd8, 0x27, 0x9c, 0x07, 0x8e, 0xff, 0x11, 0x6a, 0xb0, 0x78, 0x6e, 0xad, 0x3a, 0x2e, 0x0f, 0x98, 0x9f, 0x72, 0xc3, 0x7f, 0x82, 0xf2, 0x96, 0x96, 0x70}}},
|
|
||||||
{{{0x81, 0x6b, 0x88, 0xe8, 0x1e, 0xc7, 0x77, 0x96, 0x0e, 0xa1, 0xa9, 0x52, 0xe0, 0xd8, 0x0e, 0x61, 0x9e, 0x79, 0x2d, 0x95, 0x9c, 0x8d, 0x96, 0xe0, 0x06, 0x40, 0x5d, 0x87, 0x28, 0x5f, 0x98, 0x70}} ,
|
|
||||||
{{0xf1, 0x79, 0x7b, 0xed, 0x4f, 0x44, 0xb2, 0xe7, 0x08, 0x0d, 0xc2, 0x08, 0x12, 0xd2, 0x9f, 0xdf, 0xcd, 0x93, 0x20, 0x8a, 0xcf, 0x33, 0xca, 0x6d, 0x89, 0xb9, 0x77, 0xc8, 0x93, 0x1b, 0x4e, 0x60}}},
|
|
||||||
{{{0x26, 0x4f, 0x7e, 0x97, 0xf6, 0x40, 0xdd, 0x4f, 0xfc, 0x52, 0x78, 0xf9, 0x90, 0x31, 0x03, 0xe6, 0x7d, 0x56, 0x39, 0x0b, 0x1d, 0x56, 0x82, 0x85, 0xf9, 0x1a, 0x42, 0x17, 0x69, 0x6c, 0xcf, 0x39}} ,
|
|
||||||
{{0x69, 0xd2, 0x06, 0x3a, 0x4f, 0x39, 0x2d, 0xf9, 0x38, 0x40, 0x8c, 0x4c, 0xe7, 0x05, 0x12, 0xb4, 0x78, 0x8b, 0xf8, 0xc0, 0xec, 0x93, 0xde, 0x7a, 0x6b, 0xce, 0x2c, 0xe1, 0x0e, 0xa9, 0x34, 0x44}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x0b, 0xa4, 0x3c, 0xb0, 0x0f, 0x7a, 0x51, 0xf1, 0x78, 0xd6, 0xd9, 0x6a, 0xfd, 0x46, 0xe8, 0xb8, 0xa8, 0x79, 0x1d, 0x87, 0xf9, 0x90, 0xf2, 0x9c, 0x13, 0x29, 0xf8, 0x0b, 0x20, 0x64, 0xfa, 0x05}} ,
|
|
||||||
{{0x26, 0x09, 0xda, 0x17, 0xaf, 0x95, 0xd6, 0xfb, 0x6a, 0x19, 0x0d, 0x6e, 0x5e, 0x12, 0xf1, 0x99, 0x4c, 0xaa, 0xa8, 0x6f, 0x79, 0x86, 0xf4, 0x72, 0x28, 0x00, 0x26, 0xf9, 0xea, 0x9e, 0x19, 0x3d}}},
|
|
||||||
{{{0x87, 0xdd, 0xcf, 0xf0, 0x5b, 0x49, 0xa2, 0x5d, 0x40, 0x7a, 0x23, 0x26, 0xa4, 0x7a, 0x83, 0x8a, 0xb7, 0x8b, 0xd2, 0x1a, 0xbf, 0xea, 0x02, 0x24, 0x08, 0x5f, 0x7b, 0xa9, 0xb1, 0xbe, 0x9d, 0x37}} ,
|
|
||||||
{{0xfc, 0x86, 0x4b, 0x08, 0xee, 0xe7, 0xa0, 0xfd, 0x21, 0x45, 0x09, 0x34, 0xc1, 0x61, 0x32, 0x23, 0xfc, 0x9b, 0x55, 0x48, 0x53, 0x99, 0xf7, 0x63, 0xd0, 0x99, 0xce, 0x01, 0xe0, 0x9f, 0xeb, 0x28}}},
|
|
||||||
{{{0x47, 0xfc, 0xab, 0x5a, 0x17, 0xf0, 0x85, 0x56, 0x3a, 0x30, 0x86, 0x20, 0x28, 0x4b, 0x8e, 0x44, 0x74, 0x3a, 0x6e, 0x02, 0xf1, 0x32, 0x8f, 0x9f, 0x3f, 0x08, 0x35, 0xe9, 0xca, 0x16, 0x5f, 0x6e}} ,
|
|
||||||
{{0x1c, 0x59, 0x1c, 0x65, 0x5d, 0x34, 0xa4, 0x09, 0xcd, 0x13, 0x9c, 0x70, 0x7d, 0xb1, 0x2a, 0xc5, 0x88, 0xaf, 0x0b, 0x60, 0xc7, 0x9f, 0x34, 0x8d, 0xd6, 0xb7, 0x7f, 0xea, 0x78, 0x65, 0x8d, 0x77}}},
|
|
||||||
{{{0x56, 0xa5, 0xc2, 0x0c, 0xdd, 0xbc, 0xb8, 0x20, 0x6d, 0x57, 0x61, 0xb5, 0xfb, 0x78, 0xb5, 0xd4, 0x49, 0x54, 0x90, 0x26, 0xc1, 0xcb, 0xe9, 0xe6, 0xbf, 0xec, 0x1d, 0x4e, 0xed, 0x07, 0x7e, 0x5e}} ,
|
|
||||||
{{0xc7, 0xf6, 0x6c, 0x56, 0x31, 0x20, 0x14, 0x0e, 0xa8, 0xd9, 0x27, 0xc1, 0x9a, 0x3d, 0x1b, 0x7d, 0x0e, 0x26, 0xd3, 0x81, 0xaa, 0xeb, 0xf5, 0x6b, 0x79, 0x02, 0xf1, 0x51, 0x5c, 0x75, 0x55, 0x0f}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x0a, 0x34, 0xcd, 0x82, 0x3c, 0x33, 0x09, 0x54, 0xd2, 0x61, 0x39, 0x30, 0x9b, 0xfd, 0xef, 0x21, 0x26, 0xd4, 0x70, 0xfa, 0xee, 0xf9, 0x31, 0x33, 0x73, 0x84, 0xd0, 0xb3, 0x81, 0xbf, 0xec, 0x2e}} ,
|
|
||||||
{{0xe8, 0x93, 0x8b, 0x00, 0x64, 0xf7, 0x9c, 0xb8, 0x74, 0xe0, 0xe6, 0x49, 0x48, 0x4d, 0x4d, 0x48, 0xb6, 0x19, 0xa1, 0x40, 0xb7, 0xd9, 0x32, 0x41, 0x7c, 0x82, 0x37, 0xa1, 0x2d, 0xdc, 0xd2, 0x54}}},
|
|
||||||
{{{0x68, 0x2b, 0x4a, 0x5b, 0xd5, 0xc7, 0x51, 0x91, 0x1d, 0xe1, 0x2a, 0x4b, 0xc4, 0x47, 0xf1, 0xbc, 0x7a, 0xb3, 0xcb, 0xc8, 0xb6, 0x7c, 0xac, 0x90, 0x05, 0xfd, 0xf3, 0xf9, 0x52, 0x3a, 0x11, 0x6b}} ,
|
|
||||||
{{0x3d, 0xc1, 0x27, 0xf3, 0x59, 0x43, 0x95, 0x90, 0xc5, 0x96, 0x79, 0xf5, 0xf4, 0x95, 0x65, 0x29, 0x06, 0x9c, 0x51, 0x05, 0x18, 0xda, 0xb8, 0x2e, 0x79, 0x7e, 0x69, 0x59, 0x71, 0x01, 0xeb, 0x1a}}},
|
|
||||||
{{{0x15, 0x06, 0x49, 0xb6, 0x8a, 0x3c, 0xea, 0x2f, 0x34, 0x20, 0x14, 0xc3, 0xaa, 0xd6, 0xaf, 0x2c, 0x3e, 0xbd, 0x65, 0x20, 0xe2, 0x4d, 0x4b, 0x3b, 0xeb, 0x9f, 0x4a, 0xc3, 0xad, 0xa4, 0x3b, 0x60}} ,
|
|
||||||
{{0xbc, 0x58, 0xe6, 0xc0, 0x95, 0x2a, 0x2a, 0x81, 0x9a, 0x7a, 0xf3, 0xd2, 0x06, 0xbe, 0x48, 0xbc, 0x0c, 0xc5, 0x46, 0xe0, 0x6a, 0xd4, 0xac, 0x0f, 0xd9, 0xcc, 0x82, 0x34, 0x2c, 0xaf, 0xdb, 0x1f}}},
|
|
||||||
{{{0xf7, 0x17, 0x13, 0xbd, 0xfb, 0xbc, 0xd2, 0xec, 0x45, 0xb3, 0x15, 0x31, 0xe9, 0xaf, 0x82, 0x84, 0x3d, 0x28, 0xc6, 0xfc, 0x11, 0xf5, 0x41, 0xb5, 0x8b, 0xd3, 0x12, 0x76, 0x52, 0xe7, 0x1a, 0x3c}} ,
|
|
||||||
{{0x4e, 0x36, 0x11, 0x07, 0xa2, 0x15, 0x20, 0x51, 0xc4, 0x2a, 0xc3, 0x62, 0x8b, 0x5e, 0x7f, 0xa6, 0x0f, 0xf9, 0x45, 0x85, 0x6c, 0x11, 0x86, 0xb7, 0x7e, 0xe5, 0xd7, 0xf9, 0xc3, 0x91, 0x1c, 0x05}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0xea, 0xd6, 0xde, 0x29, 0x3a, 0x00, 0xb9, 0x02, 0x59, 0xcb, 0x26, 0xc4, 0xba, 0x99, 0xb1, 0x97, 0x2f, 0x8e, 0x00, 0x92, 0x26, 0x4f, 0x52, 0xeb, 0x47, 0x1b, 0x89, 0x8b, 0x24, 0xc0, 0x13, 0x7d}} ,
|
|
||||||
{{0xd5, 0x20, 0x5b, 0x80, 0xa6, 0x80, 0x20, 0x95, 0xc3, 0xe9, 0x9f, 0x8e, 0x87, 0x9e, 0x1e, 0x9e, 0x7a, 0xc7, 0xcc, 0x75, 0x6c, 0xa5, 0xf1, 0x91, 0x1a, 0xa8, 0x01, 0x2c, 0xab, 0x76, 0xa9, 0x59}}},
|
|
||||||
{{{0xde, 0xc9, 0xb1, 0x31, 0x10, 0x16, 0xaa, 0x35, 0x14, 0x6a, 0xd4, 0xb5, 0x34, 0x82, 0x71, 0xd2, 0x4a, 0x5d, 0x9a, 0x1f, 0x53, 0x26, 0x3c, 0xe5, 0x8e, 0x8d, 0x33, 0x7f, 0xff, 0xa9, 0xd5, 0x17}} ,
|
|
||||||
{{0x89, 0xaf, 0xf6, 0xa4, 0x64, 0xd5, 0x10, 0xe0, 0x1d, 0xad, 0xef, 0x44, 0xbd, 0xda, 0x83, 0xac, 0x7a, 0xa8, 0xf0, 0x1c, 0x07, 0xf9, 0xc3, 0x43, 0x6c, 0x3f, 0xb7, 0xd3, 0x87, 0x22, 0x02, 0x73}}},
|
|
||||||
{{{0x64, 0x1d, 0x49, 0x13, 0x2f, 0x71, 0xec, 0x69, 0x87, 0xd0, 0x42, 0xee, 0x13, 0xec, 0xe3, 0xed, 0x56, 0x7b, 0xbf, 0xbd, 0x8c, 0x2f, 0x7d, 0x7b, 0x9d, 0x28, 0xec, 0x8e, 0x76, 0x2f, 0x6f, 0x08}} ,
|
|
||||||
{{0x22, 0xf5, 0x5f, 0x4d, 0x15, 0xef, 0xfc, 0x4e, 0x57, 0x03, 0x36, 0x89, 0xf0, 0xeb, 0x5b, 0x91, 0xd6, 0xe2, 0xca, 0x01, 0xa5, 0xee, 0x52, 0xec, 0xa0, 0x3c, 0x8f, 0x33, 0x90, 0x5a, 0x94, 0x72}}},
|
|
||||||
{{{0x8a, 0x4b, 0xe7, 0x38, 0xbc, 0xda, 0xc2, 0xb0, 0x85, 0xe1, 0x4a, 0xfe, 0x2d, 0x44, 0x84, 0xcb, 0x20, 0x6b, 0x2d, 0xbf, 0x11, 0x9c, 0xd7, 0xbe, 0xd3, 0x3e, 0x5f, 0xbf, 0x68, 0xbc, 0xa8, 0x07}} ,
|
|
||||||
{{0x01, 0x89, 0x28, 0x22, 0x6a, 0x78, 0xaa, 0x29, 0x03, 0xc8, 0x74, 0x95, 0x03, 0x3e, 0xdc, 0xbd, 0x07, 0x13, 0xa8, 0xa2, 0x20, 0x2d, 0xb3, 0x18, 0x70, 0x42, 0xfd, 0x7a, 0xc4, 0xd7, 0x49, 0x72}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x02, 0xff, 0x32, 0x2b, 0x5c, 0x93, 0x54, 0x32, 0xe8, 0x57, 0x54, 0x1a, 0x8b, 0x33, 0x60, 0x65, 0xd3, 0x67, 0xa4, 0xc1, 0x26, 0xc4, 0xa4, 0x34, 0x1f, 0x9b, 0xa7, 0xa9, 0xf4, 0xd9, 0x4f, 0x5b}} ,
|
|
||||||
{{0x46, 0x8d, 0xb0, 0x33, 0x54, 0x26, 0x5b, 0x68, 0xdf, 0xbb, 0xc5, 0xec, 0xc2, 0xf9, 0x3c, 0x5a, 0x37, 0xc1, 0x8e, 0x27, 0x47, 0xaa, 0x49, 0x5a, 0xf8, 0xfb, 0x68, 0x04, 0x23, 0xd1, 0xeb, 0x40}}},
|
|
||||||
{{{0x65, 0xa5, 0x11, 0x84, 0x8a, 0x67, 0x9d, 0x9e, 0xd1, 0x44, 0x68, 0x7a, 0x34, 0xe1, 0x9f, 0xa3, 0x54, 0xcd, 0x07, 0xca, 0x79, 0x1f, 0x54, 0x2f, 0x13, 0x70, 0x4e, 0xee, 0xa2, 0xfa, 0xe7, 0x5d}} ,
|
|
||||||
{{0x36, 0xec, 0x54, 0xf8, 0xce, 0xe4, 0x85, 0xdf, 0xf6, 0x6f, 0x1d, 0x90, 0x08, 0xbc, 0xe8, 0xc0, 0x92, 0x2d, 0x43, 0x6b, 0x92, 0xa9, 0x8e, 0xab, 0x0a, 0x2e, 0x1c, 0x1e, 0x64, 0x23, 0x9f, 0x2c}}},
|
|
||||||
{{{0xa7, 0xd6, 0x2e, 0xd5, 0xcc, 0xd4, 0xcb, 0x5a, 0x3b, 0xa7, 0xf9, 0x46, 0x03, 0x1d, 0xad, 0x2b, 0x34, 0x31, 0x90, 0x00, 0x46, 0x08, 0x82, 0x14, 0xc4, 0xe0, 0x9c, 0xf0, 0xe3, 0x55, 0x43, 0x31}} ,
|
|
||||||
{{0x60, 0xd6, 0xdd, 0x78, 0xe6, 0xd4, 0x22, 0x42, 0x1f, 0x00, 0xf9, 0xb1, 0x6a, 0x63, 0xe2, 0x92, 0x59, 0xd1, 0x1a, 0xb7, 0x00, 0x54, 0x29, 0xc9, 0xc1, 0xf6, 0x6f, 0x7a, 0xc5, 0x3c, 0x5f, 0x65}}},
|
|
||||||
{{{0x27, 0x4f, 0xd0, 0x72, 0xb1, 0x11, 0x14, 0x27, 0x15, 0x94, 0x48, 0x81, 0x7e, 0x74, 0xd8, 0x32, 0xd5, 0xd1, 0x11, 0x28, 0x60, 0x63, 0x36, 0x32, 0x37, 0xb5, 0x13, 0x1c, 0xa0, 0x37, 0xe3, 0x74}} ,
|
|
||||||
{{0xf1, 0x25, 0x4e, 0x11, 0x96, 0x67, 0xe6, 0x1c, 0xc2, 0xb2, 0x53, 0xe2, 0xda, 0x85, 0xee, 0xb2, 0x9f, 0x59, 0xf3, 0xba, 0xbd, 0xfa, 0xcf, 0x6e, 0xf9, 0xda, 0xa4, 0xb3, 0x02, 0x8f, 0x64, 0x08}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x34, 0x94, 0xf2, 0x64, 0x54, 0x47, 0x37, 0x07, 0x40, 0x8a, 0x20, 0xba, 0x4a, 0x55, 0xd7, 0x3f, 0x47, 0xba, 0x25, 0x23, 0x14, 0xb0, 0x2c, 0xe8, 0x55, 0xa8, 0xa6, 0xef, 0x51, 0xbd, 0x6f, 0x6a}} ,
|
|
||||||
{{0x71, 0xd6, 0x16, 0x76, 0xb2, 0x06, 0xea, 0x79, 0xf5, 0xc4, 0xc3, 0x52, 0x7e, 0x61, 0xd1, 0xe1, 0xad, 0x70, 0x78, 0x1d, 0x16, 0x11, 0xf8, 0x7c, 0x2b, 0xfc, 0x55, 0x9f, 0x52, 0xf8, 0xf5, 0x16}}},
|
|
||||||
{{{0x34, 0x96, 0x9a, 0xf6, 0xc5, 0xe0, 0x14, 0x03, 0x24, 0x0e, 0x4c, 0xad, 0x9e, 0x9a, 0x70, 0x23, 0x96, 0xb2, 0xf1, 0x2e, 0x9d, 0xc3, 0x32, 0x9b, 0x54, 0xa5, 0x73, 0xde, 0x88, 0xb1, 0x3e, 0x24}} ,
|
|
||||||
{{0xf6, 0xe2, 0x4c, 0x1f, 0x5b, 0xb2, 0xaf, 0x82, 0xa5, 0xcf, 0x81, 0x10, 0x04, 0xef, 0xdb, 0xa2, 0xcc, 0x24, 0xb2, 0x7e, 0x0b, 0x7a, 0xeb, 0x01, 0xd8, 0x52, 0xf4, 0x51, 0x89, 0x29, 0x79, 0x37}}},
|
|
||||||
{{{0x74, 0xde, 0x12, 0xf3, 0x68, 0xb7, 0x66, 0xc3, 0xee, 0x68, 0xdc, 0x81, 0xb5, 0x55, 0x99, 0xab, 0xd9, 0x28, 0x63, 0x6d, 0x8b, 0x40, 0x69, 0x75, 0x6c, 0xcd, 0x5c, 0x2a, 0x7e, 0x32, 0x7b, 0x29}} ,
|
|
||||||
{{0x02, 0xcc, 0x22, 0x74, 0x4d, 0x19, 0x07, 0xc0, 0xda, 0xb5, 0x76, 0x51, 0x2a, 0xaa, 0xa6, 0x0a, 0x5f, 0x26, 0xd4, 0xbc, 0xaf, 0x48, 0x88, 0x7f, 0x02, 0xbc, 0xf2, 0xe1, 0xcf, 0xe9, 0xdd, 0x15}}},
|
|
||||||
{{{0xed, 0xb5, 0x9a, 0x8c, 0x9a, 0xdd, 0x27, 0xf4, 0x7f, 0x47, 0xd9, 0x52, 0xa7, 0xcd, 0x65, 0xa5, 0x31, 0x22, 0xed, 0xa6, 0x63, 0x5b, 0x80, 0x4a, 0xad, 0x4d, 0xed, 0xbf, 0xee, 0x49, 0xb3, 0x06}} ,
|
|
||||||
{{0xf8, 0x64, 0x8b, 0x60, 0x90, 0xe9, 0xde, 0x44, 0x77, 0xb9, 0x07, 0x36, 0x32, 0xc2, 0x50, 0xf5, 0x65, 0xdf, 0x48, 0x4c, 0x37, 0xaa, 0x68, 0xab, 0x9a, 0x1f, 0x3e, 0xff, 0x89, 0x92, 0xa0, 0x07}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x7d, 0x4f, 0x9c, 0x19, 0xc0, 0x4a, 0x31, 0xec, 0xf9, 0xaa, 0xeb, 0xb2, 0x16, 0x9c, 0xa3, 0x66, 0x5f, 0xd1, 0xd4, 0xed, 0xb8, 0x92, 0x1c, 0xab, 0xda, 0xea, 0xd9, 0x57, 0xdf, 0x4c, 0x2a, 0x48}} ,
|
|
||||||
{{0x4b, 0xb0, 0x4e, 0x6e, 0x11, 0x3b, 0x51, 0xbd, 0x6a, 0xfd, 0xe4, 0x25, 0xa5, 0x5f, 0x11, 0x3f, 0x98, 0x92, 0x51, 0x14, 0xc6, 0x5f, 0x3c, 0x0b, 0xa8, 0xf7, 0xc2, 0x81, 0x43, 0xde, 0x91, 0x73}}},
|
|
||||||
{{{0x3c, 0x8f, 0x9f, 0x33, 0x2a, 0x1f, 0x43, 0x33, 0x8f, 0x68, 0xff, 0x1f, 0x3d, 0x73, 0x6b, 0xbf, 0x68, 0xcc, 0x7d, 0x13, 0x6c, 0x24, 0x4b, 0xcc, 0x4d, 0x24, 0x0d, 0xfe, 0xde, 0x86, 0xad, 0x3b}} ,
|
|
||||||
{{0x79, 0x51, 0x81, 0x01, 0xdc, 0x73, 0x53, 0xe0, 0x6e, 0x9b, 0xea, 0x68, 0x3f, 0x5c, 0x14, 0x84, 0x53, 0x8d, 0x4b, 0xc0, 0x9f, 0x9f, 0x89, 0x2b, 0x8c, 0xba, 0x86, 0xfa, 0xf2, 0xcd, 0xe3, 0x2d}}},
|
|
||||||
{{{0x06, 0xf9, 0x29, 0x5a, 0xdb, 0x3d, 0x84, 0x52, 0xab, 0xcc, 0x6b, 0x60, 0x9d, 0xb7, 0x4a, 0x0e, 0x36, 0x63, 0x91, 0xad, 0xa0, 0x95, 0xb0, 0x97, 0x89, 0x4e, 0xcf, 0x7d, 0x3c, 0xe5, 0x7c, 0x28}} ,
|
|
||||||
{{0x2e, 0x69, 0x98, 0xfd, 0xc6, 0xbd, 0xcc, 0xca, 0xdf, 0x9a, 0x44, 0x7e, 0x9d, 0xca, 0x89, 0x6d, 0xbf, 0x27, 0xc2, 0xf8, 0xcd, 0x46, 0x00, 0x2b, 0xb5, 0x58, 0x4e, 0xb7, 0x89, 0x09, 0xe9, 0x2d}}},
|
|
||||||
{{{0x54, 0xbe, 0x75, 0xcb, 0x05, 0xb0, 0x54, 0xb7, 0xe7, 0x26, 0x86, 0x4a, 0xfc, 0x19, 0xcf, 0x27, 0x46, 0xd4, 0x22, 0x96, 0x5a, 0x11, 0xe8, 0xd5, 0x1b, 0xed, 0x71, 0xc5, 0x5d, 0xc8, 0xaf, 0x45}} ,
|
|
||||||
{{0x40, 0x7b, 0x77, 0x57, 0x49, 0x9e, 0x80, 0x39, 0x23, 0xee, 0x81, 0x0b, 0x22, 0xcf, 0xdb, 0x7a, 0x2f, 0x14, 0xb8, 0x57, 0x8f, 0xa1, 0x39, 0x1e, 0x77, 0xfc, 0x0b, 0xa6, 0xbf, 0x8a, 0x0c, 0x6c}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x77, 0x3a, 0xd4, 0xd8, 0x27, 0xcf, 0xe8, 0xa1, 0x72, 0x9d, 0xca, 0xdd, 0x0d, 0x96, 0xda, 0x79, 0xed, 0x56, 0x42, 0x15, 0x60, 0xc7, 0x1c, 0x6b, 0x26, 0x30, 0xf6, 0x6a, 0x95, 0x67, 0xf3, 0x0a}} ,
|
|
||||||
{{0xc5, 0x08, 0xa4, 0x2b, 0x2f, 0xbd, 0x31, 0x81, 0x2a, 0xa6, 0xb6, 0xe4, 0x00, 0x91, 0xda, 0x3d, 0xb2, 0xb0, 0x96, 0xce, 0x8a, 0xd2, 0x8d, 0x70, 0xb3, 0xd3, 0x34, 0x01, 0x90, 0x8d, 0x10, 0x21}}},
|
|
||||||
{{{0x33, 0x0d, 0xe7, 0xba, 0x4f, 0x07, 0xdf, 0x8d, 0xea, 0x7d, 0xa0, 0xc5, 0xd6, 0xb1, 0xb0, 0xe5, 0x57, 0x1b, 0x5b, 0xf5, 0x45, 0x13, 0x14, 0x64, 0x5a, 0xeb, 0x5c, 0xfc, 0x54, 0x01, 0x76, 0x2b}} ,
|
|
||||||
{{0x02, 0x0c, 0xc2, 0xaf, 0x96, 0x36, 0xfe, 0x4a, 0xe2, 0x54, 0x20, 0x6a, 0xeb, 0xb2, 0x9f, 0x62, 0xd7, 0xce, 0xa2, 0x3f, 0x20, 0x11, 0x34, 0x37, 0xe0, 0x42, 0xed, 0x6f, 0xf9, 0x1a, 0xc8, 0x7d}}},
|
|
||||||
{{{0xd8, 0xb9, 0x11, 0xe8, 0x36, 0x3f, 0x42, 0xc1, 0xca, 0xdc, 0xd3, 0xf1, 0xc8, 0x23, 0x3d, 0x4f, 0x51, 0x7b, 0x9d, 0x8d, 0xd8, 0xe4, 0xa0, 0xaa, 0xf3, 0x04, 0xd6, 0x11, 0x93, 0xc8, 0x35, 0x45}} ,
|
|
||||||
{{0x61, 0x36, 0xd6, 0x08, 0x90, 0xbf, 0xa7, 0x7a, 0x97, 0x6c, 0x0f, 0x84, 0xd5, 0x33, 0x2d, 0x37, 0xc9, 0x6a, 0x80, 0x90, 0x3d, 0x0a, 0xa2, 0xaa, 0xe1, 0xb8, 0x84, 0xba, 0x61, 0x36, 0xdd, 0x69}}},
|
|
||||||
{{{0x6b, 0xdb, 0x5b, 0x9c, 0xc6, 0x92, 0xbc, 0x23, 0xaf, 0xc5, 0xb8, 0x75, 0xf8, 0x42, 0xfa, 0xd6, 0xb6, 0x84, 0x94, 0x63, 0x98, 0x93, 0x48, 0x78, 0x38, 0xcd, 0xbb, 0x18, 0x34, 0xc3, 0xdb, 0x67}} ,
|
|
||||||
{{0x96, 0xf3, 0x3a, 0x09, 0x56, 0xb0, 0x6f, 0x7c, 0x51, 0x1e, 0x1b, 0x39, 0x48, 0xea, 0xc9, 0x0c, 0x25, 0xa2, 0x7a, 0xca, 0xe7, 0x92, 0xfc, 0x59, 0x30, 0xa3, 0x89, 0x85, 0xdf, 0x6f, 0x43, 0x38}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x79, 0x84, 0x44, 0x19, 0xbd, 0xe9, 0x54, 0xc4, 0xc0, 0x6e, 0x2a, 0xa8, 0xa8, 0x9b, 0x43, 0xd5, 0x71, 0x22, 0x5f, 0xdc, 0x01, 0xfa, 0xdf, 0xb3, 0xb8, 0x47, 0x4b, 0x0a, 0xa5, 0x44, 0xea, 0x29}} ,
|
|
||||||
{{0x05, 0x90, 0x50, 0xaf, 0x63, 0x5f, 0x9d, 0x9e, 0xe1, 0x9d, 0x38, 0x97, 0x1f, 0x6c, 0xac, 0x30, 0x46, 0xb2, 0x6a, 0x19, 0xd1, 0x4b, 0xdb, 0xbb, 0x8c, 0xda, 0x2e, 0xab, 0xc8, 0x5a, 0x77, 0x6c}}},
|
|
||||||
{{{0x2b, 0xbe, 0xaf, 0xa1, 0x6d, 0x2f, 0x0b, 0xb1, 0x8f, 0xe3, 0xe0, 0x38, 0xcd, 0x0b, 0x41, 0x1b, 0x4a, 0x15, 0x07, 0xf3, 0x6f, 0xdc, 0xb8, 0xe9, 0xde, 0xb2, 0xa3, 0x40, 0x01, 0xa6, 0x45, 0x1e}} ,
|
|
||||||
{{0x76, 0x0a, 0xda, 0x8d, 0x2c, 0x07, 0x3f, 0x89, 0x7d, 0x04, 0xad, 0x43, 0x50, 0x6e, 0xd2, 0x47, 0xcb, 0x8a, 0xe6, 0x85, 0x1a, 0x24, 0xf3, 0xd2, 0x60, 0xfd, 0xdf, 0x73, 0xa4, 0x0d, 0x73, 0x0e}}},
|
|
||||||
{{{0xfd, 0x67, 0x6b, 0x71, 0x9b, 0x81, 0x53, 0x39, 0x39, 0xf4, 0xb8, 0xd5, 0xc3, 0x30, 0x9b, 0x3b, 0x7c, 0xa3, 0xf0, 0xd0, 0x84, 0x21, 0xd6, 0xbf, 0xb7, 0x4c, 0x87, 0x13, 0x45, 0x2d, 0xa7, 0x55}} ,
|
|
||||||
{{0x5d, 0x04, 0xb3, 0x40, 0x28, 0x95, 0x2d, 0x30, 0x83, 0xec, 0x5e, 0xe4, 0xff, 0x75, 0xfe, 0x79, 0x26, 0x9d, 0x1d, 0x36, 0xcd, 0x0a, 0x15, 0xd2, 0x24, 0x14, 0x77, 0x71, 0xd7, 0x8a, 0x1b, 0x04}}},
|
|
||||||
{{{0x5d, 0x93, 0xc9, 0xbe, 0xaa, 0x90, 0xcd, 0x9b, 0xfb, 0x73, 0x7e, 0xb0, 0x64, 0x98, 0x57, 0x44, 0x42, 0x41, 0xb1, 0xaf, 0xea, 0xc1, 0xc3, 0x22, 0xff, 0x60, 0x46, 0xcb, 0x61, 0x81, 0x70, 0x61}} ,
|
|
||||||
{{0x0d, 0x82, 0xb9, 0xfe, 0x21, 0xcd, 0xc4, 0xf5, 0x98, 0x0c, 0x4e, 0x72, 0xee, 0x87, 0x49, 0xf8, 0xa1, 0x95, 0xdf, 0x8f, 0x2d, 0xbd, 0x21, 0x06, 0x7c, 0x15, 0xe8, 0x12, 0x6d, 0x93, 0xd6, 0x38}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x91, 0xf7, 0x51, 0xd9, 0xef, 0x7d, 0x42, 0x01, 0x13, 0xe9, 0xb8, 0x7f, 0xa6, 0x49, 0x17, 0x64, 0x21, 0x80, 0x83, 0x2c, 0x63, 0x4c, 0x60, 0x09, 0x59, 0x91, 0x92, 0x77, 0x39, 0x51, 0xf4, 0x48}} ,
|
|
||||||
{{0x60, 0xd5, 0x22, 0x83, 0x08, 0x2f, 0xff, 0x99, 0x3e, 0x69, 0x6d, 0x88, 0xda, 0xe7, 0x5b, 0x52, 0x26, 0x31, 0x2a, 0xe5, 0x89, 0xde, 0x68, 0x90, 0xb6, 0x22, 0x5a, 0xbd, 0xd3, 0x85, 0x53, 0x31}}},
|
|
||||||
{{{0xd8, 0xce, 0xdc, 0xf9, 0x3c, 0x4b, 0xa2, 0x1d, 0x2c, 0x2f, 0x36, 0xbe, 0x7a, 0xfc, 0xcd, 0xbc, 0xdc, 0xf9, 0x30, 0xbd, 0xff, 0x05, 0xc7, 0xe4, 0x8e, 0x17, 0x62, 0xf8, 0x4d, 0xa0, 0x56, 0x79}} ,
|
|
||||||
{{0x82, 0xe7, 0xf6, 0xba, 0x53, 0x84, 0x0a, 0xa3, 0x34, 0xff, 0x3c, 0xa3, 0x6a, 0xa1, 0x37, 0xea, 0xdd, 0xb6, 0x95, 0xb3, 0x78, 0x19, 0x76, 0x1e, 0x55, 0x2f, 0x77, 0x2e, 0x7f, 0xc1, 0xea, 0x5e}}},
|
|
||||||
{{{0x83, 0xe1, 0x6e, 0xa9, 0x07, 0x33, 0x3e, 0x83, 0xff, 0xcb, 0x1c, 0x9f, 0xb1, 0xa3, 0xb4, 0xc9, 0xe1, 0x07, 0x97, 0xff, 0xf8, 0x23, 0x8f, 0xce, 0x40, 0xfd, 0x2e, 0x5e, 0xdb, 0x16, 0x43, 0x2d}} ,
|
|
||||||
{{0xba, 0x38, 0x02, 0xf7, 0x81, 0x43, 0x83, 0xa3, 0x20, 0x4f, 0x01, 0x3b, 0x8a, 0x04, 0x38, 0x31, 0xc6, 0x0f, 0xc8, 0xdf, 0xd7, 0xfa, 0x2f, 0x88, 0x3f, 0xfc, 0x0c, 0x76, 0xc4, 0xa6, 0x45, 0x72}}},
|
|
||||||
{{{0xbb, 0x0c, 0xbc, 0x6a, 0xa4, 0x97, 0x17, 0x93, 0x2d, 0x6f, 0xde, 0x72, 0x10, 0x1c, 0x08, 0x2c, 0x0f, 0x80, 0x32, 0x68, 0x27, 0xd4, 0xab, 0xdd, 0xc5, 0x58, 0x61, 0x13, 0x6d, 0x11, 0x1e, 0x4d}} ,
|
|
||||||
{{0x1a, 0xb9, 0xc9, 0x10, 0xfb, 0x1e, 0x4e, 0xf4, 0x84, 0x4b, 0x8a, 0x5e, 0x7b, 0x4b, 0xe8, 0x43, 0x8c, 0x8f, 0x00, 0xb5, 0x54, 0x13, 0xc5, 0x5c, 0xb6, 0x35, 0x4e, 0x9d, 0xe4, 0x5b, 0x41, 0x6d}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x15, 0x7d, 0x12, 0x48, 0x82, 0x14, 0x42, 0xcd, 0x32, 0xd4, 0x4b, 0xc1, 0x72, 0x61, 0x2a, 0x8c, 0xec, 0xe2, 0xf8, 0x24, 0x45, 0x94, 0xe3, 0xbe, 0xdd, 0x67, 0xa8, 0x77, 0x5a, 0xae, 0x5b, 0x4b}} ,
|
|
||||||
{{0xcb, 0x77, 0x9a, 0x20, 0xde, 0xb8, 0x23, 0xd9, 0xa0, 0x0f, 0x8c, 0x7b, 0xa5, 0xcb, 0xae, 0xb6, 0xec, 0x42, 0x67, 0x0e, 0x58, 0xa4, 0x75, 0x98, 0x21, 0x71, 0x84, 0xb3, 0xe0, 0x76, 0x94, 0x73}}},
|
|
||||||
{{{0xdf, 0xfc, 0x69, 0x28, 0x23, 0x3f, 0x5b, 0xf8, 0x3b, 0x24, 0x37, 0xf3, 0x1d, 0xd5, 0x22, 0x6b, 0xd0, 0x98, 0xa8, 0x6c, 0xcf, 0xff, 0x06, 0xe1, 0x13, 0xdf, 0xb9, 0xc1, 0x0c, 0xa9, 0xbf, 0x33}} ,
|
|
||||||
{{0xd9, 0x81, 0xda, 0xb2, 0x4f, 0x82, 0x9d, 0x43, 0x81, 0x09, 0xf1, 0xd2, 0x01, 0xef, 0xac, 0xf4, 0x2d, 0x7d, 0x01, 0x09, 0xf1, 0xff, 0xa5, 0x9f, 0xe5, 0xca, 0x27, 0x63, 0xdb, 0x20, 0xb1, 0x53}}},
|
|
||||||
{{{0x67, 0x02, 0xe8, 0xad, 0xa9, 0x34, 0xd4, 0xf0, 0x15, 0x81, 0xaa, 0xc7, 0x4d, 0x87, 0x94, 0xea, 0x75, 0xe7, 0x4c, 0x94, 0x04, 0x0e, 0x69, 0x87, 0xe7, 0x51, 0x91, 0x10, 0x03, 0xc7, 0xbe, 0x56}} ,
|
|
||||||
{{0x32, 0xfb, 0x86, 0xec, 0x33, 0x6b, 0x2e, 0x51, 0x2b, 0xc8, 0xfa, 0x6c, 0x70, 0x47, 0x7e, 0xce, 0x05, 0x0c, 0x71, 0xf3, 0xb4, 0x56, 0xa6, 0xdc, 0xcc, 0x78, 0x07, 0x75, 0xd0, 0xdd, 0xb2, 0x6a}}},
|
|
||||||
{{{0xc6, 0xef, 0xb9, 0xc0, 0x2b, 0x22, 0x08, 0x1e, 0x71, 0x70, 0xb3, 0x35, 0x9c, 0x7a, 0x01, 0x92, 0x44, 0x9a, 0xf6, 0xb0, 0x58, 0x95, 0xc1, 0x9b, 0x02, 0xed, 0x2d, 0x7c, 0x34, 0x29, 0x49, 0x44}} ,
|
|
||||||
{{0x45, 0x62, 0x1d, 0x2e, 0xff, 0x2a, 0x1c, 0x21, 0xa4, 0x25, 0x7b, 0x0d, 0x8c, 0x15, 0x39, 0xfc, 0x8f, 0x7c, 0xa5, 0x7d, 0x1e, 0x25, 0xa3, 0x45, 0xd6, 0xab, 0xbd, 0xcb, 0xc5, 0x5e, 0x78, 0x77}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0xd0, 0xd3, 0x42, 0xed, 0x1d, 0x00, 0x3c, 0x15, 0x2c, 0x9c, 0x77, 0x81, 0xd2, 0x73, 0xd1, 0x06, 0xd5, 0xc4, 0x7f, 0x94, 0xbb, 0x92, 0x2d, 0x2c, 0x4b, 0x45, 0x4b, 0xe9, 0x2a, 0x89, 0x6b, 0x2b}} ,
|
|
||||||
{{0xd2, 0x0c, 0x88, 0xc5, 0x48, 0x4d, 0xea, 0x0d, 0x4a, 0xc9, 0x52, 0x6a, 0x61, 0x79, 0xe9, 0x76, 0xf3, 0x85, 0x52, 0x5c, 0x1b, 0x2c, 0xe1, 0xd6, 0xc4, 0x0f, 0x18, 0x0e, 0x4e, 0xf6, 0x1c, 0x7f}}},
|
|
||||||
{{{0xb4, 0x04, 0x2e, 0x42, 0xcb, 0x1f, 0x2b, 0x11, 0x51, 0x7b, 0x08, 0xac, 0xaa, 0x3e, 0x9e, 0x52, 0x60, 0xb7, 0xc2, 0x61, 0x57, 0x8c, 0x84, 0xd5, 0x18, 0xa6, 0x19, 0xfc, 0xb7, 0x75, 0x91, 0x1b}} ,
|
|
||||||
{{0xe8, 0x68, 0xca, 0x44, 0xc8, 0x38, 0x38, 0xcc, 0x53, 0x0a, 0x32, 0x35, 0xcc, 0x52, 0xcb, 0x0e, 0xf7, 0xc5, 0xe7, 0xec, 0x3d, 0x85, 0xcc, 0x58, 0xe2, 0x17, 0x47, 0xff, 0x9f, 0xa5, 0x30, 0x17}}},
|
|
||||||
{{{0xe3, 0xae, 0xc8, 0xc1, 0x71, 0x75, 0x31, 0x00, 0x37, 0x41, 0x5c, 0x0e, 0x39, 0xda, 0x73, 0xa0, 0xc7, 0x97, 0x36, 0x6c, 0x5b, 0xf2, 0xee, 0x64, 0x0a, 0x3d, 0x89, 0x1e, 0x1d, 0x49, 0x8c, 0x37}} ,
|
|
||||||
{{0x4c, 0xe6, 0xb0, 0xc1, 0xa5, 0x2a, 0x82, 0x09, 0x08, 0xad, 0x79, 0x9c, 0x56, 0xf6, 0xf9, 0xc1, 0xd7, 0x7c, 0x39, 0x7f, 0x93, 0xca, 0x11, 0x55, 0xbf, 0x07, 0x1b, 0x82, 0x29, 0x69, 0x95, 0x5c}}},
|
|
||||||
{{{0x87, 0xee, 0xa6, 0x56, 0x9e, 0xc2, 0x9a, 0x56, 0x24, 0x42, 0x85, 0x4d, 0x98, 0x31, 0x1e, 0x60, 0x4d, 0x87, 0x85, 0x04, 0xae, 0x46, 0x12, 0xf9, 0x8e, 0x7f, 0xe4, 0x7f, 0xf6, 0x1c, 0x37, 0x01}} ,
|
|
||||||
{{0x73, 0x4c, 0xb6, 0xc5, 0xc4, 0xe9, 0x6c, 0x85, 0x48, 0x4a, 0x5a, 0xac, 0xd9, 0x1f, 0x43, 0xf8, 0x62, 0x5b, 0xee, 0x98, 0x2a, 0x33, 0x8e, 0x79, 0xce, 0x61, 0x06, 0x35, 0xd8, 0xd7, 0xca, 0x71}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x72, 0xd3, 0xae, 0xa6, 0xca, 0x8f, 0xcd, 0xcc, 0x78, 0x8e, 0x19, 0x4d, 0xa7, 0xd2, 0x27, 0xe9, 0xa4, 0x3c, 0x16, 0x5b, 0x84, 0x80, 0xf9, 0xd0, 0xcc, 0x6a, 0x1e, 0xca, 0x1e, 0x67, 0xbd, 0x63}} ,
|
|
||||||
{{0x7b, 0x6e, 0x2a, 0xd2, 0x87, 0x48, 0xff, 0xa1, 0xca, 0xe9, 0x15, 0x85, 0xdc, 0xdb, 0x2c, 0x39, 0x12, 0x91, 0xa9, 0x20, 0xaa, 0x4f, 0x29, 0xf4, 0x15, 0x7a, 0xd2, 0xf5, 0x32, 0xcc, 0x60, 0x04}}},
|
|
||||||
{{{0xe5, 0x10, 0x47, 0x3b, 0xfa, 0x90, 0xfc, 0x30, 0xb5, 0xea, 0x6f, 0x56, 0x8f, 0xfb, 0x0e, 0xa7, 0x3b, 0xc8, 0xb2, 0xff, 0x02, 0x7a, 0x33, 0x94, 0x93, 0x2a, 0x03, 0xe0, 0x96, 0x3a, 0x6c, 0x0f}} ,
|
|
||||||
{{0x5a, 0x63, 0x67, 0xe1, 0x9b, 0x47, 0x78, 0x9f, 0x38, 0x79, 0xac, 0x97, 0x66, 0x1d, 0x5e, 0x51, 0xee, 0x24, 0x42, 0xe8, 0x58, 0x4b, 0x8a, 0x03, 0x75, 0x86, 0x37, 0x86, 0xe2, 0x97, 0x4e, 0x3d}}},
|
|
||||||
{{{0x3f, 0x75, 0x8e, 0xb4, 0xff, 0xd8, 0xdd, 0xd6, 0x37, 0x57, 0x9d, 0x6d, 0x3b, 0xbd, 0xd5, 0x60, 0x88, 0x65, 0x9a, 0xb9, 0x4a, 0x68, 0x84, 0xa2, 0x67, 0xdd, 0x17, 0x25, 0x97, 0x04, 0x8b, 0x5e}} ,
|
|
||||||
{{0xbb, 0x40, 0x5e, 0xbc, 0x16, 0x92, 0x05, 0xc4, 0xc0, 0x4e, 0x72, 0x90, 0x0e, 0xab, 0xcf, 0x8a, 0xed, 0xef, 0xb9, 0x2d, 0x3b, 0xf8, 0x43, 0x5b, 0xba, 0x2d, 0xeb, 0x2f, 0x52, 0xd2, 0xd1, 0x5a}}},
|
|
||||||
{{{0x40, 0xb4, 0xab, 0xe6, 0xad, 0x9f, 0x46, 0x69, 0x4a, 0xb3, 0x8e, 0xaa, 0xea, 0x9c, 0x8a, 0x20, 0x16, 0x5d, 0x8c, 0x13, 0xbd, 0xf6, 0x1d, 0xc5, 0x24, 0xbd, 0x90, 0x2a, 0x1c, 0xc7, 0x13, 0x3b}} ,
|
|
||||||
{{0x54, 0xdc, 0x16, 0x0d, 0x18, 0xbe, 0x35, 0x64, 0x61, 0x52, 0x02, 0x80, 0xaf, 0x05, 0xf7, 0xa6, 0x42, 0xd3, 0x8f, 0x2e, 0x79, 0x26, 0xa8, 0xbb, 0xb2, 0x17, 0x48, 0xb2, 0x7a, 0x0a, 0x89, 0x14}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x20, 0xa8, 0x88, 0xe3, 0x91, 0xc0, 0x6e, 0xbb, 0x8a, 0x27, 0x82, 0x51, 0x83, 0xb2, 0x28, 0xa9, 0x83, 0xeb, 0xa6, 0xa9, 0x4d, 0x17, 0x59, 0x22, 0x54, 0x00, 0x50, 0x45, 0xcb, 0x48, 0x4b, 0x18}} ,
|
|
||||||
{{0x33, 0x7c, 0xe7, 0x26, 0xba, 0x4d, 0x32, 0xfe, 0x53, 0xf4, 0xfa, 0x83, 0xe3, 0xa5, 0x79, 0x66, 0x73, 0xef, 0x80, 0x23, 0x68, 0xc2, 0x60, 0xdd, 0xa9, 0x33, 0xdc, 0x03, 0x7a, 0xe0, 0xe0, 0x3e}}},
|
|
||||||
{{{0x34, 0x5c, 0x13, 0xfb, 0xc0, 0xe3, 0x78, 0x2b, 0x54, 0x58, 0x22, 0x9b, 0x76, 0x81, 0x7f, 0x93, 0x9c, 0x25, 0x3c, 0xd2, 0xe9, 0x96, 0x21, 0x26, 0x08, 0xf5, 0xed, 0x95, 0x11, 0xae, 0x04, 0x5a}} ,
|
|
||||||
{{0xb9, 0xe8, 0xc5, 0x12, 0x97, 0x1f, 0x83, 0xfe, 0x3e, 0x94, 0x99, 0xd4, 0x2d, 0xf9, 0x52, 0x59, 0x5c, 0x82, 0xa6, 0xf0, 0x75, 0x7e, 0xe8, 0xec, 0xcc, 0xac, 0x18, 0x21, 0x09, 0x67, 0x66, 0x67}}},
|
|
||||||
{{{0xb3, 0x40, 0x29, 0xd1, 0xcb, 0x1b, 0x08, 0x9e, 0x9c, 0xb7, 0x53, 0xb9, 0x3b, 0x71, 0x08, 0x95, 0x12, 0x1a, 0x58, 0xaf, 0x7e, 0x82, 0x52, 0x43, 0x4f, 0x11, 0x39, 0xf4, 0x93, 0x1a, 0x26, 0x05}} ,
|
|
||||||
{{0x6e, 0x44, 0xa3, 0xf9, 0x64, 0xaf, 0xe7, 0x6d, 0x7d, 0xdf, 0x1e, 0xac, 0x04, 0xea, 0x3b, 0x5f, 0x9b, 0xe8, 0x24, 0x9d, 0x0e, 0xe5, 0x2e, 0x3e, 0xdf, 0xa9, 0xf7, 0xd4, 0x50, 0x71, 0xf0, 0x78}}},
|
|
||||||
{{{0x3e, 0xa8, 0x38, 0xc2, 0x57, 0x56, 0x42, 0x9a, 0xb1, 0xe2, 0xf8, 0x45, 0xaa, 0x11, 0x48, 0x5f, 0x17, 0xc4, 0x54, 0x27, 0xdc, 0x5d, 0xaa, 0xdd, 0x41, 0xbc, 0xdf, 0x81, 0xb9, 0x53, 0xee, 0x52}} ,
|
|
||||||
{{0xc3, 0xf1, 0xa7, 0x6d, 0xb3, 0x5f, 0x92, 0x6f, 0xcc, 0x91, 0xb8, 0x95, 0x05, 0xdf, 0x3c, 0x64, 0x57, 0x39, 0x61, 0x51, 0xad, 0x8c, 0x38, 0x7b, 0xc8, 0xde, 0x00, 0x34, 0xbe, 0xa1, 0xb0, 0x7e}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x25, 0x24, 0x1d, 0x8a, 0x67, 0x20, 0xee, 0x42, 0xeb, 0x38, 0xed, 0x0b, 0x8b, 0xcd, 0x46, 0x9d, 0x5e, 0x6b, 0x1e, 0x24, 0x9d, 0x12, 0x05, 0x1a, 0xcc, 0x05, 0x4e, 0x92, 0x38, 0xe1, 0x1f, 0x50}} ,
|
|
||||||
{{0x4e, 0xee, 0x1c, 0x91, 0xe6, 0x11, 0xbd, 0x8e, 0x55, 0x1a, 0x18, 0x75, 0x66, 0xaf, 0x4d, 0x7b, 0x0f, 0xae, 0x6d, 0x85, 0xca, 0x82, 0x58, 0x21, 0x9c, 0x18, 0xe0, 0xed, 0xec, 0x22, 0x80, 0x2f}}},
|
|
||||||
{{{0x68, 0x3b, 0x0a, 0x39, 0x1d, 0x6a, 0x15, 0x57, 0xfc, 0xf0, 0x63, 0x54, 0xdb, 0x39, 0xdb, 0xe8, 0x5c, 0x64, 0xff, 0xa0, 0x09, 0x4f, 0x3b, 0xb7, 0x32, 0x60, 0x99, 0x94, 0xfd, 0x94, 0x82, 0x2d}} ,
|
|
||||||
{{0x24, 0xf6, 0x5a, 0x44, 0xf1, 0x55, 0x2c, 0xdb, 0xea, 0x7c, 0x84, 0x7c, 0x01, 0xac, 0xe3, 0xfd, 0xc9, 0x27, 0xc1, 0x5a, 0xb9, 0xde, 0x4f, 0x5a, 0x90, 0xdd, 0xc6, 0x67, 0xaa, 0x6f, 0x8a, 0x3a}}},
|
|
||||||
{{{0x78, 0x52, 0x87, 0xc9, 0x97, 0x63, 0xb1, 0xdd, 0x54, 0x5f, 0xc1, 0xf8, 0xf1, 0x06, 0xa6, 0xa8, 0xa3, 0x88, 0x82, 0xd4, 0xcb, 0xa6, 0x19, 0xdd, 0xd1, 0x11, 0x87, 0x08, 0x17, 0x4c, 0x37, 0x2a}} ,
|
|
||||||
{{0xa1, 0x0c, 0xf3, 0x08, 0x43, 0xd9, 0x24, 0x1e, 0x83, 0xa7, 0xdf, 0x91, 0xca, 0xbd, 0x69, 0x47, 0x8d, 0x1b, 0xe2, 0xb9, 0x4e, 0xb5, 0xe1, 0x76, 0xb3, 0x1c, 0x93, 0x03, 0xce, 0x5f, 0xb3, 0x5a}}},
|
|
||||||
{{{0x1d, 0xda, 0xe4, 0x61, 0x03, 0x50, 0xa9, 0x8b, 0x68, 0x18, 0xef, 0xb2, 0x1c, 0x84, 0x3b, 0xa2, 0x44, 0x95, 0xa3, 0x04, 0x3b, 0xd6, 0x99, 0x00, 0xaf, 0x76, 0x42, 0x67, 0x02, 0x7d, 0x85, 0x56}} ,
|
|
||||||
{{0xce, 0x72, 0x0e, 0x29, 0x84, 0xb2, 0x7d, 0xd2, 0x45, 0xbe, 0x57, 0x06, 0xed, 0x7f, 0xcf, 0xed, 0xcd, 0xef, 0x19, 0xd6, 0xbc, 0x15, 0x79, 0x64, 0xd2, 0x18, 0xe3, 0x20, 0x67, 0x3a, 0x54, 0x0b}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x52, 0xfd, 0x04, 0xc5, 0xfb, 0x99, 0xe7, 0xe8, 0xfb, 0x8c, 0xe1, 0x42, 0x03, 0xef, 0x9d, 0xd9, 0x9e, 0x4d, 0xf7, 0x80, 0xcf, 0x2e, 0xcc, 0x9b, 0x45, 0xc9, 0x7b, 0x7a, 0xbc, 0x37, 0xa8, 0x52}} ,
|
|
||||||
{{0x96, 0x11, 0x41, 0x8a, 0x47, 0x91, 0xfe, 0xb6, 0xda, 0x7a, 0x54, 0x63, 0xd1, 0x14, 0x35, 0x05, 0x86, 0x8c, 0xa9, 0x36, 0x3f, 0xf2, 0x85, 0x54, 0x4e, 0x92, 0xd8, 0x85, 0x01, 0x46, 0xd6, 0x50}}},
|
|
||||||
{{{0x53, 0xcd, 0xf3, 0x86, 0x40, 0xe6, 0x39, 0x42, 0x95, 0xd6, 0xcb, 0x45, 0x1a, 0x20, 0xc8, 0x45, 0x4b, 0x32, 0x69, 0x04, 0xb1, 0xaf, 0x20, 0x46, 0xc7, 0x6b, 0x23, 0x5b, 0x69, 0xee, 0x30, 0x3f}} ,
|
|
||||||
{{0x70, 0x83, 0x47, 0xc0, 0xdb, 0x55, 0x08, 0xa8, 0x7b, 0x18, 0x6d, 0xf5, 0x04, 0x5a, 0x20, 0x0c, 0x4a, 0x8c, 0x60, 0xae, 0xae, 0x0f, 0x64, 0x55, 0x55, 0x2e, 0xd5, 0x1d, 0x53, 0x31, 0x42, 0x41}}},
|
|
||||||
{{{0xca, 0xfc, 0x88, 0x6b, 0x96, 0x78, 0x0a, 0x8b, 0x83, 0xdc, 0xbc, 0xaf, 0x40, 0xb6, 0x8d, 0x7f, 0xef, 0xb4, 0xd1, 0x3f, 0xcc, 0xa2, 0x74, 0xc9, 0xc2, 0x92, 0x55, 0x00, 0xab, 0xdb, 0xbf, 0x4f}} ,
|
|
||||||
{{0x93, 0x1c, 0x06, 0x2d, 0x66, 0x65, 0x02, 0xa4, 0x97, 0x18, 0xfd, 0x00, 0xe7, 0xab, 0x03, 0xec, 0xce, 0xc1, 0xbf, 0x37, 0xf8, 0x13, 0x53, 0xa5, 0xe5, 0x0c, 0x3a, 0xa8, 0x55, 0xb9, 0xff, 0x68}}},
|
|
||||||
{{{0xe4, 0xe6, 0x6d, 0x30, 0x7d, 0x30, 0x35, 0xc2, 0x78, 0x87, 0xf9, 0xfc, 0x6b, 0x5a, 0xc3, 0xb7, 0x65, 0xd8, 0x2e, 0xc7, 0xa5, 0x0c, 0xc6, 0xdc, 0x12, 0xaa, 0xd6, 0x4f, 0xc5, 0x38, 0xbc, 0x0e}} ,
|
|
||||||
{{0xe2, 0x3c, 0x76, 0x86, 0x38, 0xf2, 0x7b, 0x2c, 0x16, 0x78, 0x8d, 0xf5, 0xa4, 0x15, 0xda, 0xdb, 0x26, 0x85, 0xa0, 0x56, 0xdd, 0x1d, 0xe3, 0xb3, 0xfd, 0x40, 0xef, 0xf2, 0xd9, 0xa1, 0xb3, 0x04}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0xdb, 0x49, 0x0e, 0xe6, 0x58, 0x10, 0x7a, 0x52, 0xda, 0xb5, 0x7d, 0x37, 0x6a, 0x3e, 0xa1, 0x78, 0xce, 0xc7, 0x1c, 0x24, 0x23, 0xdb, 0x7d, 0xfb, 0x8c, 0x8d, 0xdc, 0x30, 0x67, 0x69, 0x75, 0x3b}} ,
|
|
||||||
{{0xa9, 0xea, 0x6d, 0x16, 0x16, 0x60, 0xf4, 0x60, 0x87, 0x19, 0x44, 0x8c, 0x4a, 0x8b, 0x3e, 0xfb, 0x16, 0x00, 0x00, 0x54, 0xa6, 0x9e, 0x9f, 0xef, 0xcf, 0xd9, 0xd2, 0x4c, 0x74, 0x31, 0xd0, 0x34}}},
|
|
||||||
{{{0xa4, 0xeb, 0x04, 0xa4, 0x8c, 0x8f, 0x71, 0x27, 0x95, 0x85, 0x5d, 0x55, 0x4b, 0xb1, 0x26, 0x26, 0xc8, 0xae, 0x6a, 0x7d, 0xa2, 0x21, 0xca, 0xce, 0x38, 0xab, 0x0f, 0xd0, 0xd5, 0x2b, 0x6b, 0x00}} ,
|
|
||||||
{{0xe5, 0x67, 0x0c, 0xf1, 0x3a, 0x9a, 0xea, 0x09, 0x39, 0xef, 0xd1, 0x30, 0xbc, 0x33, 0xba, 0xb1, 0x6a, 0xc5, 0x27, 0x08, 0x7f, 0x54, 0x80, 0x3d, 0xab, 0xf6, 0x15, 0x7a, 0xc2, 0x40, 0x73, 0x72}}},
|
|
||||||
{{{0x84, 0x56, 0x82, 0xb6, 0x12, 0x70, 0x7f, 0xf7, 0xf0, 0xbd, 0x5b, 0xa9, 0xd5, 0xc5, 0x5f, 0x59, 0xbf, 0x7f, 0xb3, 0x55, 0x22, 0x02, 0xc9, 0x44, 0x55, 0x87, 0x8f, 0x96, 0x98, 0x64, 0x6d, 0x15}} ,
|
|
||||||
{{0xb0, 0x8b, 0xaa, 0x1e, 0xec, 0xc7, 0xa5, 0x8f, 0x1f, 0x92, 0x04, 0xc6, 0x05, 0xf6, 0xdf, 0xa1, 0xcc, 0x1f, 0x81, 0xf5, 0x0e, 0x9c, 0x57, 0xdc, 0xe3, 0xbb, 0x06, 0x87, 0x1e, 0xfe, 0x23, 0x6c}}},
|
|
||||||
{{{0xd8, 0x2b, 0x5b, 0x16, 0xea, 0x20, 0xf1, 0xd3, 0x68, 0x8f, 0xae, 0x5b, 0xd0, 0xa9, 0x1a, 0x19, 0xa8, 0x36, 0xfb, 0x2b, 0x57, 0x88, 0x7d, 0x90, 0xd5, 0xa6, 0xf3, 0xdc, 0x38, 0x89, 0x4e, 0x1f}} ,
|
|
||||||
{{0xcc, 0x19, 0xda, 0x9b, 0x3b, 0x43, 0x48, 0x21, 0x2e, 0x23, 0x4d, 0x3d, 0xae, 0xf8, 0x8c, 0xfc, 0xdd, 0xa6, 0x74, 0x37, 0x65, 0xca, 0xee, 0x1a, 0x19, 0x8e, 0x9f, 0x64, 0x6f, 0x0c, 0x8b, 0x5a}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x25, 0xb9, 0xc2, 0xf0, 0x72, 0xb8, 0x15, 0x16, 0xcc, 0x8d, 0x3c, 0x6f, 0x25, 0xed, 0xf4, 0x46, 0x2e, 0x0c, 0x60, 0x0f, 0xe2, 0x84, 0x34, 0x55, 0x89, 0x59, 0x34, 0x1b, 0xf5, 0x8d, 0xfe, 0x08}} ,
|
|
||||||
{{0xf8, 0xab, 0x93, 0xbc, 0x44, 0xba, 0x1b, 0x75, 0x4b, 0x49, 0x6f, 0xd0, 0x54, 0x2e, 0x63, 0xba, 0xb5, 0xea, 0xed, 0x32, 0x14, 0xc9, 0x94, 0xd8, 0xc5, 0xce, 0xf4, 0x10, 0x68, 0xe0, 0x38, 0x27}}},
|
|
||||||
{{{0x74, 0x1c, 0x14, 0x9b, 0xd4, 0x64, 0x61, 0x71, 0x5a, 0xb6, 0x21, 0x33, 0x4f, 0xf7, 0x8e, 0xba, 0xa5, 0x48, 0x9a, 0xc7, 0xfa, 0x9a, 0xf0, 0xb4, 0x62, 0xad, 0xf2, 0x5e, 0xcc, 0x03, 0x24, 0x1a}} ,
|
|
||||||
{{0xf5, 0x76, 0xfd, 0xe4, 0xaf, 0xb9, 0x03, 0x59, 0xce, 0x63, 0xd2, 0x3b, 0x1f, 0xcd, 0x21, 0x0c, 0xad, 0x44, 0xa5, 0x97, 0xac, 0x80, 0x11, 0x02, 0x9b, 0x0c, 0xe5, 0x8b, 0xcd, 0xfb, 0x79, 0x77}}},
|
|
||||||
{{{0x15, 0xbe, 0x9a, 0x0d, 0xba, 0x38, 0x72, 0x20, 0x8a, 0xf5, 0xbe, 0x59, 0x93, 0x79, 0xb7, 0xf6, 0x6a, 0x0c, 0x38, 0x27, 0x1a, 0x60, 0xf4, 0x86, 0x3b, 0xab, 0x5a, 0x00, 0xa0, 0xce, 0x21, 0x7d}} ,
|
|
||||||
{{0x6c, 0xba, 0x14, 0xc5, 0xea, 0x12, 0x9e, 0x2e, 0x82, 0x63, 0xce, 0x9b, 0x4a, 0xe7, 0x1d, 0xec, 0xf1, 0x2e, 0x51, 0x1c, 0xf4, 0xd0, 0x69, 0x15, 0x42, 0x9d, 0xa3, 0x3f, 0x0e, 0xbf, 0xe9, 0x5c}}},
|
|
||||||
{{{0xe4, 0x0d, 0xf4, 0xbd, 0xee, 0x31, 0x10, 0xed, 0xcb, 0x12, 0x86, 0xad, 0xd4, 0x2f, 0x90, 0x37, 0x32, 0xc3, 0x0b, 0x73, 0xec, 0x97, 0x85, 0xa4, 0x01, 0x1c, 0x76, 0x35, 0xfe, 0x75, 0xdd, 0x71}} ,
|
|
||||||
{{0x11, 0xa4, 0x88, 0x9f, 0x3e, 0x53, 0x69, 0x3b, 0x1b, 0xe0, 0xf7, 0xba, 0x9b, 0xad, 0x4e, 0x81, 0x5f, 0xb5, 0x5c, 0xae, 0xbe, 0x67, 0x86, 0x37, 0x34, 0x8e, 0x07, 0x32, 0x45, 0x4a, 0x67, 0x39}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x90, 0x70, 0x58, 0x20, 0x03, 0x1e, 0x67, 0xb2, 0xc8, 0x9b, 0x58, 0xc5, 0xb1, 0xeb, 0x2d, 0x4a, 0xde, 0x82, 0x8c, 0xf2, 0xd2, 0x14, 0xb8, 0x70, 0x61, 0x4e, 0x73, 0xd6, 0x0b, 0x6b, 0x0d, 0x30}} ,
|
|
||||||
{{0x81, 0xfc, 0x55, 0x5c, 0xbf, 0xa7, 0xc4, 0xbd, 0xe2, 0xf0, 0x4b, 0x8f, 0xe9, 0x7d, 0x99, 0xfa, 0xd3, 0xab, 0xbc, 0xc7, 0x83, 0x2b, 0x04, 0x7f, 0x0c, 0x19, 0x43, 0x03, 0x3d, 0x07, 0xca, 0x40}}},
|
|
||||||
{{{0xf9, 0xc8, 0xbe, 0x8c, 0x16, 0x81, 0x39, 0x96, 0xf6, 0x17, 0x58, 0xc8, 0x30, 0x58, 0xfb, 0xc2, 0x03, 0x45, 0xd2, 0x52, 0x76, 0xe0, 0x6a, 0x26, 0x28, 0x5c, 0x88, 0x59, 0x6a, 0x5a, 0x54, 0x42}} ,
|
|
||||||
{{0x07, 0xb5, 0x2e, 0x2c, 0x67, 0x15, 0x9b, 0xfb, 0x83, 0x69, 0x1e, 0x0f, 0xda, 0xd6, 0x29, 0xb1, 0x60, 0xe0, 0xb2, 0xba, 0x69, 0xa2, 0x9e, 0xbd, 0xbd, 0xe0, 0x1c, 0xbd, 0xcd, 0x06, 0x64, 0x70}}},
|
|
||||||
{{{0x41, 0xfa, 0x8c, 0xe1, 0x89, 0x8f, 0x27, 0xc8, 0x25, 0x8f, 0x6f, 0x5f, 0x55, 0xf8, 0xde, 0x95, 0x6d, 0x2f, 0x75, 0x16, 0x2b, 0x4e, 0x44, 0xfd, 0x86, 0x6e, 0xe9, 0x70, 0x39, 0x76, 0x97, 0x7e}} ,
|
|
||||||
{{0x17, 0x62, 0x6b, 0x14, 0xa1, 0x7c, 0xd0, 0x79, 0x6e, 0xd8, 0x8a, 0xa5, 0x6d, 0x8c, 0x93, 0xd2, 0x3f, 0xec, 0x44, 0x8d, 0x6e, 0x91, 0x01, 0x8c, 0x8f, 0xee, 0x01, 0x8f, 0xc0, 0xb4, 0x85, 0x0e}}},
|
|
||||||
{{{0x02, 0x3a, 0x70, 0x41, 0xe4, 0x11, 0x57, 0x23, 0xac, 0xe6, 0xfc, 0x54, 0x7e, 0xcd, 0xd7, 0x22, 0xcb, 0x76, 0x9f, 0x20, 0xce, 0xa0, 0x73, 0x76, 0x51, 0x3b, 0xa4, 0xf8, 0xe3, 0x62, 0x12, 0x6c}} ,
|
|
||||||
{{0x7f, 0x00, 0x9c, 0x26, 0x0d, 0x6f, 0x48, 0x7f, 0x3a, 0x01, 0xed, 0xc5, 0x96, 0xb0, 0x1f, 0x4f, 0xa8, 0x02, 0x62, 0x27, 0x8a, 0x50, 0x8d, 0x9a, 0x8b, 0x52, 0x0f, 0x1e, 0xcf, 0x41, 0x38, 0x19}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0xf5, 0x6c, 0xd4, 0x2f, 0x0f, 0x69, 0x0f, 0x87, 0x3f, 0x61, 0x65, 0x1e, 0x35, 0x34, 0x85, 0xba, 0x02, 0x30, 0xac, 0x25, 0x3d, 0xe2, 0x62, 0xf1, 0xcc, 0xe9, 0x1b, 0xc2, 0xef, 0x6a, 0x42, 0x57}} ,
|
|
||||||
{{0x34, 0x1f, 0x2e, 0xac, 0xd1, 0xc7, 0x04, 0x52, 0x32, 0x66, 0xb2, 0x33, 0x73, 0x21, 0x34, 0x54, 0xf7, 0x71, 0xed, 0x06, 0xb0, 0xff, 0xa6, 0x59, 0x6f, 0x8a, 0x4e, 0xfb, 0x02, 0xb0, 0x45, 0x6b}}},
|
|
||||||
{{{0xf5, 0x48, 0x0b, 0x03, 0xc5, 0x22, 0x7d, 0x80, 0x08, 0x53, 0xfe, 0x32, 0xb1, 0xa1, 0x8a, 0x74, 0x6f, 0xbd, 0x3f, 0x85, 0xf4, 0xcf, 0xf5, 0x60, 0xaf, 0x41, 0x7e, 0x3e, 0x46, 0xa3, 0x5a, 0x20}} ,
|
|
||||||
{{0xaa, 0x35, 0x87, 0x44, 0x63, 0x66, 0x97, 0xf8, 0x6e, 0x55, 0x0c, 0x04, 0x3e, 0x35, 0x50, 0xbf, 0x93, 0x69, 0xd2, 0x8b, 0x05, 0x55, 0x99, 0xbe, 0xe2, 0x53, 0x61, 0xec, 0xe8, 0x08, 0x0b, 0x32}}},
|
|
||||||
{{{0xb3, 0x10, 0x45, 0x02, 0x69, 0x59, 0x2e, 0x97, 0xd9, 0x64, 0xf8, 0xdb, 0x25, 0x80, 0xdc, 0xc4, 0xd5, 0x62, 0x3c, 0xed, 0x65, 0x91, 0xad, 0xd1, 0x57, 0x81, 0x94, 0xaa, 0xa1, 0x29, 0xfc, 0x68}} ,
|
|
||||||
{{0xdd, 0xb5, 0x7d, 0xab, 0x5a, 0x21, 0x41, 0x53, 0xbb, 0x17, 0x79, 0x0d, 0xd1, 0xa8, 0x0c, 0x0c, 0x20, 0x88, 0x09, 0xe9, 0x84, 0xe8, 0x25, 0x11, 0x67, 0x7a, 0x8b, 0x1a, 0xe4, 0x5d, 0xe1, 0x5d}}},
|
|
||||||
{{{0x37, 0xea, 0xfe, 0x65, 0x3b, 0x25, 0xe8, 0xe1, 0xc2, 0xc5, 0x02, 0xa4, 0xbe, 0x98, 0x0a, 0x2b, 0x61, 0xc1, 0x9b, 0xe2, 0xd5, 0x92, 0xe6, 0x9e, 0x7d, 0x1f, 0xca, 0x43, 0x88, 0x8b, 0x2c, 0x59}} ,
|
|
||||||
{{0xe0, 0xb5, 0x00, 0x1d, 0x2a, 0x6f, 0xaf, 0x79, 0x86, 0x2f, 0xa6, 0x5a, 0x93, 0xd1, 0xfe, 0xae, 0x3a, 0xee, 0xdb, 0x7c, 0x61, 0xbe, 0x7c, 0x01, 0xf9, 0xfe, 0x52, 0xdc, 0xd8, 0x52, 0xa3, 0x42}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x22, 0xaf, 0x13, 0x37, 0xbd, 0x37, 0x71, 0xac, 0x04, 0x46, 0x63, 0xac, 0xa4, 0x77, 0xed, 0x25, 0x38, 0xe0, 0x15, 0xa8, 0x64, 0x00, 0x0d, 0xce, 0x51, 0x01, 0xa9, 0xbc, 0x0f, 0x03, 0x1c, 0x04}} ,
|
|
||||||
{{0x89, 0xf9, 0x80, 0x07, 0xcf, 0x3f, 0xb3, 0xe9, 0xe7, 0x45, 0x44, 0x3d, 0x2a, 0x7c, 0xe9, 0xe4, 0x16, 0x5c, 0x5e, 0x65, 0x1c, 0xc7, 0x7d, 0xc6, 0x7a, 0xfb, 0x43, 0xee, 0x25, 0x76, 0x46, 0x72}}},
|
|
||||||
{{{0x02, 0xa2, 0xed, 0xf4, 0x8f, 0x6b, 0x0b, 0x3e, 0xeb, 0x35, 0x1a, 0xd5, 0x7e, 0xdb, 0x78, 0x00, 0x96, 0x8a, 0xa0, 0xb4, 0xcf, 0x60, 0x4b, 0xd4, 0xd5, 0xf9, 0x2d, 0xbf, 0x88, 0xbd, 0x22, 0x62}} ,
|
|
||||||
{{0x13, 0x53, 0xe4, 0x82, 0x57, 0xfa, 0x1e, 0x8f, 0x06, 0x2b, 0x90, 0xba, 0x08, 0xb6, 0x10, 0x54, 0x4f, 0x7c, 0x1b, 0x26, 0xed, 0xda, 0x6b, 0xdd, 0x25, 0xd0, 0x4e, 0xea, 0x42, 0xbb, 0x25, 0x03}}},
|
|
||||||
{{{0x51, 0x16, 0x50, 0x7c, 0xd5, 0x5d, 0xf6, 0x99, 0xe8, 0x77, 0x72, 0x4e, 0xfa, 0x62, 0xcb, 0x76, 0x75, 0x0c, 0xe2, 0x71, 0x98, 0x92, 0xd5, 0xfa, 0x45, 0xdf, 0x5c, 0x6f, 0x1e, 0x9e, 0x28, 0x69}} ,
|
|
||||||
{{0x0d, 0xac, 0x66, 0x6d, 0xc3, 0x8b, 0xba, 0x16, 0xb5, 0xe2, 0xa0, 0x0d, 0x0c, 0xbd, 0xa4, 0x8e, 0x18, 0x6c, 0xf2, 0xdc, 0xf9, 0xdc, 0x4a, 0x86, 0x25, 0x95, 0x14, 0xcb, 0xd8, 0x1a, 0x04, 0x0f}}},
|
|
||||||
{{{0x97, 0xa5, 0xdb, 0x8b, 0x2d, 0xaa, 0x42, 0x11, 0x09, 0xf2, 0x93, 0xbb, 0xd9, 0x06, 0x84, 0x4e, 0x11, 0xa8, 0xa0, 0x25, 0x2b, 0xa6, 0x5f, 0xae, 0xc4, 0xb4, 0x4c, 0xc8, 0xab, 0xc7, 0x3b, 0x02}} ,
|
|
||||||
{{0xee, 0xc9, 0x29, 0x0f, 0xdf, 0x11, 0x85, 0xed, 0xce, 0x0d, 0x62, 0x2c, 0x8f, 0x4b, 0xf9, 0x04, 0xe9, 0x06, 0x72, 0x1d, 0x37, 0x20, 0x50, 0xc9, 0x14, 0xeb, 0xec, 0x39, 0xa7, 0x97, 0x2b, 0x4d}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x69, 0xd1, 0x39, 0xbd, 0xfb, 0x33, 0xbe, 0xc4, 0xf0, 0x5c, 0xef, 0xf0, 0x56, 0x68, 0xfc, 0x97, 0x47, 0xc8, 0x72, 0xb6, 0x53, 0xa4, 0x0a, 0x98, 0xa5, 0xb4, 0x37, 0x71, 0xcf, 0x66, 0x50, 0x6d}} ,
|
|
||||||
{{0x17, 0xa4, 0x19, 0x52, 0x11, 0x47, 0xb3, 0x5c, 0x5b, 0xa9, 0x2e, 0x22, 0xb4, 0x00, 0x52, 0xf9, 0x57, 0x18, 0xb8, 0xbe, 0x5a, 0xe3, 0xab, 0x83, 0xc8, 0x87, 0x0a, 0x2a, 0xd8, 0x8c, 0xbb, 0x54}}},
|
|
||||||
{{{0xa9, 0x62, 0x93, 0x85, 0xbe, 0xe8, 0x73, 0x4a, 0x0e, 0xb0, 0xb5, 0x2d, 0x94, 0x50, 0xaa, 0xd3, 0xb2, 0xea, 0x9d, 0x62, 0x76, 0x3b, 0x07, 0x34, 0x4e, 0x2d, 0x70, 0xc8, 0x9a, 0x15, 0x66, 0x6b}} ,
|
|
||||||
{{0xc5, 0x96, 0xca, 0xc8, 0x22, 0x1a, 0xee, 0x5f, 0xe7, 0x31, 0x60, 0x22, 0x83, 0x08, 0x63, 0xce, 0xb9, 0x32, 0x44, 0x58, 0x5d, 0x3a, 0x9b, 0xe4, 0x04, 0xd5, 0xef, 0x38, 0xef, 0x4b, 0xdd, 0x19}}},
|
|
||||||
{{{0x4d, 0xc2, 0x17, 0x75, 0xa1, 0x68, 0xcd, 0xc3, 0xc6, 0x03, 0x44, 0xe3, 0x78, 0x09, 0x91, 0x47, 0x3f, 0x0f, 0xe4, 0x92, 0x58, 0xfa, 0x7d, 0x1f, 0x20, 0x94, 0x58, 0x5e, 0xbc, 0x19, 0x02, 0x6f}} ,
|
|
||||||
{{0x20, 0xd6, 0xd8, 0x91, 0x54, 0xa7, 0xf3, 0x20, 0x4b, 0x34, 0x06, 0xfa, 0x30, 0xc8, 0x6f, 0x14, 0x10, 0x65, 0x74, 0x13, 0x4e, 0xf0, 0x69, 0x26, 0xce, 0xcf, 0x90, 0xf4, 0xd0, 0xc5, 0xc8, 0x64}}},
|
|
||||||
{{{0x26, 0xa2, 0x50, 0x02, 0x24, 0x72, 0xf1, 0xf0, 0x4e, 0x2d, 0x93, 0xd5, 0x08, 0xe7, 0xae, 0x38, 0xf7, 0x18, 0xa5, 0x32, 0x34, 0xc2, 0xf0, 0xa6, 0xec, 0xb9, 0x61, 0x7b, 0x64, 0x99, 0xac, 0x71}} ,
|
|
||||||
{{0x25, 0xcf, 0x74, 0x55, 0x1b, 0xaa, 0xa9, 0x38, 0x41, 0x40, 0xd5, 0x95, 0x95, 0xab, 0x1c, 0x5e, 0xbc, 0x41, 0x7e, 0x14, 0x30, 0xbe, 0x13, 0x89, 0xf4, 0xe5, 0xeb, 0x28, 0xc0, 0xc2, 0x96, 0x3a}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x2b, 0x77, 0x45, 0xec, 0x67, 0x76, 0x32, 0x4c, 0xb9, 0xdf, 0x25, 0x32, 0x6b, 0xcb, 0xe7, 0x14, 0x61, 0x43, 0xee, 0xba, 0x9b, 0x71, 0xef, 0xd2, 0x48, 0x65, 0xbb, 0x1b, 0x8a, 0x13, 0x1b, 0x22}} ,
|
|
||||||
{{0x84, 0xad, 0x0c, 0x18, 0x38, 0x5a, 0xba, 0xd0, 0x98, 0x59, 0xbf, 0x37, 0xb0, 0x4f, 0x97, 0x60, 0x20, 0xb3, 0x9b, 0x97, 0xf6, 0x08, 0x6c, 0xa4, 0xff, 0xfb, 0xb7, 0xfa, 0x95, 0xb2, 0x51, 0x79}}},
|
|
||||||
{{{0x28, 0x5c, 0x3f, 0xdb, 0x6b, 0x18, 0x3b, 0x5c, 0xd1, 0x04, 0x28, 0xde, 0x85, 0x52, 0x31, 0xb5, 0xbb, 0xf6, 0xa9, 0xed, 0xbe, 0x28, 0x4f, 0xb3, 0x7e, 0x05, 0x6a, 0xdb, 0x95, 0x0d, 0x1b, 0x1c}} ,
|
|
||||||
{{0xd5, 0xc5, 0xc3, 0x9a, 0x0a, 0xd0, 0x31, 0x3e, 0x07, 0x36, 0x8e, 0xc0, 0x8a, 0x62, 0xb1, 0xca, 0xd6, 0x0e, 0x1e, 0x9d, 0xef, 0xab, 0x98, 0x4d, 0xbb, 0x6c, 0x05, 0xe0, 0xe4, 0x5d, 0xbd, 0x57}}},
|
|
||||||
{{{0xcc, 0x21, 0x27, 0xce, 0xfd, 0xa9, 0x94, 0x8e, 0xe1, 0xab, 0x49, 0xe0, 0x46, 0x26, 0xa1, 0xa8, 0x8c, 0xa1, 0x99, 0x1d, 0xb4, 0x27, 0x6d, 0x2d, 0xc8, 0x39, 0x30, 0x5e, 0x37, 0x52, 0xc4, 0x6e}} ,
|
|
||||||
{{0xa9, 0x85, 0xf4, 0xe7, 0xb0, 0x15, 0x33, 0x84, 0x1b, 0x14, 0x1a, 0x02, 0xd9, 0x3b, 0xad, 0x0f, 0x43, 0x6c, 0xea, 0x3e, 0x0f, 0x7e, 0xda, 0xdd, 0x6b, 0x4c, 0x7f, 0x6e, 0xd4, 0x6b, 0xbf, 0x0f}}},
|
|
||||||
{{{0x47, 0x9f, 0x7c, 0x56, 0x7c, 0x43, 0x91, 0x1c, 0xbb, 0x4e, 0x72, 0x3e, 0x64, 0xab, 0xa0, 0xa0, 0xdf, 0xb4, 0xd8, 0x87, 0x3a, 0xbd, 0xa8, 0x48, 0xc9, 0xb8, 0xef, 0x2e, 0xad, 0x6f, 0x84, 0x4f}} ,
|
|
||||||
{{0x2d, 0x2d, 0xf0, 0x1b, 0x7e, 0x2a, 0x6c, 0xf8, 0xa9, 0x6a, 0xe1, 0xf0, 0x99, 0xa1, 0x67, 0x9a, 0xd4, 0x13, 0xca, 0xca, 0xba, 0x27, 0x92, 0xaa, 0xa1, 0x5d, 0x50, 0xde, 0xcc, 0x40, 0x26, 0x0a}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x9f, 0x3e, 0xf2, 0xb2, 0x90, 0xce, 0xdb, 0x64, 0x3e, 0x03, 0xdd, 0x37, 0x36, 0x54, 0x70, 0x76, 0x24, 0xb5, 0x69, 0x03, 0xfc, 0xa0, 0x2b, 0x74, 0xb2, 0x05, 0x0e, 0xcc, 0xd8, 0x1f, 0x6a, 0x1f}} ,
|
|
||||||
{{0x19, 0x5e, 0x60, 0x69, 0x58, 0x86, 0xa0, 0x31, 0xbd, 0x32, 0xe9, 0x2c, 0x5c, 0xd2, 0x85, 0xba, 0x40, 0x64, 0xa8, 0x74, 0xf8, 0x0e, 0x1c, 0xb3, 0xa9, 0x69, 0xe8, 0x1e, 0x40, 0x64, 0x99, 0x77}}},
|
|
||||||
{{{0x6c, 0x32, 0x4f, 0xfd, 0xbb, 0x5c, 0xbb, 0x8d, 0x64, 0x66, 0x4a, 0x71, 0x1f, 0x79, 0xa3, 0xad, 0x8d, 0xf9, 0xd4, 0xec, 0xcf, 0x67, 0x70, 0xfa, 0x05, 0x4a, 0x0f, 0x6e, 0xaf, 0x87, 0x0a, 0x6f}} ,
|
|
||||||
{{0xc6, 0x36, 0x6e, 0x6c, 0x8c, 0x24, 0x09, 0x60, 0xbe, 0x26, 0xd2, 0x4c, 0x5e, 0x17, 0xca, 0x5f, 0x1d, 0xcc, 0x87, 0xe8, 0x42, 0x6a, 0xcb, 0xcb, 0x7d, 0x92, 0x05, 0x35, 0x81, 0x13, 0x60, 0x6b}}},
|
|
||||||
{{{0xf4, 0x15, 0xcd, 0x0f, 0x0a, 0xaf, 0x4e, 0x6b, 0x51, 0xfd, 0x14, 0xc4, 0x2e, 0x13, 0x86, 0x74, 0x44, 0xcb, 0x66, 0x6b, 0xb6, 0x9d, 0x74, 0x56, 0x32, 0xac, 0x8d, 0x8e, 0x8c, 0x8c, 0x8c, 0x39}} ,
|
|
||||||
{{0xca, 0x59, 0x74, 0x1a, 0x11, 0xef, 0x6d, 0xf7, 0x39, 0x5c, 0x3b, 0x1f, 0xfa, 0xe3, 0x40, 0x41, 0x23, 0x9e, 0xf6, 0xd1, 0x21, 0xa2, 0xbf, 0xad, 0x65, 0x42, 0x6b, 0x59, 0x8a, 0xe8, 0xc5, 0x7f}}},
|
|
||||||
{{{0x64, 0x05, 0x7a, 0x84, 0x4a, 0x13, 0xc3, 0xf6, 0xb0, 0x6e, 0x9a, 0x6b, 0x53, 0x6b, 0x32, 0xda, 0xd9, 0x74, 0x75, 0xc4, 0xba, 0x64, 0x3d, 0x3b, 0x08, 0xdd, 0x10, 0x46, 0xef, 0xc7, 0x90, 0x1f}} ,
|
|
||||||
{{0x7b, 0x2f, 0x3a, 0xce, 0xc8, 0xa1, 0x79, 0x3c, 0x30, 0x12, 0x44, 0x28, 0xf6, 0xbc, 0xff, 0xfd, 0xf4, 0xc0, 0x97, 0xb0, 0xcc, 0xc3, 0x13, 0x7a, 0xb9, 0x9a, 0x16, 0xe4, 0xcb, 0x4c, 0x34, 0x63}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x07, 0x4e, 0xd3, 0x2d, 0x09, 0x33, 0x0e, 0xd2, 0x0d, 0xbe, 0x3e, 0xe7, 0xe4, 0xaa, 0xb7, 0x00, 0x8b, 0xe8, 0xad, 0xaa, 0x7a, 0x8d, 0x34, 0x28, 0xa9, 0x81, 0x94, 0xc5, 0xe7, 0x42, 0xac, 0x47}} ,
|
|
||||||
{{0x24, 0x89, 0x7a, 0x8f, 0xb5, 0x9b, 0xf0, 0xc2, 0x03, 0x64, 0xd0, 0x1e, 0xf5, 0xa4, 0xb2, 0xf3, 0x74, 0xe9, 0x1a, 0x16, 0xfd, 0xcb, 0x15, 0xea, 0xeb, 0x10, 0x6c, 0x35, 0xd1, 0xc1, 0xa6, 0x28}}},
|
|
||||||
{{{0xcc, 0xd5, 0x39, 0xfc, 0xa5, 0xa4, 0xad, 0x32, 0x15, 0xce, 0x19, 0xe8, 0x34, 0x2b, 0x1c, 0x60, 0x91, 0xfc, 0x05, 0xa9, 0xb3, 0xdc, 0x80, 0x29, 0xc4, 0x20, 0x79, 0x06, 0x39, 0xc0, 0xe2, 0x22}} ,
|
|
||||||
{{0xbb, 0xa8, 0xe1, 0x89, 0x70, 0x57, 0x18, 0x54, 0x3c, 0xf6, 0x0d, 0x82, 0x12, 0x05, 0x87, 0x96, 0x06, 0x39, 0xe3, 0xf8, 0xb3, 0x95, 0xe5, 0xd7, 0x26, 0xbf, 0x09, 0x5a, 0x94, 0xf9, 0x1c, 0x63}}},
|
|
||||||
{{{0x2b, 0x8c, 0x2d, 0x9a, 0x8b, 0x84, 0xf2, 0x56, 0xfb, 0xad, 0x2e, 0x7f, 0xb7, 0xfc, 0x30, 0xe1, 0x35, 0x89, 0xba, 0x4d, 0xa8, 0x6d, 0xce, 0x8c, 0x8b, 0x30, 0xe0, 0xda, 0x29, 0x18, 0x11, 0x17}} ,
|
|
||||||
{{0x19, 0xa6, 0x5a, 0x65, 0x93, 0xc3, 0xb5, 0x31, 0x22, 0x4f, 0xf3, 0xf6, 0x0f, 0xeb, 0x28, 0xc3, 0x7c, 0xeb, 0xce, 0x86, 0xec, 0x67, 0x76, 0x6e, 0x35, 0x45, 0x7b, 0xd8, 0x6b, 0x92, 0x01, 0x65}}},
|
|
||||||
{{{0x3d, 0xd5, 0x9a, 0x64, 0x73, 0x36, 0xb1, 0xd6, 0x86, 0x98, 0x42, 0x3f, 0x8a, 0xf1, 0xc7, 0xf5, 0x42, 0xa8, 0x9c, 0x52, 0xa8, 0xdc, 0xf9, 0x24, 0x3f, 0x4a, 0xa1, 0xa4, 0x5b, 0xe8, 0x62, 0x1a}} ,
|
|
||||||
{{0xc5, 0xbd, 0xc8, 0x14, 0xd5, 0x0d, 0xeb, 0xe1, 0xa5, 0xe6, 0x83, 0x11, 0x09, 0x00, 0x1d, 0x55, 0x83, 0x51, 0x7e, 0x75, 0x00, 0x81, 0xb9, 0xcb, 0xd8, 0xc5, 0xe5, 0xa1, 0xd9, 0x17, 0x6d, 0x1f}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0xea, 0xf9, 0xe4, 0xe9, 0xe1, 0x52, 0x3f, 0x51, 0x19, 0x0d, 0xdd, 0xd9, 0x9d, 0x93, 0x31, 0x87, 0x23, 0x09, 0xd5, 0x83, 0xeb, 0x92, 0x09, 0x76, 0x6e, 0xe3, 0xf8, 0xc0, 0xa2, 0x66, 0xb5, 0x36}} ,
|
|
||||||
{{0x3a, 0xbb, 0x39, 0xed, 0x32, 0x02, 0xe7, 0x43, 0x7a, 0x38, 0x14, 0x84, 0xe3, 0x44, 0xd2, 0x5e, 0x94, 0xdd, 0x78, 0x89, 0x55, 0x4c, 0x73, 0x9e, 0xe1, 0xe4, 0x3e, 0x43, 0xd0, 0x4a, 0xde, 0x1b}}},
|
|
||||||
{{{0xb2, 0xe7, 0x8f, 0xe3, 0xa3, 0xc5, 0xcb, 0x72, 0xee, 0x79, 0x41, 0xf8, 0xdf, 0xee, 0x65, 0xc5, 0x45, 0x77, 0x27, 0x3c, 0xbd, 0x58, 0xd3, 0x75, 0xe2, 0x04, 0x4b, 0xbb, 0x65, 0xf3, 0xc8, 0x0f}} ,
|
|
||||||
{{0x24, 0x7b, 0x93, 0x34, 0xb5, 0xe2, 0x74, 0x48, 0xcd, 0xa0, 0x0b, 0x92, 0x97, 0x66, 0x39, 0xf4, 0xb0, 0xe2, 0x5d, 0x39, 0x6a, 0x5b, 0x45, 0x17, 0x78, 0x1e, 0xdb, 0x91, 0x81, 0x1c, 0xf9, 0x16}}},
|
|
||||||
{{{0x16, 0xdf, 0xd1, 0x5a, 0xd5, 0xe9, 0x4e, 0x58, 0x95, 0x93, 0x5f, 0x51, 0x09, 0xc3, 0x2a, 0xc9, 0xd4, 0x55, 0x48, 0x79, 0xa4, 0xa3, 0xb2, 0xc3, 0x62, 0xaa, 0x8c, 0xe8, 0xad, 0x47, 0x39, 0x1b}} ,
|
|
||||||
{{0x46, 0xda, 0x9e, 0x51, 0x3a, 0xe6, 0xd1, 0xa6, 0xbb, 0x4d, 0x7b, 0x08, 0xbe, 0x8c, 0xd5, 0xf3, 0x3f, 0xfd, 0xf7, 0x44, 0x80, 0x2d, 0x53, 0x4b, 0xd0, 0x87, 0x68, 0xc1, 0xb5, 0xd8, 0xf7, 0x07}}},
|
|
||||||
{{{0xf4, 0x10, 0x46, 0xbe, 0xb7, 0xd2, 0xd1, 0xce, 0x5e, 0x76, 0xa2, 0xd7, 0x03, 0xdc, 0xe4, 0x81, 0x5a, 0xf6, 0x3c, 0xde, 0xae, 0x7a, 0x9d, 0x21, 0x34, 0xa5, 0xf6, 0xa9, 0x73, 0xe2, 0x8d, 0x60}} ,
|
|
||||||
{{0xfa, 0x44, 0x71, 0xf6, 0x41, 0xd8, 0xc6, 0x58, 0x13, 0x37, 0xeb, 0x84, 0x0f, 0x96, 0xc7, 0xdc, 0xc8, 0xa9, 0x7a, 0x83, 0xb2, 0x2f, 0x31, 0xb1, 0x1a, 0xd8, 0x98, 0x3f, 0x11, 0xd0, 0x31, 0x3b}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x81, 0xd5, 0x34, 0x16, 0x01, 0xa3, 0x93, 0xea, 0x52, 0x94, 0xec, 0x93, 0xb7, 0x81, 0x11, 0x2d, 0x58, 0xf9, 0xb5, 0x0a, 0xaa, 0x4f, 0xf6, 0x2e, 0x3f, 0x36, 0xbf, 0x33, 0x5a, 0xe7, 0xd1, 0x08}} ,
|
|
||||||
{{0x1a, 0xcf, 0x42, 0xae, 0xcc, 0xb5, 0x77, 0x39, 0xc4, 0x5b, 0x5b, 0xd0, 0x26, 0x59, 0x27, 0xd0, 0x55, 0x71, 0x12, 0x9d, 0x88, 0x3d, 0x9c, 0xea, 0x41, 0x6a, 0xf0, 0x50, 0x93, 0x93, 0xdd, 0x47}}},
|
|
||||||
{{{0x6f, 0xc9, 0x51, 0x6d, 0x1c, 0xaa, 0xf5, 0xa5, 0x90, 0x3f, 0x14, 0xe2, 0x6e, 0x8e, 0x64, 0xfd, 0xac, 0xe0, 0x4e, 0x22, 0xe5, 0xc1, 0xbc, 0x29, 0x0a, 0x6a, 0x9e, 0xa1, 0x60, 0xcb, 0x2f, 0x0b}} ,
|
|
||||||
{{0xdc, 0x39, 0x32, 0xf3, 0xa1, 0x44, 0xe9, 0xc5, 0xc3, 0x78, 0xfb, 0x95, 0x47, 0x34, 0x35, 0x34, 0xe8, 0x25, 0xde, 0x93, 0xc6, 0xb4, 0x76, 0x6d, 0x86, 0x13, 0xc6, 0xe9, 0x68, 0xb5, 0x01, 0x63}}},
|
|
||||||
{{{0x1f, 0x9a, 0x52, 0x64, 0x97, 0xd9, 0x1c, 0x08, 0x51, 0x6f, 0x26, 0x9d, 0xaa, 0x93, 0x33, 0x43, 0xfa, 0x77, 0xe9, 0x62, 0x9b, 0x5d, 0x18, 0x75, 0xeb, 0x78, 0xf7, 0x87, 0x8f, 0x41, 0xb4, 0x4d}} ,
|
|
||||||
{{0x13, 0xa8, 0x82, 0x3e, 0xe9, 0x13, 0xad, 0xeb, 0x01, 0xca, 0xcf, 0xda, 0xcd, 0xf7, 0x6c, 0xc7, 0x7a, 0xdc, 0x1e, 0x6e, 0xc8, 0x4e, 0x55, 0x62, 0x80, 0xea, 0x78, 0x0c, 0x86, 0xb9, 0x40, 0x51}}},
|
|
||||||
{{{0x27, 0xae, 0xd3, 0x0d, 0x4c, 0x8f, 0x34, 0xea, 0x7d, 0x3c, 0xe5, 0x8a, 0xcf, 0x5b, 0x92, 0xd8, 0x30, 0x16, 0xb4, 0xa3, 0x75, 0xff, 0xeb, 0x27, 0xc8, 0x5c, 0x6c, 0xc2, 0xee, 0x6c, 0x21, 0x0b}} ,
|
|
||||||
{{0xc3, 0xba, 0x12, 0x53, 0x2a, 0xaa, 0x77, 0xad, 0x19, 0x78, 0x55, 0x8a, 0x2e, 0x60, 0x87, 0xc2, 0x6e, 0x91, 0x38, 0x91, 0x3f, 0x7a, 0xc5, 0x24, 0x8f, 0x51, 0xc5, 0xde, 0xb0, 0x53, 0x30, 0x56}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x02, 0xfe, 0x54, 0x12, 0x18, 0xca, 0x7d, 0xa5, 0x68, 0x43, 0xa3, 0x6d, 0x14, 0x2a, 0x6a, 0xa5, 0x8e, 0x32, 0xe7, 0x63, 0x4f, 0xe3, 0xc6, 0x44, 0x3e, 0xab, 0x63, 0xca, 0x17, 0x86, 0x74, 0x3f}} ,
|
|
||||||
{{0x1e, 0x64, 0xc1, 0x7d, 0x52, 0xdc, 0x13, 0x5a, 0xa1, 0x9c, 0x4e, 0xee, 0x99, 0x28, 0xbb, 0x4c, 0xee, 0xac, 0xa9, 0x1b, 0x89, 0xa2, 0x38, 0x39, 0x7b, 0xc4, 0x0f, 0x42, 0xe6, 0x89, 0xed, 0x0f}}},
|
|
||||||
{{{0xf3, 0x3c, 0x8c, 0x80, 0x83, 0x10, 0x8a, 0x37, 0x50, 0x9c, 0xb4, 0xdf, 0x3f, 0x8c, 0xf7, 0x23, 0x07, 0xd6, 0xff, 0xa0, 0x82, 0x6c, 0x75, 0x3b, 0xe4, 0xb5, 0xbb, 0xe4, 0xe6, 0x50, 0xf0, 0x08}} ,
|
|
||||||
{{0x62, 0xee, 0x75, 0x48, 0x92, 0x33, 0xf2, 0xf4, 0xad, 0x15, 0x7a, 0xa1, 0x01, 0x46, 0xa9, 0x32, 0x06, 0x88, 0xb6, 0x36, 0x47, 0x35, 0xb9, 0xb4, 0x42, 0x85, 0x76, 0xf0, 0x48, 0x00, 0x90, 0x38}}},
|
|
||||||
{{{0x51, 0x15, 0x9d, 0xc3, 0x95, 0xd1, 0x39, 0xbb, 0x64, 0x9d, 0x15, 0x81, 0xc1, 0x68, 0xd0, 0xb6, 0xa4, 0x2c, 0x7d, 0x5e, 0x02, 0x39, 0x00, 0xe0, 0x3b, 0xa4, 0xcc, 0xca, 0x1d, 0x81, 0x24, 0x10}} ,
|
|
||||||
{{0xe7, 0x29, 0xf9, 0x37, 0xd9, 0x46, 0x5a, 0xcd, 0x70, 0xfe, 0x4d, 0x5b, 0xbf, 0xa5, 0xcf, 0x91, 0xf4, 0xef, 0xee, 0x8a, 0x29, 0xd0, 0xe7, 0xc4, 0x25, 0x92, 0x8a, 0xff, 0x36, 0xfc, 0xe4, 0x49}}},
|
|
||||||
{{{0xbd, 0x00, 0xb9, 0x04, 0x7d, 0x35, 0xfc, 0xeb, 0xd0, 0x0b, 0x05, 0x32, 0x52, 0x7a, 0x89, 0x24, 0x75, 0x50, 0xe1, 0x63, 0x02, 0x82, 0x8e, 0xe7, 0x85, 0x0c, 0xf2, 0x56, 0x44, 0x37, 0x83, 0x25}} ,
|
|
||||||
{{0x8f, 0xa1, 0xce, 0xcb, 0x60, 0xda, 0x12, 0x02, 0x1e, 0x29, 0x39, 0x2a, 0x03, 0xb7, 0xeb, 0x77, 0x40, 0xea, 0xc9, 0x2b, 0x2c, 0xd5, 0x7d, 0x7e, 0x2c, 0xc7, 0x5a, 0xfd, 0xff, 0xc4, 0xd1, 0x62}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x1d, 0x88, 0x98, 0x5b, 0x4e, 0xfc, 0x41, 0x24, 0x05, 0xe6, 0x50, 0x2b, 0xae, 0x96, 0x51, 0xd9, 0x6b, 0x72, 0xb2, 0x33, 0x42, 0x98, 0x68, 0xbb, 0x10, 0x5a, 0x7a, 0x8c, 0x9d, 0x07, 0xb4, 0x05}} ,
|
|
||||||
{{0x2f, 0x61, 0x9f, 0xd7, 0xa8, 0x3f, 0x83, 0x8c, 0x10, 0x69, 0x90, 0xe6, 0xcf, 0xd2, 0x63, 0xa3, 0xe4, 0x54, 0x7e, 0xe5, 0x69, 0x13, 0x1c, 0x90, 0x57, 0xaa, 0xe9, 0x53, 0x22, 0x43, 0x29, 0x23}}},
|
|
||||||
{{{0xe5, 0x1c, 0xf8, 0x0a, 0xfd, 0x2d, 0x7e, 0xf5, 0xf5, 0x70, 0x7d, 0x41, 0x6b, 0x11, 0xfe, 0xbe, 0x99, 0xd1, 0x55, 0x29, 0x31, 0xbf, 0xc0, 0x97, 0x6c, 0xd5, 0x35, 0xcc, 0x5e, 0x8b, 0xd9, 0x69}} ,
|
|
||||||
{{0x8e, 0x4e, 0x9f, 0x25, 0xf8, 0x81, 0x54, 0x2d, 0x0e, 0xd5, 0x54, 0x81, 0x9b, 0xa6, 0x92, 0xce, 0x4b, 0xe9, 0x8f, 0x24, 0x3b, 0xca, 0xe0, 0x44, 0xab, 0x36, 0xfe, 0xfb, 0x87, 0xd4, 0x26, 0x3e}}},
|
|
||||||
{{{0x0f, 0x93, 0x9c, 0x11, 0xe7, 0xdb, 0xf1, 0xf0, 0x85, 0x43, 0x28, 0x15, 0x37, 0xdd, 0xde, 0x27, 0xdf, 0xad, 0x3e, 0x49, 0x4f, 0xe0, 0x5b, 0xf6, 0x80, 0x59, 0x15, 0x3c, 0x85, 0xb7, 0x3e, 0x12}} ,
|
|
||||||
{{0xf5, 0xff, 0xcc, 0xf0, 0xb4, 0x12, 0x03, 0x5f, 0xc9, 0x84, 0xcb, 0x1d, 0x17, 0xe0, 0xbc, 0xcc, 0x03, 0x62, 0xa9, 0x8b, 0x94, 0xa6, 0xaa, 0x18, 0xcb, 0x27, 0x8d, 0x49, 0xa6, 0x17, 0x15, 0x07}}},
|
|
||||||
{{{0xd9, 0xb6, 0xd4, 0x9d, 0xd4, 0x6a, 0xaf, 0x70, 0x07, 0x2c, 0x10, 0x9e, 0xbd, 0x11, 0xad, 0xe4, 0x26, 0x33, 0x70, 0x92, 0x78, 0x1c, 0x74, 0x9f, 0x75, 0x60, 0x56, 0xf4, 0x39, 0xa8, 0xa8, 0x62}} ,
|
|
||||||
{{0x3b, 0xbf, 0x55, 0x35, 0x61, 0x8b, 0x44, 0x97, 0xe8, 0x3a, 0x55, 0xc1, 0xc8, 0x3b, 0xfd, 0x95, 0x29, 0x11, 0x60, 0x96, 0x1e, 0xcb, 0x11, 0x9d, 0xc2, 0x03, 0x8a, 0x1b, 0xc6, 0xd6, 0x45, 0x3d}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x7e, 0x0e, 0x50, 0xb2, 0xcc, 0x0d, 0x6b, 0xa6, 0x71, 0x5b, 0x42, 0xed, 0xbd, 0xaf, 0xac, 0xf0, 0xfc, 0x12, 0xa2, 0x3f, 0x4e, 0xda, 0xe8, 0x11, 0xf3, 0x23, 0xe1, 0x04, 0x62, 0x03, 0x1c, 0x4e}} ,
|
|
||||||
{{0xc8, 0xb1, 0x1b, 0x6f, 0x73, 0x61, 0x3d, 0x27, 0x0d, 0x7d, 0x7a, 0x25, 0x5f, 0x73, 0x0e, 0x2f, 0x93, 0xf6, 0x24, 0xd8, 0x4f, 0x90, 0xac, 0xa2, 0x62, 0x0a, 0xf0, 0x61, 0xd9, 0x08, 0x59, 0x6a}}},
|
|
||||||
{{{0x6f, 0x2d, 0x55, 0xf8, 0x2f, 0x8e, 0xf0, 0x18, 0x3b, 0xea, 0xdd, 0x26, 0x72, 0xd1, 0xf5, 0xfe, 0xe5, 0xb8, 0xe6, 0xd3, 0x10, 0x48, 0x46, 0x49, 0x3a, 0x9f, 0x5e, 0x45, 0x6b, 0x90, 0xe8, 0x7f}} ,
|
|
||||||
{{0xd3, 0x76, 0x69, 0x33, 0x7b, 0xb9, 0x40, 0x70, 0xee, 0xa6, 0x29, 0x6b, 0xdd, 0xd0, 0x5d, 0x8d, 0xc1, 0x3e, 0x4a, 0xea, 0x37, 0xb1, 0x03, 0x02, 0x03, 0x35, 0xf1, 0x28, 0x9d, 0xff, 0x00, 0x13}}},
|
|
||||||
{{{0x7a, 0xdb, 0x12, 0xd2, 0x8a, 0x82, 0x03, 0x1b, 0x1e, 0xaf, 0xf9, 0x4b, 0x9c, 0xbe, 0xae, 0x7c, 0xe4, 0x94, 0x2a, 0x23, 0xb3, 0x62, 0x86, 0xe7, 0xfd, 0x23, 0xaa, 0x99, 0xbd, 0x2b, 0x11, 0x6c}} ,
|
|
||||||
{{0x8d, 0xa6, 0xd5, 0xac, 0x9d, 0xcc, 0x68, 0x75, 0x7f, 0xc3, 0x4d, 0x4b, 0xdd, 0x6c, 0xbb, 0x11, 0x5a, 0x60, 0xe5, 0xbd, 0x7d, 0x27, 0x8b, 0xda, 0xb4, 0x95, 0xf6, 0x03, 0x27, 0xa4, 0x92, 0x3f}}},
|
|
||||||
{{{0x22, 0xd6, 0xb5, 0x17, 0x84, 0xbf, 0x12, 0xcc, 0x23, 0x14, 0x4a, 0xdf, 0x14, 0x31, 0xbc, 0xa1, 0xac, 0x6e, 0xab, 0xfa, 0x57, 0x11, 0x53, 0xb3, 0x27, 0xe6, 0xf9, 0x47, 0x33, 0x44, 0x34, 0x1e}} ,
|
|
||||||
{{0x79, 0xfc, 0xa6, 0xb4, 0x0b, 0x35, 0x20, 0xc9, 0x4d, 0x22, 0x84, 0xc4, 0xa9, 0x20, 0xec, 0x89, 0x94, 0xba, 0x66, 0x56, 0x48, 0xb9, 0x87, 0x7f, 0xca, 0x1e, 0x06, 0xed, 0xa5, 0x55, 0x59, 0x29}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x56, 0xe1, 0xf5, 0xf1, 0xd5, 0xab, 0xa8, 0x2b, 0xae, 0x89, 0xf3, 0xcf, 0x56, 0x9f, 0xf2, 0x4b, 0x31, 0xbc, 0x18, 0xa9, 0x06, 0x5b, 0xbe, 0xb4, 0x61, 0xf8, 0xb2, 0x06, 0x9c, 0x81, 0xab, 0x4c}} ,
|
|
||||||
{{0x1f, 0x68, 0x76, 0x01, 0x16, 0x38, 0x2b, 0x0f, 0x77, 0x97, 0x92, 0x67, 0x4e, 0x86, 0x6a, 0x8b, 0xe5, 0xe8, 0x0c, 0xf7, 0x36, 0x39, 0xb5, 0x33, 0xe6, 0xcf, 0x5e, 0xbd, 0x18, 0xfb, 0x10, 0x1f}}},
|
|
||||||
{{{0x83, 0xf0, 0x0d, 0x63, 0xef, 0x53, 0x6b, 0xb5, 0x6b, 0xf9, 0x83, 0xcf, 0xde, 0x04, 0x22, 0x9b, 0x2c, 0x0a, 0xe0, 0xa5, 0xd8, 0xc7, 0x9c, 0xa5, 0xa3, 0xf6, 0x6f, 0xcf, 0x90, 0x6b, 0x68, 0x7c}} ,
|
|
||||||
{{0x33, 0x15, 0xd7, 0x7f, 0x1a, 0xd5, 0x21, 0x58, 0xc4, 0x18, 0xa5, 0xf0, 0xcc, 0x73, 0xa8, 0xfd, 0xfa, 0x18, 0xd1, 0x03, 0x91, 0x8d, 0x52, 0xd2, 0xa3, 0xa4, 0xd3, 0xb1, 0xea, 0x1d, 0x0f, 0x00}}},
|
|
||||||
{{{0xcc, 0x48, 0x83, 0x90, 0xe5, 0xfd, 0x3f, 0x84, 0xaa, 0xf9, 0x8b, 0x82, 0x59, 0x24, 0x34, 0x68, 0x4f, 0x1c, 0x23, 0xd9, 0xcc, 0x71, 0xe1, 0x7f, 0x8c, 0xaf, 0xf1, 0xee, 0x00, 0xb6, 0xa0, 0x77}} ,
|
|
||||||
{{0xf5, 0x1a, 0x61, 0xf7, 0x37, 0x9d, 0x00, 0xf4, 0xf2, 0x69, 0x6f, 0x4b, 0x01, 0x85, 0x19, 0x45, 0x4d, 0x7f, 0x02, 0x7c, 0x6a, 0x05, 0x47, 0x6c, 0x1f, 0x81, 0x20, 0xd4, 0xe8, 0x50, 0x27, 0x72}}},
|
|
||||||
{{{0x2c, 0x3a, 0xe5, 0xad, 0xf4, 0xdd, 0x2d, 0xf7, 0x5c, 0x44, 0xb5, 0x5b, 0x21, 0xa3, 0x89, 0x5f, 0x96, 0x45, 0xca, 0x4d, 0xa4, 0x21, 0x99, 0x70, 0xda, 0xc4, 0xc4, 0xa0, 0xe5, 0xf4, 0xec, 0x0a}} ,
|
|
||||||
{{0x07, 0x68, 0x21, 0x65, 0xe9, 0x08, 0xa0, 0x0b, 0x6a, 0x4a, 0xba, 0xb5, 0x80, 0xaf, 0xd0, 0x1b, 0xc5, 0xf5, 0x4b, 0x73, 0x50, 0x60, 0x2d, 0x71, 0x69, 0x61, 0x0e, 0xc0, 0x20, 0x40, 0x30, 0x19}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0xd0, 0x75, 0x57, 0x3b, 0xeb, 0x5c, 0x14, 0x56, 0x50, 0xc9, 0x4f, 0xb8, 0xb8, 0x1e, 0xa3, 0xf4, 0xab, 0xf5, 0xa9, 0x20, 0x15, 0x94, 0x82, 0xda, 0x96, 0x1c, 0x9b, 0x59, 0x8c, 0xff, 0xf4, 0x51}} ,
|
|
||||||
{{0xc1, 0x3a, 0x86, 0xd7, 0xb0, 0x06, 0x84, 0x7f, 0x1b, 0xbd, 0xd4, 0x07, 0x78, 0x80, 0x2e, 0xb1, 0xb4, 0xee, 0x52, 0x38, 0xee, 0x9a, 0xf9, 0xf6, 0xf3, 0x41, 0x6e, 0xd4, 0x88, 0x95, 0xac, 0x35}}},
|
|
||||||
{{{0x41, 0x97, 0xbf, 0x71, 0x6a, 0x9b, 0x72, 0xec, 0xf3, 0xf8, 0x6b, 0xe6, 0x0e, 0x6c, 0x69, 0xa5, 0x2f, 0x68, 0x52, 0xd8, 0x61, 0x81, 0xc0, 0x63, 0x3f, 0xa6, 0x3c, 0x13, 0x90, 0xe6, 0x8d, 0x56}} ,
|
|
||||||
{{0xe8, 0x39, 0x30, 0x77, 0x23, 0xb1, 0xfd, 0x1b, 0x3d, 0x3e, 0x74, 0x4d, 0x7f, 0xae, 0x5b, 0x3a, 0xb4, 0x65, 0x0e, 0x3a, 0x43, 0xdc, 0xdc, 0x41, 0x47, 0xe6, 0xe8, 0x92, 0x09, 0x22, 0x48, 0x4c}}},
|
|
||||||
{{{0x85, 0x57, 0x9f, 0xb5, 0xc8, 0x06, 0xb2, 0x9f, 0x47, 0x3f, 0xf0, 0xfa, 0xe6, 0xa9, 0xb1, 0x9b, 0x6f, 0x96, 0x7d, 0xf9, 0xa4, 0x65, 0x09, 0x75, 0x32, 0xa6, 0x6c, 0x7f, 0x47, 0x4b, 0x2f, 0x4f}} ,
|
|
||||||
{{0x34, 0xe9, 0x59, 0x93, 0x9d, 0x26, 0x80, 0x54, 0xf2, 0xcc, 0x3c, 0xc2, 0x25, 0x85, 0xe3, 0x6a, 0xc1, 0x62, 0x04, 0xa7, 0x08, 0x32, 0x6d, 0xa1, 0x39, 0x84, 0x8a, 0x3b, 0x87, 0x5f, 0x11, 0x13}}},
|
|
||||||
{{{0xda, 0x03, 0x34, 0x66, 0xc4, 0x0c, 0x73, 0x6e, 0xbc, 0x24, 0xb5, 0xf9, 0x70, 0x81, 0x52, 0xe9, 0xf4, 0x7c, 0x23, 0xdd, 0x9f, 0xb8, 0x46, 0xef, 0x1d, 0x22, 0x55, 0x7d, 0x71, 0xc4, 0x42, 0x33}} ,
|
|
||||||
{{0xc5, 0x37, 0x69, 0x5b, 0xa8, 0xc6, 0x9d, 0xa4, 0xfc, 0x61, 0x6e, 0x68, 0x46, 0xea, 0xd7, 0x1c, 0x67, 0xd2, 0x7d, 0xfa, 0xf1, 0xcc, 0x54, 0x8d, 0x36, 0x35, 0xc9, 0x00, 0xdf, 0x6c, 0x67, 0x50}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x9a, 0x4d, 0x42, 0x29, 0x5d, 0xa4, 0x6b, 0x6f, 0xa8, 0x8a, 0x4d, 0x91, 0x7b, 0xd2, 0xdf, 0x36, 0xef, 0x01, 0x22, 0xc5, 0xcc, 0x8d, 0xeb, 0x58, 0x3d, 0xb3, 0x50, 0xfc, 0x8b, 0x97, 0x96, 0x33}} ,
|
|
||||||
{{0x93, 0x33, 0x07, 0xc8, 0x4a, 0xca, 0xd0, 0xb1, 0xab, 0xbd, 0xdd, 0xa7, 0x7c, 0xac, 0x3e, 0x45, 0xcb, 0xcc, 0x07, 0x91, 0xbf, 0x35, 0x9d, 0xcb, 0x7d, 0x12, 0x3c, 0x11, 0x59, 0x13, 0xcf, 0x5c}}},
|
|
||||||
{{{0x45, 0xb8, 0x41, 0xd7, 0xab, 0x07, 0x15, 0x00, 0x8e, 0xce, 0xdf, 0xb2, 0x43, 0x5c, 0x01, 0xdc, 0xf4, 0x01, 0x51, 0x95, 0x10, 0x5a, 0xf6, 0x24, 0x24, 0xa0, 0x19, 0x3a, 0x09, 0x2a, 0xaa, 0x3f}} ,
|
|
||||||
{{0xdc, 0x8e, 0xeb, 0xc6, 0xbf, 0xdd, 0x11, 0x7b, 0xe7, 0x47, 0xe6, 0xce, 0xe7, 0xb6, 0xc5, 0xe8, 0x8a, 0xdc, 0x4b, 0x57, 0x15, 0x3b, 0x66, 0xca, 0x89, 0xa3, 0xfd, 0xac, 0x0d, 0xe1, 0x1d, 0x7a}}},
|
|
||||||
{{{0x89, 0xef, 0xbf, 0x03, 0x75, 0xd0, 0x29, 0x50, 0xcb, 0x7d, 0xd6, 0xbe, 0xad, 0x5f, 0x7b, 0x00, 0x32, 0xaa, 0x98, 0xed, 0x3f, 0x8f, 0x92, 0xcb, 0x81, 0x56, 0x01, 0x63, 0x64, 0xa3, 0x38, 0x39}} ,
|
|
||||||
{{0x8b, 0xa4, 0xd6, 0x50, 0xb4, 0xaa, 0x5d, 0x64, 0x64, 0x76, 0x2e, 0xa1, 0xa6, 0xb3, 0xb8, 0x7c, 0x7a, 0x56, 0xf5, 0x5c, 0x4e, 0x84, 0x5c, 0xfb, 0xdd, 0xca, 0x48, 0x8b, 0x48, 0xb9, 0xba, 0x34}}},
|
|
||||||
{{{0xc5, 0xe3, 0xe8, 0xae, 0x17, 0x27, 0xe3, 0x64, 0x60, 0x71, 0x47, 0x29, 0x02, 0x0f, 0x92, 0x5d, 0x10, 0x93, 0xc8, 0x0e, 0xa1, 0xed, 0xba, 0xa9, 0x96, 0x1c, 0xc5, 0x76, 0x30, 0xcd, 0xf9, 0x30}} ,
|
|
||||||
{{0x95, 0xb0, 0xbd, 0x8c, 0xbc, 0xa7, 0x4f, 0x7e, 0xfd, 0x4e, 0x3a, 0xbf, 0x5f, 0x04, 0x79, 0x80, 0x2b, 0x5a, 0x9f, 0x4f, 0x68, 0x21, 0x19, 0x71, 0xc6, 0x20, 0x01, 0x42, 0xaa, 0xdf, 0xae, 0x2c}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x90, 0x6e, 0x7e, 0x4b, 0x71, 0x93, 0xc0, 0x72, 0xed, 0xeb, 0x71, 0x24, 0x97, 0x26, 0x9c, 0xfe, 0xcb, 0x3e, 0x59, 0x19, 0xa8, 0x0f, 0x75, 0x7d, 0xbe, 0x18, 0xe6, 0x96, 0x1e, 0x95, 0x70, 0x60}} ,
|
|
||||||
{{0x89, 0x66, 0x3e, 0x1d, 0x4c, 0x5f, 0xfe, 0xc0, 0x04, 0x43, 0xd6, 0x44, 0x19, 0xb5, 0xad, 0xc7, 0x22, 0xdc, 0x71, 0x28, 0x64, 0xde, 0x41, 0x38, 0x27, 0x8f, 0x2c, 0x6b, 0x08, 0xb8, 0xb8, 0x7b}}},
|
|
||||||
{{{0x3d, 0x70, 0x27, 0x9d, 0xd9, 0xaf, 0xb1, 0x27, 0xaf, 0xe3, 0x5d, 0x1e, 0x3a, 0x30, 0x54, 0x61, 0x60, 0xe8, 0xc3, 0x26, 0x3a, 0xbc, 0x7e, 0xf5, 0x81, 0xdd, 0x64, 0x01, 0x04, 0xeb, 0xc0, 0x1e}} ,
|
|
||||||
{{0xda, 0x2c, 0xa4, 0xd1, 0xa1, 0xc3, 0x5c, 0x6e, 0x32, 0x07, 0x1f, 0xb8, 0x0e, 0x19, 0x9e, 0x99, 0x29, 0x33, 0x9a, 0xae, 0x7a, 0xed, 0x68, 0x42, 0x69, 0x7c, 0x07, 0xb3, 0x38, 0x2c, 0xf6, 0x3d}}},
|
|
||||||
{{{0x64, 0xaa, 0xb5, 0x88, 0x79, 0x65, 0x38, 0x8c, 0x94, 0xd6, 0x62, 0x37, 0x7d, 0x64, 0xcd, 0x3a, 0xeb, 0xff, 0xe8, 0x81, 0x09, 0xc7, 0x6a, 0x50, 0x09, 0x0d, 0x28, 0x03, 0x0d, 0x9a, 0x93, 0x0a}} ,
|
|
||||||
{{0x42, 0xa3, 0xf1, 0xc5, 0xb4, 0x0f, 0xd8, 0xc8, 0x8d, 0x15, 0x31, 0xbd, 0xf8, 0x07, 0x8b, 0xcd, 0x08, 0x8a, 0xfb, 0x18, 0x07, 0xfe, 0x8e, 0x52, 0x86, 0xef, 0xbe, 0xec, 0x49, 0x52, 0x99, 0x08}}},
|
|
||||||
{{{0x0f, 0xa9, 0xd5, 0x01, 0xaa, 0x48, 0x4f, 0x28, 0x66, 0x32, 0x1a, 0xba, 0x7c, 0xea, 0x11, 0x80, 0x17, 0x18, 0x9b, 0x56, 0x88, 0x25, 0x06, 0x69, 0x12, 0x2c, 0xea, 0x56, 0x69, 0x41, 0x24, 0x19}} ,
|
|
||||||
{{0xde, 0x21, 0xf0, 0xda, 0x8a, 0xfb, 0xb1, 0xb8, 0xcd, 0xc8, 0x6a, 0x82, 0x19, 0x73, 0xdb, 0xc7, 0xcf, 0x88, 0xeb, 0x96, 0xee, 0x6f, 0xfb, 0x06, 0xd2, 0xcd, 0x7d, 0x7b, 0x12, 0x28, 0x8e, 0x0c}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x93, 0x44, 0x97, 0xce, 0x28, 0xff, 0x3a, 0x40, 0xc4, 0xf5, 0xf6, 0x9b, 0xf4, 0x6b, 0x07, 0x84, 0xfb, 0x98, 0xd8, 0xec, 0x8c, 0x03, 0x57, 0xec, 0x49, 0xed, 0x63, 0xb6, 0xaa, 0xff, 0x98, 0x28}} ,
|
|
||||||
{{0x3d, 0x16, 0x35, 0xf3, 0x46, 0xbc, 0xb3, 0xf4, 0xc6, 0xb6, 0x4f, 0xfa, 0xf4, 0xa0, 0x13, 0xe6, 0x57, 0x45, 0x93, 0xb9, 0xbc, 0xd6, 0x59, 0xe7, 0x77, 0x94, 0x6c, 0xab, 0x96, 0x3b, 0x4f, 0x09}}},
|
|
||||||
{{{0x5a, 0xf7, 0x6b, 0x01, 0x12, 0x4f, 0x51, 0xc1, 0x70, 0x84, 0x94, 0x47, 0xb2, 0x01, 0x6c, 0x71, 0xd7, 0xcc, 0x17, 0x66, 0x0f, 0x59, 0x5d, 0x5d, 0x10, 0x01, 0x57, 0x11, 0xf5, 0xdd, 0xe2, 0x34}} ,
|
|
||||||
{{0x26, 0xd9, 0x1f, 0x5c, 0x58, 0xac, 0x8b, 0x03, 0xd2, 0xc3, 0x85, 0x0f, 0x3a, 0xc3, 0x7f, 0x6d, 0x8e, 0x86, 0xcd, 0x52, 0x74, 0x8f, 0x55, 0x77, 0x17, 0xb7, 0x8e, 0xb7, 0x88, 0xea, 0xda, 0x1b}}},
|
|
||||||
{{{0xb6, 0xea, 0x0e, 0x40, 0x93, 0x20, 0x79, 0x35, 0x6a, 0x61, 0x84, 0x5a, 0x07, 0x6d, 0xf9, 0x77, 0x6f, 0xed, 0x69, 0x1c, 0x0d, 0x25, 0x76, 0xcc, 0xf0, 0xdb, 0xbb, 0xc5, 0xad, 0xe2, 0x26, 0x57}} ,
|
|
||||||
{{0xcf, 0xe8, 0x0e, 0x6b, 0x96, 0x7d, 0xed, 0x27, 0xd1, 0x3c, 0xa9, 0xd9, 0x50, 0xa9, 0x98, 0x84, 0x5e, 0x86, 0xef, 0xd6, 0xf0, 0xf8, 0x0e, 0x89, 0x05, 0x2f, 0xd9, 0x5f, 0x15, 0x5f, 0x73, 0x79}}},
|
|
||||||
{{{0xc8, 0x5c, 0x16, 0xfe, 0xed, 0x9f, 0x26, 0x56, 0xf6, 0x4b, 0x9f, 0xa7, 0x0a, 0x85, 0xfe, 0xa5, 0x8c, 0x87, 0xdd, 0x98, 0xce, 0x4e, 0xc3, 0x58, 0x55, 0xb2, 0x7b, 0x3d, 0xd8, 0x6b, 0xb5, 0x4c}} ,
|
|
||||||
{{0x65, 0x38, 0xa0, 0x15, 0xfa, 0xa7, 0xb4, 0x8f, 0xeb, 0xc4, 0x86, 0x9b, 0x30, 0xa5, 0x5e, 0x4d, 0xea, 0x8a, 0x9a, 0x9f, 0x1a, 0xd8, 0x5b, 0x53, 0x14, 0x19, 0x25, 0x63, 0xb4, 0x6f, 0x1f, 0x5d}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0xac, 0x8f, 0xbc, 0x1e, 0x7d, 0x8b, 0x5a, 0x0b, 0x8d, 0xaf, 0x76, 0x2e, 0x71, 0xe3, 0x3b, 0x6f, 0x53, 0x2f, 0x3e, 0x90, 0x95, 0xd4, 0x35, 0x14, 0x4f, 0x8c, 0x3c, 0xce, 0x57, 0x1c, 0x76, 0x49}} ,
|
|
||||||
{{0xa8, 0x50, 0xe1, 0x61, 0x6b, 0x57, 0x35, 0xeb, 0x44, 0x0b, 0x0c, 0x6e, 0xf9, 0x25, 0x80, 0x74, 0xf2, 0x8f, 0x6f, 0x7a, 0x3e, 0x7f, 0x2d, 0xf3, 0x4e, 0x09, 0x65, 0x10, 0x5e, 0x03, 0x25, 0x32}}},
|
|
||||||
{{{0xa9, 0x60, 0xdc, 0x0f, 0x64, 0xe5, 0x1d, 0xe2, 0x8d, 0x4f, 0x79, 0x2f, 0x0e, 0x24, 0x02, 0x00, 0x05, 0x77, 0x43, 0x25, 0x3d, 0x6a, 0xc7, 0xb7, 0xbf, 0x04, 0x08, 0x65, 0xf4, 0x39, 0x4b, 0x65}} ,
|
|
||||||
{{0x96, 0x19, 0x12, 0x6b, 0x6a, 0xb7, 0xe3, 0xdc, 0x45, 0x9b, 0xdb, 0xb4, 0xa8, 0xae, 0xdc, 0xa8, 0x14, 0x44, 0x65, 0x62, 0xce, 0x34, 0x9a, 0x84, 0x18, 0x12, 0x01, 0xf1, 0xe2, 0x7b, 0xce, 0x50}}},
|
|
||||||
{{{0x41, 0x21, 0x30, 0x53, 0x1b, 0x47, 0x01, 0xb7, 0x18, 0xd8, 0x82, 0x57, 0xbd, 0xa3, 0x60, 0xf0, 0x32, 0xf6, 0x5b, 0xf0, 0x30, 0x88, 0x91, 0x59, 0xfd, 0x90, 0xa2, 0xb9, 0x55, 0x93, 0x21, 0x34}} ,
|
|
||||||
{{0x97, 0x67, 0x9e, 0xeb, 0x6a, 0xf9, 0x6e, 0xd6, 0x73, 0xe8, 0x6b, 0x29, 0xec, 0x63, 0x82, 0x00, 0xa8, 0x99, 0x1c, 0x1d, 0x30, 0xc8, 0x90, 0x52, 0x90, 0xb6, 0x6a, 0x80, 0x4e, 0xff, 0x4b, 0x51}}},
|
|
||||||
{{{0x0f, 0x7d, 0x63, 0x8c, 0x6e, 0x5c, 0xde, 0x30, 0xdf, 0x65, 0xfa, 0x2e, 0xb0, 0xa3, 0x25, 0x05, 0x54, 0xbd, 0x25, 0xba, 0x06, 0xae, 0xdf, 0x8b, 0xd9, 0x1b, 0xea, 0x38, 0xb3, 0x05, 0x16, 0x09}} ,
|
|
||||||
{{0xc7, 0x8c, 0xbf, 0x64, 0x28, 0xad, 0xf8, 0xa5, 0x5a, 0x6f, 0xc9, 0xba, 0xd5, 0x7f, 0xd5, 0xd6, 0xbd, 0x66, 0x2f, 0x3d, 0xaa, 0x54, 0xf6, 0xba, 0x32, 0x22, 0x9a, 0x1e, 0x52, 0x05, 0xf4, 0x1d}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0xaa, 0x1f, 0xbb, 0xeb, 0xfe, 0xe4, 0x87, 0xfc, 0xb1, 0x2c, 0xb7, 0x88, 0xf4, 0xc6, 0xb9, 0xf5, 0x24, 0x46, 0xf2, 0xa5, 0x9f, 0x8f, 0x8a, 0x93, 0x70, 0x69, 0xd4, 0x56, 0xec, 0xfd, 0x06, 0x46}} ,
|
|
||||||
{{0x4e, 0x66, 0xcf, 0x4e, 0x34, 0xce, 0x0c, 0xd9, 0xa6, 0x50, 0xd6, 0x5e, 0x95, 0xaf, 0xe9, 0x58, 0xfa, 0xee, 0x9b, 0xb8, 0xa5, 0x0f, 0x35, 0xe0, 0x43, 0x82, 0x6d, 0x65, 0xe6, 0xd9, 0x00, 0x0f}}},
|
|
||||||
{{{0x7b, 0x75, 0x3a, 0xfc, 0x64, 0xd3, 0x29, 0x7e, 0xdd, 0x49, 0x9a, 0x59, 0x53, 0xbf, 0xb4, 0xa7, 0x52, 0xb3, 0x05, 0xab, 0xc3, 0xaf, 0x16, 0x1a, 0x85, 0x42, 0x32, 0xa2, 0x86, 0xfa, 0x39, 0x43}} ,
|
|
||||||
{{0x0e, 0x4b, 0xa3, 0x63, 0x8a, 0xfe, 0xa5, 0x58, 0xf1, 0x13, 0xbd, 0x9d, 0xaa, 0x7f, 0x76, 0x40, 0x70, 0x81, 0x10, 0x75, 0x99, 0xbb, 0xbe, 0x0b, 0x16, 0xe9, 0xba, 0x62, 0x34, 0xcc, 0x07, 0x6d}}},
|
|
||||||
{{{0xc3, 0xf1, 0xc6, 0x93, 0x65, 0xee, 0x0b, 0xbc, 0xea, 0x14, 0xf0, 0xc1, 0xf8, 0x84, 0x89, 0xc2, 0xc9, 0xd7, 0xea, 0x34, 0xca, 0xa7, 0xc4, 0x99, 0xd5, 0x50, 0x69, 0xcb, 0xd6, 0x21, 0x63, 0x7c}} ,
|
|
||||||
{{0x99, 0xeb, 0x7c, 0x31, 0x73, 0x64, 0x67, 0x7f, 0x0c, 0x66, 0xaa, 0x8c, 0x69, 0x91, 0xe2, 0x26, 0xd3, 0x23, 0xe2, 0x76, 0x5d, 0x32, 0x52, 0xdf, 0x5d, 0xc5, 0x8f, 0xb7, 0x7c, 0x84, 0xb3, 0x70}}},
|
|
||||||
{{{0xeb, 0x01, 0xc7, 0x36, 0x97, 0x4e, 0xb6, 0xab, 0x5f, 0x0d, 0x2c, 0xba, 0x67, 0x64, 0x55, 0xde, 0xbc, 0xff, 0xa6, 0xec, 0x04, 0xd3, 0x8d, 0x39, 0x56, 0x5e, 0xee, 0xf8, 0xe4, 0x2e, 0x33, 0x62}} ,
|
|
||||||
{{0x65, 0xef, 0xb8, 0x9f, 0xc8, 0x4b, 0xa7, 0xfd, 0x21, 0x49, 0x9b, 0x92, 0x35, 0x82, 0xd6, 0x0a, 0x9b, 0xf2, 0x79, 0xf1, 0x47, 0x2f, 0x6a, 0x7e, 0x9f, 0xcf, 0x18, 0x02, 0x3c, 0xfb, 0x1b, 0x3e}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x2f, 0x8b, 0xc8, 0x40, 0x51, 0xd1, 0xac, 0x1a, 0x0b, 0xe4, 0xa9, 0xa2, 0x42, 0x21, 0x19, 0x2f, 0x7b, 0x97, 0xbf, 0xf7, 0x57, 0x6d, 0x3f, 0x3d, 0x4f, 0x0f, 0xe2, 0xb2, 0x81, 0x00, 0x9e, 0x7b}} ,
|
|
||||||
{{0x8c, 0x85, 0x2b, 0xc4, 0xfc, 0xf1, 0xab, 0xe8, 0x79, 0x22, 0xc4, 0x84, 0x17, 0x3a, 0xfa, 0x86, 0xa6, 0x7d, 0xf9, 0xf3, 0x6f, 0x03, 0x57, 0x20, 0x4d, 0x79, 0xf9, 0x6e, 0x71, 0x54, 0x38, 0x09}}},
|
|
||||||
{{{0x40, 0x29, 0x74, 0xa8, 0x2f, 0x5e, 0xf9, 0x79, 0xa4, 0xf3, 0x3e, 0xb9, 0xfd, 0x33, 0x31, 0xac, 0x9a, 0x69, 0x88, 0x1e, 0x77, 0x21, 0x2d, 0xf3, 0x91, 0x52, 0x26, 0x15, 0xb2, 0xa6, 0xcf, 0x7e}} ,
|
|
||||||
{{0xc6, 0x20, 0x47, 0x6c, 0xa4, 0x7d, 0xcb, 0x63, 0xea, 0x5b, 0x03, 0xdf, 0x3e, 0x88, 0x81, 0x6d, 0xce, 0x07, 0x42, 0x18, 0x60, 0x7e, 0x7b, 0x55, 0xfe, 0x6a, 0xf3, 0xda, 0x5c, 0x8b, 0x95, 0x10}}},
|
|
||||||
{{{0x62, 0xe4, 0x0d, 0x03, 0xb4, 0xd7, 0xcd, 0xfa, 0xbd, 0x46, 0xdf, 0x93, 0x71, 0x10, 0x2c, 0xa8, 0x3b, 0xb6, 0x09, 0x05, 0x70, 0x84, 0x43, 0x29, 0xa8, 0x59, 0xf5, 0x8e, 0x10, 0xe4, 0xd7, 0x20}} ,
|
|
||||||
{{0x57, 0x82, 0x1c, 0xab, 0xbf, 0x62, 0x70, 0xe8, 0xc4, 0xcf, 0xf0, 0x28, 0x6e, 0x16, 0x3c, 0x08, 0x78, 0x89, 0x85, 0x46, 0x0f, 0xf6, 0x7f, 0xcf, 0xcb, 0x7e, 0xb8, 0x25, 0xe9, 0x5a, 0xfa, 0x03}}},
|
|
||||||
{{{0xfb, 0x95, 0x92, 0x63, 0x50, 0xfc, 0x62, 0xf0, 0xa4, 0x5e, 0x8c, 0x18, 0xc2, 0x17, 0x24, 0xb7, 0x78, 0xc2, 0xa9, 0xe7, 0x6a, 0x32, 0xd6, 0x29, 0x85, 0xaf, 0xcb, 0x8d, 0x91, 0x13, 0xda, 0x6b}} ,
|
|
||||||
{{0x36, 0x0a, 0xc2, 0xb6, 0x4b, 0xa5, 0x5d, 0x07, 0x17, 0x41, 0x31, 0x5f, 0x62, 0x46, 0xf8, 0x92, 0xf9, 0x66, 0x48, 0x73, 0xa6, 0x97, 0x0d, 0x7d, 0x88, 0xee, 0x62, 0xb1, 0x03, 0xa8, 0x3f, 0x2c}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x4a, 0xb1, 0x70, 0x8a, 0xa9, 0xe8, 0x63, 0x79, 0x00, 0xe2, 0x25, 0x16, 0xca, 0x4b, 0x0f, 0xa4, 0x66, 0xad, 0x19, 0x9f, 0x88, 0x67, 0x0c, 0x8b, 0xc2, 0x4a, 0x5b, 0x2b, 0x6d, 0x95, 0xaf, 0x19}} ,
|
|
||||||
{{0x8b, 0x9d, 0xb6, 0xcc, 0x60, 0xb4, 0x72, 0x4f, 0x17, 0x69, 0x5a, 0x4a, 0x68, 0x34, 0xab, 0xa1, 0x45, 0x32, 0x3c, 0x83, 0x87, 0x72, 0x30, 0x54, 0x77, 0x68, 0xae, 0xfb, 0xb5, 0x8b, 0x22, 0x5e}}},
|
|
||||||
{{{0xf1, 0xb9, 0x87, 0x35, 0xc5, 0xbb, 0xb9, 0xcf, 0xf5, 0xd6, 0xcd, 0xd5, 0x0c, 0x7c, 0x0e, 0xe6, 0x90, 0x34, 0xfb, 0x51, 0x42, 0x1e, 0x6d, 0xac, 0x9a, 0x46, 0xc4, 0x97, 0x29, 0x32, 0xbf, 0x45}} ,
|
|
||||||
{{0x66, 0x9e, 0xc6, 0x24, 0xc0, 0xed, 0xa5, 0x5d, 0x88, 0xd4, 0xf0, 0x73, 0x97, 0x7b, 0xea, 0x7f, 0x42, 0xff, 0x21, 0xa0, 0x9b, 0x2f, 0x9a, 0xfd, 0x53, 0x57, 0x07, 0x84, 0x48, 0x88, 0x9d, 0x52}}},
|
|
||||||
{{{0xc6, 0x96, 0x48, 0x34, 0x2a, 0x06, 0xaf, 0x94, 0x3d, 0xf4, 0x1a, 0xcf, 0xf2, 0xc0, 0x21, 0xc2, 0x42, 0x5e, 0xc8, 0x2f, 0x35, 0xa2, 0x3e, 0x29, 0xfa, 0x0c, 0x84, 0xe5, 0x89, 0x72, 0x7c, 0x06}} ,
|
|
||||||
{{0x32, 0x65, 0x03, 0xe5, 0x89, 0xa6, 0x6e, 0xb3, 0x5b, 0x8e, 0xca, 0xeb, 0xfe, 0x22, 0x56, 0x8b, 0x5d, 0x14, 0x4b, 0x4d, 0xf9, 0xbe, 0xb5, 0xf5, 0xe6, 0x5c, 0x7b, 0x8b, 0xf4, 0x13, 0x11, 0x34}}},
|
|
||||||
{{{0x07, 0xc6, 0x22, 0x15, 0xe2, 0x9c, 0x60, 0xa2, 0x19, 0xd9, 0x27, 0xae, 0x37, 0x4e, 0xa6, 0xc9, 0x80, 0xa6, 0x91, 0x8f, 0x12, 0x49, 0xe5, 0x00, 0x18, 0x47, 0xd1, 0xd7, 0x28, 0x22, 0x63, 0x39}} ,
|
|
||||||
{{0xe8, 0xe2, 0x00, 0x7e, 0xf2, 0x9e, 0x1e, 0x99, 0x39, 0x95, 0x04, 0xbd, 0x1e, 0x67, 0x7b, 0xb2, 0x26, 0xac, 0xe6, 0xaa, 0xe2, 0x46, 0xd5, 0xe4, 0xe8, 0x86, 0xbd, 0xab, 0x7c, 0x55, 0x59, 0x6f}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x24, 0x64, 0x6e, 0x9b, 0x35, 0x71, 0x78, 0xce, 0x33, 0x03, 0x21, 0x33, 0x36, 0xf1, 0x73, 0x9b, 0xb9, 0x15, 0x8b, 0x2c, 0x69, 0xcf, 0x4d, 0xed, 0x4f, 0x4d, 0x57, 0x14, 0x13, 0x82, 0xa4, 0x4d}} ,
|
|
||||||
{{0x65, 0x6e, 0x0a, 0xa4, 0x59, 0x07, 0x17, 0xf2, 0x6b, 0x4a, 0x1f, 0x6e, 0xf6, 0xb5, 0xbc, 0x62, 0xe4, 0xb6, 0xda, 0xa2, 0x93, 0xbc, 0x29, 0x05, 0xd2, 0xd2, 0x73, 0x46, 0x03, 0x16, 0x40, 0x31}}},
|
|
||||||
{{{0x4c, 0x73, 0x6d, 0x15, 0xbd, 0xa1, 0x4d, 0x5c, 0x13, 0x0b, 0x24, 0x06, 0x98, 0x78, 0x1c, 0x5b, 0xeb, 0x1f, 0x18, 0x54, 0x43, 0xd9, 0x55, 0x66, 0xda, 0x29, 0x21, 0xe8, 0xb8, 0x3c, 0x42, 0x22}} ,
|
|
||||||
{{0xb4, 0xcd, 0x08, 0x6f, 0x15, 0x23, 0x1a, 0x0b, 0x22, 0xed, 0xd1, 0xf1, 0xa7, 0xc7, 0x73, 0x45, 0xf3, 0x9e, 0xce, 0x76, 0xb7, 0xf6, 0x39, 0xb6, 0x8e, 0x79, 0xbe, 0xe9, 0x9b, 0xcf, 0x7d, 0x62}}},
|
|
||||||
{{{0x92, 0x5b, 0xfc, 0x72, 0xfd, 0xba, 0xf1, 0xfd, 0xa6, 0x7c, 0x95, 0xe3, 0x61, 0x3f, 0xe9, 0x03, 0xd4, 0x2b, 0xd4, 0x20, 0xd9, 0xdb, 0x4d, 0x32, 0x3e, 0xf5, 0x11, 0x64, 0xe3, 0xb4, 0xbe, 0x32}} ,
|
|
||||||
{{0x86, 0x17, 0x90, 0xe7, 0xc9, 0x1f, 0x10, 0xa5, 0x6a, 0x2d, 0x39, 0xd0, 0x3b, 0xc4, 0xa6, 0xe9, 0x59, 0x13, 0xda, 0x1a, 0xe6, 0xa0, 0xb9, 0x3c, 0x50, 0xb8, 0x40, 0x7c, 0x15, 0x36, 0x5a, 0x42}}},
|
|
||||||
{{{0xb4, 0x0b, 0x32, 0xab, 0xdc, 0x04, 0x51, 0x55, 0x21, 0x1e, 0x0b, 0x75, 0x99, 0x89, 0x73, 0x35, 0x3a, 0x91, 0x2b, 0xfe, 0xe7, 0x49, 0xea, 0x76, 0xc1, 0xf9, 0x46, 0xb9, 0x53, 0x02, 0x23, 0x04}} ,
|
|
||||||
{{0xfc, 0x5a, 0x1e, 0x1d, 0x74, 0x58, 0x95, 0xa6, 0x8f, 0x7b, 0x97, 0x3e, 0x17, 0x3b, 0x79, 0x2d, 0xa6, 0x57, 0xef, 0x45, 0x02, 0x0b, 0x4d, 0x6e, 0x9e, 0x93, 0x8d, 0x2f, 0xd9, 0x9d, 0xdb, 0x04}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0xc0, 0xd7, 0x56, 0x97, 0x58, 0x91, 0xde, 0x09, 0x4f, 0x9f, 0xbe, 0x63, 0xb0, 0x83, 0x86, 0x43, 0x5d, 0xbc, 0xe0, 0xf3, 0xc0, 0x75, 0xbf, 0x8b, 0x8e, 0xaa, 0xf7, 0x8b, 0x64, 0x6e, 0xb0, 0x63}} ,
|
|
||||||
{{0x16, 0xae, 0x8b, 0xe0, 0x9b, 0x24, 0x68, 0x5c, 0x44, 0xc2, 0xd0, 0x08, 0xb7, 0x7b, 0x62, 0xfd, 0x7f, 0xd8, 0xd4, 0xb7, 0x50, 0xfd, 0x2c, 0x1b, 0xbf, 0x41, 0x95, 0xd9, 0x8e, 0xd8, 0x17, 0x1b}}},
|
|
||||||
{{{0x86, 0x55, 0x37, 0x8e, 0xc3, 0x38, 0x48, 0x14, 0xb5, 0x97, 0xd2, 0xa7, 0x54, 0x45, 0xf1, 0x35, 0x44, 0x38, 0x9e, 0xf1, 0x1b, 0xb6, 0x34, 0x00, 0x3c, 0x96, 0xee, 0x29, 0x00, 0xea, 0x2c, 0x0b}} ,
|
|
||||||
{{0xea, 0xda, 0x99, 0x9e, 0x19, 0x83, 0x66, 0x6d, 0xe9, 0x76, 0x87, 0x50, 0xd1, 0xfd, 0x3c, 0x60, 0x87, 0xc6, 0x41, 0xd9, 0x8e, 0xdb, 0x5e, 0xde, 0xaa, 0x9a, 0xd3, 0x28, 0xda, 0x95, 0xea, 0x47}}},
|
|
||||||
{{{0xd0, 0x80, 0xba, 0x19, 0xae, 0x1d, 0xa9, 0x79, 0xf6, 0x3f, 0xac, 0x5d, 0x6f, 0x96, 0x1f, 0x2a, 0xce, 0x29, 0xb2, 0xff, 0x37, 0xf1, 0x94, 0x8f, 0x0c, 0xb5, 0x28, 0xba, 0x9a, 0x21, 0xf6, 0x66}} ,
|
|
||||||
{{0x02, 0xfb, 0x54, 0xb8, 0x05, 0xf3, 0x81, 0x52, 0x69, 0x34, 0x46, 0x9d, 0x86, 0x76, 0x8f, 0xd7, 0xf8, 0x6a, 0x66, 0xff, 0xe6, 0xa7, 0x90, 0xf7, 0x5e, 0xcd, 0x6a, 0x9b, 0x55, 0xfc, 0x9d, 0x48}}},
|
|
||||||
{{{0xbd, 0xaa, 0x13, 0xe6, 0xcd, 0x45, 0x4a, 0xa4, 0x59, 0x0a, 0x64, 0xb1, 0x98, 0xd6, 0x34, 0x13, 0x04, 0xe6, 0x97, 0x94, 0x06, 0xcb, 0xd4, 0x4e, 0xbb, 0x96, 0xcd, 0xd1, 0x57, 0xd1, 0xe3, 0x06}} ,
|
|
||||||
{{0x7a, 0x6c, 0x45, 0x27, 0xc4, 0x93, 0x7f, 0x7d, 0x7c, 0x62, 0x50, 0x38, 0x3a, 0x6b, 0xb5, 0x88, 0xc6, 0xd9, 0xf1, 0x78, 0x19, 0xb9, 0x39, 0x93, 0x3d, 0xc9, 0xe0, 0x9c, 0x3c, 0xce, 0xf5, 0x72}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x24, 0xea, 0x23, 0x7d, 0x56, 0x2c, 0xe2, 0x59, 0x0e, 0x85, 0x60, 0x04, 0x88, 0x5a, 0x74, 0x1e, 0x4b, 0xef, 0x13, 0xda, 0x4c, 0xff, 0x83, 0x45, 0x85, 0x3f, 0x08, 0x95, 0x2c, 0x20, 0x13, 0x1f}} ,
|
|
||||||
{{0x48, 0x5f, 0x27, 0x90, 0x5c, 0x02, 0x42, 0xad, 0x78, 0x47, 0x5c, 0xb5, 0x7e, 0x08, 0x85, 0x00, 0xfa, 0x7f, 0xfd, 0xfd, 0xe7, 0x09, 0x11, 0xf2, 0x7e, 0x1b, 0x38, 0x6c, 0x35, 0x6d, 0x33, 0x66}}},
|
|
||||||
{{{0x93, 0x03, 0x36, 0x81, 0xac, 0xe4, 0x20, 0x09, 0x35, 0x4c, 0x45, 0xb2, 0x1e, 0x4c, 0x14, 0x21, 0xe6, 0xe9, 0x8a, 0x7b, 0x8d, 0xfe, 0x1e, 0xc6, 0x3e, 0xc1, 0x35, 0xfa, 0xe7, 0x70, 0x4e, 0x1d}} ,
|
|
||||||
{{0x61, 0x2e, 0xc2, 0xdd, 0x95, 0x57, 0xd1, 0xab, 0x80, 0xe8, 0x63, 0x17, 0xb5, 0x48, 0xe4, 0x8a, 0x11, 0x9e, 0x72, 0xbe, 0x85, 0x8d, 0x51, 0x0a, 0xf2, 0x9f, 0xe0, 0x1c, 0xa9, 0x07, 0x28, 0x7b}}},
|
|
||||||
{{{0xbb, 0x71, 0x14, 0x5e, 0x26, 0x8c, 0x3d, 0xc8, 0xe9, 0x7c, 0xd3, 0xd6, 0xd1, 0x2f, 0x07, 0x6d, 0xe6, 0xdf, 0xfb, 0x79, 0xd6, 0x99, 0x59, 0x96, 0x48, 0x40, 0x0f, 0x3a, 0x7b, 0xb2, 0xa0, 0x72}} ,
|
|
||||||
{{0x4e, 0x3b, 0x69, 0xc8, 0x43, 0x75, 0x51, 0x6c, 0x79, 0x56, 0xe4, 0xcb, 0xf7, 0xa6, 0x51, 0xc2, 0x2c, 0x42, 0x0b, 0xd4, 0x82, 0x20, 0x1c, 0x01, 0x08, 0x66, 0xd7, 0xbf, 0x04, 0x56, 0xfc, 0x02}}},
|
|
||||||
{{{0x24, 0xe8, 0xb7, 0x60, 0xae, 0x47, 0x80, 0xfc, 0xe5, 0x23, 0xe7, 0xc2, 0xc9, 0x85, 0xe6, 0x98, 0xa0, 0x29, 0x4e, 0xe1, 0x84, 0x39, 0x2d, 0x95, 0x2c, 0xf3, 0x45, 0x3c, 0xff, 0xaf, 0x27, 0x4c}} ,
|
|
||||||
{{0x6b, 0xa6, 0xf5, 0x4b, 0x11, 0xbd, 0xba, 0x5b, 0x9e, 0xc4, 0xa4, 0x51, 0x1e, 0xbe, 0xd0, 0x90, 0x3a, 0x9c, 0xc2, 0x26, 0xb6, 0x1e, 0xf1, 0x95, 0x7d, 0xc8, 0x6d, 0x52, 0xe6, 0x99, 0x2c, 0x5f}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x85, 0xe0, 0x24, 0x32, 0xb4, 0xd1, 0xef, 0xfc, 0x69, 0xa2, 0xbf, 0x8f, 0x72, 0x2c, 0x95, 0xf6, 0xe4, 0x6e, 0x7d, 0x90, 0xf7, 0x57, 0x81, 0xa0, 0xf7, 0xda, 0xef, 0x33, 0x07, 0xe3, 0x6b, 0x78}} ,
|
|
||||||
{{0x36, 0x27, 0x3e, 0xc6, 0x12, 0x07, 0xab, 0x4e, 0xbe, 0x69, 0x9d, 0xb3, 0xbe, 0x08, 0x7c, 0x2a, 0x47, 0x08, 0xfd, 0xd4, 0xcd, 0x0e, 0x27, 0x34, 0x5b, 0x98, 0x34, 0x2f, 0x77, 0x5f, 0x3a, 0x65}}},
|
|
||||||
{{{0x13, 0xaa, 0x2e, 0x4c, 0xf0, 0x22, 0xb8, 0x6c, 0xb3, 0x19, 0x4d, 0xeb, 0x6b, 0xd0, 0xa4, 0xc6, 0x9c, 0xdd, 0xc8, 0x5b, 0x81, 0x57, 0x89, 0xdf, 0x33, 0xa9, 0x68, 0x49, 0x80, 0xe4, 0xfe, 0x21}} ,
|
|
||||||
{{0x00, 0x17, 0x90, 0x30, 0xe9, 0xd3, 0x60, 0x30, 0x31, 0xc2, 0x72, 0x89, 0x7a, 0x36, 0xa5, 0xbd, 0x39, 0x83, 0x85, 0x50, 0xa1, 0x5d, 0x6c, 0x41, 0x1d, 0xb5, 0x2c, 0x07, 0x40, 0x77, 0x0b, 0x50}}},
|
|
||||||
{{{0x64, 0x34, 0xec, 0xc0, 0x9e, 0x44, 0x41, 0xaf, 0xa0, 0x36, 0x05, 0x6d, 0xea, 0x30, 0x25, 0x46, 0x35, 0x24, 0x9d, 0x86, 0xbd, 0x95, 0xf1, 0x6a, 0x46, 0xd7, 0x94, 0x54, 0xf9, 0x3b, 0xbd, 0x5d}} ,
|
|
||||||
{{0x77, 0x5b, 0xe2, 0x37, 0xc7, 0xe1, 0x7c, 0x13, 0x8c, 0x9f, 0x7b, 0x7b, 0x2a, 0xce, 0x42, 0xa3, 0xb9, 0x2a, 0x99, 0xa8, 0xc0, 0xd8, 0x3c, 0x86, 0xb0, 0xfb, 0xe9, 0x76, 0x77, 0xf7, 0xf5, 0x56}}},
|
|
||||||
{{{0xdf, 0xb3, 0x46, 0x11, 0x6e, 0x13, 0xb7, 0x28, 0x4e, 0x56, 0xdd, 0xf1, 0xac, 0xad, 0x58, 0xc3, 0xf8, 0x88, 0x94, 0x5e, 0x06, 0x98, 0xa1, 0xe4, 0x6a, 0xfb, 0x0a, 0x49, 0x5d, 0x8a, 0xfe, 0x77}} ,
|
|
||||||
{{0x46, 0x02, 0xf5, 0xa5, 0xaf, 0xc5, 0x75, 0x6d, 0xba, 0x45, 0x35, 0x0a, 0xfe, 0xc9, 0xac, 0x22, 0x91, 0x8d, 0x21, 0x95, 0x33, 0x03, 0xc0, 0x8a, 0x16, 0xf3, 0x39, 0xe0, 0x01, 0x0f, 0x53, 0x3c}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x34, 0x75, 0x37, 0x1f, 0x34, 0x4e, 0xa9, 0x1d, 0x68, 0x67, 0xf8, 0x49, 0x98, 0x96, 0xfc, 0x4c, 0x65, 0x97, 0xf7, 0x02, 0x4a, 0x52, 0x6c, 0x01, 0xbd, 0x48, 0xbb, 0x1b, 0xed, 0xa4, 0xe2, 0x53}} ,
|
|
||||||
{{0x59, 0xd5, 0x9b, 0x5a, 0xa2, 0x90, 0xd3, 0xb8, 0x37, 0x4c, 0x55, 0x82, 0x28, 0x08, 0x0f, 0x7f, 0xaa, 0x81, 0x65, 0xe0, 0x0c, 0x52, 0xc9, 0xa3, 0x32, 0x27, 0x64, 0xda, 0xfd, 0x34, 0x23, 0x5a}}},
|
|
||||||
{{{0xb5, 0xb0, 0x0c, 0x4d, 0xb3, 0x7b, 0x23, 0xc8, 0x1f, 0x8a, 0x39, 0x66, 0xe6, 0xba, 0x4c, 0x10, 0x37, 0xca, 0x9c, 0x7c, 0x05, 0x9e, 0xff, 0xc0, 0xf8, 0x8e, 0xb1, 0x8f, 0x6f, 0x67, 0x18, 0x26}} ,
|
|
||||||
{{0x4b, 0x41, 0x13, 0x54, 0x23, 0x1a, 0xa4, 0x4e, 0xa9, 0x8b, 0x1e, 0x4b, 0xfc, 0x15, 0x24, 0xbb, 0x7e, 0xcb, 0xb6, 0x1e, 0x1b, 0xf5, 0xf2, 0xc8, 0x56, 0xec, 0x32, 0xa2, 0x60, 0x5b, 0xa0, 0x2a}}},
|
|
||||||
{{{0xa4, 0x29, 0x47, 0x86, 0x2e, 0x92, 0x4f, 0x11, 0x4f, 0xf3, 0xb2, 0x5c, 0xd5, 0x3e, 0xa6, 0xb9, 0xc8, 0xe2, 0x33, 0x11, 0x1f, 0x01, 0x8f, 0xb0, 0x9b, 0xc7, 0xa5, 0xff, 0x83, 0x0f, 0x1e, 0x28}} ,
|
|
||||||
{{0x1d, 0x29, 0x7a, 0xa1, 0xec, 0x8e, 0xb5, 0xad, 0xea, 0x02, 0x68, 0x60, 0x74, 0x29, 0x1c, 0xa5, 0xcf, 0xc8, 0x3b, 0x7d, 0x8b, 0x2b, 0x7c, 0xad, 0xa4, 0x40, 0x17, 0x51, 0x59, 0x7c, 0x2e, 0x5d}}},
|
|
||||||
{{{0x0a, 0x6c, 0x4f, 0xbc, 0x3e, 0x32, 0xe7, 0x4a, 0x1a, 0x13, 0xc1, 0x49, 0x38, 0xbf, 0xf7, 0xc2, 0xd3, 0x8f, 0x6b, 0xad, 0x52, 0xf7, 0xcf, 0xbc, 0x27, 0xcb, 0x40, 0x67, 0x76, 0xcd, 0x6d, 0x56}} ,
|
|
||||||
{{0xe5, 0xb0, 0x27, 0xad, 0xbe, 0x9b, 0xf2, 0xb5, 0x63, 0xde, 0x3a, 0x23, 0x95, 0xb7, 0x0a, 0x7e, 0xf3, 0x9e, 0x45, 0x6f, 0x19, 0x39, 0x75, 0x8f, 0x39, 0x3d, 0x0f, 0xc0, 0x9f, 0xf1, 0xe9, 0x51}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x88, 0xaa, 0x14, 0x24, 0x86, 0x94, 0x11, 0x12, 0x3e, 0x1a, 0xb5, 0xcc, 0xbb, 0xe0, 0x9c, 0xd5, 0x9c, 0x6d, 0xba, 0x58, 0x72, 0x8d, 0xfb, 0x22, 0x7b, 0x9f, 0x7c, 0x94, 0x30, 0xb3, 0x51, 0x21}} ,
|
|
||||||
{{0xf6, 0x74, 0x3d, 0xf2, 0xaf, 0xd0, 0x1e, 0x03, 0x7c, 0x23, 0x6b, 0xc9, 0xfc, 0x25, 0x70, 0x90, 0xdc, 0x9a, 0xa4, 0xfb, 0x49, 0xfc, 0x3d, 0x0a, 0x35, 0x38, 0x6f, 0xe4, 0x7e, 0x50, 0x01, 0x2a}}},
|
|
||||||
{{{0xd6, 0xe3, 0x96, 0x61, 0x3a, 0xfd, 0xef, 0x9b, 0x1f, 0x90, 0xa4, 0x24, 0x14, 0x5b, 0xc8, 0xde, 0x50, 0xb1, 0x1d, 0xaf, 0xe8, 0x55, 0x8a, 0x87, 0x0d, 0xfe, 0xaa, 0x3b, 0x82, 0x2c, 0x8d, 0x7b}} ,
|
|
||||||
{{0x85, 0x0c, 0xaf, 0xf8, 0x83, 0x44, 0x49, 0xd9, 0x45, 0xcf, 0xf7, 0x48, 0xd9, 0x53, 0xb4, 0xf1, 0x65, 0xa0, 0xe1, 0xc3, 0xb3, 0x15, 0xed, 0x89, 0x9b, 0x4f, 0x62, 0xb3, 0x57, 0xa5, 0x45, 0x1c}}},
|
|
||||||
{{{0x8f, 0x12, 0xea, 0xaf, 0xd1, 0x1f, 0x79, 0x10, 0x0b, 0xf6, 0xa3, 0x7b, 0xea, 0xac, 0x8b, 0x57, 0x32, 0x62, 0xe7, 0x06, 0x12, 0x51, 0xa0, 0x3b, 0x43, 0x5e, 0xa4, 0x20, 0x78, 0x31, 0xce, 0x0d}} ,
|
|
||||||
{{0x84, 0x7c, 0xc2, 0xa6, 0x91, 0x23, 0xce, 0xbd, 0xdc, 0xf9, 0xce, 0xd5, 0x75, 0x30, 0x22, 0xe6, 0xf9, 0x43, 0x62, 0x0d, 0xf7, 0x75, 0x9d, 0x7f, 0x8c, 0xff, 0x7d, 0xe4, 0x72, 0xac, 0x9f, 0x1c}}},
|
|
||||||
{{{0x88, 0xc1, 0x99, 0xd0, 0x3c, 0x1c, 0x5d, 0xb4, 0xef, 0x13, 0x0f, 0x90, 0xb9, 0x36, 0x2f, 0x95, 0x95, 0xc6, 0xdc, 0xde, 0x0a, 0x51, 0xe2, 0x8d, 0xf3, 0xbc, 0x51, 0xec, 0xdf, 0xb1, 0xa2, 0x5f}} ,
|
|
||||||
{{0x2e, 0x68, 0xa1, 0x23, 0x7d, 0x9b, 0x40, 0x69, 0x85, 0x7b, 0x42, 0xbf, 0x90, 0x4b, 0xd6, 0x40, 0x2f, 0xd7, 0x52, 0x52, 0xb2, 0x21, 0xde, 0x64, 0xbd, 0x88, 0xc3, 0x6d, 0xa5, 0xfa, 0x81, 0x3f}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0xfb, 0xfd, 0x47, 0x7b, 0x8a, 0x66, 0x9e, 0x79, 0x2e, 0x64, 0x82, 0xef, 0xf7, 0x21, 0xec, 0xf6, 0xd8, 0x86, 0x09, 0x31, 0x7c, 0xdd, 0x03, 0x6a, 0x58, 0xa0, 0x77, 0xb7, 0x9b, 0x8c, 0x87, 0x1f}} ,
|
|
||||||
{{0x55, 0x47, 0xe4, 0xa8, 0x3d, 0x55, 0x21, 0x34, 0xab, 0x1d, 0xae, 0xe0, 0xf4, 0xea, 0xdb, 0xc5, 0xb9, 0x58, 0xbf, 0xc4, 0x2a, 0x89, 0x31, 0x1a, 0xf4, 0x2d, 0xe1, 0xca, 0x37, 0x99, 0x47, 0x59}}},
|
|
||||||
{{{0xc7, 0xca, 0x63, 0xc1, 0x49, 0xa9, 0x35, 0x45, 0x55, 0x7e, 0xda, 0x64, 0x32, 0x07, 0x50, 0xf7, 0x32, 0xac, 0xde, 0x75, 0x58, 0x9b, 0x11, 0xb2, 0x3a, 0x1f, 0xf5, 0xf7, 0x79, 0x04, 0xe6, 0x08}} ,
|
|
||||||
{{0x46, 0xfa, 0x22, 0x4b, 0xfa, 0xe1, 0xfe, 0x96, 0xfc, 0x67, 0xba, 0x67, 0x97, 0xc4, 0xe7, 0x1b, 0x86, 0x90, 0x5f, 0xee, 0xf4, 0x5b, 0x11, 0xb2, 0xcd, 0xad, 0xee, 0xc2, 0x48, 0x6c, 0x2b, 0x1b}}},
|
|
||||||
{{{0xe3, 0x39, 0x62, 0xb4, 0x4f, 0x31, 0x04, 0xc9, 0xda, 0xd5, 0x73, 0x51, 0x57, 0xc5, 0xb8, 0xf3, 0xa3, 0x43, 0x70, 0xe4, 0x61, 0x81, 0x84, 0xe2, 0xbb, 0xbf, 0x4f, 0x9e, 0xa4, 0x5e, 0x74, 0x06}} ,
|
|
||||||
{{0x29, 0xac, 0xff, 0x27, 0xe0, 0x59, 0xbe, 0x39, 0x9c, 0x0d, 0x83, 0xd7, 0x10, 0x0b, 0x15, 0xb7, 0xe1, 0xc2, 0x2c, 0x30, 0x73, 0x80, 0x3a, 0x7d, 0x5d, 0xab, 0x58, 0x6b, 0xc1, 0xf0, 0xf4, 0x22}}},
|
|
||||||
{{{0xfe, 0x7f, 0xfb, 0x35, 0x7d, 0xc6, 0x01, 0x23, 0x28, 0xc4, 0x02, 0xac, 0x1f, 0x42, 0xb4, 0x9d, 0xfc, 0x00, 0x94, 0xa5, 0xee, 0xca, 0xda, 0x97, 0x09, 0x41, 0x77, 0x87, 0x5d, 0x7b, 0x87, 0x78}} ,
|
|
||||||
{{0xf5, 0xfb, 0x90, 0x2d, 0x81, 0x19, 0x9e, 0x2f, 0x6d, 0x85, 0x88, 0x8c, 0x40, 0x5c, 0x77, 0x41, 0x4d, 0x01, 0x19, 0x76, 0x60, 0xe8, 0x4c, 0x48, 0xe4, 0x33, 0x83, 0x32, 0x6c, 0xb4, 0x41, 0x03}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0xff, 0x10, 0xc2, 0x09, 0x4f, 0x6e, 0xf4, 0xd2, 0xdf, 0x7e, 0xca, 0x7b, 0x1c, 0x1d, 0xba, 0xa3, 0xb6, 0xda, 0x67, 0x33, 0xd4, 0x87, 0x36, 0x4b, 0x11, 0x20, 0x05, 0xa6, 0x29, 0xc1, 0x87, 0x17}} ,
|
|
||||||
{{0xf6, 0x96, 0xca, 0x2f, 0xda, 0x38, 0xa7, 0x1b, 0xfc, 0xca, 0x7d, 0xfe, 0x08, 0x89, 0xe2, 0x47, 0x2b, 0x6a, 0x5d, 0x4b, 0xfa, 0xa1, 0xb4, 0xde, 0xb6, 0xc2, 0x31, 0x51, 0xf5, 0xe0, 0xa4, 0x0b}}},
|
|
||||||
{{{0x5c, 0xe5, 0xc6, 0x04, 0x8e, 0x2b, 0x57, 0xbe, 0x38, 0x85, 0x23, 0xcb, 0xb7, 0xbe, 0x4f, 0xa9, 0xd3, 0x6e, 0x12, 0xaa, 0xd5, 0xb2, 0x2e, 0x93, 0x29, 0x9a, 0x4a, 0x88, 0x18, 0x43, 0xf5, 0x01}} ,
|
|
||||||
{{0x50, 0xfc, 0xdb, 0xa2, 0x59, 0x21, 0x8d, 0xbd, 0x7e, 0x33, 0xae, 0x2f, 0x87, 0x1a, 0xd0, 0x97, 0xc7, 0x0d, 0x4d, 0x63, 0x01, 0xef, 0x05, 0x84, 0xec, 0x40, 0xdd, 0xa8, 0x0a, 0x4f, 0x70, 0x0b}}},
|
|
||||||
{{{0x41, 0x69, 0x01, 0x67, 0x5c, 0xd3, 0x8a, 0xc5, 0xcf, 0x3f, 0xd1, 0x57, 0xd1, 0x67, 0x3e, 0x01, 0x39, 0xb5, 0xcb, 0x81, 0x56, 0x96, 0x26, 0xb6, 0xc2, 0xe7, 0x5c, 0xfb, 0x63, 0x97, 0x58, 0x06}} ,
|
|
||||||
{{0x0c, 0x0e, 0xf3, 0xba, 0xf0, 0xe5, 0xba, 0xb2, 0x57, 0x77, 0xc6, 0x20, 0x9b, 0x89, 0x24, 0xbe, 0xf2, 0x9c, 0x8a, 0xba, 0x69, 0xc1, 0xf1, 0xb0, 0x4f, 0x2a, 0x05, 0x9a, 0xee, 0x10, 0x7e, 0x36}}},
|
|
||||||
{{{0x3f, 0x26, 0xe9, 0x40, 0xe9, 0x03, 0xad, 0x06, 0x69, 0x91, 0xe0, 0xd1, 0x89, 0x60, 0x84, 0x79, 0xde, 0x27, 0x6d, 0xe6, 0x76, 0xbd, 0xea, 0xe6, 0xae, 0x48, 0xc3, 0x67, 0xc0, 0x57, 0xcd, 0x2f}} ,
|
|
||||||
{{0x7f, 0xc1, 0xdc, 0xb9, 0xc7, 0xbc, 0x86, 0x3d, 0x55, 0x4b, 0x28, 0x7a, 0xfb, 0x4d, 0xc7, 0xf8, 0xbc, 0x67, 0x2a, 0x60, 0x4d, 0x8f, 0x07, 0x0b, 0x1a, 0x17, 0xbf, 0xfa, 0xac, 0xa7, 0x3d, 0x1a}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x91, 0x3f, 0xed, 0x5e, 0x18, 0x78, 0x3f, 0x23, 0x2c, 0x0d, 0x8c, 0x44, 0x00, 0xe8, 0xfb, 0xe9, 0x8e, 0xd6, 0xd1, 0x36, 0x58, 0x57, 0x9e, 0xae, 0x4b, 0x5c, 0x0b, 0x07, 0xbc, 0x6b, 0x55, 0x2b}} ,
|
|
||||||
{{0x6f, 0x4d, 0x17, 0xd7, 0xe1, 0x84, 0xd9, 0x78, 0xb1, 0x90, 0xfd, 0x2e, 0xb3, 0xb5, 0x19, 0x3f, 0x1b, 0xfa, 0xc0, 0x68, 0xb3, 0xdd, 0x00, 0x2e, 0x89, 0xbd, 0x7e, 0x80, 0x32, 0x13, 0xa0, 0x7b}}},
|
|
||||||
{{{0x1a, 0x6f, 0x40, 0xaf, 0x44, 0x44, 0xb0, 0x43, 0x8f, 0x0d, 0xd0, 0x1e, 0xc4, 0x0b, 0x19, 0x5d, 0x8e, 0xfe, 0xc1, 0xf3, 0xc5, 0x5c, 0x91, 0xf8, 0x04, 0x4e, 0xbe, 0x90, 0xb4, 0x47, 0x5c, 0x3f}} ,
|
|
||||||
{{0xb0, 0x3b, 0x2c, 0xf3, 0xfe, 0x32, 0x71, 0x07, 0x3f, 0xaa, 0xba, 0x45, 0x60, 0xa8, 0x8d, 0xea, 0x54, 0xcb, 0x39, 0x10, 0xb4, 0xf2, 0x8b, 0xd2, 0x14, 0x82, 0x42, 0x07, 0x8e, 0xe9, 0x7c, 0x53}}},
|
|
||||||
{{{0xb0, 0xae, 0xc1, 0x8d, 0xc9, 0x8f, 0xb9, 0x7a, 0x77, 0xef, 0xba, 0x79, 0xa0, 0x3c, 0xa8, 0xf5, 0x6a, 0xe2, 0x3f, 0x5d, 0x00, 0xe3, 0x4b, 0x45, 0x24, 0x7b, 0x43, 0x78, 0x55, 0x1d, 0x2b, 0x1e}} ,
|
|
||||||
{{0x01, 0xb8, 0xd6, 0x16, 0x67, 0xa0, 0x15, 0xb9, 0xe1, 0x58, 0xa4, 0xa7, 0x31, 0x37, 0x77, 0x2f, 0x8b, 0x12, 0x9f, 0xf4, 0x3f, 0xc7, 0x36, 0x66, 0xd2, 0xa8, 0x56, 0xf7, 0x7f, 0x74, 0xc6, 0x41}}},
|
|
||||||
{{{0x5d, 0xf8, 0xb4, 0xa8, 0x30, 0xdd, 0xcc, 0x38, 0xa5, 0xd3, 0xca, 0xd8, 0xd1, 0xf8, 0xb2, 0x31, 0x91, 0xd4, 0x72, 0x05, 0x57, 0x4a, 0x3b, 0x82, 0x4a, 0xc6, 0x68, 0x20, 0xe2, 0x18, 0x41, 0x61}} ,
|
|
||||||
{{0x19, 0xd4, 0x8d, 0x47, 0x29, 0x12, 0x65, 0xb0, 0x11, 0x78, 0x47, 0xb5, 0xcb, 0xa3, 0xa5, 0xfa, 0x05, 0x85, 0x54, 0xa9, 0x33, 0x97, 0x8d, 0x2b, 0xc2, 0xfe, 0x99, 0x35, 0x28, 0xe5, 0xeb, 0x63}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0xb1, 0x3f, 0x3f, 0xef, 0xd8, 0xf4, 0xfc, 0xb3, 0xa0, 0x60, 0x50, 0x06, 0x2b, 0x29, 0x52, 0x70, 0x15, 0x0b, 0x24, 0x24, 0xf8, 0x5f, 0x79, 0x18, 0xcc, 0xff, 0x89, 0x99, 0x84, 0xa1, 0xae, 0x13}} ,
|
|
||||||
{{0x44, 0x1f, 0xb8, 0xc2, 0x01, 0xc1, 0x30, 0x19, 0x55, 0x05, 0x60, 0x10, 0xa4, 0x6c, 0x2d, 0x67, 0x70, 0xe5, 0x25, 0x1b, 0xf2, 0xbf, 0xdd, 0xfb, 0x70, 0x2b, 0xa1, 0x8c, 0x9c, 0x94, 0x84, 0x08}}},
|
|
||||||
{{{0xe7, 0xc4, 0x43, 0x4d, 0xc9, 0x2b, 0x69, 0x5d, 0x1d, 0x3c, 0xaf, 0xbb, 0x43, 0x38, 0x4e, 0x98, 0x3d, 0xed, 0x0d, 0x21, 0x03, 0xfd, 0xf0, 0x99, 0x47, 0x04, 0xb0, 0x98, 0x69, 0x55, 0x72, 0x0f}} ,
|
|
||||||
{{0x5e, 0xdf, 0x15, 0x53, 0x3b, 0x86, 0x80, 0xb0, 0xf1, 0x70, 0x68, 0x8f, 0x66, 0x7c, 0x0e, 0x49, 0x1a, 0xd8, 0x6b, 0xfe, 0x4e, 0xef, 0xca, 0x47, 0xd4, 0x03, 0xc1, 0x37, 0x50, 0x9c, 0xc1, 0x16}}},
|
|
||||||
{{{0xcd, 0x24, 0xc6, 0x3e, 0x0c, 0x82, 0x9b, 0x91, 0x2b, 0x61, 0x4a, 0xb2, 0x0f, 0x88, 0x55, 0x5f, 0x5a, 0x57, 0xff, 0xe5, 0x74, 0x0b, 0x13, 0x43, 0x00, 0xd8, 0x6b, 0xcf, 0xd2, 0x15, 0x03, 0x2c}} ,
|
|
||||||
{{0xdc, 0xff, 0x15, 0x61, 0x2f, 0x4a, 0x2f, 0x62, 0xf2, 0x04, 0x2f, 0xb5, 0x0c, 0xb7, 0x1e, 0x3f, 0x74, 0x1a, 0x0f, 0xd7, 0xea, 0xcd, 0xd9, 0x7d, 0xf6, 0x12, 0x0e, 0x2f, 0xdb, 0x5a, 0x3b, 0x16}}},
|
|
||||||
{{{0x1b, 0x37, 0x47, 0xe3, 0xf5, 0x9e, 0xea, 0x2c, 0x2a, 0xe7, 0x82, 0x36, 0xf4, 0x1f, 0x81, 0x47, 0x92, 0x4b, 0x69, 0x0e, 0x11, 0x8c, 0x5d, 0x53, 0x5b, 0x81, 0x27, 0x08, 0xbc, 0xa0, 0xae, 0x25}} ,
|
|
||||||
{{0x69, 0x32, 0xa1, 0x05, 0x11, 0x42, 0x00, 0xd2, 0x59, 0xac, 0x4d, 0x62, 0x8b, 0x13, 0xe2, 0x50, 0x5d, 0xa0, 0x9d, 0x9b, 0xfd, 0xbb, 0x12, 0x41, 0x75, 0x41, 0x9e, 0xcc, 0xdc, 0xc7, 0xdc, 0x5d}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0xd9, 0xe3, 0x38, 0x06, 0x46, 0x70, 0x82, 0x5e, 0x28, 0x49, 0x79, 0xff, 0x25, 0xd2, 0x4e, 0x29, 0x8d, 0x06, 0xb0, 0x23, 0xae, 0x9b, 0x66, 0xe4, 0x7d, 0xc0, 0x70, 0x91, 0xa3, 0xfc, 0xec, 0x4e}} ,
|
|
||||||
{{0x62, 0x12, 0x37, 0x6a, 0x30, 0xf6, 0x1e, 0xfb, 0x14, 0x5c, 0x0d, 0x0e, 0xb7, 0x81, 0x6a, 0xe7, 0x08, 0x05, 0xac, 0xaa, 0x38, 0x46, 0xe2, 0x73, 0xea, 0x4b, 0x07, 0x81, 0x43, 0x7c, 0x9e, 0x5e}}},
|
|
||||||
{{{0xfc, 0xf9, 0x21, 0x4f, 0x2e, 0x76, 0x9b, 0x1f, 0x28, 0x60, 0x77, 0x43, 0x32, 0x9d, 0xbe, 0x17, 0x30, 0x2a, 0xc6, 0x18, 0x92, 0x66, 0x62, 0x30, 0x98, 0x40, 0x11, 0xa6, 0x7f, 0x18, 0x84, 0x28}} ,
|
|
||||||
{{0x3f, 0xab, 0xd3, 0xf4, 0x8a, 0x76, 0xa1, 0x3c, 0xca, 0x2d, 0x49, 0xc3, 0xea, 0x08, 0x0b, 0x85, 0x17, 0x2a, 0xc3, 0x6c, 0x08, 0xfd, 0x57, 0x9f, 0x3d, 0x5f, 0xdf, 0x67, 0x68, 0x42, 0x00, 0x32}}},
|
|
||||||
{{{0x51, 0x60, 0x1b, 0x06, 0x4f, 0x8a, 0x21, 0xba, 0x38, 0xa8, 0xba, 0xd6, 0x40, 0xf6, 0xe9, 0x9b, 0x76, 0x4d, 0x56, 0x21, 0x5b, 0x0a, 0x9b, 0x2e, 0x4f, 0x3d, 0x81, 0x32, 0x08, 0x9f, 0x97, 0x5b}} ,
|
|
||||||
{{0xe5, 0x44, 0xec, 0x06, 0x9d, 0x90, 0x79, 0x9f, 0xd3, 0xe0, 0x79, 0xaf, 0x8f, 0x10, 0xfd, 0xdd, 0x04, 0xae, 0x27, 0x97, 0x46, 0x33, 0x79, 0xea, 0xb8, 0x4e, 0xca, 0x5a, 0x59, 0x57, 0xe1, 0x0e}}},
|
|
||||||
{{{0x1a, 0xda, 0xf3, 0xa5, 0x41, 0x43, 0x28, 0xfc, 0x7e, 0xe7, 0x71, 0xea, 0xc6, 0x3b, 0x59, 0xcc, 0x2e, 0xd3, 0x40, 0xec, 0xb3, 0x13, 0x6f, 0x44, 0xcd, 0x13, 0xb2, 0x37, 0xf2, 0x6e, 0xd9, 0x1c}} ,
|
|
||||||
{{0xe3, 0xdb, 0x60, 0xcd, 0x5c, 0x4a, 0x18, 0x0f, 0xef, 0x73, 0x36, 0x71, 0x8c, 0xf6, 0x11, 0xb4, 0xd8, 0xce, 0x17, 0x5e, 0x4f, 0x26, 0x77, 0x97, 0x5f, 0xcb, 0xef, 0x91, 0xeb, 0x6a, 0x62, 0x7a}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x18, 0x4a, 0xa2, 0x97, 0x08, 0x81, 0x2d, 0x83, 0xc4, 0xcc, 0xf0, 0x83, 0x7e, 0xec, 0x0d, 0x95, 0x4c, 0x5b, 0xfb, 0xfa, 0x98, 0x80, 0x4a, 0x66, 0x56, 0x0c, 0x51, 0xb3, 0xf2, 0x04, 0x5d, 0x27}} ,
|
|
||||||
{{0x3b, 0xb9, 0xb8, 0x06, 0x5a, 0x2e, 0xfe, 0xc3, 0x82, 0x37, 0x9c, 0xa3, 0x11, 0x1f, 0x9c, 0xa6, 0xda, 0x63, 0x48, 0x9b, 0xad, 0xde, 0x2d, 0xa6, 0xbc, 0x6e, 0x32, 0xda, 0x27, 0x65, 0xdd, 0x57}}},
|
|
||||||
{{{0x84, 0x4f, 0x37, 0x31, 0x7d, 0x2e, 0xbc, 0xad, 0x87, 0x07, 0x2a, 0x6b, 0x37, 0xfc, 0x5f, 0xeb, 0x4e, 0x75, 0x35, 0xa6, 0xde, 0xab, 0x0a, 0x19, 0x3a, 0xb7, 0xb1, 0xef, 0x92, 0x6a, 0x3b, 0x3c}} ,
|
|
||||||
{{0x3b, 0xb2, 0x94, 0x6d, 0x39, 0x60, 0xac, 0xee, 0xe7, 0x81, 0x1a, 0x3b, 0x76, 0x87, 0x5c, 0x05, 0x94, 0x2a, 0x45, 0xb9, 0x80, 0xe9, 0x22, 0xb1, 0x07, 0xcb, 0x40, 0x9e, 0x70, 0x49, 0x6d, 0x12}}},
|
|
||||||
{{{0xfd, 0x18, 0x78, 0x84, 0xa8, 0x4c, 0x7d, 0x6e, 0x59, 0xa6, 0xe5, 0x74, 0xf1, 0x19, 0xa6, 0x84, 0x2e, 0x51, 0xc1, 0x29, 0x13, 0xf2, 0x14, 0x6b, 0x5d, 0x53, 0x51, 0xf7, 0xef, 0xbf, 0x01, 0x22}} ,
|
|
||||||
{{0xa4, 0x4b, 0x62, 0x4c, 0xe6, 0xfd, 0x72, 0x07, 0xf2, 0x81, 0xfc, 0xf2, 0xbd, 0x12, 0x7c, 0x68, 0x76, 0x2a, 0xba, 0xf5, 0x65, 0xb1, 0x1f, 0x17, 0x0a, 0x38, 0xb0, 0xbf, 0xc0, 0xf8, 0xf4, 0x2a}}},
|
|
||||||
{{{0x55, 0x60, 0x55, 0x5b, 0xe4, 0x1d, 0x71, 0x4c, 0x9d, 0x5b, 0x9f, 0x70, 0xa6, 0x85, 0x9a, 0x2c, 0xa0, 0xe2, 0x32, 0x48, 0xce, 0x9e, 0x2a, 0xa5, 0x07, 0x3b, 0xc7, 0x6c, 0x86, 0x77, 0xde, 0x3c}} ,
|
|
||||||
{{0xf7, 0x18, 0x7a, 0x96, 0x7e, 0x43, 0x57, 0xa9, 0x55, 0xfc, 0x4e, 0xb6, 0x72, 0x00, 0xf2, 0xe4, 0xd7, 0x52, 0xd3, 0xd3, 0xb6, 0x85, 0xf6, 0x71, 0xc7, 0x44, 0x3f, 0x7f, 0xd7, 0xb3, 0xf2, 0x79}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x46, 0xca, 0xa7, 0x55, 0x7b, 0x79, 0xf3, 0xca, 0x5a, 0x65, 0xf6, 0xed, 0x50, 0x14, 0x7b, 0xe4, 0xc4, 0x2a, 0x65, 0x9e, 0xe2, 0xf9, 0xca, 0xa7, 0x22, 0x26, 0x53, 0xcb, 0x21, 0x5b, 0xa7, 0x31}} ,
|
|
||||||
{{0x90, 0xd7, 0xc5, 0x26, 0x08, 0xbd, 0xb0, 0x53, 0x63, 0x58, 0xc3, 0x31, 0x5e, 0x75, 0x46, 0x15, 0x91, 0xa6, 0xf8, 0x2f, 0x1a, 0x08, 0x65, 0x88, 0x2f, 0x98, 0x04, 0xf1, 0x7c, 0x6e, 0x00, 0x77}}},
|
|
||||||
{{{0x81, 0x21, 0x61, 0x09, 0xf6, 0x4e, 0xf1, 0x92, 0xee, 0x63, 0x61, 0x73, 0x87, 0xc7, 0x54, 0x0e, 0x42, 0x4b, 0xc9, 0x47, 0xd1, 0xb8, 0x7e, 0x91, 0x75, 0x37, 0x99, 0x28, 0xb8, 0xdd, 0x7f, 0x50}} ,
|
|
||||||
{{0x89, 0x8f, 0xc0, 0xbe, 0x5d, 0xd6, 0x9f, 0xa0, 0xf0, 0x9d, 0x81, 0xce, 0x3a, 0x7b, 0x98, 0x58, 0xbb, 0xd7, 0x78, 0xc8, 0x3f, 0x13, 0xf1, 0x74, 0x19, 0xdf, 0xf8, 0x98, 0x89, 0x5d, 0xfa, 0x5f}}},
|
|
||||||
{{{0x9e, 0x35, 0x85, 0x94, 0x47, 0x1f, 0x90, 0x15, 0x26, 0xd0, 0x84, 0xed, 0x8a, 0x80, 0xf7, 0x63, 0x42, 0x86, 0x27, 0xd7, 0xf4, 0x75, 0x58, 0xdc, 0x9c, 0xc0, 0x22, 0x7e, 0x20, 0x35, 0xfd, 0x1f}} ,
|
|
||||||
{{0x68, 0x0e, 0x6f, 0x97, 0xba, 0x70, 0xbb, 0xa3, 0x0e, 0xe5, 0x0b, 0x12, 0xf4, 0xa2, 0xdc, 0x47, 0xf8, 0xe6, 0xd0, 0x23, 0x6c, 0x33, 0xa8, 0x99, 0x46, 0x6e, 0x0f, 0x44, 0xba, 0x76, 0x48, 0x0f}}},
|
|
||||||
{{{0xa3, 0x2a, 0x61, 0x37, 0xe2, 0x59, 0x12, 0x0e, 0x27, 0xba, 0x64, 0x43, 0xae, 0xc0, 0x42, 0x69, 0x79, 0xa4, 0x1e, 0x29, 0x8b, 0x15, 0xeb, 0xf8, 0xaf, 0xd4, 0xa2, 0x68, 0x33, 0xb5, 0x7a, 0x24}} ,
|
|
||||||
{{0x2c, 0x19, 0x33, 0xdd, 0x1b, 0xab, 0xec, 0x01, 0xb0, 0x23, 0xf8, 0x42, 0x2b, 0x06, 0x88, 0xea, 0x3d, 0x2d, 0x00, 0x2a, 0x78, 0x45, 0x4d, 0x38, 0xed, 0x2e, 0x2e, 0x44, 0x49, 0xed, 0xcb, 0x33}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0xa0, 0x68, 0xe8, 0x41, 0x8f, 0x91, 0xf8, 0x11, 0x13, 0x90, 0x2e, 0xa7, 0xab, 0x30, 0xef, 0xad, 0xa0, 0x61, 0x00, 0x88, 0xef, 0xdb, 0xce, 0x5b, 0x5c, 0xbb, 0x62, 0xc8, 0x56, 0xf9, 0x00, 0x73}} ,
|
|
||||||
{{0x3f, 0x60, 0xc1, 0x82, 0x2d, 0xa3, 0x28, 0x58, 0x24, 0x9e, 0x9f, 0xe3, 0x70, 0xcc, 0x09, 0x4e, 0x1a, 0x3f, 0x11, 0x11, 0x15, 0x07, 0x3c, 0xa4, 0x41, 0xe0, 0x65, 0xa3, 0x0a, 0x41, 0x6d, 0x11}}},
|
|
||||||
{{{0x31, 0x40, 0x01, 0x52, 0x56, 0x94, 0x5b, 0x28, 0x8a, 0xaa, 0x52, 0xee, 0xd8, 0x0a, 0x05, 0x8d, 0xcd, 0xb5, 0xaa, 0x2e, 0x38, 0xaa, 0xb7, 0x87, 0xf7, 0x2b, 0xfb, 0x04, 0xcb, 0x84, 0x3d, 0x54}} ,
|
|
||||||
{{0x20, 0xef, 0x59, 0xde, 0xa4, 0x2b, 0x93, 0x6e, 0x2e, 0xec, 0x42, 0x9a, 0xd4, 0x2d, 0xf4, 0x46, 0x58, 0x27, 0x2b, 0x18, 0x8f, 0x83, 0x3d, 0x69, 0x9e, 0xd4, 0x3e, 0xb6, 0xc5, 0xfd, 0x58, 0x03}}},
|
|
||||||
{{{0x33, 0x89, 0xc9, 0x63, 0x62, 0x1c, 0x17, 0xb4, 0x60, 0xc4, 0x26, 0x68, 0x09, 0xc3, 0x2e, 0x37, 0x0f, 0x7b, 0xb4, 0x9c, 0xb6, 0xf9, 0xfb, 0xd4, 0x51, 0x78, 0xc8, 0x63, 0xea, 0x77, 0x47, 0x07}} ,
|
|
||||||
{{0x32, 0xb4, 0x18, 0x47, 0x79, 0xcb, 0xd4, 0x5a, 0x07, 0x14, 0x0f, 0xa0, 0xd5, 0xac, 0xd0, 0x41, 0x40, 0xab, 0x61, 0x23, 0xe5, 0x2a, 0x2a, 0x6f, 0xf7, 0xa8, 0xd4, 0x76, 0xef, 0xe7, 0x45, 0x6c}}},
|
|
||||||
{{{0xa1, 0x5e, 0x60, 0x4f, 0xfb, 0xe1, 0x70, 0x6a, 0x1f, 0x55, 0x4f, 0x09, 0xb4, 0x95, 0x33, 0x36, 0xc6, 0x81, 0x01, 0x18, 0x06, 0x25, 0x27, 0xa4, 0xb4, 0x24, 0xa4, 0x86, 0x03, 0x4c, 0xac, 0x02}} ,
|
|
||||||
{{0x77, 0x38, 0xde, 0xd7, 0x60, 0x48, 0x07, 0xf0, 0x74, 0xa8, 0xff, 0x54, 0xe5, 0x30, 0x43, 0xff, 0x77, 0xfb, 0x21, 0x07, 0xff, 0xb2, 0x07, 0x6b, 0xe4, 0xe5, 0x30, 0xfc, 0x19, 0x6c, 0xa3, 0x01}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x13, 0xc5, 0x2c, 0xac, 0xd3, 0x83, 0x82, 0x7c, 0x29, 0xf7, 0x05, 0xa5, 0x00, 0xb6, 0x1f, 0x86, 0x55, 0xf4, 0xd6, 0x2f, 0x0c, 0x99, 0xd0, 0x65, 0x9b, 0x6b, 0x46, 0x0d, 0x43, 0xf8, 0x16, 0x28}} ,
|
|
||||||
{{0x1e, 0x7f, 0xb4, 0x74, 0x7e, 0xb1, 0x89, 0x4f, 0x18, 0x5a, 0xab, 0x64, 0x06, 0xdf, 0x45, 0x87, 0xe0, 0x6a, 0xc6, 0xf0, 0x0e, 0xc9, 0x24, 0x35, 0x38, 0xea, 0x30, 0x54, 0xb4, 0xc4, 0x52, 0x54}}},
|
|
||||||
{{{0xe9, 0x9f, 0xdc, 0x3f, 0xc1, 0x89, 0x44, 0x74, 0x27, 0xe4, 0xc1, 0x90, 0xff, 0x4a, 0xa7, 0x3c, 0xee, 0xcd, 0xf4, 0x1d, 0x25, 0x94, 0x7f, 0x63, 0x16, 0x48, 0xbc, 0x64, 0xfe, 0x95, 0xc4, 0x0c}} ,
|
|
||||||
{{0x8b, 0x19, 0x75, 0x6e, 0x03, 0x06, 0x5e, 0x6a, 0x6f, 0x1a, 0x8c, 0xe3, 0xd3, 0x28, 0xf2, 0xe0, 0xb9, 0x7a, 0x43, 0x69, 0xe6, 0xd3, 0xc0, 0xfe, 0x7e, 0x97, 0xab, 0x6c, 0x7b, 0x8e, 0x13, 0x42}}},
|
|
||||||
{{{0xd4, 0xca, 0x70, 0x3d, 0xab, 0xfb, 0x5f, 0x5e, 0x00, 0x0c, 0xcc, 0x77, 0x22, 0xf8, 0x78, 0x55, 0xae, 0x62, 0x35, 0xfb, 0x9a, 0xc6, 0x03, 0xe4, 0x0c, 0xee, 0xab, 0xc7, 0xc0, 0x89, 0x87, 0x54}} ,
|
|
||||||
{{0x32, 0xad, 0xae, 0x85, 0x58, 0x43, 0xb8, 0xb1, 0xe6, 0x3e, 0x00, 0x9c, 0x78, 0x88, 0x56, 0xdb, 0x9c, 0xfc, 0x79, 0xf6, 0xf9, 0x41, 0x5f, 0xb7, 0xbc, 0x11, 0xf9, 0x20, 0x36, 0x1c, 0x53, 0x2b}}},
|
|
||||||
{{{0x5a, 0x20, 0x5b, 0xa1, 0xa5, 0x44, 0x91, 0x24, 0x02, 0x63, 0x12, 0x64, 0xb8, 0x55, 0xf6, 0xde, 0x2c, 0xdb, 0x47, 0xb8, 0xc6, 0x0a, 0xc3, 0x00, 0x78, 0x93, 0xd8, 0xf5, 0xf5, 0x18, 0x28, 0x0a}} ,
|
|
||||||
{{0xd6, 0x1b, 0x9a, 0x6c, 0xe5, 0x46, 0xea, 0x70, 0x96, 0x8d, 0x4e, 0x2a, 0x52, 0x21, 0x26, 0x4b, 0xb1, 0xbb, 0x0f, 0x7c, 0xa9, 0x9b, 0x04, 0xbb, 0x51, 0x08, 0xf1, 0x9a, 0xa4, 0x76, 0x7c, 0x18}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0xfa, 0x94, 0xf7, 0x40, 0xd0, 0xd7, 0xeb, 0xa9, 0x82, 0x36, 0xd5, 0x15, 0xb9, 0x33, 0x7a, 0xbf, 0x8a, 0xf2, 0x63, 0xaa, 0x37, 0xf5, 0x59, 0xac, 0xbd, 0xbb, 0x32, 0x36, 0xbe, 0x73, 0x99, 0x38}} ,
|
|
||||||
{{0x2c, 0xb3, 0xda, 0x7a, 0xd8, 0x3d, 0x99, 0xca, 0xd2, 0xf4, 0xda, 0x99, 0x8e, 0x4f, 0x98, 0xb7, 0xf4, 0xae, 0x3e, 0x9f, 0x8e, 0x35, 0x60, 0xa4, 0x33, 0x75, 0xa4, 0x04, 0x93, 0xb1, 0x6b, 0x4d}}},
|
|
||||||
{{{0x97, 0x9d, 0xa8, 0xcd, 0x97, 0x7b, 0x9d, 0xb9, 0xe7, 0xa5, 0xef, 0xfd, 0xa8, 0x42, 0x6b, 0xc3, 0x62, 0x64, 0x7d, 0xa5, 0x1b, 0xc9, 0x9e, 0xd2, 0x45, 0xb9, 0xee, 0x03, 0xb0, 0xbf, 0xc0, 0x68}} ,
|
|
||||||
{{0xed, 0xb7, 0x84, 0x2c, 0xf6, 0xd3, 0xa1, 0x6b, 0x24, 0x6d, 0x87, 0x56, 0x97, 0x59, 0x79, 0x62, 0x9f, 0xac, 0xed, 0xf3, 0xc9, 0x89, 0x21, 0x2e, 0x04, 0xb3, 0xcc, 0x2f, 0xbe, 0xd6, 0x0a, 0x4b}}},
|
|
||||||
{{{0x39, 0x61, 0x05, 0xed, 0x25, 0x89, 0x8b, 0x5d, 0x1b, 0xcb, 0x0c, 0x55, 0xf4, 0x6a, 0x00, 0x8a, 0x46, 0xe8, 0x1e, 0xc6, 0x83, 0xc8, 0x5a, 0x76, 0xdb, 0xcc, 0x19, 0x7a, 0xcc, 0x67, 0x46, 0x0b}} ,
|
|
||||||
{{0x53, 0xcf, 0xc2, 0xa1, 0xad, 0x6a, 0xf3, 0xcd, 0x8f, 0xc9, 0xde, 0x1c, 0xf8, 0x6c, 0x8f, 0xf8, 0x76, 0x42, 0xe7, 0xfe, 0xb2, 0x72, 0x21, 0x0a, 0x66, 0x74, 0x8f, 0xb7, 0xeb, 0xe4, 0x6f, 0x01}}},
|
|
||||||
{{{0x22, 0x8c, 0x6b, 0xbe, 0xfc, 0x4d, 0x70, 0x62, 0x6e, 0x52, 0x77, 0x99, 0x88, 0x7e, 0x7b, 0x57, 0x7a, 0x0d, 0xfe, 0xdc, 0x72, 0x92, 0xf1, 0x68, 0x1d, 0x97, 0xd7, 0x7c, 0x8d, 0x53, 0x10, 0x37}} ,
|
|
||||||
{{0x53, 0x88, 0x77, 0x02, 0xca, 0x27, 0xa8, 0xe5, 0x45, 0xe2, 0xa8, 0x48, 0x2a, 0xab, 0x18, 0xca, 0xea, 0x2d, 0x2a, 0x54, 0x17, 0x37, 0x32, 0x09, 0xdc, 0xe0, 0x4a, 0xb7, 0x7d, 0x82, 0x10, 0x7d}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x8a, 0x64, 0x1e, 0x14, 0x0a, 0x57, 0xd4, 0xda, 0x5c, 0x96, 0x9b, 0x01, 0x4c, 0x67, 0xbf, 0x8b, 0x30, 0xfe, 0x08, 0xdb, 0x0d, 0xd5, 0xa8, 0xd7, 0x09, 0x11, 0x85, 0xa2, 0xd3, 0x45, 0xfb, 0x7e}} ,
|
|
||||||
{{0xda, 0x8c, 0xc2, 0xd0, 0xac, 0x18, 0xe8, 0x52, 0x36, 0xd4, 0x21, 0xa3, 0xdd, 0x57, 0x22, 0x79, 0xb7, 0xf8, 0x71, 0x9d, 0xc6, 0x91, 0x70, 0x86, 0x56, 0xbf, 0xa1, 0x11, 0x8b, 0x19, 0xe1, 0x0f}}},
|
|
||||||
{{{0x18, 0x32, 0x98, 0x2c, 0x8f, 0x91, 0xae, 0x12, 0xf0, 0x8c, 0xea, 0xf3, 0x3c, 0xb9, 0x5d, 0xe4, 0x69, 0xed, 0xb2, 0x47, 0x18, 0xbd, 0xce, 0x16, 0x52, 0x5c, 0x23, 0xe2, 0xa5, 0x25, 0x52, 0x5d}} ,
|
|
||||||
{{0xb9, 0xb1, 0xe7, 0x5d, 0x4e, 0xbc, 0xee, 0xbb, 0x40, 0x81, 0x77, 0x82, 0x19, 0xab, 0xb5, 0xc6, 0xee, 0xab, 0x5b, 0x6b, 0x63, 0x92, 0x8a, 0x34, 0x8d, 0xcd, 0xee, 0x4f, 0x49, 0xe5, 0xc9, 0x7e}}},
|
|
||||||
{{{0x21, 0xac, 0x8b, 0x22, 0xcd, 0xc3, 0x9a, 0xe9, 0x5e, 0x78, 0xbd, 0xde, 0xba, 0xad, 0xab, 0xbf, 0x75, 0x41, 0x09, 0xc5, 0x58, 0xa4, 0x7d, 0x92, 0xb0, 0x7f, 0xf2, 0xa1, 0xd1, 0xc0, 0xb3, 0x6d}} ,
|
|
||||||
{{0x62, 0x4f, 0xd0, 0x75, 0x77, 0xba, 0x76, 0x77, 0xd7, 0xb8, 0xd8, 0x92, 0x6f, 0x98, 0x34, 0x3d, 0xd6, 0x4e, 0x1c, 0x0f, 0xf0, 0x8f, 0x2e, 0xf1, 0xb3, 0xbd, 0xb1, 0xb9, 0xec, 0x99, 0xb4, 0x07}}},
|
|
||||||
{{{0x60, 0x57, 0x2e, 0x9a, 0x72, 0x1d, 0x6b, 0x6e, 0x58, 0x33, 0x24, 0x8c, 0x48, 0x39, 0x46, 0x8e, 0x89, 0x6a, 0x88, 0x51, 0x23, 0x62, 0xb5, 0x32, 0x09, 0x36, 0xe3, 0x57, 0xf5, 0x98, 0xde, 0x6f}} ,
|
|
||||||
{{0x8b, 0x2c, 0x00, 0x48, 0x4a, 0xf9, 0x5b, 0x87, 0x69, 0x52, 0xe5, 0x5b, 0xd1, 0xb1, 0xe5, 0x25, 0x25, 0xe0, 0x9c, 0xc2, 0x13, 0x44, 0xe8, 0xb9, 0x0a, 0x70, 0xad, 0xbd, 0x0f, 0x51, 0x94, 0x69}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0xa2, 0xdc, 0xab, 0xa9, 0x25, 0x2d, 0xac, 0x5f, 0x03, 0x33, 0x08, 0xe7, 0x7e, 0xfe, 0x95, 0x36, 0x3c, 0x5b, 0x3a, 0xd3, 0x05, 0x82, 0x1c, 0x95, 0x2d, 0xd8, 0x77, 0x7e, 0x02, 0xd9, 0x5b, 0x70}} ,
|
|
||||||
{{0xc2, 0xfe, 0x1b, 0x0c, 0x67, 0xcd, 0xd6, 0xe0, 0x51, 0x8e, 0x2c, 0xe0, 0x79, 0x88, 0xf0, 0xcf, 0x41, 0x4a, 0xad, 0x23, 0xd4, 0x46, 0xca, 0x94, 0xa1, 0xc3, 0xeb, 0x28, 0x06, 0xfa, 0x17, 0x14}}},
|
|
||||||
{{{0x7b, 0xaa, 0x70, 0x0a, 0x4b, 0xfb, 0xf5, 0xbf, 0x80, 0xc5, 0xcf, 0x08, 0x7a, 0xdd, 0xa1, 0xf4, 0x9d, 0x54, 0x50, 0x53, 0x23, 0x77, 0x23, 0xf5, 0x34, 0xa5, 0x22, 0xd1, 0x0d, 0x96, 0x2e, 0x47}} ,
|
|
||||||
{{0xcc, 0xb7, 0x32, 0x89, 0x57, 0xd0, 0x98, 0x75, 0xe4, 0x37, 0x99, 0xa9, 0xe8, 0xba, 0xed, 0xba, 0xeb, 0xc7, 0x4f, 0x15, 0x76, 0x07, 0x0c, 0x4c, 0xef, 0x9f, 0x52, 0xfc, 0x04, 0x5d, 0x58, 0x10}}},
|
|
||||||
{{{0xce, 0x82, 0xf0, 0x8f, 0x79, 0x02, 0xa8, 0xd1, 0xda, 0x14, 0x09, 0x48, 0xee, 0x8a, 0x40, 0x98, 0x76, 0x60, 0x54, 0x5a, 0xde, 0x03, 0x24, 0xf5, 0xe6, 0x2f, 0xe1, 0x03, 0xbf, 0x68, 0x82, 0x7f}} ,
|
|
||||||
{{0x64, 0xe9, 0x28, 0xc7, 0xa4, 0xcf, 0x2a, 0xf9, 0x90, 0x64, 0x72, 0x2c, 0x8b, 0xeb, 0xec, 0xa0, 0xf2, 0x7d, 0x35, 0xb5, 0x90, 0x4d, 0x7f, 0x5b, 0x4a, 0x49, 0xe4, 0xb8, 0x3b, 0xc8, 0xa1, 0x2f}}},
|
|
||||||
{{{0x8b, 0xc5, 0xcc, 0x3d, 0x69, 0xa6, 0xa1, 0x18, 0x44, 0xbc, 0x4d, 0x77, 0x37, 0xc7, 0x86, 0xec, 0x0c, 0xc9, 0xd6, 0x44, 0xa9, 0x23, 0x27, 0xb9, 0x03, 0x34, 0xa7, 0x0a, 0xd5, 0xc7, 0x34, 0x37}} ,
|
|
||||||
{{0xf9, 0x7e, 0x3e, 0x66, 0xee, 0xf9, 0x99, 0x28, 0xff, 0xad, 0x11, 0xd8, 0xe2, 0x66, 0xc5, 0xcd, 0x0f, 0x0d, 0x0b, 0x6a, 0xfc, 0x7c, 0x24, 0xa8, 0x4f, 0xa8, 0x5e, 0x80, 0x45, 0x8b, 0x6c, 0x41}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0xef, 0x1e, 0xec, 0xf7, 0x8d, 0x77, 0xf2, 0xea, 0xdb, 0x60, 0x03, 0x21, 0xc0, 0xff, 0x5e, 0x67, 0xc3, 0x71, 0x0b, 0x21, 0xb4, 0x41, 0xa0, 0x68, 0x38, 0xc6, 0x01, 0xa3, 0xd3, 0x51, 0x3c, 0x3c}} ,
|
|
||||||
{{0x92, 0xf8, 0xd6, 0x4b, 0xef, 0x42, 0x13, 0xb2, 0x4a, 0xc4, 0x2e, 0x72, 0x3f, 0xc9, 0x11, 0xbd, 0x74, 0x02, 0x0e, 0xf5, 0x13, 0x9d, 0x83, 0x1a, 0x1b, 0xd5, 0x54, 0xde, 0xc4, 0x1e, 0x16, 0x6c}}},
|
|
||||||
{{{0x27, 0x52, 0xe4, 0x63, 0xaa, 0x94, 0xe6, 0xc3, 0x28, 0x9c, 0xc6, 0x56, 0xac, 0xfa, 0xb6, 0xbd, 0xe2, 0xcc, 0x76, 0xc6, 0x27, 0x27, 0xa2, 0x8e, 0x78, 0x2b, 0x84, 0x72, 0x10, 0xbd, 0x4e, 0x2a}} ,
|
|
||||||
{{0xea, 0xa7, 0x23, 0xef, 0x04, 0x61, 0x80, 0x50, 0xc9, 0x6e, 0xa5, 0x96, 0xd1, 0xd1, 0xc8, 0xc3, 0x18, 0xd7, 0x2d, 0xfd, 0x26, 0xbd, 0xcb, 0x7b, 0x92, 0x51, 0x0e, 0x4a, 0x65, 0x57, 0xb8, 0x49}}},
|
|
||||||
{{{0xab, 0x55, 0x36, 0xc3, 0xec, 0x63, 0x55, 0x11, 0x55, 0xf6, 0xa5, 0xc7, 0x01, 0x5f, 0xfe, 0x79, 0xd8, 0x0a, 0xf7, 0x03, 0xd8, 0x98, 0x99, 0xf5, 0xd0, 0x00, 0x54, 0x6b, 0x66, 0x28, 0xf5, 0x25}} ,
|
|
||||||
{{0x7a, 0x8d, 0xa1, 0x5d, 0x70, 0x5d, 0x51, 0x27, 0xee, 0x30, 0x65, 0x56, 0x95, 0x46, 0xde, 0xbd, 0x03, 0x75, 0xb4, 0x57, 0x59, 0x89, 0xeb, 0x02, 0x9e, 0xcc, 0x89, 0x19, 0xa7, 0xcb, 0x17, 0x67}}},
|
|
||||||
{{{0x6a, 0xeb, 0xfc, 0x9a, 0x9a, 0x10, 0xce, 0xdb, 0x3a, 0x1c, 0x3c, 0x6a, 0x9d, 0xea, 0x46, 0xbc, 0x45, 0x49, 0xac, 0xe3, 0x41, 0x12, 0x7c, 0xf0, 0xf7, 0x4f, 0xf9, 0xf7, 0xff, 0x2c, 0x89, 0x04}} ,
|
|
||||||
{{0x30, 0x31, 0x54, 0x1a, 0x46, 0xca, 0xe6, 0xc6, 0xcb, 0xe2, 0xc3, 0xc1, 0x8b, 0x75, 0x81, 0xbe, 0xee, 0xf8, 0xa3, 0x11, 0x1c, 0x25, 0xa3, 0xa7, 0x35, 0x51, 0x55, 0xe2, 0x25, 0xaa, 0xe2, 0x3a}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0xb4, 0x48, 0x10, 0x9f, 0x8a, 0x09, 0x76, 0xfa, 0xf0, 0x7a, 0xb0, 0x70, 0xf7, 0x83, 0x80, 0x52, 0x84, 0x2b, 0x26, 0xa2, 0xc4, 0x5d, 0x4f, 0xba, 0xb1, 0xc8, 0x40, 0x0d, 0x78, 0x97, 0xc4, 0x60}} ,
|
|
||||||
{{0xd4, 0xb1, 0x6c, 0x08, 0xc7, 0x40, 0x38, 0x73, 0x5f, 0x0b, 0xf3, 0x76, 0x5d, 0xb2, 0xa5, 0x2f, 0x57, 0x57, 0x07, 0xed, 0x08, 0xa2, 0x6c, 0x4f, 0x08, 0x02, 0xb5, 0x0e, 0xee, 0x44, 0xfa, 0x22}}},
|
|
||||||
{{{0x0f, 0x00, 0x3f, 0xa6, 0x04, 0x19, 0x56, 0x65, 0x31, 0x7f, 0x8b, 0xeb, 0x0d, 0xe1, 0x47, 0x89, 0x97, 0x16, 0x53, 0xfa, 0x81, 0xa7, 0xaa, 0xb2, 0xbf, 0x67, 0xeb, 0x72, 0x60, 0x81, 0x0d, 0x48}} ,
|
|
||||||
{{0x7e, 0x13, 0x33, 0xcd, 0xa8, 0x84, 0x56, 0x1e, 0x67, 0xaf, 0x6b, 0x43, 0xac, 0x17, 0xaf, 0x16, 0xc0, 0x52, 0x99, 0x49, 0x5b, 0x87, 0x73, 0x7e, 0xb5, 0x43, 0xda, 0x6b, 0x1d, 0x0f, 0x2d, 0x55}}},
|
|
||||||
{{{0xe9, 0x58, 0x1f, 0xff, 0x84, 0x3f, 0x93, 0x1c, 0xcb, 0xe1, 0x30, 0x69, 0xa5, 0x75, 0x19, 0x7e, 0x14, 0x5f, 0xf8, 0xfc, 0x09, 0xdd, 0xa8, 0x78, 0x9d, 0xca, 0x59, 0x8b, 0xd1, 0x30, 0x01, 0x13}} ,
|
|
||||||
{{0xff, 0x76, 0x03, 0xc5, 0x4b, 0x89, 0x99, 0x70, 0x00, 0x59, 0x70, 0x9c, 0xd5, 0xd9, 0x11, 0x89, 0x5a, 0x46, 0xfe, 0xef, 0xdc, 0xd9, 0x55, 0x2b, 0x45, 0xa7, 0xb0, 0x2d, 0xfb, 0x24, 0xc2, 0x29}}},
|
|
||||||
{{{0x38, 0x06, 0xf8, 0x0b, 0xac, 0x82, 0xc4, 0x97, 0x2b, 0x90, 0xe0, 0xf7, 0xa8, 0xab, 0x6c, 0x08, 0x80, 0x66, 0x90, 0x46, 0xf7, 0x26, 0x2d, 0xf8, 0xf1, 0xc4, 0x6b, 0x4a, 0x82, 0x98, 0x8e, 0x37}} ,
|
|
||||||
{{0x8e, 0xb4, 0xee, 0xb8, 0xd4, 0x3f, 0xb2, 0x1b, 0xe0, 0x0a, 0x3d, 0x75, 0x34, 0x28, 0xa2, 0x8e, 0xc4, 0x92, 0x7b, 0xfe, 0x60, 0x6e, 0x6d, 0xb8, 0x31, 0x1d, 0x62, 0x0d, 0x78, 0x14, 0x42, 0x11}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x5e, 0xa8, 0xd8, 0x04, 0x9b, 0x73, 0xc9, 0xc9, 0xdc, 0x0d, 0x73, 0xbf, 0x0a, 0x0a, 0x73, 0xff, 0x18, 0x1f, 0x9c, 0x51, 0xaa, 0xc6, 0xf1, 0x83, 0x25, 0xfd, 0xab, 0xa3, 0x11, 0xd3, 0x01, 0x24}} ,
|
|
||||||
{{0x4d, 0xe3, 0x7e, 0x38, 0x62, 0x5e, 0x64, 0xbb, 0x2b, 0x53, 0xb5, 0x03, 0x68, 0xc4, 0xf2, 0x2b, 0x5a, 0x03, 0x32, 0x99, 0x4a, 0x41, 0x9a, 0xe1, 0x1a, 0xae, 0x8c, 0x48, 0xf3, 0x24, 0x32, 0x65}}},
|
|
||||||
{{{0xe8, 0xdd, 0xad, 0x3a, 0x8c, 0xea, 0xf4, 0xb3, 0xb2, 0xe5, 0x73, 0xf2, 0xed, 0x8b, 0xbf, 0xed, 0xb1, 0x0c, 0x0c, 0xfb, 0x2b, 0xf1, 0x01, 0x48, 0xe8, 0x26, 0x03, 0x8e, 0x27, 0x4d, 0x96, 0x72}} ,
|
|
||||||
{{0xc8, 0x09, 0x3b, 0x60, 0xc9, 0x26, 0x4d, 0x7c, 0xf2, 0x9c, 0xd4, 0xa1, 0x3b, 0x26, 0xc2, 0x04, 0x33, 0x44, 0x76, 0x3c, 0x02, 0xbb, 0x11, 0x42, 0x0c, 0x22, 0xb7, 0xc6, 0xe1, 0xac, 0xb4, 0x0e}}},
|
|
||||||
{{{0x6f, 0x85, 0xe7, 0xef, 0xde, 0x67, 0x30, 0xfc, 0xbf, 0x5a, 0xe0, 0x7b, 0x7a, 0x2a, 0x54, 0x6b, 0x5d, 0x62, 0x85, 0xa1, 0xf8, 0x16, 0x88, 0xec, 0x61, 0xb9, 0x96, 0xb5, 0xef, 0x2d, 0x43, 0x4d}} ,
|
|
||||||
{{0x7c, 0x31, 0x33, 0xcc, 0xe4, 0xcf, 0x6c, 0xff, 0x80, 0x47, 0x77, 0xd1, 0xd8, 0xe9, 0x69, 0x97, 0x98, 0x7f, 0x20, 0x57, 0x1d, 0x1d, 0x4f, 0x08, 0x27, 0xc8, 0x35, 0x57, 0x40, 0xc6, 0x21, 0x0c}}},
|
|
||||||
{{{0xd2, 0x8e, 0x9b, 0xfa, 0x42, 0x8e, 0xdf, 0x8f, 0xc7, 0x86, 0xf9, 0xa4, 0xca, 0x70, 0x00, 0x9d, 0x21, 0xbf, 0xec, 0x57, 0x62, 0x30, 0x58, 0x8c, 0x0d, 0x35, 0xdb, 0x5d, 0x8b, 0x6a, 0xa0, 0x5a}} ,
|
|
||||||
{{0xc1, 0x58, 0x7c, 0x0d, 0x20, 0xdd, 0x11, 0x26, 0x5f, 0x89, 0x3b, 0x97, 0x58, 0xf8, 0x8b, 0xe3, 0xdf, 0x32, 0xe2, 0xfc, 0xd8, 0x67, 0xf2, 0xa5, 0x37, 0x1e, 0x6d, 0xec, 0x7c, 0x27, 0x20, 0x79}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0xd0, 0xe9, 0xc0, 0xfa, 0x95, 0x45, 0x23, 0x96, 0xf1, 0x2c, 0x79, 0x25, 0x14, 0xce, 0x40, 0x14, 0x44, 0x2c, 0x36, 0x50, 0xd9, 0x63, 0x56, 0xb7, 0x56, 0x3b, 0x9e, 0xa7, 0xef, 0x89, 0xbb, 0x0e}} ,
|
|
||||||
{{0xce, 0x7f, 0xdc, 0x0a, 0xcc, 0x82, 0x1c, 0x0a, 0x78, 0x71, 0xe8, 0x74, 0x8d, 0x01, 0x30, 0x0f, 0xa7, 0x11, 0x4c, 0xdf, 0x38, 0xd7, 0xa7, 0x0d, 0xf8, 0x48, 0x52, 0x00, 0x80, 0x7b, 0x5f, 0x0e}}},
|
|
||||||
{{{0x25, 0x83, 0xe6, 0x94, 0x7b, 0x81, 0xb2, 0x91, 0xae, 0x0e, 0x05, 0xc9, 0xa3, 0x68, 0x2d, 0xd9, 0x88, 0x25, 0x19, 0x2a, 0x61, 0x61, 0x21, 0x97, 0x15, 0xa1, 0x35, 0xa5, 0x46, 0xc8, 0xa2, 0x0e}} ,
|
|
||||||
{{0x1b, 0x03, 0x0d, 0x8b, 0x5a, 0x1b, 0x97, 0x4b, 0xf2, 0x16, 0x31, 0x3d, 0x1f, 0x33, 0xa0, 0x50, 0x3a, 0x18, 0xbe, 0x13, 0xa1, 0x76, 0xc1, 0xba, 0x1b, 0xf1, 0x05, 0x7b, 0x33, 0xa8, 0x82, 0x3b}}},
|
|
||||||
{{{0xba, 0x36, 0x7b, 0x6d, 0xa9, 0xea, 0x14, 0x12, 0xc5, 0xfa, 0x91, 0x00, 0xba, 0x9b, 0x99, 0xcc, 0x56, 0x02, 0xe9, 0xa0, 0x26, 0x40, 0x66, 0x8c, 0xc4, 0xf8, 0x85, 0x33, 0x68, 0xe7, 0x03, 0x20}} ,
|
|
||||||
{{0x50, 0x5b, 0xff, 0xa9, 0xb2, 0xf1, 0xf1, 0x78, 0xcf, 0x14, 0xa4, 0xa9, 0xfc, 0x09, 0x46, 0x94, 0x54, 0x65, 0x0d, 0x9c, 0x5f, 0x72, 0x21, 0xe2, 0x97, 0xa5, 0x2d, 0x81, 0xce, 0x4a, 0x5f, 0x79}}},
|
|
||||||
{{{0x3d, 0x5f, 0x5c, 0xd2, 0xbc, 0x7d, 0x77, 0x0e, 0x2a, 0x6d, 0x22, 0x45, 0x84, 0x06, 0xc4, 0xdd, 0xc6, 0xa6, 0xc6, 0xd7, 0x49, 0xad, 0x6d, 0x87, 0x91, 0x0e, 0x3a, 0x67, 0x1d, 0x2c, 0x1d, 0x56}} ,
|
|
||||||
{{0xfe, 0x7a, 0x74, 0xcf, 0xd4, 0xd2, 0xe5, 0x19, 0xde, 0xd0, 0xdb, 0x70, 0x23, 0x69, 0xe6, 0x6d, 0xec, 0xec, 0xcc, 0x09, 0x33, 0x6a, 0x77, 0xdc, 0x6b, 0x22, 0x76, 0x5d, 0x92, 0x09, 0xac, 0x2d}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x23, 0x15, 0x17, 0xeb, 0xd3, 0xdb, 0x12, 0x5e, 0x01, 0xf0, 0x91, 0xab, 0x2c, 0x41, 0xce, 0xac, 0xed, 0x1b, 0x4b, 0x2d, 0xbc, 0xdb, 0x17, 0x66, 0x89, 0x46, 0xad, 0x4b, 0x1e, 0x6f, 0x0b, 0x14}} ,
|
|
||||||
{{0x11, 0xce, 0xbf, 0xb6, 0x77, 0x2d, 0x48, 0x22, 0x18, 0x4f, 0xa3, 0x5d, 0x4a, 0xb0, 0x70, 0x12, 0x3e, 0x54, 0xd7, 0xd8, 0x0e, 0x2b, 0x27, 0xdc, 0x53, 0xff, 0xca, 0x8c, 0x59, 0xb3, 0x4e, 0x44}}},
|
|
||||||
{{{0x07, 0x76, 0x61, 0x0f, 0x66, 0xb2, 0x21, 0x39, 0x7e, 0xc0, 0xec, 0x45, 0x28, 0x82, 0xa1, 0x29, 0x32, 0x44, 0x35, 0x13, 0x5e, 0x61, 0x5e, 0x54, 0xcb, 0x7c, 0xef, 0xf6, 0x41, 0xcf, 0x9f, 0x0a}} ,
|
|
||||||
{{0xdd, 0xf9, 0xda, 0x84, 0xc3, 0xe6, 0x8a, 0x9f, 0x24, 0xd2, 0x96, 0x5d, 0x39, 0x6f, 0x58, 0x8c, 0xc1, 0x56, 0x93, 0xab, 0xb5, 0x79, 0x3b, 0xd2, 0xa8, 0x73, 0x16, 0xed, 0xfa, 0xb4, 0x2f, 0x73}}},
|
|
||||||
{{{0x8b, 0xb1, 0x95, 0xe5, 0x92, 0x50, 0x35, 0x11, 0x76, 0xac, 0xf4, 0x4d, 0x24, 0xc3, 0x32, 0xe6, 0xeb, 0xfe, 0x2c, 0x87, 0xc4, 0xf1, 0x56, 0xc4, 0x75, 0x24, 0x7a, 0x56, 0x85, 0x5a, 0x3a, 0x13}} ,
|
|
||||||
{{0x0d, 0x16, 0xac, 0x3c, 0x4a, 0x58, 0x86, 0x3a, 0x46, 0x7f, 0x6c, 0xa3, 0x52, 0x6e, 0x37, 0xe4, 0x96, 0x9c, 0xe9, 0x5c, 0x66, 0x41, 0x67, 0xe4, 0xfb, 0x79, 0x0c, 0x05, 0xf6, 0x64, 0xd5, 0x7c}}},
|
|
||||||
{{{0x28, 0xc1, 0xe1, 0x54, 0x73, 0xf2, 0xbf, 0x76, 0x74, 0x19, 0x19, 0x1b, 0xe4, 0xb9, 0xa8, 0x46, 0x65, 0x73, 0xf3, 0x77, 0x9b, 0x29, 0x74, 0x5b, 0xc6, 0x89, 0x6c, 0x2c, 0x7c, 0xf8, 0xb3, 0x0f}} ,
|
|
||||||
{{0xf7, 0xd5, 0xe9, 0x74, 0x5d, 0xb8, 0x25, 0x16, 0xb5, 0x30, 0xbc, 0x84, 0xc5, 0xf0, 0xad, 0xca, 0x12, 0x28, 0xbc, 0x9d, 0xd4, 0xfa, 0x82, 0xe6, 0xe3, 0xbf, 0xa2, 0x15, 0x2c, 0xd4, 0x34, 0x10}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x61, 0xb1, 0x46, 0xba, 0x0e, 0x31, 0xa5, 0x67, 0x6c, 0x7f, 0xd6, 0xd9, 0x27, 0x85, 0x0f, 0x79, 0x14, 0xc8, 0x6c, 0x2f, 0x5f, 0x5b, 0x9c, 0x35, 0x3d, 0x38, 0x86, 0x77, 0x65, 0x55, 0x6a, 0x7b}} ,
|
|
||||||
{{0xd3, 0xb0, 0x3a, 0x66, 0x60, 0x1b, 0x43, 0xf1, 0x26, 0x58, 0x99, 0x09, 0x8f, 0x2d, 0xa3, 0x14, 0x71, 0x85, 0xdb, 0xed, 0xf6, 0x26, 0xd5, 0x61, 0x9a, 0x73, 0xac, 0x0e, 0xea, 0xac, 0xb7, 0x0c}}},
|
|
||||||
{{{0x5e, 0xf4, 0xe5, 0x17, 0x0e, 0x10, 0x9f, 0xe7, 0x43, 0x5f, 0x67, 0x5c, 0xac, 0x4b, 0xe5, 0x14, 0x41, 0xd2, 0xbf, 0x48, 0xf5, 0x14, 0xb0, 0x71, 0xc6, 0x61, 0xc1, 0xb2, 0x70, 0x58, 0xd2, 0x5a}} ,
|
|
||||||
{{0x2d, 0xba, 0x16, 0x07, 0x92, 0x94, 0xdc, 0xbd, 0x50, 0x2b, 0xc9, 0x7f, 0x42, 0x00, 0xba, 0x61, 0xed, 0xf8, 0x43, 0xed, 0xf5, 0xf9, 0x40, 0x60, 0xb2, 0xb0, 0x82, 0xcb, 0xed, 0x75, 0xc7, 0x65}}},
|
|
||||||
{{{0x80, 0xba, 0x0d, 0x09, 0x40, 0xa7, 0x39, 0xa6, 0x67, 0x34, 0x7e, 0x66, 0xbe, 0x56, 0xfb, 0x53, 0x78, 0xc4, 0x46, 0xe8, 0xed, 0x68, 0x6c, 0x7f, 0xce, 0xe8, 0x9f, 0xce, 0xa2, 0x64, 0x58, 0x53}} ,
|
|
||||||
{{0xe8, 0xc1, 0xa9, 0xc2, 0x7b, 0x59, 0x21, 0x33, 0xe2, 0x43, 0x73, 0x2b, 0xac, 0x2d, 0xc1, 0x89, 0x3b, 0x15, 0xe2, 0xd5, 0xc0, 0x97, 0x8a, 0xfd, 0x6f, 0x36, 0x33, 0xb7, 0xb9, 0xc3, 0x88, 0x09}}},
|
|
||||||
{{{0xd0, 0xb6, 0x56, 0x30, 0x5c, 0xae, 0xb3, 0x75, 0x44, 0xa4, 0x83, 0x51, 0x6e, 0x01, 0x65, 0xef, 0x45, 0x76, 0xe6, 0xf5, 0xa2, 0x0d, 0xd4, 0x16, 0x3b, 0x58, 0x2f, 0xf2, 0x2f, 0x36, 0x18, 0x3f}} ,
|
|
||||||
{{0xfd, 0x2f, 0xe0, 0x9b, 0x1e, 0x8c, 0xc5, 0x18, 0xa9, 0xca, 0xd4, 0x2b, 0x35, 0xb6, 0x95, 0x0a, 0x9f, 0x7e, 0xfb, 0xc4, 0xef, 0x88, 0x7b, 0x23, 0x43, 0xec, 0x2f, 0x0d, 0x0f, 0x7a, 0xfc, 0x5c}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x8d, 0xd2, 0xda, 0xc7, 0x44, 0xd6, 0x7a, 0xdb, 0x26, 0x7d, 0x1d, 0xb8, 0xe1, 0xde, 0x9d, 0x7a, 0x7d, 0x17, 0x7e, 0x1c, 0x37, 0x04, 0x8d, 0x2d, 0x7c, 0x5e, 0x18, 0x38, 0x1e, 0xaf, 0xc7, 0x1b}} ,
|
|
||||||
{{0x33, 0x48, 0x31, 0x00, 0x59, 0xf6, 0xf2, 0xca, 0x0f, 0x27, 0x1b, 0x63, 0x12, 0x7e, 0x02, 0x1d, 0x49, 0xc0, 0x5d, 0x79, 0x87, 0xef, 0x5e, 0x7a, 0x2f, 0x1f, 0x66, 0x55, 0xd8, 0x09, 0xd9, 0x61}}},
|
|
||||||
{{{0x54, 0x83, 0x02, 0x18, 0x82, 0x93, 0x99, 0x07, 0xd0, 0xa7, 0xda, 0xd8, 0x75, 0x89, 0xfa, 0xf2, 0xd9, 0xa3, 0xb8, 0x6b, 0x5a, 0x35, 0x28, 0xd2, 0x6b, 0x59, 0xc2, 0xf8, 0x45, 0xe2, 0xbc, 0x06}} ,
|
|
||||||
{{0x65, 0xc0, 0xa3, 0x88, 0x51, 0x95, 0xfc, 0x96, 0x94, 0x78, 0xe8, 0x0d, 0x8b, 0x41, 0xc9, 0xc2, 0x58, 0x48, 0x75, 0x10, 0x2f, 0xcd, 0x2a, 0xc9, 0xa0, 0x6d, 0x0f, 0xdd, 0x9c, 0x98, 0x26, 0x3d}}},
|
|
||||||
{{{0x2f, 0x66, 0x29, 0x1b, 0x04, 0x89, 0xbd, 0x7e, 0xee, 0x6e, 0xdd, 0xb7, 0x0e, 0xef, 0xb0, 0x0c, 0xb4, 0xfc, 0x7f, 0xc2, 0xc9, 0x3a, 0x3c, 0x64, 0xef, 0x45, 0x44, 0xaf, 0x8a, 0x90, 0x65, 0x76}} ,
|
|
||||||
{{0xa1, 0x4c, 0x70, 0x4b, 0x0e, 0xa0, 0x83, 0x70, 0x13, 0xa4, 0xaf, 0xb8, 0x38, 0x19, 0x22, 0x65, 0x09, 0xb4, 0x02, 0x4f, 0x06, 0xf8, 0x17, 0xce, 0x46, 0x45, 0xda, 0x50, 0x7c, 0x8a, 0xd1, 0x4e}}},
|
|
||||||
{{{0xf7, 0xd4, 0x16, 0x6c, 0x4e, 0x95, 0x9d, 0x5d, 0x0f, 0x91, 0x2b, 0x52, 0xfe, 0x5c, 0x34, 0xe5, 0x30, 0xe6, 0xa4, 0x3b, 0xf3, 0xf3, 0x34, 0x08, 0xa9, 0x4a, 0xa0, 0xb5, 0x6e, 0xb3, 0x09, 0x0a}} ,
|
|
||||||
{{0x26, 0xd9, 0x5e, 0xa3, 0x0f, 0xeb, 0xa2, 0xf3, 0x20, 0x3b, 0x37, 0xd4, 0xe4, 0x9e, 0xce, 0x06, 0x3d, 0x53, 0xed, 0xae, 0x2b, 0xeb, 0xb6, 0x24, 0x0a, 0x11, 0xa3, 0x0f, 0xd6, 0x7f, 0xa4, 0x3a}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0xdb, 0x9f, 0x2c, 0xfc, 0xd6, 0xb2, 0x1e, 0x2e, 0x52, 0x7a, 0x06, 0x87, 0x2d, 0x86, 0x72, 0x2b, 0x6d, 0x90, 0x77, 0x46, 0x43, 0xb5, 0x7a, 0xf8, 0x60, 0x7d, 0x91, 0x60, 0x5b, 0x9d, 0x9e, 0x07}} ,
|
|
||||||
{{0x97, 0x87, 0xc7, 0x04, 0x1c, 0x38, 0x01, 0x39, 0x58, 0xc7, 0x85, 0xa3, 0xfc, 0x64, 0x00, 0x64, 0x25, 0xa2, 0xbf, 0x50, 0x94, 0xca, 0x26, 0x31, 0x45, 0x0a, 0x24, 0xd2, 0x51, 0x29, 0x51, 0x16}}},
|
|
||||||
{{{0x4d, 0x4a, 0xd7, 0x98, 0x71, 0x57, 0xac, 0x7d, 0x8b, 0x37, 0xbd, 0x63, 0xff, 0x87, 0xb1, 0x49, 0x95, 0x20, 0x7c, 0xcf, 0x7c, 0x59, 0xc4, 0x91, 0x9c, 0xef, 0xd0, 0xdb, 0x60, 0x09, 0x9d, 0x46}} ,
|
|
||||||
{{0xcb, 0x78, 0x94, 0x90, 0xe4, 0x45, 0xb3, 0xf6, 0xd9, 0xf6, 0x57, 0x74, 0xd5, 0xf8, 0x83, 0x4f, 0x39, 0xc9, 0xbd, 0x88, 0xc2, 0x57, 0x21, 0x1f, 0x24, 0x32, 0x68, 0xf8, 0xc7, 0x21, 0x5f, 0x0b}}},
|
|
||||||
{{{0x2a, 0x36, 0x68, 0xfc, 0x5f, 0xb6, 0x4f, 0xa5, 0xe3, 0x9d, 0x24, 0x2f, 0xc0, 0x93, 0x61, 0xcf, 0xf8, 0x0a, 0xed, 0xe1, 0xdb, 0x27, 0xec, 0x0e, 0x14, 0x32, 0x5f, 0x8e, 0xa1, 0x62, 0x41, 0x16}} ,
|
|
||||||
{{0x95, 0x21, 0x01, 0xce, 0x95, 0x5b, 0x0e, 0x57, 0xc7, 0xb9, 0x62, 0xb5, 0x28, 0xca, 0x11, 0xec, 0xb4, 0x46, 0x06, 0x73, 0x26, 0xff, 0xfb, 0x66, 0x7d, 0xee, 0x5f, 0xb2, 0x56, 0xfd, 0x2a, 0x08}}},
|
|
||||||
{{{0x92, 0x67, 0x77, 0x56, 0xa1, 0xff, 0xc4, 0xc5, 0x95, 0xf0, 0xe3, 0x3a, 0x0a, 0xca, 0x94, 0x4d, 0x9e, 0x7e, 0x3d, 0xb9, 0x6e, 0xb6, 0xb0, 0xce, 0xa4, 0x30, 0x89, 0x99, 0xe9, 0xad, 0x11, 0x59}} ,
|
|
||||||
{{0xf6, 0x48, 0x95, 0xa1, 0x6f, 0x5f, 0xb7, 0xa5, 0xbb, 0x30, 0x00, 0x1c, 0xd2, 0x8a, 0xd6, 0x25, 0x26, 0x1b, 0xb2, 0x0d, 0x37, 0x6a, 0x05, 0xf4, 0x9d, 0x3e, 0x17, 0x2a, 0x43, 0xd2, 0x3a, 0x06}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x32, 0x99, 0x93, 0xd1, 0x9a, 0x72, 0xf3, 0xa9, 0x16, 0xbd, 0xb4, 0x4c, 0xdd, 0xf9, 0xd4, 0xb2, 0x64, 0x9a, 0xd3, 0x05, 0xe4, 0xa3, 0x73, 0x1c, 0xcb, 0x7e, 0x57, 0x67, 0xff, 0x04, 0xb3, 0x10}} ,
|
|
||||||
{{0xb9, 0x4b, 0xa4, 0xad, 0xd0, 0x6d, 0x61, 0x23, 0xb4, 0xaf, 0x34, 0xa9, 0xaa, 0x65, 0xec, 0xd9, 0x69, 0xe3, 0x85, 0xcd, 0xcc, 0xe7, 0xb0, 0x9b, 0x41, 0xc1, 0x1c, 0xf9, 0xa0, 0xfa, 0xb7, 0x13}}},
|
|
||||||
{{{0x04, 0xfd, 0x88, 0x3c, 0x0c, 0xd0, 0x09, 0x52, 0x51, 0x4f, 0x06, 0x19, 0xcc, 0xc3, 0xbb, 0xde, 0x80, 0xc5, 0x33, 0xbc, 0xf9, 0xf3, 0x17, 0x36, 0xdd, 0xc6, 0xde, 0xe8, 0x9b, 0x5d, 0x79, 0x1b}} ,
|
|
||||||
{{0x65, 0x0a, 0xbe, 0x51, 0x57, 0xad, 0x50, 0x79, 0x08, 0x71, 0x9b, 0x07, 0x95, 0x8f, 0xfb, 0xae, 0x4b, 0x38, 0xba, 0xcf, 0x53, 0x2a, 0x86, 0x1e, 0xc0, 0x50, 0x5c, 0x67, 0x1b, 0xf6, 0x87, 0x6c}}},
|
|
||||||
{{{0x4f, 0x00, 0xb2, 0x66, 0x55, 0xed, 0x4a, 0xed, 0x8d, 0xe1, 0x66, 0x18, 0xb2, 0x14, 0x74, 0x8d, 0xfd, 0x1a, 0x36, 0x0f, 0x26, 0x5c, 0x8b, 0x89, 0xf3, 0xab, 0xf2, 0xf3, 0x24, 0x67, 0xfd, 0x70}} ,
|
|
||||||
{{0xfd, 0x4e, 0x2a, 0xc1, 0x3a, 0xca, 0x8f, 0x00, 0xd8, 0xec, 0x74, 0x67, 0xef, 0x61, 0xe0, 0x28, 0xd0, 0x96, 0xf4, 0x48, 0xde, 0x81, 0xe3, 0xef, 0xdc, 0xaa, 0x7d, 0xf3, 0xb6, 0x55, 0xa6, 0x65}}},
|
|
||||||
{{{0xeb, 0xcb, 0xc5, 0x70, 0x91, 0x31, 0x10, 0x93, 0x0d, 0xc8, 0xd0, 0xef, 0x62, 0xe8, 0x6f, 0x82, 0xe3, 0x69, 0x3d, 0x91, 0x7f, 0x31, 0xe1, 0x26, 0x35, 0x3c, 0x4a, 0x2f, 0xab, 0xc4, 0x9a, 0x5e}} ,
|
|
||||||
{{0xab, 0x1b, 0xb5, 0xe5, 0x2b, 0xc3, 0x0e, 0x29, 0xb0, 0xd0, 0x73, 0xe6, 0x4f, 0x64, 0xf2, 0xbc, 0xe4, 0xe4, 0xe1, 0x9a, 0x52, 0x33, 0x2f, 0xbd, 0xcc, 0x03, 0xee, 0x8a, 0xfa, 0x00, 0x5f, 0x50}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0xf6, 0xdb, 0x0d, 0x22, 0x3d, 0xb5, 0x14, 0x75, 0x31, 0xf0, 0x81, 0xe2, 0xb9, 0x37, 0xa2, 0xa9, 0x84, 0x11, 0x9a, 0x07, 0xb5, 0x53, 0x89, 0x78, 0xa9, 0x30, 0x27, 0xa1, 0xf1, 0x4e, 0x5c, 0x2e}} ,
|
|
||||||
{{0x8b, 0x00, 0x54, 0xfb, 0x4d, 0xdc, 0xcb, 0x17, 0x35, 0x40, 0xff, 0xb7, 0x8c, 0xfe, 0x4a, 0xe4, 0x4e, 0x99, 0x4e, 0xa8, 0x74, 0x54, 0x5d, 0x5c, 0x96, 0xa3, 0x12, 0x55, 0x36, 0x31, 0x17, 0x5c}}},
|
|
||||||
{{{0xce, 0x24, 0xef, 0x7b, 0x86, 0xf2, 0x0f, 0x77, 0xe8, 0x5c, 0x7d, 0x87, 0x38, 0x2d, 0xef, 0xaf, 0xf2, 0x8c, 0x72, 0x2e, 0xeb, 0xb6, 0x55, 0x4b, 0x6e, 0xf1, 0x4e, 0x8a, 0x0e, 0x9a, 0x6c, 0x4c}} ,
|
|
||||||
{{0x25, 0xea, 0x86, 0xc2, 0xd1, 0x4f, 0xb7, 0x3e, 0xa8, 0x5c, 0x8d, 0x66, 0x81, 0x25, 0xed, 0xc5, 0x4c, 0x05, 0xb9, 0xd8, 0xd6, 0x70, 0xbe, 0x73, 0x82, 0xe8, 0xa1, 0xe5, 0x1e, 0x71, 0xd5, 0x26}}},
|
|
||||||
{{{0x4e, 0x6d, 0xc3, 0xa7, 0x4f, 0x22, 0x45, 0x26, 0xa2, 0x7e, 0x16, 0xf7, 0xf7, 0x63, 0xdc, 0x86, 0x01, 0x2a, 0x71, 0x38, 0x5c, 0x33, 0xc3, 0xce, 0x30, 0xff, 0xf9, 0x2c, 0x91, 0x71, 0x8a, 0x72}} ,
|
|
||||||
{{0x8c, 0x44, 0x09, 0x28, 0xd5, 0x23, 0xc9, 0x8f, 0xf3, 0x84, 0x45, 0xc6, 0x9a, 0x5e, 0xff, 0xd2, 0xc7, 0x57, 0x93, 0xa3, 0xc1, 0x69, 0xdd, 0x62, 0x0f, 0xda, 0x5c, 0x30, 0x59, 0x5d, 0xe9, 0x4c}}},
|
|
||||||
{{{0x92, 0x7e, 0x50, 0x27, 0x72, 0xd7, 0x0c, 0xd6, 0x69, 0x96, 0x81, 0x35, 0x84, 0x94, 0x35, 0x8b, 0x6c, 0xaa, 0x62, 0x86, 0x6e, 0x1c, 0x15, 0xf3, 0x6c, 0xb3, 0xff, 0x65, 0x1b, 0xa2, 0x9b, 0x59}} ,
|
|
||||||
{{0xe2, 0xa9, 0x65, 0x88, 0xc4, 0x50, 0xfa, 0xbb, 0x3b, 0x6e, 0x5f, 0x44, 0x01, 0xca, 0x97, 0xd4, 0xdd, 0xf6, 0xcd, 0x3f, 0x3f, 0xe5, 0x97, 0x67, 0x2b, 0x8c, 0x66, 0x0f, 0x35, 0x9b, 0xf5, 0x07}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0xf1, 0x59, 0x27, 0xd8, 0xdb, 0x5a, 0x11, 0x5e, 0x82, 0xf3, 0x38, 0xff, 0x1c, 0xed, 0xfe, 0x3f, 0x64, 0x54, 0x3f, 0x7f, 0xd1, 0x81, 0xed, 0xef, 0x65, 0xc5, 0xcb, 0xfd, 0xe1, 0x80, 0xcd, 0x11}} ,
|
|
||||||
{{0xe0, 0xdb, 0x22, 0x28, 0xe6, 0xff, 0x61, 0x9d, 0x41, 0x14, 0x2d, 0x3b, 0x26, 0x22, 0xdf, 0xf1, 0x34, 0x81, 0xe9, 0x45, 0xee, 0x0f, 0x98, 0x8b, 0xa6, 0x3f, 0xef, 0xf7, 0x43, 0x19, 0xf1, 0x43}}},
|
|
||||||
{{{0xee, 0xf3, 0x00, 0xa1, 0x50, 0xde, 0xc0, 0xb6, 0x01, 0xe3, 0x8c, 0x3c, 0x4d, 0x31, 0xd2, 0xb0, 0x58, 0xcd, 0xed, 0x10, 0x4a, 0x7a, 0xef, 0x80, 0xa9, 0x19, 0x32, 0xf3, 0xd8, 0x33, 0x8c, 0x06}} ,
|
|
||||||
{{0xcb, 0x7d, 0x4f, 0xff, 0x30, 0xd8, 0x12, 0x3b, 0x39, 0x1c, 0x06, 0xf9, 0x4c, 0x34, 0x35, 0x71, 0xb5, 0x16, 0x94, 0x67, 0xdf, 0xee, 0x11, 0xde, 0xa4, 0x1d, 0x88, 0x93, 0x35, 0xa9, 0x32, 0x10}}},
|
|
||||||
{{{0xe9, 0xc3, 0xbc, 0x7b, 0x5c, 0xfc, 0xb2, 0xf9, 0xc9, 0x2f, 0xe5, 0xba, 0x3a, 0x0b, 0xab, 0x64, 0x38, 0x6f, 0x5b, 0x4b, 0x93, 0xda, 0x64, 0xec, 0x4d, 0x3d, 0xa0, 0xf5, 0xbb, 0xba, 0x47, 0x48}} ,
|
|
||||||
{{0x60, 0xbc, 0x45, 0x1f, 0x23, 0xa2, 0x3b, 0x70, 0x76, 0xe6, 0x97, 0x99, 0x4f, 0x77, 0x54, 0x67, 0x30, 0x9a, 0xe7, 0x66, 0xd6, 0xcd, 0x2e, 0x51, 0x24, 0x2c, 0x42, 0x4a, 0x11, 0xfe, 0x6f, 0x7e}}},
|
|
||||||
{{{0x87, 0xc0, 0xb1, 0xf0, 0xa3, 0x6f, 0x0c, 0x93, 0xa9, 0x0a, 0x72, 0xef, 0x5c, 0xbe, 0x65, 0x35, 0xa7, 0x6a, 0x4e, 0x2c, 0xbf, 0x21, 0x23, 0xe8, 0x2f, 0x97, 0xc7, 0x3e, 0xc8, 0x17, 0xac, 0x1e}} ,
|
|
||||||
{{0x7b, 0xef, 0x21, 0xe5, 0x40, 0xcc, 0x1e, 0xdc, 0xd6, 0xbd, 0x97, 0x7a, 0x7c, 0x75, 0x86, 0x7a, 0x25, 0x5a, 0x6e, 0x7c, 0xe5, 0x51, 0x3c, 0x1b, 0x5b, 0x82, 0x9a, 0x07, 0x60, 0xa1, 0x19, 0x04}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x96, 0x88, 0xa6, 0xab, 0x8f, 0xe3, 0x3a, 0x49, 0xf8, 0xfe, 0x34, 0xe7, 0x6a, 0xb2, 0xfe, 0x40, 0x26, 0x74, 0x57, 0x4c, 0xf6, 0xd4, 0x99, 0xce, 0x5d, 0x7b, 0x2f, 0x67, 0xd6, 0x5a, 0xe4, 0x4e}} ,
|
|
||||||
{{0x5c, 0x82, 0xb3, 0xbd, 0x55, 0x25, 0xf6, 0x6a, 0x93, 0xa4, 0x02, 0xc6, 0x7d, 0x5c, 0xb1, 0x2b, 0x5b, 0xff, 0xfb, 0x56, 0xf8, 0x01, 0x41, 0x90, 0xc6, 0xb6, 0xac, 0x4f, 0xfe, 0xa7, 0x41, 0x70}}},
|
|
||||||
{{{0xdb, 0xfa, 0x9b, 0x2c, 0xd4, 0x23, 0x67, 0x2c, 0x8a, 0x63, 0x6c, 0x07, 0x26, 0x48, 0x4f, 0xc2, 0x03, 0xd2, 0x53, 0x20, 0x28, 0xed, 0x65, 0x71, 0x47, 0xa9, 0x16, 0x16, 0x12, 0xbc, 0x28, 0x33}} ,
|
|
||||||
{{0x39, 0xc0, 0xfa, 0xfa, 0xcd, 0x33, 0x43, 0xc7, 0x97, 0x76, 0x9b, 0x93, 0x91, 0x72, 0xeb, 0xc5, 0x18, 0x67, 0x4c, 0x11, 0xf0, 0xf4, 0xe5, 0x73, 0xb2, 0x5c, 0x1b, 0xc2, 0x26, 0x3f, 0xbf, 0x2b}}},
|
|
||||||
{{{0x86, 0xe6, 0x8c, 0x1d, 0xdf, 0xca, 0xfc, 0xd5, 0xf8, 0x3a, 0xc3, 0x44, 0x72, 0xe6, 0x78, 0x9d, 0x2b, 0x97, 0xf8, 0x28, 0x45, 0xb4, 0x20, 0xc9, 0x2a, 0x8c, 0x67, 0xaa, 0x11, 0xc5, 0x5b, 0x2f}} ,
|
|
||||||
{{0x17, 0x0f, 0x86, 0x52, 0xd7, 0x9d, 0xc3, 0x44, 0x51, 0x76, 0x32, 0x65, 0xb4, 0x37, 0x81, 0x99, 0x46, 0x37, 0x62, 0xed, 0xcf, 0x64, 0x9d, 0x72, 0x40, 0x7a, 0x4c, 0x0b, 0x76, 0x2a, 0xfb, 0x56}}},
|
|
||||||
{{{0x33, 0xa7, 0x90, 0x7c, 0xc3, 0x6f, 0x17, 0xa5, 0xa0, 0x67, 0x72, 0x17, 0xea, 0x7e, 0x63, 0x14, 0x83, 0xde, 0xc1, 0x71, 0x2d, 0x41, 0x32, 0x7a, 0xf3, 0xd1, 0x2b, 0xd8, 0x2a, 0xa6, 0x46, 0x36}} ,
|
|
||||||
{{0xac, 0xcc, 0x6b, 0x7c, 0xf9, 0xb8, 0x8b, 0x08, 0x5c, 0xd0, 0x7d, 0x8f, 0x73, 0xea, 0x20, 0xda, 0x86, 0xca, 0x00, 0xc7, 0xad, 0x73, 0x4d, 0xe9, 0xe8, 0xa9, 0xda, 0x1f, 0x03, 0x06, 0xdd, 0x24}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x9c, 0xb2, 0x61, 0x0a, 0x98, 0x2a, 0xa5, 0xd7, 0xee, 0xa9, 0xac, 0x65, 0xcb, 0x0a, 0x1e, 0xe2, 0xbe, 0xdc, 0x85, 0x59, 0x0f, 0x9c, 0xa6, 0x57, 0x34, 0xa5, 0x87, 0xeb, 0x7b, 0x1e, 0x0c, 0x3c}} ,
|
|
||||||
{{0x2f, 0xbd, 0x84, 0x63, 0x0d, 0xb5, 0xa0, 0xf0, 0x4b, 0x9e, 0x93, 0xc6, 0x34, 0x9a, 0x34, 0xff, 0x73, 0x19, 0x2f, 0x6e, 0x54, 0x45, 0x2c, 0x92, 0x31, 0x76, 0x34, 0xf1, 0xb2, 0x26, 0xe8, 0x74}}},
|
|
||||||
{{{0x0a, 0x67, 0x90, 0x6d, 0x0c, 0x4c, 0xcc, 0xc0, 0xe6, 0xbd, 0xa7, 0x5e, 0x55, 0x8c, 0xcd, 0x58, 0x9b, 0x11, 0xa2, 0xbb, 0x4b, 0xb1, 0x43, 0x04, 0x3c, 0x55, 0xed, 0x23, 0xfe, 0xcd, 0xb1, 0x53}} ,
|
|
||||||
{{0x05, 0xfb, 0x75, 0xf5, 0x01, 0xaf, 0x38, 0x72, 0x58, 0xfc, 0x04, 0x29, 0x34, 0x7a, 0x67, 0xa2, 0x08, 0x50, 0x6e, 0xd0, 0x2b, 0x73, 0xd5, 0xb8, 0xe4, 0x30, 0x96, 0xad, 0x45, 0xdf, 0xa6, 0x5c}}},
|
|
||||||
{{{0x0d, 0x88, 0x1a, 0x90, 0x7e, 0xdc, 0xd8, 0xfe, 0xc1, 0x2f, 0x5d, 0x67, 0xee, 0x67, 0x2f, 0xed, 0x6f, 0x55, 0x43, 0x5f, 0x87, 0x14, 0x35, 0x42, 0xd3, 0x75, 0xae, 0xd5, 0xd3, 0x85, 0x1a, 0x76}} ,
|
|
||||||
{{0x87, 0xc8, 0xa0, 0x6e, 0xe1, 0xb0, 0xad, 0x6a, 0x4a, 0x34, 0x71, 0xed, 0x7c, 0xd6, 0x44, 0x03, 0x65, 0x4a, 0x5c, 0x5c, 0x04, 0xf5, 0x24, 0x3f, 0xb0, 0x16, 0x5e, 0x8c, 0xb2, 0xd2, 0xc5, 0x20}}},
|
|
||||||
{{{0x98, 0x83, 0xc2, 0x37, 0xa0, 0x41, 0xa8, 0x48, 0x5c, 0x5f, 0xbf, 0xc8, 0xfa, 0x24, 0xe0, 0x59, 0x2c, 0xbd, 0xf6, 0x81, 0x7e, 0x88, 0xe6, 0xca, 0x04, 0xd8, 0x5d, 0x60, 0xbb, 0x74, 0xa7, 0x0b}} ,
|
|
||||||
{{0x21, 0x13, 0x91, 0xbf, 0x77, 0x7a, 0x33, 0xbc, 0xe9, 0x07, 0x39, 0x0a, 0xdd, 0x7d, 0x06, 0x10, 0x9a, 0xee, 0x47, 0x73, 0x1b, 0x15, 0x5a, 0xfb, 0xcd, 0x4d, 0xd0, 0xd2, 0x3a, 0x01, 0xba, 0x54}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x48, 0xd5, 0x39, 0x4a, 0x0b, 0x20, 0x6a, 0x43, 0xa0, 0x07, 0x82, 0x5e, 0x49, 0x7c, 0xc9, 0x47, 0xf1, 0x7c, 0x37, 0xb9, 0x23, 0xef, 0x6b, 0x46, 0x45, 0x8c, 0x45, 0x76, 0xdf, 0x14, 0x6b, 0x6e}} ,
|
|
||||||
{{0x42, 0xc9, 0xca, 0x29, 0x4c, 0x76, 0x37, 0xda, 0x8a, 0x2d, 0x7c, 0x3a, 0x58, 0xf2, 0x03, 0xb4, 0xb5, 0xb9, 0x1a, 0x13, 0x2d, 0xde, 0x5f, 0x6b, 0x9d, 0xba, 0x52, 0xc9, 0x5d, 0xb3, 0xf3, 0x30}}},
|
|
||||||
{{{0x4c, 0x6f, 0xfe, 0x6b, 0x0c, 0x62, 0xd7, 0x48, 0x71, 0xef, 0xb1, 0x85, 0x79, 0xc0, 0xed, 0x24, 0xb1, 0x08, 0x93, 0x76, 0x8e, 0xf7, 0x38, 0x8e, 0xeb, 0xfe, 0x80, 0x40, 0xaf, 0x90, 0x64, 0x49}} ,
|
|
||||||
{{0x4a, 0x88, 0xda, 0xc1, 0x98, 0x44, 0x3c, 0x53, 0x4e, 0xdb, 0x4b, 0xb9, 0x12, 0x5f, 0xcd, 0x08, 0x04, 0xef, 0x75, 0xe7, 0xb1, 0x3a, 0xe5, 0x07, 0xfa, 0xca, 0x65, 0x7b, 0x72, 0x10, 0x64, 0x7f}}},
|
|
||||||
{{{0x3d, 0x81, 0xf0, 0xeb, 0x16, 0xfd, 0x58, 0x33, 0x8d, 0x7c, 0x1a, 0xfb, 0x20, 0x2c, 0x8a, 0xee, 0x90, 0xbb, 0x33, 0x6d, 0x45, 0xe9, 0x8e, 0x99, 0x85, 0xe1, 0x08, 0x1f, 0xc5, 0xf1, 0xb5, 0x46}} ,
|
|
||||||
{{0xe4, 0xe7, 0x43, 0x4b, 0xa0, 0x3f, 0x2b, 0x06, 0xba, 0x17, 0xae, 0x3d, 0xe6, 0xce, 0xbd, 0xb8, 0xed, 0x74, 0x11, 0x35, 0xec, 0x96, 0xfe, 0x31, 0xe3, 0x0e, 0x7a, 0x4e, 0xc9, 0x1d, 0xcb, 0x20}}},
|
|
||||||
{{{0xe0, 0x67, 0xe9, 0x7b, 0xdb, 0x96, 0x5c, 0xb0, 0x32, 0xd0, 0x59, 0x31, 0x90, 0xdc, 0x92, 0x97, 0xac, 0x09, 0x38, 0x31, 0x0f, 0x7e, 0xd6, 0x5d, 0xd0, 0x06, 0xb6, 0x1f, 0xea, 0xf0, 0x5b, 0x07}} ,
|
|
||||||
{{0x81, 0x9f, 0xc7, 0xde, 0x6b, 0x41, 0x22, 0x35, 0x14, 0x67, 0x77, 0x3e, 0x90, 0x81, 0xb0, 0xd9, 0x85, 0x4c, 0xca, 0x9b, 0x3f, 0x04, 0x59, 0xd6, 0xaa, 0x17, 0xc3, 0x88, 0x34, 0x37, 0xba, 0x43}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x4c, 0xb6, 0x69, 0xc8, 0x81, 0x95, 0x94, 0x33, 0x92, 0x34, 0xe9, 0x3c, 0x84, 0x0d, 0x3d, 0x5a, 0x37, 0x9c, 0x22, 0xa0, 0xaa, 0x65, 0xce, 0xb4, 0xc2, 0x2d, 0x66, 0x67, 0x02, 0xff, 0x74, 0x10}} ,
|
|
||||||
{{0x22, 0xb0, 0xd5, 0xe6, 0xc7, 0xef, 0xb1, 0xa7, 0x13, 0xda, 0x60, 0xb4, 0x80, 0xc1, 0x42, 0x7d, 0x10, 0x70, 0x97, 0x04, 0x4d, 0xda, 0x23, 0x89, 0xc2, 0x0e, 0x68, 0xcb, 0xde, 0xe0, 0x9b, 0x29}}},
|
|
||||||
{{{0x33, 0xfe, 0x42, 0x2a, 0x36, 0x2b, 0x2e, 0x36, 0x64, 0x5c, 0x8b, 0xcc, 0x81, 0x6a, 0x15, 0x08, 0xa1, 0x27, 0xe8, 0x57, 0xe5, 0x78, 0x8e, 0xf2, 0x58, 0x19, 0x12, 0x42, 0xae, 0xc4, 0x63, 0x3e}} ,
|
|
||||||
{{0x78, 0x96, 0x9c, 0xa7, 0xca, 0x80, 0xae, 0x02, 0x85, 0xb1, 0x7c, 0x04, 0x5c, 0xc1, 0x5b, 0x26, 0xc1, 0xba, 0xed, 0xa5, 0x59, 0x70, 0x85, 0x8c, 0x8c, 0xe8, 0x87, 0xac, 0x6a, 0x28, 0x99, 0x35}}},
|
|
||||||
{{{0x9f, 0x04, 0x08, 0x28, 0xbe, 0x87, 0xda, 0x80, 0x28, 0x38, 0xde, 0x9f, 0xcd, 0xe4, 0xe3, 0x62, 0xfb, 0x2e, 0x46, 0x8d, 0x01, 0xb3, 0x06, 0x51, 0xd4, 0x19, 0x3b, 0x11, 0xfa, 0xe2, 0xad, 0x1e}} ,
|
|
||||||
{{0xa0, 0x20, 0x99, 0x69, 0x0a, 0xae, 0xa3, 0x70, 0x4e, 0x64, 0x80, 0xb7, 0x85, 0x9c, 0x87, 0x54, 0x43, 0x43, 0x55, 0x80, 0x6d, 0x8d, 0x7c, 0xa9, 0x64, 0xca, 0x6c, 0x2e, 0x21, 0xd8, 0xc8, 0x6c}}},
|
|
||||||
{{{0x91, 0x4a, 0x07, 0xad, 0x08, 0x75, 0xc1, 0x4f, 0xa4, 0xb2, 0xc3, 0x6f, 0x46, 0x3e, 0xb1, 0xce, 0x52, 0xab, 0x67, 0x09, 0x54, 0x48, 0x6b, 0x6c, 0xd7, 0x1d, 0x71, 0x76, 0xcb, 0xff, 0xdd, 0x31}} ,
|
|
||||||
{{0x36, 0x88, 0xfa, 0xfd, 0xf0, 0x36, 0x6f, 0x07, 0x74, 0x88, 0x50, 0xd0, 0x95, 0x38, 0x4a, 0x48, 0x2e, 0x07, 0x64, 0x97, 0x11, 0x76, 0x01, 0x1a, 0x27, 0x4d, 0x8e, 0x25, 0x9a, 0x9b, 0x1c, 0x22}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0xbe, 0x57, 0xbd, 0x0e, 0x0f, 0xac, 0x5e, 0x76, 0xa3, 0x71, 0xad, 0x2b, 0x10, 0x45, 0x02, 0xec, 0x59, 0xd5, 0x5d, 0xa9, 0x44, 0xcc, 0x25, 0x4c, 0xb3, 0x3c, 0x5b, 0x69, 0x07, 0x55, 0x26, 0x6b}} ,
|
|
||||||
{{0x30, 0x6b, 0xd4, 0xa7, 0x51, 0x29, 0xe3, 0xf9, 0x7a, 0x75, 0x2a, 0x82, 0x2f, 0xd6, 0x1d, 0x99, 0x2b, 0x80, 0xd5, 0x67, 0x1e, 0x15, 0x9d, 0xca, 0xfd, 0xeb, 0xac, 0x97, 0x35, 0x09, 0x7f, 0x3f}}},
|
|
||||||
{{{0x35, 0x0d, 0x34, 0x0a, 0xb8, 0x67, 0x56, 0x29, 0x20, 0xf3, 0x19, 0x5f, 0xe2, 0x83, 0x42, 0x73, 0x53, 0xa8, 0xc5, 0x02, 0x19, 0x33, 0xb4, 0x64, 0xbd, 0xc3, 0x87, 0x8c, 0xd7, 0x76, 0xed, 0x25}} ,
|
|
||||||
{{0x47, 0x39, 0x37, 0x76, 0x0d, 0x1d, 0x0c, 0xf5, 0x5a, 0x6d, 0x43, 0x88, 0x99, 0x15, 0xb4, 0x52, 0x0f, 0x2a, 0xb3, 0xb0, 0x3f, 0xa6, 0xb3, 0x26, 0xb3, 0xc7, 0x45, 0xf5, 0x92, 0x5f, 0x9b, 0x17}}},
|
|
||||||
{{{0x9d, 0x23, 0xbd, 0x15, 0xfe, 0x52, 0x52, 0x15, 0x26, 0x79, 0x86, 0xba, 0x06, 0x56, 0x66, 0xbb, 0x8c, 0x2e, 0x10, 0x11, 0xd5, 0x4a, 0x18, 0x52, 0xda, 0x84, 0x44, 0xf0, 0x3e, 0xe9, 0x8c, 0x35}} ,
|
|
||||||
{{0xad, 0xa0, 0x41, 0xec, 0xc8, 0x4d, 0xb9, 0xd2, 0x6e, 0x96, 0x4e, 0x5b, 0xc5, 0xc2, 0xa0, 0x1b, 0xcf, 0x0c, 0xbf, 0x17, 0x66, 0x57, 0xc1, 0x17, 0x90, 0x45, 0x71, 0xc2, 0xe1, 0x24, 0xeb, 0x27}}},
|
|
||||||
{{{0x2c, 0xb9, 0x42, 0xa4, 0xaf, 0x3b, 0x42, 0x0e, 0xc2, 0x0f, 0xf2, 0xea, 0x83, 0xaf, 0x9a, 0x13, 0x17, 0xb0, 0xbd, 0x89, 0x17, 0xe3, 0x72, 0xcb, 0x0e, 0x76, 0x7e, 0x41, 0x63, 0x04, 0x88, 0x71}} ,
|
|
||||||
{{0x75, 0x78, 0x38, 0x86, 0x57, 0xdd, 0x9f, 0xee, 0x54, 0x70, 0x65, 0xbf, 0xf1, 0x2c, 0xe0, 0x39, 0x0d, 0xe3, 0x89, 0xfd, 0x8e, 0x93, 0x4f, 0x43, 0xdc, 0xd5, 0x5b, 0xde, 0xf9, 0x98, 0xe5, 0x7b}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0xe7, 0x3b, 0x65, 0x11, 0xdf, 0xb2, 0xf2, 0x63, 0x94, 0x12, 0x6f, 0x5c, 0x9e, 0x77, 0xc1, 0xb6, 0xd8, 0xab, 0x58, 0x7a, 0x1d, 0x95, 0x73, 0xdd, 0xe7, 0xe3, 0x6f, 0xf2, 0x03, 0x1d, 0xdb, 0x76}} ,
|
|
||||||
{{0xae, 0x06, 0x4e, 0x2c, 0x52, 0x1b, 0xbc, 0x5a, 0x5a, 0xa5, 0xbe, 0x27, 0xbd, 0xeb, 0xe1, 0x14, 0x17, 0x68, 0x26, 0x07, 0x03, 0xd1, 0x18, 0x0b, 0xdf, 0xf1, 0x06, 0x5c, 0xa6, 0x1b, 0xb9, 0x24}}},
|
|
||||||
{{{0xc5, 0x66, 0x80, 0x13, 0x0e, 0x48, 0x8c, 0x87, 0x31, 0x84, 0xb4, 0x60, 0xed, 0xc5, 0xec, 0xb6, 0xc5, 0x05, 0x33, 0x5f, 0x2f, 0x7d, 0x40, 0xb6, 0x32, 0x1d, 0x38, 0x74, 0x1b, 0xf1, 0x09, 0x3d}} ,
|
|
||||||
{{0xd4, 0x69, 0x82, 0xbc, 0x8d, 0xf8, 0x34, 0x36, 0x75, 0x55, 0x18, 0x55, 0x58, 0x3c, 0x79, 0xaf, 0x26, 0x80, 0xab, 0x9b, 0x95, 0x00, 0xf1, 0xcb, 0xda, 0xc1, 0x9f, 0xf6, 0x2f, 0xa2, 0xf4, 0x45}}},
|
|
||||||
{{{0x17, 0xbe, 0xeb, 0x85, 0xed, 0x9e, 0xcd, 0x56, 0xf5, 0x17, 0x45, 0x42, 0xb4, 0x1f, 0x44, 0x4c, 0x05, 0x74, 0x15, 0x47, 0x00, 0xc6, 0x6a, 0x3d, 0x24, 0x09, 0x0d, 0x58, 0xb1, 0x42, 0xd7, 0x04}} ,
|
|
||||||
{{0x8d, 0xbd, 0xa3, 0xc4, 0x06, 0x9b, 0x1f, 0x90, 0x58, 0x60, 0x74, 0xb2, 0x00, 0x3b, 0x3c, 0xd2, 0xda, 0x82, 0xbb, 0x10, 0x90, 0x69, 0x92, 0xa9, 0xb4, 0x30, 0x81, 0xe3, 0x7c, 0xa8, 0x89, 0x45}}},
|
|
||||||
{{{0x3f, 0xdc, 0x05, 0xcb, 0x41, 0x3c, 0xc8, 0x23, 0x04, 0x2c, 0x38, 0x99, 0xe3, 0x68, 0x55, 0xf9, 0xd3, 0x32, 0xc7, 0xbf, 0xfa, 0xd4, 0x1b, 0x5d, 0xde, 0xdc, 0x10, 0x42, 0xc0, 0x42, 0xd9, 0x75}} ,
|
|
||||||
{{0x2d, 0xab, 0x35, 0x4e, 0x87, 0xc4, 0x65, 0x97, 0x67, 0x24, 0xa4, 0x47, 0xad, 0x3f, 0x8e, 0xf3, 0xcb, 0x31, 0x17, 0x77, 0xc5, 0xe2, 0xd7, 0x8f, 0x3c, 0xc1, 0xcd, 0x56, 0x48, 0xc1, 0x6c, 0x69}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x14, 0xae, 0x5f, 0x88, 0x7b, 0xa5, 0x90, 0xdf, 0x10, 0xb2, 0x8b, 0x5e, 0x24, 0x17, 0xc3, 0xa3, 0xd4, 0x0f, 0x92, 0x61, 0x1a, 0x19, 0x5a, 0xad, 0x76, 0xbd, 0xd8, 0x1c, 0xdd, 0xe0, 0x12, 0x6d}} ,
|
|
||||||
{{0x8e, 0xbd, 0x70, 0x8f, 0x02, 0xa3, 0x24, 0x4d, 0x5a, 0x67, 0xc4, 0xda, 0xf7, 0x20, 0x0f, 0x81, 0x5b, 0x7a, 0x05, 0x24, 0x67, 0x83, 0x0b, 0x2a, 0x80, 0xe7, 0xfd, 0x74, 0x4b, 0x9e, 0x5c, 0x0d}}},
|
|
||||||
{{{0x94, 0xd5, 0x5f, 0x1f, 0xa2, 0xfb, 0xeb, 0xe1, 0x07, 0x34, 0xf8, 0x20, 0xad, 0x81, 0x30, 0x06, 0x2d, 0xa1, 0x81, 0x95, 0x36, 0xcf, 0x11, 0x0b, 0xaf, 0xc1, 0x2b, 0x9a, 0x6c, 0x55, 0xc1, 0x16}} ,
|
|
||||||
{{0x36, 0x4f, 0xf1, 0x5e, 0x74, 0x35, 0x13, 0x28, 0xd7, 0x11, 0xcf, 0xb8, 0xde, 0x93, 0xb3, 0x05, 0xb8, 0xb5, 0x73, 0xe9, 0xeb, 0xad, 0x19, 0x1e, 0x89, 0x0f, 0x8b, 0x15, 0xd5, 0x8c, 0xe3, 0x23}}},
|
|
||||||
{{{0x33, 0x79, 0xe7, 0x18, 0xe6, 0x0f, 0x57, 0x93, 0x15, 0xa0, 0xa7, 0xaa, 0xc4, 0xbf, 0x4f, 0x30, 0x74, 0x95, 0x5e, 0x69, 0x4a, 0x5b, 0x45, 0xe4, 0x00, 0xeb, 0x23, 0x74, 0x4c, 0xdf, 0x6b, 0x45}} ,
|
|
||||||
{{0x97, 0x29, 0x6c, 0xc4, 0x42, 0x0b, 0xdd, 0xc0, 0x29, 0x5c, 0x9b, 0x34, 0x97, 0xd0, 0xc7, 0x79, 0x80, 0x63, 0x74, 0xe4, 0x8e, 0x37, 0xb0, 0x2b, 0x7c, 0xe8, 0x68, 0x6c, 0xc3, 0x82, 0x97, 0x57}}},
|
|
||||||
{{{0x22, 0xbe, 0x83, 0xb6, 0x4b, 0x80, 0x6b, 0x43, 0x24, 0x5e, 0xef, 0x99, 0x9b, 0xa8, 0xfc, 0x25, 0x8d, 0x3b, 0x03, 0x94, 0x2b, 0x3e, 0xe7, 0x95, 0x76, 0x9b, 0xcc, 0x15, 0xdb, 0x32, 0xe6, 0x66}} ,
|
|
||||||
{{0x84, 0xf0, 0x4a, 0x13, 0xa6, 0xd6, 0xfa, 0x93, 0x46, 0x07, 0xf6, 0x7e, 0x5c, 0x6d, 0x5e, 0xf6, 0xa6, 0xe7, 0x48, 0xf0, 0x06, 0xea, 0xff, 0x90, 0xc1, 0xcc, 0x4c, 0x19, 0x9c, 0x3c, 0x4e, 0x53}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x2a, 0x50, 0xe3, 0x07, 0x15, 0x59, 0xf2, 0x8b, 0x81, 0xf2, 0xf3, 0xd3, 0x6c, 0x99, 0x8c, 0x70, 0x67, 0xec, 0xcc, 0xee, 0x9e, 0x59, 0x45, 0x59, 0x7d, 0x47, 0x75, 0x69, 0xf5, 0x24, 0x93, 0x5d}} ,
|
|
||||||
{{0x6a, 0x4f, 0x1b, 0xbe, 0x6b, 0x30, 0xcf, 0x75, 0x46, 0xe3, 0x7b, 0x9d, 0xfc, 0xcd, 0xd8, 0x5c, 0x1f, 0xb4, 0xc8, 0xe2, 0x24, 0xec, 0x1a, 0x28, 0x05, 0x32, 0x57, 0xfd, 0x3c, 0x5a, 0x98, 0x10}}},
|
|
||||||
{{{0xa3, 0xdb, 0xf7, 0x30, 0xd8, 0xc2, 0x9a, 0xe1, 0xd3, 0xce, 0x22, 0xe5, 0x80, 0x1e, 0xd9, 0xe4, 0x1f, 0xab, 0xc0, 0x71, 0x1a, 0x86, 0x0e, 0x27, 0x99, 0x5b, 0xfa, 0x76, 0x99, 0xb0, 0x08, 0x3c}} ,
|
|
||||||
{{0x2a, 0x93, 0xd2, 0x85, 0x1b, 0x6a, 0x5d, 0xa6, 0xee, 0xd1, 0xd1, 0x33, 0xbd, 0x6a, 0x36, 0x73, 0x37, 0x3a, 0x44, 0xb4, 0xec, 0xa9, 0x7a, 0xde, 0x83, 0x40, 0xd7, 0xdf, 0x28, 0xba, 0xa2, 0x30}}},
|
|
||||||
{{{0xd3, 0xb5, 0x6d, 0x05, 0x3f, 0x9f, 0xf3, 0x15, 0x8d, 0x7c, 0xca, 0xc9, 0xfc, 0x8a, 0x7c, 0x94, 0xb0, 0x63, 0x36, 0x9b, 0x78, 0xd1, 0x91, 0x1f, 0x93, 0xd8, 0x57, 0x43, 0xde, 0x76, 0xa3, 0x43}} ,
|
|
||||||
{{0x9b, 0x35, 0xe2, 0xa9, 0x3d, 0x32, 0x1e, 0xbb, 0x16, 0x28, 0x70, 0xe9, 0x45, 0x2f, 0x8f, 0x70, 0x7f, 0x08, 0x7e, 0x53, 0xc4, 0x7a, 0xbf, 0xf7, 0xe1, 0xa4, 0x6a, 0xd8, 0xac, 0x64, 0x1b, 0x11}}},
|
|
||||||
{{{0xb2, 0xeb, 0x47, 0x46, 0x18, 0x3e, 0x1f, 0x99, 0x0c, 0xcc, 0xf1, 0x2c, 0xe0, 0xe7, 0x8f, 0xe0, 0x01, 0x7e, 0x65, 0xb8, 0x0c, 0xd0, 0xfb, 0xc8, 0xb9, 0x90, 0x98, 0x33, 0x61, 0x3b, 0xd8, 0x27}} ,
|
|
||||||
{{0xa0, 0xbe, 0x72, 0x3a, 0x50, 0x4b, 0x74, 0xab, 0x01, 0xc8, 0x93, 0xc5, 0xe4, 0xc7, 0x08, 0x6c, 0xb4, 0xca, 0xee, 0xeb, 0x8e, 0xd7, 0x4e, 0x26, 0xc6, 0x1d, 0xe2, 0x71, 0xaf, 0x89, 0xa0, 0x2a}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x98, 0x0b, 0xe4, 0xde, 0xdb, 0xa8, 0xfa, 0x82, 0x74, 0x06, 0x52, 0x6d, 0x08, 0x52, 0x8a, 0xff, 0x62, 0xc5, 0x6a, 0x44, 0x0f, 0x51, 0x8c, 0x1f, 0x6e, 0xb6, 0xc6, 0x2c, 0x81, 0xd3, 0x76, 0x46}} ,
|
|
||||||
{{0xf4, 0x29, 0x74, 0x2e, 0x80, 0xa7, 0x1a, 0x8f, 0xf6, 0xbd, 0xd6, 0x8e, 0xbf, 0xc1, 0x95, 0x2a, 0xeb, 0xa0, 0x7f, 0x45, 0xa0, 0x50, 0x14, 0x05, 0xb1, 0x57, 0x4c, 0x74, 0xb7, 0xe2, 0x89, 0x7d}}},
|
|
||||||
{{{0x07, 0xee, 0xa7, 0xad, 0xb7, 0x09, 0x0b, 0x49, 0x4e, 0xbf, 0xca, 0xe5, 0x21, 0xe6, 0xe6, 0xaf, 0xd5, 0x67, 0xf3, 0xce, 0x7e, 0x7c, 0x93, 0x7b, 0x5a, 0x10, 0x12, 0x0e, 0x6c, 0x06, 0x11, 0x75}} ,
|
|
||||||
{{0xd5, 0xfc, 0x86, 0xa3, 0x3b, 0xa3, 0x3e, 0x0a, 0xfb, 0x0b, 0xf7, 0x36, 0xb1, 0x5b, 0xda, 0x70, 0xb7, 0x00, 0xa7, 0xda, 0x88, 0x8f, 0x84, 0xa8, 0xbc, 0x1c, 0x39, 0xb8, 0x65, 0xf3, 0x4d, 0x60}}},
|
|
||||||
{{{0x96, 0x9d, 0x31, 0xf4, 0xa2, 0xbe, 0x81, 0xb9, 0xa5, 0x59, 0x9e, 0xba, 0x07, 0xbe, 0x74, 0x58, 0xd8, 0xeb, 0xc5, 0x9f, 0x3d, 0xd1, 0xf4, 0xae, 0xce, 0x53, 0xdf, 0x4f, 0xc7, 0x2a, 0x89, 0x4d}} ,
|
|
||||||
{{0x29, 0xd8, 0xf2, 0xaa, 0xe9, 0x0e, 0xf7, 0x2e, 0x5f, 0x9d, 0x8a, 0x5b, 0x09, 0xed, 0xc9, 0x24, 0x22, 0xf4, 0x0f, 0x25, 0x8f, 0x1c, 0x84, 0x6e, 0x34, 0x14, 0x6c, 0xea, 0xb3, 0x86, 0x5d, 0x04}}},
|
|
||||||
{{{0x07, 0x98, 0x61, 0xe8, 0x6a, 0xd2, 0x81, 0x49, 0x25, 0xd5, 0x5b, 0x18, 0xc7, 0x35, 0x52, 0x51, 0xa4, 0x46, 0xad, 0x18, 0x0d, 0xc9, 0x5f, 0x18, 0x91, 0x3b, 0xb4, 0xc0, 0x60, 0x59, 0x8d, 0x66}} ,
|
|
||||||
{{0x03, 0x1b, 0x79, 0x53, 0x6e, 0x24, 0xae, 0x57, 0xd9, 0x58, 0x09, 0x85, 0x48, 0xa2, 0xd3, 0xb5, 0xe2, 0x4d, 0x11, 0x82, 0xe6, 0x86, 0x3c, 0xe9, 0xb1, 0x00, 0x19, 0xc2, 0x57, 0xf7, 0x66, 0x7a}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x0f, 0xe3, 0x89, 0x03, 0xd7, 0x22, 0x95, 0x9f, 0xca, 0xb4, 0x8d, 0x9e, 0x6d, 0x97, 0xff, 0x8d, 0x21, 0x59, 0x07, 0xef, 0x03, 0x2d, 0x5e, 0xf8, 0x44, 0x46, 0xe7, 0x85, 0x80, 0xc5, 0x89, 0x50}} ,
|
|
||||||
{{0x8b, 0xd8, 0x53, 0x86, 0x24, 0x86, 0x29, 0x52, 0x01, 0xfa, 0x20, 0xc3, 0x4e, 0x95, 0xcb, 0xad, 0x7b, 0x34, 0x94, 0x30, 0xb7, 0x7a, 0xfa, 0x96, 0x41, 0x60, 0x2b, 0xcb, 0x59, 0xb9, 0xca, 0x50}}},
|
|
||||||
{{{0xc2, 0x5b, 0x9b, 0x78, 0x23, 0x1b, 0x3a, 0x88, 0x94, 0x5f, 0x0a, 0x9b, 0x98, 0x2b, 0x6e, 0x53, 0x11, 0xf6, 0xff, 0xc6, 0x7d, 0x42, 0xcc, 0x02, 0x80, 0x40, 0x0d, 0x1e, 0xfb, 0xaf, 0x61, 0x07}} ,
|
|
||||||
{{0xb0, 0xe6, 0x2f, 0x81, 0x70, 0xa1, 0x2e, 0x39, 0x04, 0x7c, 0xc4, 0x2c, 0x87, 0x45, 0x4a, 0x5b, 0x69, 0x97, 0xac, 0x6d, 0x2c, 0x10, 0x42, 0x7c, 0x3b, 0x15, 0x70, 0x60, 0x0e, 0x11, 0x6d, 0x3a}}},
|
|
||||||
{{{0x9b, 0x18, 0x80, 0x5e, 0xdb, 0x05, 0xbd, 0xc6, 0xb7, 0x3c, 0xc2, 0x40, 0x4d, 0x5d, 0xce, 0x97, 0x8a, 0x34, 0x15, 0xab, 0x28, 0x5d, 0x10, 0xf0, 0x37, 0x0c, 0xcc, 0x16, 0xfa, 0x1f, 0x33, 0x0d}} ,
|
|
||||||
{{0x19, 0xf9, 0x35, 0xaa, 0x59, 0x1a, 0x0c, 0x5c, 0x06, 0xfc, 0x6a, 0x0b, 0x97, 0x53, 0x36, 0xfc, 0x2a, 0xa5, 0x5a, 0x9b, 0x30, 0xef, 0x23, 0xaf, 0x39, 0x5d, 0x9a, 0x6b, 0x75, 0x57, 0x48, 0x0b}}},
|
|
||||||
{{{0x26, 0xdc, 0x76, 0x3b, 0xfc, 0xf9, 0x9c, 0x3f, 0x89, 0x0b, 0x62, 0x53, 0xaf, 0x83, 0x01, 0x2e, 0xbc, 0x6a, 0xc6, 0x03, 0x0d, 0x75, 0x2a, 0x0d, 0xe6, 0x94, 0x54, 0xcf, 0xb3, 0xe5, 0x96, 0x25}} ,
|
|
||||||
{{0xfe, 0x82, 0xb1, 0x74, 0x31, 0x8a, 0xa7, 0x6f, 0x56, 0xbd, 0x8d, 0xf4, 0xe0, 0x94, 0x51, 0x59, 0xde, 0x2c, 0x5a, 0xf4, 0x84, 0x6b, 0x4a, 0x88, 0x93, 0xc0, 0x0c, 0x9a, 0xac, 0xa7, 0xa0, 0x68}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x25, 0x0d, 0xd6, 0xc7, 0x23, 0x47, 0x10, 0xad, 0xc7, 0x08, 0x5c, 0x87, 0x87, 0x93, 0x98, 0x18, 0xb8, 0xd3, 0x9c, 0xac, 0x5a, 0x3d, 0xc5, 0x75, 0xf8, 0x49, 0x32, 0x14, 0xcc, 0x51, 0x96, 0x24}} ,
|
|
||||||
{{0x65, 0x9c, 0x5d, 0xf0, 0x37, 0x04, 0xf0, 0x34, 0x69, 0x2a, 0xf0, 0xa5, 0x64, 0xca, 0xde, 0x2b, 0x5b, 0x15, 0x10, 0xd2, 0xab, 0x06, 0xdd, 0xc4, 0xb0, 0xb6, 0x5b, 0xc1, 0x17, 0xdf, 0x8f, 0x02}}},
|
|
||||||
{{{0xbd, 0x59, 0x3d, 0xbf, 0x5c, 0x31, 0x44, 0x2c, 0x32, 0x94, 0x04, 0x60, 0x84, 0x0f, 0xad, 0x00, 0xb6, 0x8f, 0xc9, 0x1d, 0xcc, 0x5c, 0xa2, 0x49, 0x0e, 0x50, 0x91, 0x08, 0x9a, 0x43, 0x55, 0x05}} ,
|
|
||||||
{{0x5d, 0x93, 0x55, 0xdf, 0x9b, 0x12, 0x19, 0xec, 0x93, 0x85, 0x42, 0x9e, 0x66, 0x0f, 0x9d, 0xaf, 0x99, 0xaf, 0x26, 0x89, 0xbc, 0x61, 0xfd, 0xff, 0xce, 0x4b, 0xf4, 0x33, 0x95, 0xc9, 0x35, 0x58}}},
|
|
||||||
{{{0x12, 0x55, 0xf9, 0xda, 0xcb, 0x44, 0xa7, 0xdc, 0x57, 0xe2, 0xf9, 0x9a, 0xe6, 0x07, 0x23, 0x60, 0x54, 0xa7, 0x39, 0xa5, 0x9b, 0x84, 0x56, 0x6e, 0xaa, 0x8b, 0x8f, 0xb0, 0x2c, 0x87, 0xaf, 0x67}} ,
|
|
||||||
{{0x00, 0xa9, 0x4c, 0xb2, 0x12, 0xf8, 0x32, 0xa8, 0x7a, 0x00, 0x4b, 0x49, 0x32, 0xba, 0x1f, 0x5d, 0x44, 0x8e, 0x44, 0x7a, 0xdc, 0x11, 0xfb, 0x39, 0x08, 0x57, 0x87, 0xa5, 0x12, 0x42, 0x93, 0x0e}}},
|
|
||||||
{{{0x17, 0xb4, 0xae, 0x72, 0x59, 0xd0, 0xaa, 0xa8, 0x16, 0x8b, 0x63, 0x11, 0xb3, 0x43, 0x04, 0xda, 0x0c, 0xa8, 0xb7, 0x68, 0xdd, 0x4e, 0x54, 0xe7, 0xaf, 0x5d, 0x5d, 0x05, 0x76, 0x36, 0xec, 0x0d}} ,
|
|
||||||
{{0x6d, 0x7c, 0x82, 0x32, 0x38, 0x55, 0x57, 0x74, 0x5b, 0x7d, 0xc3, 0xc4, 0xfb, 0x06, 0x29, 0xf0, 0x13, 0x55, 0x54, 0xc6, 0xa7, 0xdc, 0x4c, 0x9f, 0x98, 0x49, 0x20, 0xa8, 0xc3, 0x8d, 0xfa, 0x48}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x87, 0x47, 0x9d, 0xe9, 0x25, 0xd5, 0xe3, 0x47, 0x78, 0xdf, 0x85, 0xa7, 0x85, 0x5e, 0x7a, 0x4c, 0x5f, 0x79, 0x1a, 0xf3, 0xa2, 0xb2, 0x28, 0xa0, 0x9c, 0xdd, 0x30, 0x40, 0xd4, 0x38, 0xbd, 0x28}} ,
|
|
||||||
{{0xfc, 0xbb, 0xd5, 0x78, 0x6d, 0x1d, 0xd4, 0x99, 0xb4, 0xaa, 0x44, 0x44, 0x7a, 0x1b, 0xd8, 0xfe, 0xb4, 0x99, 0xb9, 0xcc, 0xe7, 0xc4, 0xd3, 0x3a, 0x73, 0x83, 0x41, 0x5c, 0x40, 0xd7, 0x2d, 0x55}}},
|
|
||||||
{{{0x26, 0xe1, 0x7b, 0x5f, 0xe5, 0xdc, 0x3f, 0x7d, 0xa1, 0xa7, 0x26, 0x44, 0x22, 0x23, 0xc0, 0x8f, 0x7d, 0xf1, 0xb5, 0x11, 0x47, 0x7b, 0x19, 0xd4, 0x75, 0x6f, 0x1e, 0xa5, 0x27, 0xfe, 0xc8, 0x0e}} ,
|
|
||||||
{{0xd3, 0x11, 0x3d, 0xab, 0xef, 0x2c, 0xed, 0xb1, 0x3d, 0x7c, 0x32, 0x81, 0x6b, 0xfe, 0xf8, 0x1c, 0x3c, 0x7b, 0xc0, 0x61, 0xdf, 0xb8, 0x75, 0x76, 0x7f, 0xaa, 0xd8, 0x93, 0xaf, 0x3d, 0xe8, 0x3d}}},
|
|
||||||
{{{0xfd, 0x5b, 0x4e, 0x8d, 0xb6, 0x7e, 0x82, 0x9b, 0xef, 0xce, 0x04, 0x69, 0x51, 0x52, 0xff, 0xef, 0xa0, 0x52, 0xb5, 0x79, 0x17, 0x5e, 0x2f, 0xde, 0xd6, 0x3c, 0x2d, 0xa0, 0x43, 0xb4, 0x0b, 0x19}} ,
|
|
||||||
{{0xc0, 0x61, 0x48, 0x48, 0x17, 0xf4, 0x9e, 0x18, 0x51, 0x2d, 0xea, 0x2f, 0xf2, 0xf2, 0xe0, 0xa3, 0x14, 0xb7, 0x8b, 0x3a, 0x30, 0xf5, 0x81, 0xc1, 0x5d, 0x71, 0x39, 0x62, 0x55, 0x1f, 0x60, 0x5a}}},
|
|
||||||
{{{0xe5, 0x89, 0x8a, 0x76, 0x6c, 0xdb, 0x4d, 0x0a, 0x5b, 0x72, 0x9d, 0x59, 0x6e, 0x63, 0x63, 0x18, 0x7c, 0xe3, 0xfa, 0xe2, 0xdb, 0xa1, 0x8d, 0xf4, 0xa5, 0xd7, 0x16, 0xb2, 0xd0, 0xb3, 0x3f, 0x39}} ,
|
|
||||||
{{0xce, 0x60, 0x09, 0x6c, 0xf5, 0x76, 0x17, 0x24, 0x80, 0x3a, 0x96, 0xc7, 0x94, 0x2e, 0xf7, 0x6b, 0xef, 0xb5, 0x05, 0x96, 0xef, 0xd3, 0x7b, 0x51, 0xda, 0x05, 0x44, 0x67, 0xbc, 0x07, 0x21, 0x4e}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0xe9, 0x73, 0x6f, 0x21, 0xb9, 0xde, 0x22, 0x7d, 0xeb, 0x97, 0x31, 0x10, 0xa3, 0xea, 0xe1, 0xc6, 0x37, 0xeb, 0x8f, 0x43, 0x58, 0xde, 0x41, 0x64, 0x0e, 0x3e, 0x07, 0x99, 0x3d, 0xf1, 0xdf, 0x1e}} ,
|
|
||||||
{{0xf8, 0xad, 0x43, 0xc2, 0x17, 0x06, 0xe2, 0xe4, 0xa9, 0x86, 0xcd, 0x18, 0xd7, 0x78, 0xc8, 0x74, 0x66, 0xd2, 0x09, 0x18, 0xa5, 0xf1, 0xca, 0xa6, 0x62, 0x92, 0xc1, 0xcb, 0x00, 0xeb, 0x42, 0x2e}}},
|
|
||||||
{{{0x7b, 0x34, 0x24, 0x4c, 0xcf, 0x38, 0xe5, 0x6c, 0x0a, 0x01, 0x2c, 0x22, 0x0b, 0x24, 0x38, 0xad, 0x24, 0x7e, 0x19, 0xf0, 0x6c, 0xf9, 0x31, 0xf4, 0x35, 0x11, 0xf6, 0x46, 0x33, 0x3a, 0x23, 0x59}} ,
|
|
||||||
{{0x20, 0x0b, 0xa1, 0x08, 0x19, 0xad, 0x39, 0x54, 0xea, 0x3e, 0x23, 0x09, 0xb6, 0xe2, 0xd2, 0xbc, 0x4d, 0xfc, 0x9c, 0xf0, 0x13, 0x16, 0x22, 0x3f, 0xb9, 0xd2, 0x11, 0x86, 0x90, 0x55, 0xce, 0x3c}}},
|
|
||||||
{{{0xc4, 0x0b, 0x4b, 0x62, 0x99, 0x37, 0x84, 0x3f, 0x74, 0xa2, 0xf9, 0xce, 0xe2, 0x0b, 0x0f, 0x2a, 0x3d, 0xa3, 0xe3, 0xdb, 0x5a, 0x9d, 0x93, 0xcc, 0xa5, 0xef, 0x82, 0x91, 0x1d, 0xe6, 0x6c, 0x68}} ,
|
|
||||||
{{0xa3, 0x64, 0x17, 0x9b, 0x8b, 0xc8, 0x3a, 0x61, 0xe6, 0x9d, 0xc6, 0xed, 0x7b, 0x03, 0x52, 0x26, 0x9d, 0x3a, 0xb3, 0x13, 0xcc, 0x8a, 0xfd, 0x2c, 0x1a, 0x1d, 0xed, 0x13, 0xd0, 0x55, 0x57, 0x0e}}},
|
|
||||||
{{{0x1a, 0xea, 0xbf, 0xfd, 0x4a, 0x3c, 0x8e, 0xec, 0x29, 0x7e, 0x77, 0x77, 0x12, 0x99, 0xd7, 0x84, 0xf9, 0x55, 0x7f, 0xf1, 0x8b, 0xb4, 0xd2, 0x95, 0xa3, 0x8d, 0xf0, 0x8a, 0xa7, 0xeb, 0x82, 0x4b}} ,
|
|
||||||
{{0x2c, 0x28, 0xf4, 0x3a, 0xf6, 0xde, 0x0a, 0xe0, 0x41, 0x44, 0x23, 0xf8, 0x3f, 0x03, 0x64, 0x9f, 0xc3, 0x55, 0x4c, 0xc6, 0xc1, 0x94, 0x1c, 0x24, 0x5d, 0x5f, 0x92, 0x45, 0x96, 0x57, 0x37, 0x14}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0xc1, 0xcd, 0x90, 0x66, 0xb9, 0x76, 0xa0, 0x5b, 0xa5, 0x85, 0x75, 0x23, 0xf9, 0x89, 0xa5, 0x82, 0xb2, 0x6f, 0xb1, 0xeb, 0xc4, 0x69, 0x6f, 0x18, 0x5a, 0xed, 0x94, 0x3d, 0x9d, 0xd9, 0x2c, 0x1a}} ,
|
|
||||||
{{0x35, 0xb0, 0xe6, 0x73, 0x06, 0xb7, 0x37, 0xe0, 0xf8, 0xb0, 0x22, 0xe8, 0xd2, 0xed, 0x0b, 0xef, 0xe6, 0xc6, 0x5a, 0x99, 0x9e, 0x1a, 0x9f, 0x04, 0x97, 0xe4, 0x4d, 0x0b, 0xbe, 0xba, 0x44, 0x40}}},
|
|
||||||
{{{0xc1, 0x56, 0x96, 0x91, 0x5f, 0x1f, 0xbb, 0x54, 0x6f, 0x88, 0x89, 0x0a, 0xb2, 0xd6, 0x41, 0x42, 0x6a, 0x82, 0xee, 0x14, 0xaa, 0x76, 0x30, 0x65, 0x0f, 0x67, 0x39, 0xa6, 0x51, 0x7c, 0x49, 0x24}} ,
|
|
||||||
{{0x35, 0xa3, 0x78, 0xd1, 0x11, 0x0f, 0x75, 0xd3, 0x70, 0x46, 0xdb, 0x20, 0x51, 0xcb, 0x92, 0x80, 0x54, 0x10, 0x74, 0x36, 0x86, 0xa9, 0xd7, 0xa3, 0x08, 0x78, 0xf1, 0x01, 0x29, 0xf8, 0x80, 0x3b}}},
|
|
||||||
{{{0xdb, 0xa7, 0x9d, 0x9d, 0xbf, 0xa0, 0xcc, 0xed, 0x53, 0xa2, 0xa2, 0x19, 0x39, 0x48, 0x83, 0x19, 0x37, 0x58, 0xd1, 0x04, 0x28, 0x40, 0xf7, 0x8a, 0xc2, 0x08, 0xb7, 0xa5, 0x42, 0xcf, 0x53, 0x4c}} ,
|
|
||||||
{{0xa7, 0xbb, 0xf6, 0x8e, 0xad, 0xdd, 0xf7, 0x90, 0xdd, 0x5f, 0x93, 0x89, 0xae, 0x04, 0x37, 0xe6, 0x9a, 0xb7, 0xe8, 0xc0, 0xdf, 0x16, 0x2a, 0xbf, 0xc4, 0x3a, 0x3c, 0x41, 0xd5, 0x89, 0x72, 0x5a}}},
|
|
||||||
{{{0x1f, 0x96, 0xff, 0x34, 0x2c, 0x13, 0x21, 0xcb, 0x0a, 0x89, 0x85, 0xbe, 0xb3, 0x70, 0x9e, 0x1e, 0xde, 0x97, 0xaf, 0x96, 0x30, 0xf7, 0x48, 0x89, 0x40, 0x8d, 0x07, 0xf1, 0x25, 0xf0, 0x30, 0x58}} ,
|
|
||||||
{{0x1e, 0xd4, 0x93, 0x57, 0xe2, 0x17, 0xe7, 0x9d, 0xab, 0x3c, 0x55, 0x03, 0x82, 0x2f, 0x2b, 0xdb, 0x56, 0x1e, 0x30, 0x2e, 0x24, 0x47, 0x6e, 0xe6, 0xff, 0x33, 0x24, 0x2c, 0x75, 0x51, 0xd4, 0x67}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0x2b, 0x06, 0xd9, 0xa1, 0x5d, 0xe1, 0xf4, 0xd1, 0x1e, 0x3c, 0x9a, 0xc6, 0x29, 0x2b, 0x13, 0x13, 0x78, 0xc0, 0xd8, 0x16, 0x17, 0x2d, 0x9e, 0xa9, 0xc9, 0x79, 0x57, 0xab, 0x24, 0x91, 0x92, 0x19}} ,
|
|
||||||
{{0x69, 0xfb, 0xa1, 0x9c, 0xa6, 0x75, 0x49, 0x7d, 0x60, 0x73, 0x40, 0x42, 0xc4, 0x13, 0x0a, 0x95, 0x79, 0x1e, 0x04, 0x83, 0x94, 0x99, 0x9b, 0x1e, 0x0c, 0xe8, 0x1f, 0x54, 0xef, 0xcb, 0xc0, 0x52}}},
|
|
||||||
{{{0x14, 0x89, 0x73, 0xa1, 0x37, 0x87, 0x6a, 0x7a, 0xcf, 0x1d, 0xd9, 0x2e, 0x1a, 0x67, 0xed, 0x74, 0xc0, 0xf0, 0x9c, 0x33, 0xdd, 0xdf, 0x08, 0xbf, 0x7b, 0xd1, 0x66, 0xda, 0xe6, 0xc9, 0x49, 0x08}} ,
|
|
||||||
{{0xe9, 0xdd, 0x5e, 0x55, 0xb0, 0x0a, 0xde, 0x21, 0x4c, 0x5a, 0x2e, 0xd4, 0x80, 0x3a, 0x57, 0x92, 0x7a, 0xf1, 0xc4, 0x2c, 0x40, 0xaf, 0x2f, 0xc9, 0x92, 0x03, 0xe5, 0x5a, 0xbc, 0xdc, 0xf4, 0x09}}},
|
|
||||||
{{{0xf3, 0xe1, 0x2b, 0x7c, 0x05, 0x86, 0x80, 0x93, 0x4a, 0xad, 0xb4, 0x8f, 0x7e, 0x99, 0x0c, 0xfd, 0xcd, 0xef, 0xd1, 0xff, 0x2c, 0x69, 0x34, 0x13, 0x41, 0x64, 0xcf, 0x3b, 0xd0, 0x90, 0x09, 0x1e}} ,
|
|
||||||
{{0x9d, 0x45, 0xd6, 0x80, 0xe6, 0x45, 0xaa, 0xf4, 0x15, 0xaa, 0x5c, 0x34, 0x87, 0x99, 0xa2, 0x8c, 0x26, 0x84, 0x62, 0x7d, 0xb6, 0x29, 0xc0, 0x52, 0xea, 0xf5, 0x81, 0x18, 0x0f, 0x35, 0xa9, 0x0e}}},
|
|
||||||
{{{0xe7, 0x20, 0x72, 0x7c, 0x6d, 0x94, 0x5f, 0x52, 0x44, 0x54, 0xe3, 0xf1, 0xb2, 0xb0, 0x36, 0x46, 0x0f, 0xae, 0x92, 0xe8, 0x70, 0x9d, 0x6e, 0x79, 0xb1, 0xad, 0x37, 0xa9, 0x5f, 0xc0, 0xde, 0x03}} ,
|
|
||||||
{{0x15, 0x55, 0x37, 0xc6, 0x1c, 0x27, 0x1c, 0x6d, 0x14, 0x4f, 0xca, 0xa4, 0xc4, 0x88, 0x25, 0x46, 0x39, 0xfc, 0x5a, 0xe5, 0xfe, 0x29, 0x11, 0x69, 0xf5, 0x72, 0x84, 0x4d, 0x78, 0x9f, 0x94, 0x15}}},
|
|
||||||
{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},
|
|
||||||
{{{0xec, 0xd3, 0xff, 0x57, 0x0b, 0xb0, 0xb2, 0xdc, 0xf8, 0x4f, 0xe2, 0x12, 0xd5, 0x36, 0xbe, 0x6b, 0x09, 0x43, 0x6d, 0xa3, 0x4d, 0x90, 0x2d, 0xb8, 0x74, 0xe8, 0x71, 0x45, 0x19, 0x8b, 0x0c, 0x6a}} ,
|
|
||||||
{{0xb8, 0x42, 0x1c, 0x03, 0xad, 0x2c, 0x03, 0x8e, 0xac, 0xd7, 0x98, 0x29, 0x13, 0xc6, 0x02, 0x29, 0xb5, 0xd4, 0xe7, 0xcf, 0xcc, 0x8b, 0x83, 0xec, 0x35, 0xc7, 0x9c, 0x74, 0xb7, 0xad, 0x85, 0x5f}}},
|
|
||||||
{{{0x78, 0x84, 0xe1, 0x56, 0x45, 0x69, 0x68, 0x5a, 0x4f, 0xb8, 0xb1, 0x29, 0xff, 0x33, 0x03, 0x31, 0xb7, 0xcb, 0x96, 0x25, 0xe6, 0xe6, 0x41, 0x98, 0x1a, 0xbb, 0x03, 0x56, 0xf2, 0xb2, 0x91, 0x34}} ,
|
|
||||||
{{0x2c, 0x6c, 0xf7, 0x66, 0xa4, 0x62, 0x6b, 0x39, 0xb3, 0xba, 0x65, 0xd3, 0x1c, 0xf8, 0x11, 0xaa, 0xbe, 0xdc, 0x80, 0x59, 0x87, 0xf5, 0x7b, 0xe5, 0xe3, 0xb3, 0x3e, 0x39, 0xda, 0xbe, 0x88, 0x09}}},
|
|
||||||
{{{0x8b, 0xf1, 0xa0, 0xf5, 0xdc, 0x29, 0xb4, 0xe2, 0x07, 0xc6, 0x7a, 0x00, 0xd0, 0x89, 0x17, 0x51, 0xd4, 0xbb, 0xd4, 0x22, 0xea, 0x7e, 0x7d, 0x7c, 0x24, 0xea, 0xf2, 0xe8, 0x22, 0x12, 0x95, 0x06}} ,
|
|
||||||
{{0xda, 0x7c, 0xa4, 0x0c, 0xf4, 0xba, 0x6e, 0xe1, 0x89, 0xb5, 0x59, 0xca, 0xf1, 0xc0, 0x29, 0x36, 0x09, 0x44, 0xe2, 0x7f, 0xd1, 0x63, 0x15, 0x99, 0xea, 0x25, 0xcf, 0x0c, 0x9d, 0xc0, 0x44, 0x6f}}},
|
|
||||||
{{{0x1d, 0x86, 0x4e, 0xcf, 0xf7, 0x37, 0x10, 0x25, 0x8f, 0x12, 0xfb, 0x19, 0xfb, 0xe0, 0xed, 0x10, 0xc8, 0xe2, 0xf5, 0x75, 0xb1, 0x33, 0xc0, 0x96, 0x0d, 0xfb, 0x15, 0x6c, 0x0d, 0x07, 0x5f, 0x05}} ,
|
|
||||||
{{0x69, 0x3e, 0x47, 0x97, 0x2c, 0xaf, 0x52, 0x7c, 0x78, 0x83, 0xad, 0x1b, 0x39, 0x82, 0x2f, 0x02, 0x6f, 0x47, 0xdb, 0x2a, 0xb0, 0xe1, 0x91, 0x99, 0x55, 0xb8, 0x99, 0x3a, 0xa0, 0x44, 0x11, 0x51}}}
|
|
|
@ -1,181 +0,0 @@
|
||||||
/* $OpenBSD: src/lib/libc/hash/helper.c,v 1.11 2014/04/03 17:55:27 beck Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 2000 Poul-Henning Kamp <phk@FreeBSD.org>
|
|
||||||
*
|
|
||||||
* Permission to use, copy, modify, and distribute this software for any
|
|
||||||
* purpose with or without fee is hereby granted, provided that the above
|
|
||||||
* copyright notice and this permission notice appear in all copies.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
||||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If we meet some day, and you think this stuff is worth it, you
|
|
||||||
* can buy me a beer in return. Poul-Henning Kamp
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <sys/param.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include <sha2.h>
|
|
||||||
|
|
||||||
/* ARGSUSED */
|
|
||||||
char *
|
|
||||||
SHA256End(SHA2_CTX *ctx, char *buf)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
u_int8_t digest[SHA256_DIGEST_LENGTH];
|
|
||||||
static const char hex[] = "0123456789abcdef";
|
|
||||||
|
|
||||||
if (buf == NULL && (buf = malloc(SHA256_DIGEST_STRING_LENGTH)) == NULL)
|
|
||||||
return (NULL);
|
|
||||||
|
|
||||||
SHA256Final(digest, ctx);
|
|
||||||
for (i = 0; i < SHA256_DIGEST_LENGTH; i++) {
|
|
||||||
buf[i + i] = hex[digest[i] >> 4];
|
|
||||||
buf[i + i + 1] = hex[digest[i] & 0x0f];
|
|
||||||
}
|
|
||||||
buf[i + i] = '\0';
|
|
||||||
memset(digest, 0, sizeof(digest));
|
|
||||||
return (buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
char *
|
|
||||||
SHA256FileChunk(const char *filename, char *buf, off_t off, off_t len)
|
|
||||||
{
|
|
||||||
struct stat sb;
|
|
||||||
u_char buffer[BUFSIZ];
|
|
||||||
SHA2_CTX ctx;
|
|
||||||
int fd, save_errno;
|
|
||||||
ssize_t nr;
|
|
||||||
|
|
||||||
SHA256Init(&ctx);
|
|
||||||
|
|
||||||
if ((fd = open(filename, O_RDONLY)) < 0)
|
|
||||||
return (NULL);
|
|
||||||
if (len == 0) {
|
|
||||||
if (fstat(fd, &sb) == -1) {
|
|
||||||
close(fd);
|
|
||||||
return (NULL);
|
|
||||||
}
|
|
||||||
len = sb.st_size;
|
|
||||||
}
|
|
||||||
if (off > 0 && lseek(fd, off, SEEK_SET) < 0) {
|
|
||||||
close(fd);
|
|
||||||
return (NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
while ((nr = read(fd, buffer, MIN(sizeof(buffer), len))) > 0) {
|
|
||||||
SHA256Update(&ctx, buffer, (size_t)nr);
|
|
||||||
if (len > 0 && (len -= nr) == 0)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
save_errno = errno;
|
|
||||||
close(fd);
|
|
||||||
errno = save_errno;
|
|
||||||
return (nr < 0 ? NULL : SHA256End(&ctx, buf));
|
|
||||||
}
|
|
||||||
|
|
||||||
char *
|
|
||||||
SHA256File(const char *filename, char *buf)
|
|
||||||
{
|
|
||||||
return (SHA256FileChunk(filename, buf, (off_t)0, (off_t)0));
|
|
||||||
}
|
|
||||||
|
|
||||||
char *
|
|
||||||
SHA256Data(const u_char *data, size_t len, char *buf)
|
|
||||||
{
|
|
||||||
SHA2_CTX ctx;
|
|
||||||
|
|
||||||
SHA256Init(&ctx);
|
|
||||||
SHA256Update(&ctx, data, len);
|
|
||||||
return (SHA256End(&ctx, buf));
|
|
||||||
}
|
|
||||||
|
|
||||||
char *
|
|
||||||
SHA512End(SHA2_CTX *ctx, char *buf)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
u_int8_t digest[SHA512_DIGEST_LENGTH];
|
|
||||||
static const char hex[] = "0123456789abcdef";
|
|
||||||
|
|
||||||
if (buf == NULL && (buf = malloc(SHA512_DIGEST_STRING_LENGTH)) == NULL)
|
|
||||||
return (NULL);
|
|
||||||
|
|
||||||
SHA512Final(digest, ctx);
|
|
||||||
for (i = 0; i < SHA512_DIGEST_LENGTH; i++) {
|
|
||||||
buf[i + i] = hex[digest[i] >> 4];
|
|
||||||
buf[i + i + 1] = hex[digest[i] & 0x0f];
|
|
||||||
}
|
|
||||||
buf[i + i] = '\0';
|
|
||||||
memset(digest, 0, sizeof(digest));
|
|
||||||
return (buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
char *
|
|
||||||
SHA512FileChunk(const char *filename, char *buf, off_t off, off_t len)
|
|
||||||
{
|
|
||||||
struct stat sb;
|
|
||||||
u_char buffer[BUFSIZ];
|
|
||||||
SHA2_CTX ctx;
|
|
||||||
int fd, save_errno;
|
|
||||||
ssize_t nr;
|
|
||||||
|
|
||||||
SHA512Init(&ctx);
|
|
||||||
|
|
||||||
if ((fd = open(filename, O_RDONLY)) < 0)
|
|
||||||
return (NULL);
|
|
||||||
if (len == 0) {
|
|
||||||
if (fstat(fd, &sb) == -1) {
|
|
||||||
close(fd);
|
|
||||||
return (NULL);
|
|
||||||
}
|
|
||||||
len = sb.st_size;
|
|
||||||
}
|
|
||||||
if (off > 0 && lseek(fd, off, SEEK_SET) < 0) {
|
|
||||||
close(fd);
|
|
||||||
return (NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
while ((nr = read(fd, buffer, MIN(sizeof(buffer), len))) > 0) {
|
|
||||||
SHA512Update(&ctx, buffer, (size_t)nr);
|
|
||||||
if (len > 0 && (len -= nr) == 0)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
save_errno = errno;
|
|
||||||
close(fd);
|
|
||||||
errno = save_errno;
|
|
||||||
return (nr < 0 ? NULL : SHA512End(&ctx, buf));
|
|
||||||
}
|
|
||||||
|
|
||||||
char *
|
|
||||||
SHA512File(const char *filename, char *buf)
|
|
||||||
{
|
|
||||||
return (SHA512FileChunk(filename, buf, (off_t)0, (off_t)0));
|
|
||||||
}
|
|
||||||
|
|
||||||
char *
|
|
||||||
SHA512Data(const u_char *data, size_t len, char *buf)
|
|
||||||
{
|
|
||||||
SHA2_CTX ctx;
|
|
||||||
|
|
||||||
SHA512Init(&ctx);
|
|
||||||
SHA512Update(&ctx, data, len);
|
|
||||||
return (SHA512End(&ctx, buf));
|
|
||||||
}
|
|
|
@ -1,143 +0,0 @@
|
||||||
/* $OpenBSD: mod_ed25519.c,v 1.1 2014/01/08 05:00:01 tedu Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Public Domain, Authors: Daniel J. Bernstein, Niels Duif, Tanja Lange,
|
|
||||||
* Peter Schwabe, Bo-Yin Yang.
|
|
||||||
* Copied from supercop-20130419/crypto_sign/ed25519/ref/ed25519.c
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "crypto_api.h"
|
|
||||||
|
|
||||||
#include "ge25519.h"
|
|
||||||
|
|
||||||
static void get_hram(unsigned char *hram, const unsigned char *sm, const unsigned char *pk, unsigned char *playground, unsigned long long smlen)
|
|
||||||
{
|
|
||||||
unsigned long long i;
|
|
||||||
|
|
||||||
for (i = 0;i < 32;++i) playground[i] = sm[i];
|
|
||||||
for (i = 32;i < 64;++i) playground[i] = pk[i-32];
|
|
||||||
for (i = 64;i < smlen;++i) playground[i] = sm[i];
|
|
||||||
|
|
||||||
crypto_hash_sha512(hram,playground,smlen);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef VERIFYONLY
|
|
||||||
int crypto_sign_ed25519_keypair(
|
|
||||||
unsigned char *pk,
|
|
||||||
unsigned char *sk
|
|
||||||
)
|
|
||||||
{
|
|
||||||
sc25519 scsk;
|
|
||||||
ge25519 gepk;
|
|
||||||
unsigned char extsk[64];
|
|
||||||
int i;
|
|
||||||
|
|
||||||
randombytes(sk, 32);
|
|
||||||
crypto_hash_sha512(extsk, sk, 32);
|
|
||||||
extsk[0] &= 248;
|
|
||||||
extsk[31] &= 127;
|
|
||||||
extsk[31] |= 64;
|
|
||||||
|
|
||||||
sc25519_from32bytes(&scsk,extsk);
|
|
||||||
|
|
||||||
ge25519_scalarmult_base(&gepk, &scsk);
|
|
||||||
ge25519_pack(pk, &gepk);
|
|
||||||
for(i=0;i<32;i++)
|
|
||||||
sk[32 + i] = pk[i];
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int crypto_sign_ed25519(
|
|
||||||
unsigned char *sm,unsigned long long *smlen,
|
|
||||||
const unsigned char *m,unsigned long long mlen,
|
|
||||||
const unsigned char *sk
|
|
||||||
)
|
|
||||||
{
|
|
||||||
sc25519 sck, scs, scsk;
|
|
||||||
ge25519 ger;
|
|
||||||
unsigned char r[32];
|
|
||||||
unsigned char s[32];
|
|
||||||
unsigned char extsk[64];
|
|
||||||
unsigned long long i;
|
|
||||||
unsigned char hmg[crypto_hash_sha512_BYTES];
|
|
||||||
unsigned char hram[crypto_hash_sha512_BYTES];
|
|
||||||
|
|
||||||
crypto_hash_sha512(extsk, sk, 32);
|
|
||||||
extsk[0] &= 248;
|
|
||||||
extsk[31] &= 127;
|
|
||||||
extsk[31] |= 64;
|
|
||||||
|
|
||||||
*smlen = mlen+64;
|
|
||||||
for(i=0;i<mlen;i++)
|
|
||||||
sm[64 + i] = m[i];
|
|
||||||
for(i=0;i<32;i++)
|
|
||||||
sm[32 + i] = extsk[32+i];
|
|
||||||
|
|
||||||
crypto_hash_sha512(hmg, sm+32, mlen+32); /* Generate k as h(extsk[32],...,extsk[63],m) */
|
|
||||||
|
|
||||||
/* Computation of R */
|
|
||||||
sc25519_from64bytes(&sck, hmg);
|
|
||||||
ge25519_scalarmult_base(&ger, &sck);
|
|
||||||
ge25519_pack(r, &ger);
|
|
||||||
|
|
||||||
/* Computation of s */
|
|
||||||
for(i=0;i<32;i++)
|
|
||||||
sm[i] = r[i];
|
|
||||||
|
|
||||||
get_hram(hram, sm, sk+32, sm, mlen+64);
|
|
||||||
|
|
||||||
sc25519_from64bytes(&scs, hram);
|
|
||||||
sc25519_from32bytes(&scsk, extsk);
|
|
||||||
sc25519_mul(&scs, &scs, &scsk);
|
|
||||||
|
|
||||||
sc25519_add(&scs, &scs, &sck);
|
|
||||||
|
|
||||||
sc25519_to32bytes(s,&scs); /* cat s */
|
|
||||||
for(i=0;i<32;i++)
|
|
||||||
sm[32 + i] = s[i];
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
int crypto_sign_ed25519_open(
|
|
||||||
unsigned char *m,unsigned long long *mlen,
|
|
||||||
const unsigned char *sm,unsigned long long smlen,
|
|
||||||
const unsigned char *pk
|
|
||||||
)
|
|
||||||
{
|
|
||||||
unsigned int i;
|
|
||||||
int ret;
|
|
||||||
unsigned char t2[32];
|
|
||||||
ge25519 get1, get2;
|
|
||||||
sc25519 schram, scs;
|
|
||||||
unsigned char hram[crypto_hash_sha512_BYTES];
|
|
||||||
|
|
||||||
*mlen = (unsigned long long) -1;
|
|
||||||
if (smlen < 64) return -1;
|
|
||||||
|
|
||||||
if (ge25519_unpackneg_vartime(&get1, pk)) return -1;
|
|
||||||
|
|
||||||
get_hram(hram,sm,pk,m,smlen);
|
|
||||||
|
|
||||||
sc25519_from64bytes(&schram, hram);
|
|
||||||
|
|
||||||
sc25519_from32bytes(&scs, sm+32);
|
|
||||||
|
|
||||||
ge25519_double_scalarmult_vartime(&get2, &get1, &schram, &ge25519_base, &scs);
|
|
||||||
ge25519_pack(t2, &get2);
|
|
||||||
|
|
||||||
ret = crypto_verify_32(sm, t2);
|
|
||||||
|
|
||||||
if (!ret)
|
|
||||||
{
|
|
||||||
for(i=0;i<smlen-64;i++)
|
|
||||||
m[i] = sm[i + 64];
|
|
||||||
*mlen = smlen-64;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
for(i=0;i<smlen-64;i++)
|
|
||||||
m[i] = 0;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
|
@ -1,327 +0,0 @@
|
||||||
/* $OpenBSD: mod_ge25519.c,v 1.2 2014/01/08 05:51:35 deraadt Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Public Domain, Authors: Daniel J. Bernstein, Niels Duif, Tanja Lange,
|
|
||||||
* Peter Schwabe, Bo-Yin Yang.
|
|
||||||
* Copied from supercop-20130419/crypto_sign/ed25519/ref/ge25519.c
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "fe25519.h"
|
|
||||||
#include "sc25519.h"
|
|
||||||
#include "ge25519.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Arithmetic on the twisted Edwards curve -x^2 + y^2 = 1 + dx^2y^2
|
|
||||||
* with d = -(121665/121666) = 37095705934669439343138083508754565189542113879843219016388785533085940283555
|
|
||||||
* Base point: (15112221349535400772501151409588531511454012693041857206046113283949847762202,46316835694926478169428394003475163141307993866256225615783033603165251855960);
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* d */
|
|
||||||
static const fe25519 ge25519_ecd = {{0xA3, 0x78, 0x59, 0x13, 0xCA, 0x4D, 0xEB, 0x75, 0xAB, 0xD8, 0x41, 0x41, 0x4D, 0x0A, 0x70, 0x00,
|
|
||||||
0x98, 0xE8, 0x79, 0x77, 0x79, 0x40, 0xC7, 0x8C, 0x73, 0xFE, 0x6F, 0x2B, 0xEE, 0x6C, 0x03, 0x52}};
|
|
||||||
/* 2*d */
|
|
||||||
static const fe25519 ge25519_ec2d = {{0x59, 0xF1, 0xB2, 0x26, 0x94, 0x9B, 0xD6, 0xEB, 0x56, 0xB1, 0x83, 0x82, 0x9A, 0x14, 0xE0, 0x00,
|
|
||||||
0x30, 0xD1, 0xF3, 0xEE, 0xF2, 0x80, 0x8E, 0x19, 0xE7, 0xFC, 0xDF, 0x56, 0xDC, 0xD9, 0x06, 0x24}};
|
|
||||||
/* sqrt(-1) */
|
|
||||||
static const fe25519 ge25519_sqrtm1 = {{0xB0, 0xA0, 0x0E, 0x4A, 0x27, 0x1B, 0xEE, 0xC4, 0x78, 0xE4, 0x2F, 0xAD, 0x06, 0x18, 0x43, 0x2F,
|
|
||||||
0xA7, 0xD7, 0xFB, 0x3D, 0x99, 0x00, 0x4D, 0x2B, 0x0B, 0xDF, 0xC1, 0x4F, 0x80, 0x24, 0x83, 0x2B}};
|
|
||||||
|
|
||||||
#define ge25519_p3 ge25519
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
fe25519 x;
|
|
||||||
fe25519 z;
|
|
||||||
fe25519 y;
|
|
||||||
fe25519 t;
|
|
||||||
} ge25519_p1p1;
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
fe25519 x;
|
|
||||||
fe25519 y;
|
|
||||||
fe25519 z;
|
|
||||||
} ge25519_p2;
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
fe25519 x;
|
|
||||||
fe25519 y;
|
|
||||||
} ge25519_aff;
|
|
||||||
|
|
||||||
|
|
||||||
/* Packed coordinates of the base point */
|
|
||||||
const ge25519 ge25519_base = {{{0x1A, 0xD5, 0x25, 0x8F, 0x60, 0x2D, 0x56, 0xC9, 0xB2, 0xA7, 0x25, 0x95, 0x60, 0xC7, 0x2C, 0x69,
|
|
||||||
0x5C, 0xDC, 0xD6, 0xFD, 0x31, 0xE2, 0xA4, 0xC0, 0xFE, 0x53, 0x6E, 0xCD, 0xD3, 0x36, 0x69, 0x21}},
|
|
||||||
{{0x58, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
|
|
||||||
0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66}},
|
|
||||||
{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
|
||||||
{{0xA3, 0xDD, 0xB7, 0xA5, 0xB3, 0x8A, 0xDE, 0x6D, 0xF5, 0x52, 0x51, 0x77, 0x80, 0x9F, 0xF0, 0x20,
|
|
||||||
0x7D, 0xE3, 0xAB, 0x64, 0x8E, 0x4E, 0xEA, 0x66, 0x65, 0x76, 0x8B, 0xD7, 0x0F, 0x5F, 0x87, 0x67}}};
|
|
||||||
|
|
||||||
#ifndef VERIFYONLY
|
|
||||||
/* Multiples of the base point in affine representation */
|
|
||||||
static const ge25519_aff ge25519_base_multiples_affine[425] = {
|
|
||||||
#include "ge25519_base.data"
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void p1p1_to_p2(ge25519_p2 *r, const ge25519_p1p1 *p)
|
|
||||||
{
|
|
||||||
fe25519_mul(&r->x, &p->x, &p->t);
|
|
||||||
fe25519_mul(&r->y, &p->y, &p->z);
|
|
||||||
fe25519_mul(&r->z, &p->z, &p->t);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void p1p1_to_p3(ge25519_p3 *r, const ge25519_p1p1 *p)
|
|
||||||
{
|
|
||||||
p1p1_to_p2((ge25519_p2 *)r, p);
|
|
||||||
fe25519_mul(&r->t, &p->x, &p->y);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef VERIFYONLY
|
|
||||||
static void ge25519_mixadd2(ge25519_p3 *r, const ge25519_aff *q)
|
|
||||||
{
|
|
||||||
fe25519 a,b,t1,t2,c,d,e,f,g,h,qt;
|
|
||||||
fe25519_mul(&qt, &q->x, &q->y);
|
|
||||||
fe25519_sub(&a, &r->y, &r->x); /* A = (Y1-X1)*(Y2-X2) */
|
|
||||||
fe25519_add(&b, &r->y, &r->x); /* B = (Y1+X1)*(Y2+X2) */
|
|
||||||
fe25519_sub(&t1, &q->y, &q->x);
|
|
||||||
fe25519_add(&t2, &q->y, &q->x);
|
|
||||||
fe25519_mul(&a, &a, &t1);
|
|
||||||
fe25519_mul(&b, &b, &t2);
|
|
||||||
fe25519_sub(&e, &b, &a); /* E = B-A */
|
|
||||||
fe25519_add(&h, &b, &a); /* H = B+A */
|
|
||||||
fe25519_mul(&c, &r->t, &qt); /* C = T1*k*T2 */
|
|
||||||
fe25519_mul(&c, &c, &ge25519_ec2d);
|
|
||||||
fe25519_add(&d, &r->z, &r->z); /* D = Z1*2 */
|
|
||||||
fe25519_sub(&f, &d, &c); /* F = D-C */
|
|
||||||
fe25519_add(&g, &d, &c); /* G = D+C */
|
|
||||||
fe25519_mul(&r->x, &e, &f);
|
|
||||||
fe25519_mul(&r->y, &h, &g);
|
|
||||||
fe25519_mul(&r->z, &g, &f);
|
|
||||||
fe25519_mul(&r->t, &e, &h);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void add_p1p1(ge25519_p1p1 *r, const ge25519_p3 *p, const ge25519_p3 *q)
|
|
||||||
{
|
|
||||||
fe25519 a, b, c, d, t;
|
|
||||||
|
|
||||||
fe25519_sub(&a, &p->y, &p->x); /* A = (Y1-X1)*(Y2-X2) */
|
|
||||||
fe25519_sub(&t, &q->y, &q->x);
|
|
||||||
fe25519_mul(&a, &a, &t);
|
|
||||||
fe25519_add(&b, &p->x, &p->y); /* B = (Y1+X1)*(Y2+X2) */
|
|
||||||
fe25519_add(&t, &q->x, &q->y);
|
|
||||||
fe25519_mul(&b, &b, &t);
|
|
||||||
fe25519_mul(&c, &p->t, &q->t); /* C = T1*k*T2 */
|
|
||||||
fe25519_mul(&c, &c, &ge25519_ec2d);
|
|
||||||
fe25519_mul(&d, &p->z, &q->z); /* D = Z1*2*Z2 */
|
|
||||||
fe25519_add(&d, &d, &d);
|
|
||||||
fe25519_sub(&r->x, &b, &a); /* E = B-A */
|
|
||||||
fe25519_sub(&r->t, &d, &c); /* F = D-C */
|
|
||||||
fe25519_add(&r->z, &d, &c); /* G = D+C */
|
|
||||||
fe25519_add(&r->y, &b, &a); /* H = B+A */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* See http://www.hyperelliptic.org/EFD/g1p/auto-twisted-extended-1.html#doubling-dbl-2008-hwcd */
|
|
||||||
static void dbl_p1p1(ge25519_p1p1 *r, const ge25519_p2 *p)
|
|
||||||
{
|
|
||||||
fe25519 a,b,c,d;
|
|
||||||
fe25519_square(&a, &p->x);
|
|
||||||
fe25519_square(&b, &p->y);
|
|
||||||
fe25519_square(&c, &p->z);
|
|
||||||
fe25519_add(&c, &c, &c);
|
|
||||||
fe25519_neg(&d, &a);
|
|
||||||
|
|
||||||
fe25519_add(&r->x, &p->x, &p->y);
|
|
||||||
fe25519_square(&r->x, &r->x);
|
|
||||||
fe25519_sub(&r->x, &r->x, &a);
|
|
||||||
fe25519_sub(&r->x, &r->x, &b);
|
|
||||||
fe25519_add(&r->z, &d, &b);
|
|
||||||
fe25519_sub(&r->t, &r->z, &c);
|
|
||||||
fe25519_sub(&r->y, &d, &b);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef VERIFYONLY
|
|
||||||
/* Constant-time version of: if(b) r = p */
|
|
||||||
static void cmov_aff(ge25519_aff *r, const ge25519_aff *p, unsigned char b)
|
|
||||||
{
|
|
||||||
fe25519_cmov(&r->x, &p->x, b);
|
|
||||||
fe25519_cmov(&r->y, &p->y, b);
|
|
||||||
}
|
|
||||||
|
|
||||||
static unsigned char equal(signed char b,signed char c)
|
|
||||||
{
|
|
||||||
unsigned char ub = b;
|
|
||||||
unsigned char uc = c;
|
|
||||||
unsigned char x = ub ^ uc; /* 0: yes; 1..255: no */
|
|
||||||
crypto_uint32 y = x; /* 0: yes; 1..255: no */
|
|
||||||
y -= 1; /* 4294967295: yes; 0..254: no */
|
|
||||||
y >>= 31; /* 1: yes; 0: no */
|
|
||||||
return y;
|
|
||||||
}
|
|
||||||
|
|
||||||
static unsigned char negative(signed char b)
|
|
||||||
{
|
|
||||||
unsigned long long x = b; /* 18446744073709551361..18446744073709551615: yes; 0..255: no */
|
|
||||||
x >>= 63; /* 1: yes; 0: no */
|
|
||||||
return x;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void choose_t(ge25519_aff *t, unsigned long long pos, signed char b)
|
|
||||||
{
|
|
||||||
/* constant time */
|
|
||||||
fe25519 v;
|
|
||||||
*t = ge25519_base_multiples_affine[5*pos+0];
|
|
||||||
cmov_aff(t, &ge25519_base_multiples_affine[5*pos+1],equal(b,1) | equal(b,-1));
|
|
||||||
cmov_aff(t, &ge25519_base_multiples_affine[5*pos+2],equal(b,2) | equal(b,-2));
|
|
||||||
cmov_aff(t, &ge25519_base_multiples_affine[5*pos+3],equal(b,3) | equal(b,-3));
|
|
||||||
cmov_aff(t, &ge25519_base_multiples_affine[5*pos+4],equal(b,-4));
|
|
||||||
fe25519_neg(&v, &t->x);
|
|
||||||
fe25519_cmov(&t->x, &v, negative(b));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void setneutral(ge25519 *r)
|
|
||||||
{
|
|
||||||
fe25519_setzero(&r->x);
|
|
||||||
fe25519_setone(&r->y);
|
|
||||||
fe25519_setone(&r->z);
|
|
||||||
fe25519_setzero(&r->t);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ********************************************************************
|
|
||||||
* EXPORTED FUNCTIONS
|
|
||||||
******************************************************************** */
|
|
||||||
|
|
||||||
/* return 0 on success, -1 otherwise */
|
|
||||||
int ge25519_unpackneg_vartime(ge25519_p3 *r, const unsigned char p[32])
|
|
||||||
{
|
|
||||||
unsigned char par;
|
|
||||||
fe25519 t, chk, num, den, den2, den4, den6;
|
|
||||||
fe25519_setone(&r->z);
|
|
||||||
par = p[31] >> 7;
|
|
||||||
fe25519_unpack(&r->y, p);
|
|
||||||
fe25519_square(&num, &r->y); /* x = y^2 */
|
|
||||||
fe25519_mul(&den, &num, &ge25519_ecd); /* den = dy^2 */
|
|
||||||
fe25519_sub(&num, &num, &r->z); /* x = y^2-1 */
|
|
||||||
fe25519_add(&den, &r->z, &den); /* den = dy^2+1 */
|
|
||||||
|
|
||||||
/* Computation of sqrt(num/den) */
|
|
||||||
/* 1.: computation of num^((p-5)/8)*den^((7p-35)/8) = (num*den^7)^((p-5)/8) */
|
|
||||||
fe25519_square(&den2, &den);
|
|
||||||
fe25519_square(&den4, &den2);
|
|
||||||
fe25519_mul(&den6, &den4, &den2);
|
|
||||||
fe25519_mul(&t, &den6, &num);
|
|
||||||
fe25519_mul(&t, &t, &den);
|
|
||||||
|
|
||||||
fe25519_pow2523(&t, &t);
|
|
||||||
/* 2. computation of r->x = t * num * den^3 */
|
|
||||||
fe25519_mul(&t, &t, &num);
|
|
||||||
fe25519_mul(&t, &t, &den);
|
|
||||||
fe25519_mul(&t, &t, &den);
|
|
||||||
fe25519_mul(&r->x, &t, &den);
|
|
||||||
|
|
||||||
/* 3. Check whether sqrt computation gave correct result, multiply by sqrt(-1) if not: */
|
|
||||||
fe25519_square(&chk, &r->x);
|
|
||||||
fe25519_mul(&chk, &chk, &den);
|
|
||||||
if (!fe25519_iseq_vartime(&chk, &num))
|
|
||||||
fe25519_mul(&r->x, &r->x, &ge25519_sqrtm1);
|
|
||||||
|
|
||||||
/* 4. Now we have one of the two square roots, except if input was not a square */
|
|
||||||
fe25519_square(&chk, &r->x);
|
|
||||||
fe25519_mul(&chk, &chk, &den);
|
|
||||||
if (!fe25519_iseq_vartime(&chk, &num))
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
/* 5. Choose the desired square root according to parity: */
|
|
||||||
if(fe25519_getparity(&r->x) != (1-par))
|
|
||||||
fe25519_neg(&r->x, &r->x);
|
|
||||||
|
|
||||||
fe25519_mul(&r->t, &r->x, &r->y);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ge25519_pack(unsigned char r[32], const ge25519_p3 *p)
|
|
||||||
{
|
|
||||||
fe25519 tx, ty, zi;
|
|
||||||
fe25519_invert(&zi, &p->z);
|
|
||||||
fe25519_mul(&tx, &p->x, &zi);
|
|
||||||
fe25519_mul(&ty, &p->y, &zi);
|
|
||||||
fe25519_pack(r, &ty);
|
|
||||||
r[31] ^= fe25519_getparity(&tx) << 7;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ge25519_isneutral_vartime(const ge25519_p3 *p)
|
|
||||||
{
|
|
||||||
int ret = 1;
|
|
||||||
if(!fe25519_iszero(&p->x)) ret = 0;
|
|
||||||
if(!fe25519_iseq_vartime(&p->y, &p->z)) ret = 0;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* computes [s1]p1 + [s2]p2 */
|
|
||||||
void ge25519_double_scalarmult_vartime(ge25519_p3 *r, const ge25519_p3 *p1, const sc25519 *s1, const ge25519_p3 *p2, const sc25519 *s2)
|
|
||||||
{
|
|
||||||
ge25519_p1p1 tp1p1;
|
|
||||||
ge25519_p3 pre[16];
|
|
||||||
unsigned char b[127];
|
|
||||||
int i;
|
|
||||||
|
|
||||||
/* precomputation s2 s1 */
|
|
||||||
setneutral(pre); /* 00 00 */
|
|
||||||
pre[1] = *p1; /* 00 01 */
|
|
||||||
dbl_p1p1(&tp1p1,(ge25519_p2 *)p1); p1p1_to_p3( &pre[2], &tp1p1); /* 00 10 */
|
|
||||||
add_p1p1(&tp1p1,&pre[1], &pre[2]); p1p1_to_p3( &pre[3], &tp1p1); /* 00 11 */
|
|
||||||
pre[4] = *p2; /* 01 00 */
|
|
||||||
add_p1p1(&tp1p1,&pre[1], &pre[4]); p1p1_to_p3( &pre[5], &tp1p1); /* 01 01 */
|
|
||||||
add_p1p1(&tp1p1,&pre[2], &pre[4]); p1p1_to_p3( &pre[6], &tp1p1); /* 01 10 */
|
|
||||||
add_p1p1(&tp1p1,&pre[3], &pre[4]); p1p1_to_p3( &pre[7], &tp1p1); /* 01 11 */
|
|
||||||
dbl_p1p1(&tp1p1,(ge25519_p2 *)p2); p1p1_to_p3( &pre[8], &tp1p1); /* 10 00 */
|
|
||||||
add_p1p1(&tp1p1,&pre[1], &pre[8]); p1p1_to_p3( &pre[9], &tp1p1); /* 10 01 */
|
|
||||||
dbl_p1p1(&tp1p1,(ge25519_p2 *)&pre[5]); p1p1_to_p3(&pre[10], &tp1p1); /* 10 10 */
|
|
||||||
add_p1p1(&tp1p1,&pre[3], &pre[8]); p1p1_to_p3(&pre[11], &tp1p1); /* 10 11 */
|
|
||||||
add_p1p1(&tp1p1,&pre[4], &pre[8]); p1p1_to_p3(&pre[12], &tp1p1); /* 11 00 */
|
|
||||||
add_p1p1(&tp1p1,&pre[1],&pre[12]); p1p1_to_p3(&pre[13], &tp1p1); /* 11 01 */
|
|
||||||
add_p1p1(&tp1p1,&pre[2],&pre[12]); p1p1_to_p3(&pre[14], &tp1p1); /* 11 10 */
|
|
||||||
add_p1p1(&tp1p1,&pre[3],&pre[12]); p1p1_to_p3(&pre[15], &tp1p1); /* 11 11 */
|
|
||||||
|
|
||||||
sc25519_2interleave2(b,s1,s2);
|
|
||||||
|
|
||||||
/* scalar multiplication */
|
|
||||||
*r = pre[b[126]];
|
|
||||||
for(i=125;i>=0;i--)
|
|
||||||
{
|
|
||||||
dbl_p1p1(&tp1p1, (ge25519_p2 *)r);
|
|
||||||
p1p1_to_p2((ge25519_p2 *) r, &tp1p1);
|
|
||||||
dbl_p1p1(&tp1p1, (ge25519_p2 *)r);
|
|
||||||
if(b[i]!=0)
|
|
||||||
{
|
|
||||||
p1p1_to_p3(r, &tp1p1);
|
|
||||||
add_p1p1(&tp1p1, r, &pre[b[i]]);
|
|
||||||
}
|
|
||||||
if(i != 0) p1p1_to_p2((ge25519_p2 *)r, &tp1p1);
|
|
||||||
else p1p1_to_p3(r, &tp1p1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef VERIFYONLY
|
|
||||||
void ge25519_scalarmult_base(ge25519_p3 *r, const sc25519 *s)
|
|
||||||
{
|
|
||||||
signed char b[85];
|
|
||||||
int i;
|
|
||||||
ge25519_aff t;
|
|
||||||
sc25519_window3(b,s);
|
|
||||||
|
|
||||||
choose_t((ge25519_aff *)r, 0, b[0]);
|
|
||||||
fe25519_setone(&r->z);
|
|
||||||
fe25519_mul(&r->t, &r->x, &r->y);
|
|
||||||
for(i=1;i<85;i++)
|
|
||||||
{
|
|
||||||
choose_t(&t, (unsigned long long) i, b[i]);
|
|
||||||
ge25519_mixadd2(r, &t);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
|
@ -1,327 +0,0 @@
|
||||||
/* $OpenBSD: src/lib/libutil/ohash.c,v 1.1 2014/06/02 18:52:03 deraadt Exp $ */
|
|
||||||
|
|
||||||
/* Copyright (c) 1999, 2004 Marc Espie <espie@openbsd.org>
|
|
||||||
*
|
|
||||||
* Permission to use, copy, modify, and distribute this software for any
|
|
||||||
* purpose with or without fee is hereby granted, provided that the above
|
|
||||||
* copyright notice and this permission notice appear in all copies.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
||||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <limits.h>
|
|
||||||
#include "ohash.h"
|
|
||||||
|
|
||||||
struct _ohash_record {
|
|
||||||
uint32_t hv;
|
|
||||||
const char *p;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define DELETED ((const char *)h)
|
|
||||||
#define NONE (h->size)
|
|
||||||
|
|
||||||
/* Don't bother changing the hash table if the change is small enough. */
|
|
||||||
#define MINSIZE (1UL << 4)
|
|
||||||
#define MINDELETED 4
|
|
||||||
|
|
||||||
static void ohash_resize(struct ohash *);
|
|
||||||
|
|
||||||
|
|
||||||
/* This handles the common case of variable length keys, where the
|
|
||||||
* key is stored at the end of the record.
|
|
||||||
*/
|
|
||||||
void *
|
|
||||||
ohash_create_entry(struct ohash_info *i, const char *start, const char **end)
|
|
||||||
{
|
|
||||||
char *p;
|
|
||||||
|
|
||||||
if (!*end)
|
|
||||||
*end = start + strlen(start);
|
|
||||||
p = (i->alloc)(i->key_offset + (*end - start) + 1, i->data);
|
|
||||||
if (p) {
|
|
||||||
memcpy(p+i->key_offset, start, *end-start);
|
|
||||||
p[i->key_offset + (*end - start)] = '\0';
|
|
||||||
}
|
|
||||||
return (void *)p;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* hash_delete only frees the hash structure. Use hash_first/hash_next
|
|
||||||
* to free entries as well. */
|
|
||||||
void
|
|
||||||
ohash_delete(struct ohash *h)
|
|
||||||
{
|
|
||||||
(h->info.free)(h->t, h->info.data);
|
|
||||||
#ifndef NDEBUG
|
|
||||||
h->t = NULL;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
ohash_resize(struct ohash *h)
|
|
||||||
{
|
|
||||||
struct _ohash_record *n;
|
|
||||||
size_t ns;
|
|
||||||
unsigned int j;
|
|
||||||
unsigned int i, incr;
|
|
||||||
|
|
||||||
if (4 * h->deleted < h->total) {
|
|
||||||
if (h->size >= (UINT_MAX >> 1U))
|
|
||||||
ns = UINT_MAX;
|
|
||||||
else
|
|
||||||
ns = h->size << 1U;
|
|
||||||
} else if (3 * h->deleted > 2 * h->total)
|
|
||||||
ns = h->size >> 1U;
|
|
||||||
else
|
|
||||||
ns = h->size;
|
|
||||||
if (ns < MINSIZE)
|
|
||||||
ns = MINSIZE;
|
|
||||||
#ifdef STATS_HASH
|
|
||||||
STAT_HASH_EXPAND++;
|
|
||||||
STAT_HASH_SIZE += ns - h->size;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
n = (h->info.calloc)(ns, sizeof(struct _ohash_record), h->info.data);
|
|
||||||
if (!n)
|
|
||||||
return;
|
|
||||||
|
|
||||||
for (j = 0; j < h->size; j++) {
|
|
||||||
if (h->t[j].p != NULL && h->t[j].p != DELETED) {
|
|
||||||
i = h->t[j].hv % ns;
|
|
||||||
incr = ((h->t[j].hv % (ns - 2)) & ~1) + 1;
|
|
||||||
while (n[i].p != NULL) {
|
|
||||||
i += incr;
|
|
||||||
if (i >= ns)
|
|
||||||
i -= ns;
|
|
||||||
}
|
|
||||||
n[i].hv = h->t[j].hv;
|
|
||||||
n[i].p = h->t[j].p;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
(h->info.free)(h->t, h->info.data);
|
|
||||||
h->t = n;
|
|
||||||
h->size = ns;
|
|
||||||
h->total -= h->deleted;
|
|
||||||
h->deleted = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *
|
|
||||||
ohash_remove(struct ohash *h, unsigned int i)
|
|
||||||
{
|
|
||||||
void *result = (void *)h->t[i].p;
|
|
||||||
|
|
||||||
if (result == NULL || result == DELETED)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
#ifdef STATS_HASH
|
|
||||||
STAT_HASH_ENTRIES--;
|
|
||||||
#endif
|
|
||||||
h->t[i].p = DELETED;
|
|
||||||
h->deleted++;
|
|
||||||
if (h->deleted >= MINDELETED && 4 * h->deleted > h->total)
|
|
||||||
ohash_resize(h);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *
|
|
||||||
ohash_find(struct ohash *h, unsigned int i)
|
|
||||||
{
|
|
||||||
if (h->t[i].p == DELETED)
|
|
||||||
return NULL;
|
|
||||||
else
|
|
||||||
return (void *)h->t[i].p;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *
|
|
||||||
ohash_insert(struct ohash *h, unsigned int i, void *p)
|
|
||||||
{
|
|
||||||
#ifdef STATS_HASH
|
|
||||||
STAT_HASH_ENTRIES++;
|
|
||||||
#endif
|
|
||||||
if (h->t[i].p == DELETED) {
|
|
||||||
h->deleted--;
|
|
||||||
h->t[i].p = p;
|
|
||||||
} else {
|
|
||||||
h->t[i].p = p;
|
|
||||||
/* Arbitrary resize boundary. Tweak if not efficient enough. */
|
|
||||||
if (++h->total * 4 > h->size * 3)
|
|
||||||
ohash_resize(h);
|
|
||||||
}
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int
|
|
||||||
ohash_entries(struct ohash *h)
|
|
||||||
{
|
|
||||||
return h->total - h->deleted;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *
|
|
||||||
ohash_first(struct ohash *h, unsigned int *pos)
|
|
||||||
{
|
|
||||||
*pos = 0;
|
|
||||||
return ohash_next(h, pos);
|
|
||||||
}
|
|
||||||
|
|
||||||
void *
|
|
||||||
ohash_next(struct ohash *h, unsigned int *pos)
|
|
||||||
{
|
|
||||||
for (; *pos < h->size; (*pos)++)
|
|
||||||
if (h->t[*pos].p != DELETED && h->t[*pos].p != NULL)
|
|
||||||
return (void *)h->t[(*pos)++].p;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
ohash_init(struct ohash *h, unsigned int size, struct ohash_info *info)
|
|
||||||
{
|
|
||||||
h->size = 1UL << size;
|
|
||||||
if (h->size < MINSIZE)
|
|
||||||
h->size = MINSIZE;
|
|
||||||
#ifdef STATS_HASH
|
|
||||||
STAT_HASH_CREATION++;
|
|
||||||
STAT_HASH_SIZE += h->size;
|
|
||||||
#endif
|
|
||||||
/* Copy info so that caller may free it. */
|
|
||||||
h->info.key_offset = info->key_offset;
|
|
||||||
h->info.calloc = info->calloc;
|
|
||||||
h->info.free = info->free;
|
|
||||||
h->info.alloc = info->alloc;
|
|
||||||
h->info.data = info->data;
|
|
||||||
h->t = (h->info.calloc)(h->size, sizeof(struct _ohash_record),
|
|
||||||
h->info.data);
|
|
||||||
h->total = h->deleted = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t
|
|
||||||
ohash_interval(const char *s, const char **e)
|
|
||||||
{
|
|
||||||
uint32_t k;
|
|
||||||
|
|
||||||
if (!*e)
|
|
||||||
*e = s + strlen(s);
|
|
||||||
if (s == *e)
|
|
||||||
k = 0;
|
|
||||||
else
|
|
||||||
k = *s++;
|
|
||||||
while (s != *e)
|
|
||||||
k = ((k << 2) | (k >> 30)) ^ *s++;
|
|
||||||
return k;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int
|
|
||||||
ohash_lookup_interval(struct ohash *h, const char *start, const char *end,
|
|
||||||
uint32_t hv)
|
|
||||||
{
|
|
||||||
unsigned int i, incr;
|
|
||||||
unsigned int empty;
|
|
||||||
|
|
||||||
#ifdef STATS_HASH
|
|
||||||
STAT_HASH_LOOKUP++;
|
|
||||||
#endif
|
|
||||||
empty = NONE;
|
|
||||||
i = hv % h->size;
|
|
||||||
incr = ((hv % (h->size-2)) & ~1) + 1;
|
|
||||||
while (h->t[i].p != NULL) {
|
|
||||||
#ifdef STATS_HASH
|
|
||||||
STAT_HASH_LENGTH++;
|
|
||||||
#endif
|
|
||||||
if (h->t[i].p == DELETED) {
|
|
||||||
if (empty == NONE)
|
|
||||||
empty = i;
|
|
||||||
} else if (h->t[i].hv == hv &&
|
|
||||||
strncmp(h->t[i].p+h->info.key_offset, start,
|
|
||||||
end - start) == 0 &&
|
|
||||||
(h->t[i].p+h->info.key_offset)[end-start] == '\0') {
|
|
||||||
if (empty != NONE) {
|
|
||||||
h->t[empty].hv = hv;
|
|
||||||
h->t[empty].p = h->t[i].p;
|
|
||||||
h->t[i].p = DELETED;
|
|
||||||
return empty;
|
|
||||||
} else {
|
|
||||||
#ifdef STATS_HASH
|
|
||||||
STAT_HASH_POSITIVE++;
|
|
||||||
#endif
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
i += incr;
|
|
||||||
if (i >= h->size)
|
|
||||||
i -= h->size;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Found an empty position. */
|
|
||||||
if (empty != NONE)
|
|
||||||
i = empty;
|
|
||||||
h->t[i].hv = hv;
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int
|
|
||||||
ohash_lookup_memory(struct ohash *h, const char *k, size_t size, uint32_t hv)
|
|
||||||
{
|
|
||||||
unsigned int i, incr;
|
|
||||||
unsigned int empty;
|
|
||||||
|
|
||||||
#ifdef STATS_HASH
|
|
||||||
STAT_HASH_LOOKUP++;
|
|
||||||
#endif
|
|
||||||
empty = NONE;
|
|
||||||
i = hv % h->size;
|
|
||||||
incr = ((hv % (h->size-2)) & ~1) + 1;
|
|
||||||
while (h->t[i].p != NULL) {
|
|
||||||
#ifdef STATS_HASH
|
|
||||||
STAT_HASH_LENGTH++;
|
|
||||||
#endif
|
|
||||||
if (h->t[i].p == DELETED) {
|
|
||||||
if (empty == NONE)
|
|
||||||
empty = i;
|
|
||||||
} else if (h->t[i].hv == hv &&
|
|
||||||
memcmp(h->t[i].p+h->info.key_offset, k, size) == 0) {
|
|
||||||
if (empty != NONE) {
|
|
||||||
h->t[empty].hv = hv;
|
|
||||||
h->t[empty].p = h->t[i].p;
|
|
||||||
h->t[i].p = DELETED;
|
|
||||||
return empty;
|
|
||||||
} else {
|
|
||||||
#ifdef STATS_HASH
|
|
||||||
STAT_HASH_POSITIVE++;
|
|
||||||
#endif
|
|
||||||
} return i;
|
|
||||||
}
|
|
||||||
i += incr;
|
|
||||||
if (i >= h->size)
|
|
||||||
i -= h->size;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Found an empty position. */
|
|
||||||
if (empty != NONE)
|
|
||||||
i = empty;
|
|
||||||
h->t[i].hv = hv;
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int
|
|
||||||
ohash_qlookup(struct ohash *h, const char *s)
|
|
||||||
{
|
|
||||||
const char *e = NULL;
|
|
||||||
return ohash_qlookupi(h, s, &e);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int
|
|
||||||
ohash_qlookupi(struct ohash *h, const char *s, const char **e)
|
|
||||||
{
|
|
||||||
uint32_t hv;
|
|
||||||
|
|
||||||
hv = ohash_interval(s, e);
|
|
||||||
return ohash_lookup_interval(h, s, *e, hv);
|
|
||||||
}
|
|
|
@ -1,74 +0,0 @@
|
||||||
/* $OpenBSD: src/lib/libutil/ohash.h,v 1.2 2014/06/02 18:52:03 deraadt Exp $ */
|
|
||||||
|
|
||||||
/* Copyright (c) 1999, 2004 Marc Espie <espie@openbsd.org>
|
|
||||||
*
|
|
||||||
* Permission to use, copy, modify, and distribute this software for any
|
|
||||||
* purpose with or without fee is hereby granted, provided that the above
|
|
||||||
* copyright notice and this permission notice appear in all copies.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
||||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef OHASH_H
|
|
||||||
#define OHASH_H
|
|
||||||
|
|
||||||
/* Open hashing support.
|
|
||||||
* Open hashing was chosen because it is much lighter than other hash
|
|
||||||
* techniques, and more efficient in most cases.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* user-visible data structure */
|
|
||||||
struct ohash_info {
|
|
||||||
ptrdiff_t key_offset;
|
|
||||||
void *data; /* user data */
|
|
||||||
void *(*calloc)(size_t, size_t, void *);
|
|
||||||
void (*free)(void *, void *);
|
|
||||||
void *(*alloc)(size_t, void *);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct _ohash_record;
|
|
||||||
|
|
||||||
/* private structure. It's there just so you can do a sizeof */
|
|
||||||
struct ohash {
|
|
||||||
struct _ohash_record *t;
|
|
||||||
struct ohash_info info;
|
|
||||||
unsigned int size;
|
|
||||||
unsigned int total;
|
|
||||||
unsigned int deleted;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* For this to be tweakable, we use small primitives, and leave part of the
|
|
||||||
* logic to the client application. e.g., hashing is left to the client
|
|
||||||
* application. We also provide a simple table entry lookup that yields
|
|
||||||
* a hashing table index (opaque) to be used in find/insert/remove.
|
|
||||||
* The keys are stored at a known position in the client data.
|
|
||||||
*/
|
|
||||||
__BEGIN_DECLS
|
|
||||||
void ohash_init(struct ohash *, unsigned, struct ohash_info *);
|
|
||||||
void ohash_delete(struct ohash *);
|
|
||||||
|
|
||||||
unsigned int ohash_lookup_interval(struct ohash *, const char *,
|
|
||||||
const char *, uint32_t);
|
|
||||||
unsigned int ohash_lookup_memory(struct ohash *, const char *,
|
|
||||||
size_t, uint32_t)
|
|
||||||
__attribute__ ((__bounded__(__string__,2,3)));
|
|
||||||
void *ohash_find(struct ohash *, unsigned int);
|
|
||||||
void *ohash_remove(struct ohash *, unsigned int);
|
|
||||||
void *ohash_insert(struct ohash *, unsigned int, void *);
|
|
||||||
void *ohash_first(struct ohash *, unsigned int *);
|
|
||||||
void *ohash_next(struct ohash *, unsigned int *);
|
|
||||||
unsigned int ohash_entries(struct ohash *);
|
|
||||||
|
|
||||||
void *ohash_create_entry(struct ohash_info *, const char *, const char **);
|
|
||||||
uint32_t ohash_interval(const char *, const char **);
|
|
||||||
|
|
||||||
unsigned int ohash_qlookupi(struct ohash *, const char *, const char **);
|
|
||||||
unsigned int ohash_qlookup(struct ohash *, const char *);
|
|
||||||
__END_DECLS
|
|
||||||
#endif
|
|
|
@ -1,133 +0,0 @@
|
||||||
From 038961e57c645f7bc90496a23fb20894a21b6ced Mon Sep 17 00:00:00 2001
|
|
||||||
From: mancha <mancha1 AT zoho DOT com>
|
|
||||||
Date: Tue, 2 Sep 2014
|
|
||||||
Subject: Allow adding, changing, and removing passphrases
|
|
||||||
|
|
||||||
signify.1 | 6 +++++
|
|
||||||
signify.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++--
|
|
||||||
2 files changed, 64 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
--- a/signify.c
|
|
||||||
+++ b/signify.c
|
|
||||||
@@ -84,6 +84,7 @@
|
|
||||||
"\t%1$s -C [-q] -p pubkey -x sigfile [file ...]\n"
|
|
||||||
"\t%1$s -G [-n] [-c comment] -p pubkey -s seckey\n"
|
|
||||||
"\t%1$s -I [-p pubkey] [-s seckey] [-x sigfile]\n"
|
|
||||||
+ "\t%1$s -P [-n] -s seckey\n"
|
|
||||||
"\t%1$s -S [-e] [-x sigfile] -s seckey -m message\n"
|
|
||||||
#endif
|
|
||||||
"\t%1$s -V [-eq] [-x sigfile] -p pubkey -m message\n",
|
|
||||||
@@ -671,6 +672,50 @@
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
+static void
|
|
||||||
+passphrase(const char *seckeyfile, int nrounds)
|
|
||||||
+{
|
|
||||||
+ uint8_t digest[SHA512_DIGEST_LENGTH];
|
|
||||||
+ struct enckey enckey;
|
|
||||||
+ uint8_t xorkey[sizeof(enckey.seckey)];
|
|
||||||
+ char comment[COMMENTMAXLEN];
|
|
||||||
+ int i, rounds;
|
|
||||||
+ SHA2_CTX ctx;
|
|
||||||
+
|
|
||||||
+ readb64file(seckeyfile, &enckey, sizeof(enckey), comment);
|
|
||||||
+
|
|
||||||
+ if (memcmp(enckey.kdfalg, KDFALG, 2) != 0)
|
|
||||||
+ errx(1, "unsupported KDF");
|
|
||||||
+ rounds = ntohl(enckey.kdfrounds);
|
|
||||||
+ if (rounds != 0)
|
|
||||||
+ printf("Current passphrase\n");
|
|
||||||
+ kdf(enckey.salt, sizeof(enckey.salt), rounds, 1, 0,
|
|
||||||
+ xorkey, sizeof(xorkey));
|
|
||||||
+ for (i = 0; i < sizeof(enckey.seckey); i++)
|
|
||||||
+ enckey.seckey[i] ^= xorkey[i];
|
|
||||||
+ explicit_bzero(xorkey, sizeof(xorkey));
|
|
||||||
+ SHA512Init(&ctx);
|
|
||||||
+ SHA512Update(&ctx, enckey.seckey, sizeof(enckey.seckey));
|
|
||||||
+ SHA512Final(digest, &ctx);
|
|
||||||
+ if (memcmp(enckey.checksum, digest, sizeof(enckey.checksum)) != 0)
|
|
||||||
+ errx(1, "incorrect passphrase");
|
|
||||||
+ explicit_bzero(digest, sizeof(digest));
|
|
||||||
+
|
|
||||||
+ if (nrounds != 0) {
|
|
||||||
+ arc4random_buf(enckey.salt, sizeof(enckey.salt));
|
|
||||||
+ printf("New passphrase\n");
|
|
||||||
+ }
|
|
||||||
+ enckey.kdfrounds = htonl(nrounds);
|
|
||||||
+ kdf(enckey.salt, sizeof(enckey.salt), nrounds, 1, 1,
|
|
||||||
+ xorkey, sizeof(xorkey));
|
|
||||||
+ for (i = 0; i < sizeof(enckey.seckey); i++)
|
|
||||||
+ enckey.seckey[i] ^= xorkey[i];
|
|
||||||
+ explicit_bzero(xorkey, sizeof(xorkey));
|
|
||||||
+ writeb64file(seckeyfile, comment, &enckey,
|
|
||||||
+ sizeof(enckey), NULL, 0, 0, 0600);
|
|
||||||
+ explicit_bzero(&enckey, sizeof(enckey));
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
int
|
|
||||||
main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
@@ -687,13 +732,14 @@
|
|
||||||
GENERATE,
|
|
||||||
INSPECT,
|
|
||||||
SIGN,
|
|
||||||
- VERIFY
|
|
||||||
+ VERIFY,
|
|
||||||
+ PASSPHRASE
|
|
||||||
} verb = NONE;
|
|
||||||
|
|
||||||
|
|
||||||
rounds = 42;
|
|
||||||
|
|
||||||
- while ((ch = getopt(argc, argv, "CGISVc:em:np:qs:x:")) != -1) {
|
|
||||||
+ while ((ch = getopt(argc, argv, "CGIPSVc:em:np:qs:x:")) != -1) {
|
|
||||||
switch (ch) {
|
|
||||||
#ifndef VERIFYONLY
|
|
||||||
case 'C':
|
|
||||||
@@ -711,6 +757,11 @@
|
|
||||||
usage(NULL);
|
|
||||||
verb = INSPECT;
|
|
||||||
break;
|
|
||||||
+ case 'P':
|
|
||||||
+ if (verb)
|
|
||||||
+ usage(NULL);
|
|
||||||
+ verb = PASSPHRASE;
|
|
||||||
+ break;
|
|
||||||
case 'S':
|
|
||||||
if (verb)
|
|
||||||
usage(NULL);
|
|
||||||
@@ -791,6 +842,11 @@
|
|
||||||
usage("must specify message and seckey");
|
|
||||||
sign(seckeyfile, msgfile, sigfile, embedded);
|
|
||||||
break;
|
|
||||||
+ case PASSPHRASE:
|
|
||||||
+ if (!seckeyfile)
|
|
||||||
+ usage("must specify seckey");
|
|
||||||
+ passphrase(seckeyfile, rounds);
|
|
||||||
+ break;
|
|
||||||
#endif
|
|
||||||
case VERIFY:
|
|
||||||
if (!msgfile)
|
|
||||||
--- a/signify.1
|
|
||||||
+++ b/signify.1
|
|
||||||
@@ -39,6 +39,10 @@
|
|
||||||
.Op Fl s Ar seckey
|
|
||||||
.Op Fl x Ar sigfile
|
|
||||||
.Nm signify
|
|
||||||
+.Fl P
|
|
||||||
+.Op Fl n
|
|
||||||
+.Fl s Ar seckey
|
|
||||||
+.Nm signify
|
|
||||||
.Fl S
|
|
||||||
.Op Fl e
|
|
||||||
.Op Fl x Ar sigfile
|
|
||||||
@@ -69,6 +73,8 @@
|
|
||||||
Generate a new key pair.
|
|
||||||
.It Fl I
|
|
||||||
Inspect the specified keys or signature and print their fingerprint.
|
|
||||||
+.It Fl P
|
|
||||||
+Add, change, or remove secret key passphrases.
|
|
||||||
.It Fl S
|
|
||||||
Sign the specified message file and create a signature.
|
|
||||||
.It Fl V
|
|
|
@ -1,92 +0,0 @@
|
||||||
diff --git a/.gitignore b/.gitignore
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000..e7707be
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/.gitignore
|
|
||||||
@@ -0,0 +1,4 @@
|
|
||||||
+*.o
|
|
||||||
+signify
|
|
||||||
+*.a
|
|
||||||
+*.so*
|
|
||||||
\ No newline at end of file
|
|
||||||
diff --git a/Makefile b/Makefile
|
|
||||||
index c332dd4..6780617 100644
|
|
||||||
--- a/Makefile
|
|
||||||
+++ b/Makefile
|
|
||||||
@@ -9,31 +9,37 @@ DESTDIR=
|
|
||||||
|
|
||||||
CC=gcc
|
|
||||||
AR=ar
|
|
||||||
-LIB=static
|
|
||||||
INSTALL=/usr/bin/install -c
|
|
||||||
|
|
||||||
-CFLAGS=-O2 -D_FORTIFY_SOURCE=2 -ftrapv -fPIE -fstack-protector-all \
|
|
||||||
+CFLAGS=-O2 -D_FORTIFY_SOURCE=2 -fPIC -ftrapv -fPIE -fstack-protector-all \
|
|
||||||
-Wno-attributes -Wno-unused-result -Ibsd-compat -I.
|
|
||||||
|
|
||||||
TARGET = signify
|
|
||||||
|
|
||||||
-TARGET_LIB = libsignify_$(LIB).a
|
|
||||||
+SIGNIFY_STATIC_LIB = libsignify_static.a
|
|
||||||
+SIGNIFY_SHARED_LIB = libsignify_shared.so
|
|
||||||
|
|
||||||
-SIGNIFY_OBJS = signify.o fe25519.o sc25519.o smult_curve25519_ref.o \
|
|
||||||
+SIGNIFY_OBJS = fe25519.o sc25519.o smult_curve25519_ref.o \
|
|
||||||
mod_ed25519.o mod_ge25519.o crypto_api.o base64.o bcrypt_pbkdf.o \
|
|
||||||
explicit_bzero.o arc4random.o timingsafe_bcmp.o sha2.o blowfish.o \
|
|
||||||
readpassphrase.o strlcpy.o helpers.o ohash.o
|
|
||||||
|
|
||||||
all: $(TARGET) $(TARGET_LIB)
|
|
||||||
|
|
||||||
-$(TARGET): $(SIGNIFY_OBJS)
|
|
||||||
- $(CC) $(CFLAGS) -o $(TARGET) $(SIGNIFY_OBJS)
|
|
||||||
+%.o: %.c
|
|
||||||
+ $(CC) $(CFLAGS) -c $<
|
|
||||||
|
|
||||||
-$(TARGET_LIB): $(SIGNIFY_OBJS)
|
|
||||||
- $(AR) crs $(TARGET_LIB) $(SIGNIFY_OBJS)
|
|
||||||
+$(SIGNIFY_STATIC_LIB): $(SIGNIFY_OBJS)
|
|
||||||
+ $(AR) crs $@ $(SIGNIFY_OBJS)
|
|
||||||
+
|
|
||||||
+$(SIGNIFY_SHARED_LIB): $(SIGNIFY_STATIC_LIB)
|
|
||||||
+ $(CC) -shared -o $@ $(SIGNIFY_STATIC_LIB)
|
|
||||||
+
|
|
||||||
+$(TARGET): $(SIGNIFY_STATIC_LIB) $(SIGNIFY_STATIC_LIB)
|
|
||||||
+ $(CC) $(CFLAGS) -o $(TARGET) signify.c $(SIGNIFY_STATIC_LIB)
|
|
||||||
|
|
||||||
clean:
|
|
||||||
- @rm -f *.o signify $(TARGET_LIB)
|
|
||||||
+ rm -f *.o *.so *.a signify
|
|
||||||
|
|
||||||
install:
|
|
||||||
$(INSTALL) -c -D -m 0755 signify $(DESTDIR)/$(bindir)/signify
|
|
||||||
diff --git a/README b/README
|
|
||||||
index b999d28..b5cb832 100644
|
|
||||||
--- a/README
|
|
||||||
+++ b/README
|
|
||||||
@@ -14,3 +14,8 @@ OpenBSD but in no way undermines compatibility of keys and signatures.
|
|
||||||
HOWTO and the manpage contain sample usage.
|
|
||||||
|
|
||||||
mancha <mancha1 AT zoho DOT com>
|
|
||||||
+
|
|
||||||
+Based on http://sourceforge.net/projects/slackdepot/files/signify/,
|
|
||||||
+this fork builds libsignify additionally to be used with external tools
|
|
||||||
+
|
|
||||||
+Harshavardhana <harsha AT harshavardhana DOT net>
|
|
||||||
\ No newline at end of file
|
|
||||||
diff --git a/fe25519.h b/fe25519.h
|
|
||||||
index 41b3cbb..6d347c7 100644
|
|
||||||
--- a/fe25519.h
|
|
||||||
+++ b/fe25519.h
|
|
||||||
@@ -29,9 +29,9 @@
|
|
||||||
#define fe25519_invert crypto_sign_ed25519_ref_fe25519_invert
|
|
||||||
#define fe25519_pow2523 crypto_sign_ed25519_ref_fe25519_pow2523
|
|
||||||
|
|
||||||
-typedef struct
|
|
||||||
+typedef struct
|
|
||||||
{
|
|
||||||
- crypto_uint32 v[32];
|
|
||||||
+ crypto_uint32 v[32];
|
|
||||||
}
|
|
||||||
fe25519;
|
|
||||||
|
|
|
@ -1,208 +0,0 @@
|
||||||
/* $OpenBSD: readpassphrase.c,v 1.22 2010/01/13 10:20:54 dtucker Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 2000-2002, 2007 Todd C. Miller <Todd.Miller@courtesan.com>
|
|
||||||
*
|
|
||||||
* Permission to use, copy, modify, and distribute this software for any
|
|
||||||
* purpose with or without fee is hereby granted, provided that the above
|
|
||||||
* copyright notice and this permission notice appear in all copies.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
||||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
*
|
|
||||||
* Sponsored in part by the Defense Advanced Research Projects
|
|
||||||
* Agency (DARPA) and Air Force Research Laboratory, Air Force
|
|
||||||
* Materiel Command, USAF, under agreement number F39502-99-1-0512.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* OPENBSD ORIGINAL: lib/libc/gen/readpassphrase.c */
|
|
||||||
|
|
||||||
#ifndef HAVE_READPASSPHRASE
|
|
||||||
|
|
||||||
#include <termios.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <readpassphrase.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#ifdef TCSASOFT
|
|
||||||
# define _T_FLUSH (TCSAFLUSH|TCSASOFT)
|
|
||||||
#else
|
|
||||||
# define _T_FLUSH (TCSAFLUSH)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Cygwin lacks _NSIG but has NSIG */
|
|
||||||
#if !defined(_NSIG) && defined (NSIG)
|
|
||||||
# define _NSIG NSIG
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* SunOS 4.x which lacks _POSIX_VDISABLE, but has VDISABLE */
|
|
||||||
#if !defined(_POSIX_VDISABLE) && defined(VDISABLE)
|
|
||||||
# define _POSIX_VDISABLE VDISABLE
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static volatile sig_atomic_t signo[_NSIG];
|
|
||||||
|
|
||||||
static void handler(int);
|
|
||||||
|
|
||||||
char *
|
|
||||||
readpassphrase(const char *prompt, char *buf, size_t bufsiz, int flags)
|
|
||||||
{
|
|
||||||
ssize_t nr;
|
|
||||||
int input, output, save_errno, i, need_restart;
|
|
||||||
char ch, *p, *end;
|
|
||||||
struct termios term, oterm;
|
|
||||||
struct sigaction sa, savealrm, saveint, savehup, savequit, saveterm;
|
|
||||||
struct sigaction savetstp, savettin, savettou, savepipe;
|
|
||||||
|
|
||||||
/* I suppose we could alloc on demand in this case (XXX). */
|
|
||||||
if (bufsiz == 0) {
|
|
||||||
errno = EINVAL;
|
|
||||||
return(NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
restart:
|
|
||||||
for (i = 0; i < _NSIG; i++)
|
|
||||||
signo[i] = 0;
|
|
||||||
nr = -1;
|
|
||||||
save_errno = 0;
|
|
||||||
need_restart = 0;
|
|
||||||
/*
|
|
||||||
* Read and write to /dev/tty if available. If not, read from
|
|
||||||
* stdin and write to stderr unless a tty is required.
|
|
||||||
*/
|
|
||||||
if ((flags & RPP_STDIN) ||
|
|
||||||
(input = output = open(_PATH_TTY, O_RDWR)) == -1) {
|
|
||||||
if (flags & RPP_REQUIRE_TTY) {
|
|
||||||
errno = ENOTTY;
|
|
||||||
return(NULL);
|
|
||||||
}
|
|
||||||
input = STDIN_FILENO;
|
|
||||||
output = STDERR_FILENO;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Catch signals that would otherwise cause the user to end
|
|
||||||
* up with echo turned off in the shell. Don't worry about
|
|
||||||
* things like SIGXCPU and SIGVTALRM for now.
|
|
||||||
*/
|
|
||||||
sigemptyset(&sa.sa_mask);
|
|
||||||
sa.sa_flags = 0; /* don't restart system calls */
|
|
||||||
sa.sa_handler = handler;
|
|
||||||
(void)sigaction(SIGALRM, &sa, &savealrm);
|
|
||||||
(void)sigaction(SIGHUP, &sa, &savehup);
|
|
||||||
(void)sigaction(SIGINT, &sa, &saveint);
|
|
||||||
(void)sigaction(SIGPIPE, &sa, &savepipe);
|
|
||||||
(void)sigaction(SIGQUIT, &sa, &savequit);
|
|
||||||
(void)sigaction(SIGTERM, &sa, &saveterm);
|
|
||||||
(void)sigaction(SIGTSTP, &sa, &savetstp);
|
|
||||||
(void)sigaction(SIGTTIN, &sa, &savettin);
|
|
||||||
(void)sigaction(SIGTTOU, &sa, &savettou);
|
|
||||||
|
|
||||||
/* Turn off echo if possible. */
|
|
||||||
if (input != STDIN_FILENO && tcgetattr(input, &oterm) == 0) {
|
|
||||||
memcpy(&term, &oterm, sizeof(term));
|
|
||||||
if (!(flags & RPP_ECHO_ON))
|
|
||||||
term.c_lflag &= ~(ECHO | ECHONL);
|
|
||||||
#ifdef VSTATUS
|
|
||||||
if (term.c_cc[VSTATUS] != _POSIX_VDISABLE)
|
|
||||||
term.c_cc[VSTATUS] = _POSIX_VDISABLE;
|
|
||||||
#endif
|
|
||||||
(void)tcsetattr(input, _T_FLUSH, &term);
|
|
||||||
} else {
|
|
||||||
memset(&term, 0, sizeof(term));
|
|
||||||
term.c_lflag |= ECHO;
|
|
||||||
memset(&oterm, 0, sizeof(oterm));
|
|
||||||
oterm.c_lflag |= ECHO;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* No I/O if we are already backgrounded. */
|
|
||||||
if (signo[SIGTTOU] != 1 && signo[SIGTTIN] != 1) {
|
|
||||||
if (!(flags & RPP_STDIN))
|
|
||||||
(void)write(output, prompt, strlen(prompt));
|
|
||||||
end = buf + bufsiz - 1;
|
|
||||||
p = buf;
|
|
||||||
while ((nr = read(input, &ch, 1)) == 1 && ch != '\n' && ch != '\r') {
|
|
||||||
if (p < end) {
|
|
||||||
if ((flags & RPP_SEVENBIT))
|
|
||||||
ch &= 0x7f;
|
|
||||||
if (isalpha(ch)) {
|
|
||||||
if ((flags & RPP_FORCELOWER))
|
|
||||||
ch = (char)tolower(ch);
|
|
||||||
if ((flags & RPP_FORCEUPPER))
|
|
||||||
ch = (char)toupper(ch);
|
|
||||||
}
|
|
||||||
*p++ = ch;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*p = '\0';
|
|
||||||
save_errno = errno;
|
|
||||||
if (!(term.c_lflag & ECHO))
|
|
||||||
(void)write(output, "\n", 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Restore old terminal settings and signals. */
|
|
||||||
if (memcmp(&term, &oterm, sizeof(term)) != 0) {
|
|
||||||
while (tcsetattr(input, _T_FLUSH, &oterm) == -1 &&
|
|
||||||
errno == EINTR)
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
(void)sigaction(SIGALRM, &savealrm, NULL);
|
|
||||||
(void)sigaction(SIGHUP, &savehup, NULL);
|
|
||||||
(void)sigaction(SIGINT, &saveint, NULL);
|
|
||||||
(void)sigaction(SIGQUIT, &savequit, NULL);
|
|
||||||
(void)sigaction(SIGPIPE, &savepipe, NULL);
|
|
||||||
(void)sigaction(SIGTERM, &saveterm, NULL);
|
|
||||||
(void)sigaction(SIGTSTP, &savetstp, NULL);
|
|
||||||
(void)sigaction(SIGTTIN, &savettin, NULL);
|
|
||||||
(void)sigaction(SIGTTOU, &savettou, NULL);
|
|
||||||
if (input != STDIN_FILENO)
|
|
||||||
(void)close(input);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If we were interrupted by a signal, resend it to ourselves
|
|
||||||
* now that we have restored the signal handlers.
|
|
||||||
*/
|
|
||||||
for (i = 0; i < _NSIG; i++) {
|
|
||||||
if (signo[i]) {
|
|
||||||
kill(getpid(), i);
|
|
||||||
switch (i) {
|
|
||||||
case SIGTSTP:
|
|
||||||
case SIGTTIN:
|
|
||||||
case SIGTTOU:
|
|
||||||
need_restart = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (need_restart)
|
|
||||||
goto restart;
|
|
||||||
|
|
||||||
if (save_errno)
|
|
||||||
errno = save_errno;
|
|
||||||
return(nr == -1 ? NULL : buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
char *
|
|
||||||
getpass(const char *prompt)
|
|
||||||
{
|
|
||||||
static char buf[_PASSWORD_LEN + 1];
|
|
||||||
|
|
||||||
return(readpassphrase(prompt, buf, sizeof(buf), RPP_ECHO_OFF));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void handler(int s)
|
|
||||||
{
|
|
||||||
|
|
||||||
signo[s] = 1;
|
|
||||||
}
|
|
||||||
#endif /* HAVE_READPASSPHRASE */
|
|
|
@ -1,306 +0,0 @@
|
||||||
/* $OpenBSD: sc25519.c,v 1.3 2013/12/09 11:03:45 markus Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Public Domain, Authors: Daniel J. Bernstein, Niels Duif, Tanja Lange,
|
|
||||||
* Peter Schwabe, Bo-Yin Yang.
|
|
||||||
* Copied from supercop-20130419/crypto_sign/ed25519/ref/sc25519.c
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "sc25519.h"
|
|
||||||
|
|
||||||
/*Arithmetic modulo the group order m = 2^252 + 27742317777372353535851937790883648493 = 7237005577332262213973186563042994240857116359379907606001950938285454250989 */
|
|
||||||
|
|
||||||
static const crypto_uint32 m[32] = {0xED, 0xD3, 0xF5, 0x5C, 0x1A, 0x63, 0x12, 0x58, 0xD6, 0x9C, 0xF7, 0xA2, 0xDE, 0xF9, 0xDE, 0x14,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10};
|
|
||||||
|
|
||||||
static const crypto_uint32 mu[33] = {0x1B, 0x13, 0x2C, 0x0A, 0xA3, 0xE5, 0x9C, 0xED, 0xA7, 0x29, 0x63, 0x08, 0x5D, 0x21, 0x06, 0x21,
|
|
||||||
0xEB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F};
|
|
||||||
|
|
||||||
static crypto_uint32 lt(crypto_uint32 a,crypto_uint32 b) /* 16-bit inputs */
|
|
||||||
{
|
|
||||||
unsigned int x = a;
|
|
||||||
x -= (unsigned int) b; /* 0..65535: no; 4294901761..4294967295: yes */
|
|
||||||
x >>= 31; /* 0: no; 1: yes */
|
|
||||||
return x;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Reduce coefficients of r before calling reduce_add_sub */
|
|
||||||
static void reduce_add_sub(sc25519 *r)
|
|
||||||
{
|
|
||||||
crypto_uint32 pb = 0;
|
|
||||||
crypto_uint32 b;
|
|
||||||
crypto_uint32 mask;
|
|
||||||
int i;
|
|
||||||
unsigned char t[32];
|
|
||||||
|
|
||||||
for(i=0;i<32;i++)
|
|
||||||
{
|
|
||||||
pb += m[i];
|
|
||||||
b = lt(r->v[i],pb);
|
|
||||||
t[i] = r->v[i]-pb+(b<<8);
|
|
||||||
pb = b;
|
|
||||||
}
|
|
||||||
mask = b - 1;
|
|
||||||
for(i=0;i<32;i++)
|
|
||||||
r->v[i] ^= mask & (r->v[i] ^ t[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Reduce coefficients of x before calling barrett_reduce */
|
|
||||||
static void barrett_reduce(sc25519 *r, const crypto_uint32 x[64])
|
|
||||||
{
|
|
||||||
/* See HAC, Alg. 14.42 */
|
|
||||||
int i,j;
|
|
||||||
crypto_uint32 q2[66];
|
|
||||||
crypto_uint32 *q3 = q2 + 33;
|
|
||||||
crypto_uint32 r1[33];
|
|
||||||
crypto_uint32 r2[33];
|
|
||||||
crypto_uint32 carry;
|
|
||||||
crypto_uint32 pb = 0;
|
|
||||||
crypto_uint32 b;
|
|
||||||
|
|
||||||
for (i = 0;i < 66;++i) q2[i] = 0;
|
|
||||||
for (i = 0;i < 33;++i) r2[i] = 0;
|
|
||||||
|
|
||||||
for(i=0;i<33;i++)
|
|
||||||
for(j=0;j<33;j++)
|
|
||||||
if(i+j >= 31) q2[i+j] += mu[i]*x[j+31];
|
|
||||||
carry = q2[31] >> 8;
|
|
||||||
q2[32] += carry;
|
|
||||||
carry = q2[32] >> 8;
|
|
||||||
q2[33] += carry;
|
|
||||||
|
|
||||||
for(i=0;i<33;i++)r1[i] = x[i];
|
|
||||||
for(i=0;i<32;i++)
|
|
||||||
for(j=0;j<33;j++)
|
|
||||||
if(i+j < 33) r2[i+j] += m[i]*q3[j];
|
|
||||||
|
|
||||||
for(i=0;i<32;i++)
|
|
||||||
{
|
|
||||||
carry = r2[i] >> 8;
|
|
||||||
r2[i+1] += carry;
|
|
||||||
r2[i] &= 0xff;
|
|
||||||
}
|
|
||||||
|
|
||||||
for(i=0;i<32;i++)
|
|
||||||
{
|
|
||||||
pb += r2[i];
|
|
||||||
b = lt(r1[i],pb);
|
|
||||||
r->v[i] = r1[i]-pb+(b<<8);
|
|
||||||
pb = b;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* XXX: Can it really happen that r<0?, See HAC, Alg 14.42, Step 3
|
|
||||||
* If so: Handle it here!
|
|
||||||
*/
|
|
||||||
|
|
||||||
reduce_add_sub(r);
|
|
||||||
reduce_add_sub(r);
|
|
||||||
}
|
|
||||||
|
|
||||||
void sc25519_from32bytes(sc25519 *r, const unsigned char x[32])
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
crypto_uint32 t[64];
|
|
||||||
for(i=0;i<32;i++) t[i] = x[i];
|
|
||||||
for(i=32;i<64;++i) t[i] = 0;
|
|
||||||
barrett_reduce(r, t);
|
|
||||||
}
|
|
||||||
|
|
||||||
void shortsc25519_from16bytes(shortsc25519 *r, const unsigned char x[16])
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for(i=0;i<16;i++) r->v[i] = x[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
void sc25519_from64bytes(sc25519 *r, const unsigned char x[64])
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
crypto_uint32 t[64];
|
|
||||||
for(i=0;i<64;i++) t[i] = x[i];
|
|
||||||
barrett_reduce(r, t);
|
|
||||||
}
|
|
||||||
|
|
||||||
void sc25519_from_shortsc(sc25519 *r, const shortsc25519 *x)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for(i=0;i<16;i++)
|
|
||||||
r->v[i] = x->v[i];
|
|
||||||
for(i=0;i<16;i++)
|
|
||||||
r->v[16+i] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void sc25519_to32bytes(unsigned char r[32], const sc25519 *x)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for(i=0;i<32;i++) r[i] = x->v[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
int sc25519_iszero_vartime(const sc25519 *x)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for(i=0;i<32;i++)
|
|
||||||
if(x->v[i] != 0) return 0;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int sc25519_isshort_vartime(const sc25519 *x)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for(i=31;i>15;i--)
|
|
||||||
if(x->v[i] != 0) return 0;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int sc25519_lt_vartime(const sc25519 *x, const sc25519 *y)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for(i=31;i>=0;i--)
|
|
||||||
{
|
|
||||||
if(x->v[i] < y->v[i]) return 1;
|
|
||||||
if(x->v[i] > y->v[i]) return 0;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void sc25519_add(sc25519 *r, const sc25519 *x, const sc25519 *y)
|
|
||||||
{
|
|
||||||
int i, carry;
|
|
||||||
for(i=0;i<32;i++) r->v[i] = x->v[i] + y->v[i];
|
|
||||||
for(i=0;i<31;i++)
|
|
||||||
{
|
|
||||||
carry = r->v[i] >> 8;
|
|
||||||
r->v[i+1] += carry;
|
|
||||||
r->v[i] &= 0xff;
|
|
||||||
}
|
|
||||||
reduce_add_sub(r);
|
|
||||||
}
|
|
||||||
|
|
||||||
void sc25519_sub_nored(sc25519 *r, const sc25519 *x, const sc25519 *y)
|
|
||||||
{
|
|
||||||
crypto_uint32 b = 0;
|
|
||||||
crypto_uint32 t;
|
|
||||||
int i;
|
|
||||||
for(i=0;i<32;i++)
|
|
||||||
{
|
|
||||||
t = x->v[i] - y->v[i] - b;
|
|
||||||
r->v[i] = t & 255;
|
|
||||||
b = (t >> 8) & 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void sc25519_mul(sc25519 *r, const sc25519 *x, const sc25519 *y)
|
|
||||||
{
|
|
||||||
int i,j,carry;
|
|
||||||
crypto_uint32 t[64];
|
|
||||||
for(i=0;i<64;i++)t[i] = 0;
|
|
||||||
|
|
||||||
for(i=0;i<32;i++)
|
|
||||||
for(j=0;j<32;j++)
|
|
||||||
t[i+j] += x->v[i] * y->v[j];
|
|
||||||
|
|
||||||
/* Reduce coefficients */
|
|
||||||
for(i=0;i<63;i++)
|
|
||||||
{
|
|
||||||
carry = t[i] >> 8;
|
|
||||||
t[i+1] += carry;
|
|
||||||
t[i] &= 0xff;
|
|
||||||
}
|
|
||||||
|
|
||||||
barrett_reduce(r, t);
|
|
||||||
}
|
|
||||||
|
|
||||||
void sc25519_mul_shortsc(sc25519 *r, const sc25519 *x, const shortsc25519 *y)
|
|
||||||
{
|
|
||||||
sc25519 t;
|
|
||||||
sc25519_from_shortsc(&t, y);
|
|
||||||
sc25519_mul(r, x, &t);
|
|
||||||
}
|
|
||||||
|
|
||||||
void sc25519_window3(signed char r[85], const sc25519 *s)
|
|
||||||
{
|
|
||||||
char carry;
|
|
||||||
int i;
|
|
||||||
for(i=0;i<10;i++)
|
|
||||||
{
|
|
||||||
r[8*i+0] = s->v[3*i+0] & 7;
|
|
||||||
r[8*i+1] = (s->v[3*i+0] >> 3) & 7;
|
|
||||||
r[8*i+2] = (s->v[3*i+0] >> 6) & 7;
|
|
||||||
r[8*i+2] ^= (s->v[3*i+1] << 2) & 7;
|
|
||||||
r[8*i+3] = (s->v[3*i+1] >> 1) & 7;
|
|
||||||
r[8*i+4] = (s->v[3*i+1] >> 4) & 7;
|
|
||||||
r[8*i+5] = (s->v[3*i+1] >> 7) & 7;
|
|
||||||
r[8*i+5] ^= (s->v[3*i+2] << 1) & 7;
|
|
||||||
r[8*i+6] = (s->v[3*i+2] >> 2) & 7;
|
|
||||||
r[8*i+7] = (s->v[3*i+2] >> 5) & 7;
|
|
||||||
}
|
|
||||||
r[8*i+0] = s->v[3*i+0] & 7;
|
|
||||||
r[8*i+1] = (s->v[3*i+0] >> 3) & 7;
|
|
||||||
r[8*i+2] = (s->v[3*i+0] >> 6) & 7;
|
|
||||||
r[8*i+2] ^= (s->v[3*i+1] << 2) & 7;
|
|
||||||
r[8*i+3] = (s->v[3*i+1] >> 1) & 7;
|
|
||||||
r[8*i+4] = (s->v[3*i+1] >> 4) & 7;
|
|
||||||
|
|
||||||
/* Making it signed */
|
|
||||||
carry = 0;
|
|
||||||
for(i=0;i<84;i++)
|
|
||||||
{
|
|
||||||
r[i] += carry;
|
|
||||||
r[i+1] += r[i] >> 3;
|
|
||||||
r[i] &= 7;
|
|
||||||
carry = r[i] >> 2;
|
|
||||||
r[i] -= carry<<3;
|
|
||||||
}
|
|
||||||
r[84] += carry;
|
|
||||||
}
|
|
||||||
|
|
||||||
void sc25519_window5(signed char r[51], const sc25519 *s)
|
|
||||||
{
|
|
||||||
char carry;
|
|
||||||
int i;
|
|
||||||
for(i=0;i<6;i++)
|
|
||||||
{
|
|
||||||
r[8*i+0] = s->v[5*i+0] & 31;
|
|
||||||
r[8*i+1] = (s->v[5*i+0] >> 5) & 31;
|
|
||||||
r[8*i+1] ^= (s->v[5*i+1] << 3) & 31;
|
|
||||||
r[8*i+2] = (s->v[5*i+1] >> 2) & 31;
|
|
||||||
r[8*i+3] = (s->v[5*i+1] >> 7) & 31;
|
|
||||||
r[8*i+3] ^= (s->v[5*i+2] << 1) & 31;
|
|
||||||
r[8*i+4] = (s->v[5*i+2] >> 4) & 31;
|
|
||||||
r[8*i+4] ^= (s->v[5*i+3] << 4) & 31;
|
|
||||||
r[8*i+5] = (s->v[5*i+3] >> 1) & 31;
|
|
||||||
r[8*i+6] = (s->v[5*i+3] >> 6) & 31;
|
|
||||||
r[8*i+6] ^= (s->v[5*i+4] << 2) & 31;
|
|
||||||
r[8*i+7] = (s->v[5*i+4] >> 3) & 31;
|
|
||||||
}
|
|
||||||
r[8*i+0] = s->v[5*i+0] & 31;
|
|
||||||
r[8*i+1] = (s->v[5*i+0] >> 5) & 31;
|
|
||||||
r[8*i+1] ^= (s->v[5*i+1] << 3) & 31;
|
|
||||||
r[8*i+2] = (s->v[5*i+1] >> 2) & 31;
|
|
||||||
|
|
||||||
/* Making it signed */
|
|
||||||
carry = 0;
|
|
||||||
for(i=0;i<50;i++)
|
|
||||||
{
|
|
||||||
r[i] += carry;
|
|
||||||
r[i+1] += r[i] >> 5;
|
|
||||||
r[i] &= 31;
|
|
||||||
carry = r[i] >> 4;
|
|
||||||
r[i] -= carry<<5;
|
|
||||||
}
|
|
||||||
r[50] += carry;
|
|
||||||
}
|
|
||||||
|
|
||||||
void sc25519_2interleave2(unsigned char r[127], const sc25519 *s1, const sc25519 *s2)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for(i=0;i<31;i++)
|
|
||||||
{
|
|
||||||
r[4*i] = ( s1->v[i] & 3) ^ (( s2->v[i] & 3) << 2);
|
|
||||||
r[4*i+1] = ((s1->v[i] >> 2) & 3) ^ (((s2->v[i] >> 2) & 3) << 2);
|
|
||||||
r[4*i+2] = ((s1->v[i] >> 4) & 3) ^ (((s2->v[i] >> 4) & 3) << 2);
|
|
||||||
r[4*i+3] = ((s1->v[i] >> 6) & 3) ^ (((s2->v[i] >> 6) & 3) << 2);
|
|
||||||
}
|
|
||||||
r[124] = ( s1->v[31] & 3) ^ (( s2->v[31] & 3) << 2);
|
|
||||||
r[125] = ((s1->v[31] >> 2) & 3) ^ (((s2->v[31] >> 2) & 3) << 2);
|
|
||||||
r[126] = ((s1->v[31] >> 4) & 3) ^ (((s2->v[31] >> 4) & 3) << 2);
|
|
||||||
}
|
|
|
@ -1,80 +0,0 @@
|
||||||
/* $OpenBSD: sc25519.h,v 1.3 2013/12/09 11:03:45 markus Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Public Domain, Authors: Daniel J. Bernstein, Niels Duif, Tanja Lange,
|
|
||||||
* Peter Schwabe, Bo-Yin Yang.
|
|
||||||
* Copied from supercop-20130419/crypto_sign/ed25519/ref/sc25519.h
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef SC25519_H
|
|
||||||
#define SC25519_H
|
|
||||||
|
|
||||||
#include "crypto_api.h"
|
|
||||||
|
|
||||||
#define sc25519 crypto_sign_ed25519_ref_sc25519
|
|
||||||
#define shortsc25519 crypto_sign_ed25519_ref_shortsc25519
|
|
||||||
#define sc25519_from32bytes crypto_sign_ed25519_ref_sc25519_from32bytes
|
|
||||||
#define shortsc25519_from16bytes crypto_sign_ed25519_ref_shortsc25519_from16bytes
|
|
||||||
#define sc25519_from64bytes crypto_sign_ed25519_ref_sc25519_from64bytes
|
|
||||||
#define sc25519_from_shortsc crypto_sign_ed25519_ref_sc25519_from_shortsc
|
|
||||||
#define sc25519_to32bytes crypto_sign_ed25519_ref_sc25519_to32bytes
|
|
||||||
#define sc25519_iszero_vartime crypto_sign_ed25519_ref_sc25519_iszero_vartime
|
|
||||||
#define sc25519_isshort_vartime crypto_sign_ed25519_ref_sc25519_isshort_vartime
|
|
||||||
#define sc25519_lt_vartime crypto_sign_ed25519_ref_sc25519_lt_vartime
|
|
||||||
#define sc25519_add crypto_sign_ed25519_ref_sc25519_add
|
|
||||||
#define sc25519_sub_nored crypto_sign_ed25519_ref_sc25519_sub_nored
|
|
||||||
#define sc25519_mul crypto_sign_ed25519_ref_sc25519_mul
|
|
||||||
#define sc25519_mul_shortsc crypto_sign_ed25519_ref_sc25519_mul_shortsc
|
|
||||||
#define sc25519_window3 crypto_sign_ed25519_ref_sc25519_window3
|
|
||||||
#define sc25519_window5 crypto_sign_ed25519_ref_sc25519_window5
|
|
||||||
#define sc25519_2interleave2 crypto_sign_ed25519_ref_sc25519_2interleave2
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
crypto_uint32 v[32];
|
|
||||||
}
|
|
||||||
sc25519;
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
crypto_uint32 v[16];
|
|
||||||
}
|
|
||||||
shortsc25519;
|
|
||||||
|
|
||||||
void sc25519_from32bytes(sc25519 *r, const unsigned char x[32]);
|
|
||||||
|
|
||||||
void shortsc25519_from16bytes(shortsc25519 *r, const unsigned char x[16]);
|
|
||||||
|
|
||||||
void sc25519_from64bytes(sc25519 *r, const unsigned char x[64]);
|
|
||||||
|
|
||||||
void sc25519_from_shortsc(sc25519 *r, const shortsc25519 *x);
|
|
||||||
|
|
||||||
void sc25519_to32bytes(unsigned char r[32], const sc25519 *x);
|
|
||||||
|
|
||||||
int sc25519_iszero_vartime(const sc25519 *x);
|
|
||||||
|
|
||||||
int sc25519_isshort_vartime(const sc25519 *x);
|
|
||||||
|
|
||||||
int sc25519_lt_vartime(const sc25519 *x, const sc25519 *y);
|
|
||||||
|
|
||||||
void sc25519_add(sc25519 *r, const sc25519 *x, const sc25519 *y);
|
|
||||||
|
|
||||||
void sc25519_sub_nored(sc25519 *r, const sc25519 *x, const sc25519 *y);
|
|
||||||
|
|
||||||
void sc25519_mul(sc25519 *r, const sc25519 *x, const sc25519 *y);
|
|
||||||
|
|
||||||
void sc25519_mul_shortsc(sc25519 *r, const sc25519 *x, const shortsc25519 *y);
|
|
||||||
|
|
||||||
/* Convert s into a representation of the form \sum_{i=0}^{84}r[i]2^3
|
|
||||||
* with r[i] in {-4,...,3}
|
|
||||||
*/
|
|
||||||
void sc25519_window3(signed char r[85], const sc25519 *s);
|
|
||||||
|
|
||||||
/* Convert s into a representation of the form \sum_{i=0}^{50}r[i]2^5
|
|
||||||
* with r[i] in {-16,...,15}
|
|
||||||
*/
|
|
||||||
void sc25519_window5(signed char r[51], const sc25519 *s);
|
|
||||||
|
|
||||||
void sc25519_2interleave2(unsigned char r[127], const sc25519 *s1, const sc25519 *s2);
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,905 +0,0 @@
|
||||||
/* $OpenBSD: sha2.c,v 1.18 2014/07/20 04:22:34 guenther Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* FILE: sha2.c
|
|
||||||
* AUTHOR: Aaron D. Gifford <me@aarongifford.com>
|
|
||||||
*
|
|
||||||
* Copyright (c) 2000-2001, Aaron D. Gifford
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* 3. Neither the name of the copyright holder nor the names of contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTOR(S) ``AS IS'' AND
|
|
||||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTOR(S) BE LIABLE
|
|
||||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
||||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
* SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
* $From: sha2.c,v 1.1 2001/11/08 00:01:51 adg Exp adg $
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <sha2.h>
|
|
||||||
|
|
||||||
#define __weak_alias(alias,sym) \
|
|
||||||
__asm(".weak " __ASMNAME(#alias) "\n" \
|
|
||||||
__ASMNAME(#alias) " = " __ASMNAME(#sym));
|
|
||||||
|
|
||||||
/*
|
|
||||||
* UNROLLED TRANSFORM LOOP NOTE:
|
|
||||||
* You can define SHA2_UNROLL_TRANSFORM to use the unrolled transform
|
|
||||||
* loop version for the hash transform rounds (defined using macros
|
|
||||||
* later in this file). Either define on the command line, for example:
|
|
||||||
*
|
|
||||||
* cc -DSHA2_UNROLL_TRANSFORM -o sha2 sha2.c sha2prog.c
|
|
||||||
*
|
|
||||||
* or define below:
|
|
||||||
*
|
|
||||||
* #define SHA2_UNROLL_TRANSFORM
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*** SHA-224/256/384/512 Machine Architecture Definitions *****************/
|
|
||||||
/*
|
|
||||||
* BYTE_ORDER NOTE:
|
|
||||||
*
|
|
||||||
* Please make sure that your system defines BYTE_ORDER. If your
|
|
||||||
* architecture is little-endian, make sure it also defines
|
|
||||||
* LITTLE_ENDIAN and that the two (BYTE_ORDER and LITTLE_ENDIAN) are
|
|
||||||
* equivilent.
|
|
||||||
*
|
|
||||||
* If your system does not define the above, then you can do so by
|
|
||||||
* hand like this:
|
|
||||||
*
|
|
||||||
* #define LITTLE_ENDIAN 1234
|
|
||||||
* #define BIG_ENDIAN 4321
|
|
||||||
*
|
|
||||||
* And for little-endian machines, add:
|
|
||||||
*
|
|
||||||
* #define BYTE_ORDER LITTLE_ENDIAN
|
|
||||||
*
|
|
||||||
* Or for big-endian machines:
|
|
||||||
*
|
|
||||||
* #define BYTE_ORDER BIG_ENDIAN
|
|
||||||
*
|
|
||||||
* The FreeBSD machine this was written on defines BYTE_ORDER
|
|
||||||
* appropriately by including <sys/types.h> (which in turn includes
|
|
||||||
* <machine/endian.h> where the appropriate definitions are actually
|
|
||||||
* made).
|
|
||||||
*/
|
|
||||||
#if !defined(BYTE_ORDER) || (BYTE_ORDER != LITTLE_ENDIAN && BYTE_ORDER != BIG_ENDIAN)
|
|
||||||
#error Define BYTE_ORDER to be equal to either LITTLE_ENDIAN or BIG_ENDIAN
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*** SHA-224/256/384/512 Various Length Definitions ***********************/
|
|
||||||
/* NOTE: Most of these are in sha2.h */
|
|
||||||
#define SHA224_SHORT_BLOCK_LENGTH (SHA224_BLOCK_LENGTH - 8)
|
|
||||||
#define SHA256_SHORT_BLOCK_LENGTH (SHA256_BLOCK_LENGTH - 8)
|
|
||||||
#define SHA384_SHORT_BLOCK_LENGTH (SHA384_BLOCK_LENGTH - 16)
|
|
||||||
#define SHA512_SHORT_BLOCK_LENGTH (SHA512_BLOCK_LENGTH - 16)
|
|
||||||
|
|
||||||
/*** ENDIAN SPECIFIC COPY MACROS **************************************/
|
|
||||||
#define BE_8_TO_32(dst, cp) do { \
|
|
||||||
(dst) = (u_int32_t)(cp)[3] | ((u_int32_t)(cp)[2] << 8) | \
|
|
||||||
((u_int32_t)(cp)[1] << 16) | ((u_int32_t)(cp)[0] << 24); \
|
|
||||||
} while(0)
|
|
||||||
|
|
||||||
#define BE_8_TO_64(dst, cp) do { \
|
|
||||||
(dst) = (u_int64_t)(cp)[7] | ((u_int64_t)(cp)[6] << 8) | \
|
|
||||||
((u_int64_t)(cp)[5] << 16) | ((u_int64_t)(cp)[4] << 24) | \
|
|
||||||
((u_int64_t)(cp)[3] << 32) | ((u_int64_t)(cp)[2] << 40) | \
|
|
||||||
((u_int64_t)(cp)[1] << 48) | ((u_int64_t)(cp)[0] << 56); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define BE_64_TO_8(cp, src) do { \
|
|
||||||
(cp)[0] = (src) >> 56; \
|
|
||||||
(cp)[1] = (src) >> 48; \
|
|
||||||
(cp)[2] = (src) >> 40; \
|
|
||||||
(cp)[3] = (src) >> 32; \
|
|
||||||
(cp)[4] = (src) >> 24; \
|
|
||||||
(cp)[5] = (src) >> 16; \
|
|
||||||
(cp)[6] = (src) >> 8; \
|
|
||||||
(cp)[7] = (src); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define BE_32_TO_8(cp, src) do { \
|
|
||||||
(cp)[0] = (src) >> 24; \
|
|
||||||
(cp)[1] = (src) >> 16; \
|
|
||||||
(cp)[2] = (src) >> 8; \
|
|
||||||
(cp)[3] = (src); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Macro for incrementally adding the unsigned 64-bit integer n to the
|
|
||||||
* unsigned 128-bit integer (represented using a two-element array of
|
|
||||||
* 64-bit words):
|
|
||||||
*/
|
|
||||||
#define ADDINC128(w,n) do { \
|
|
||||||
(w)[0] += (u_int64_t)(n); \
|
|
||||||
if ((w)[0] < (n)) { \
|
|
||||||
(w)[1]++; \
|
|
||||||
} \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/*** THE SIX LOGICAL FUNCTIONS ****************************************/
|
|
||||||
/*
|
|
||||||
* Bit shifting and rotation (used by the six SHA-XYZ logical functions:
|
|
||||||
*
|
|
||||||
* NOTE: The naming of R and S appears backwards here (R is a SHIFT and
|
|
||||||
* S is a ROTATION) because the SHA-224/256/384/512 description document
|
|
||||||
* (see http://csrc.nist.gov/cryptval/shs/sha256-384-512.pdf) uses this
|
|
||||||
* same "backwards" definition.
|
|
||||||
*/
|
|
||||||
/* Shift-right (used in SHA-224, SHA-256, SHA-384, and SHA-512): */
|
|
||||||
#define R(b,x) ((x) >> (b))
|
|
||||||
/* 32-bit Rotate-right (used in SHA-224 and SHA-256): */
|
|
||||||
#define S32(b,x) (((x) >> (b)) | ((x) << (32 - (b))))
|
|
||||||
/* 64-bit Rotate-right (used in SHA-384 and SHA-512): */
|
|
||||||
#define S64(b,x) (((x) >> (b)) | ((x) << (64 - (b))))
|
|
||||||
|
|
||||||
/* Two of six logical functions used in SHA-224, SHA-256, SHA-384, and SHA-512: */
|
|
||||||
#define Ch(x,y,z) (((x) & (y)) ^ ((~(x)) & (z)))
|
|
||||||
#define Maj(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
|
|
||||||
|
|
||||||
/* Four of six logical functions used in SHA-224 and SHA-256: */
|
|
||||||
#define Sigma0_256(x) (S32(2, (x)) ^ S32(13, (x)) ^ S32(22, (x)))
|
|
||||||
#define Sigma1_256(x) (S32(6, (x)) ^ S32(11, (x)) ^ S32(25, (x)))
|
|
||||||
#define sigma0_256(x) (S32(7, (x)) ^ S32(18, (x)) ^ R(3 , (x)))
|
|
||||||
#define sigma1_256(x) (S32(17, (x)) ^ S32(19, (x)) ^ R(10, (x)))
|
|
||||||
|
|
||||||
/* Four of six logical functions used in SHA-384 and SHA-512: */
|
|
||||||
#define Sigma0_512(x) (S64(28, (x)) ^ S64(34, (x)) ^ S64(39, (x)))
|
|
||||||
#define Sigma1_512(x) (S64(14, (x)) ^ S64(18, (x)) ^ S64(41, (x)))
|
|
||||||
#define sigma0_512(x) (S64( 1, (x)) ^ S64( 8, (x)) ^ R( 7, (x)))
|
|
||||||
#define sigma1_512(x) (S64(19, (x)) ^ S64(61, (x)) ^ R( 6, (x)))
|
|
||||||
|
|
||||||
|
|
||||||
/*** SHA-XYZ INITIAL HASH VALUES AND CONSTANTS ************************/
|
|
||||||
/* Hash constant words K for SHA-224 and SHA-256: */
|
|
||||||
static const u_int32_t K256[64] = {
|
|
||||||
0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL,
|
|
||||||
0x3956c25bUL, 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL,
|
|
||||||
0xd807aa98UL, 0x12835b01UL, 0x243185beUL, 0x550c7dc3UL,
|
|
||||||
0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL, 0xc19bf174UL,
|
|
||||||
0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL,
|
|
||||||
0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL,
|
|
||||||
0x983e5152UL, 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL,
|
|
||||||
0xc6e00bf3UL, 0xd5a79147UL, 0x06ca6351UL, 0x14292967UL,
|
|
||||||
0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL, 0x53380d13UL,
|
|
||||||
0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,
|
|
||||||
0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL,
|
|
||||||
0xd192e819UL, 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL,
|
|
||||||
0x19a4c116UL, 0x1e376c08UL, 0x2748774cUL, 0x34b0bcb5UL,
|
|
||||||
0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL, 0x682e6ff3UL,
|
|
||||||
0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
|
|
||||||
0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Initial hash value H for SHA-224: */
|
|
||||||
static const u_int32_t sha224_initial_hash_value[8] = {
|
|
||||||
0xc1059ed8UL,
|
|
||||||
0x367cd507UL,
|
|
||||||
0x3070dd17UL,
|
|
||||||
0xf70e5939UL,
|
|
||||||
0xffc00b31UL,
|
|
||||||
0x68581511UL,
|
|
||||||
0x64f98fa7UL,
|
|
||||||
0xbefa4fa4UL
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Initial hash value H for SHA-256: */
|
|
||||||
static const u_int32_t sha256_initial_hash_value[8] = {
|
|
||||||
0x6a09e667UL,
|
|
||||||
0xbb67ae85UL,
|
|
||||||
0x3c6ef372UL,
|
|
||||||
0xa54ff53aUL,
|
|
||||||
0x510e527fUL,
|
|
||||||
0x9b05688cUL,
|
|
||||||
0x1f83d9abUL,
|
|
||||||
0x5be0cd19UL
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Hash constant words K for SHA-384 and SHA-512: */
|
|
||||||
static const u_int64_t K512[80] = {
|
|
||||||
0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL,
|
|
||||||
0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL,
|
|
||||||
0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL,
|
|
||||||
0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL,
|
|
||||||
0xd807aa98a3030242ULL, 0x12835b0145706fbeULL,
|
|
||||||
0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL,
|
|
||||||
0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL,
|
|
||||||
0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL,
|
|
||||||
0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL,
|
|
||||||
0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL,
|
|
||||||
0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL,
|
|
||||||
0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL,
|
|
||||||
0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL,
|
|
||||||
0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL,
|
|
||||||
0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL,
|
|
||||||
0x06ca6351e003826fULL, 0x142929670a0e6e70ULL,
|
|
||||||
0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL,
|
|
||||||
0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL,
|
|
||||||
0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL,
|
|
||||||
0x81c2c92e47edaee6ULL, 0x92722c851482353bULL,
|
|
||||||
0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL,
|
|
||||||
0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL,
|
|
||||||
0xd192e819d6ef5218ULL, 0xd69906245565a910ULL,
|
|
||||||
0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL,
|
|
||||||
0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL,
|
|
||||||
0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL,
|
|
||||||
0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL,
|
|
||||||
0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL,
|
|
||||||
0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL,
|
|
||||||
0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL,
|
|
||||||
0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL,
|
|
||||||
0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL,
|
|
||||||
0xca273eceea26619cULL, 0xd186b8c721c0c207ULL,
|
|
||||||
0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL,
|
|
||||||
0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL,
|
|
||||||
0x113f9804bef90daeULL, 0x1b710b35131c471bULL,
|
|
||||||
0x28db77f523047d84ULL, 0x32caab7b40c72493ULL,
|
|
||||||
0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL,
|
|
||||||
0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL,
|
|
||||||
0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Initial hash value H for SHA-512 */
|
|
||||||
static const u_int64_t sha512_initial_hash_value[8] = {
|
|
||||||
0x6a09e667f3bcc908ULL,
|
|
||||||
0xbb67ae8584caa73bULL,
|
|
||||||
0x3c6ef372fe94f82bULL,
|
|
||||||
0xa54ff53a5f1d36f1ULL,
|
|
||||||
0x510e527fade682d1ULL,
|
|
||||||
0x9b05688c2b3e6c1fULL,
|
|
||||||
0x1f83d9abfb41bd6bULL,
|
|
||||||
0x5be0cd19137e2179ULL
|
|
||||||
};
|
|
||||||
|
|
||||||
#if !defined(SHA2_SMALL)
|
|
||||||
/* Initial hash value H for SHA-384 */
|
|
||||||
static const u_int64_t sha384_initial_hash_value[8] = {
|
|
||||||
0xcbbb9d5dc1059ed8ULL,
|
|
||||||
0x629a292a367cd507ULL,
|
|
||||||
0x9159015a3070dd17ULL,
|
|
||||||
0x152fecd8f70e5939ULL,
|
|
||||||
0x67332667ffc00b31ULL,
|
|
||||||
0x8eb44a8768581511ULL,
|
|
||||||
0xdb0c2e0d64f98fa7ULL,
|
|
||||||
0x47b5481dbefa4fa4ULL
|
|
||||||
};
|
|
||||||
|
|
||||||
/*** SHA-224: *********************************************************/
|
|
||||||
void
|
|
||||||
SHA224Init(SHA2_CTX *context)
|
|
||||||
{
|
|
||||||
memcpy(context->state.st32, sha224_initial_hash_value,
|
|
||||||
sizeof(sha224_initial_hash_value));
|
|
||||||
memset(context->buffer, 0, sizeof(context->buffer));
|
|
||||||
context->bitcount[0] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
__weak_alias(SHA224Transform, SHA256Transform);
|
|
||||||
__weak_alias(SHA224Update, SHA256Update);
|
|
||||||
__weak_alias(SHA224Pad, SHA256Pad);
|
|
||||||
|
|
||||||
void
|
|
||||||
SHA224Final(u_int8_t digest[SHA224_DIGEST_LENGTH], SHA2_CTX *context)
|
|
||||||
{
|
|
||||||
SHA224Pad(context);
|
|
||||||
|
|
||||||
#if BYTE_ORDER == LITTLE_ENDIAN
|
|
||||||
int i;
|
|
||||||
|
|
||||||
/* Convert TO host byte order */
|
|
||||||
for (i = 0; i < 7; i++)
|
|
||||||
BE_32_TO_8(digest + i * 4, context->state.st32[i]);
|
|
||||||
#else
|
|
||||||
memcpy(digest, context->state.st32, SHA224_DIGEST_LENGTH);
|
|
||||||
#endif
|
|
||||||
memset(context, 0, sizeof(*context));
|
|
||||||
}
|
|
||||||
#endif /* !defined(SHA2_SMALL) */
|
|
||||||
|
|
||||||
/*** SHA-256: *********************************************************/
|
|
||||||
void
|
|
||||||
SHA256Init(SHA2_CTX *context)
|
|
||||||
{
|
|
||||||
memcpy(context->state.st32, sha256_initial_hash_value,
|
|
||||||
sizeof(sha256_initial_hash_value));
|
|
||||||
memset(context->buffer, 0, sizeof(context->buffer));
|
|
||||||
context->bitcount[0] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef SHA2_UNROLL_TRANSFORM
|
|
||||||
|
|
||||||
/* Unrolled SHA-256 round macros: */
|
|
||||||
|
|
||||||
#define ROUND256_0_TO_15(a,b,c,d,e,f,g,h) do { \
|
|
||||||
BE_8_TO_32(W256[j], data); \
|
|
||||||
data += 4; \
|
|
||||||
T1 = (h) + Sigma1_256((e)) + Ch((e), (f), (g)) + K256[j] + W256[j]; \
|
|
||||||
(d) += T1; \
|
|
||||||
(h) = T1 + Sigma0_256((a)) + Maj((a), (b), (c)); \
|
|
||||||
j++; \
|
|
||||||
} while(0)
|
|
||||||
|
|
||||||
#define ROUND256(a,b,c,d,e,f,g,h) do { \
|
|
||||||
s0 = W256[(j+1)&0x0f]; \
|
|
||||||
s0 = sigma0_256(s0); \
|
|
||||||
s1 = W256[(j+14)&0x0f]; \
|
|
||||||
s1 = sigma1_256(s1); \
|
|
||||||
T1 = (h) + Sigma1_256((e)) + Ch((e), (f), (g)) + K256[j] + \
|
|
||||||
(W256[j&0x0f] += s1 + W256[(j+9)&0x0f] + s0); \
|
|
||||||
(d) += T1; \
|
|
||||||
(h) = T1 + Sigma0_256((a)) + Maj((a), (b), (c)); \
|
|
||||||
j++; \
|
|
||||||
} while(0)
|
|
||||||
|
|
||||||
void
|
|
||||||
SHA256Transform(u_int32_t state[8], const u_int8_t data[SHA256_BLOCK_LENGTH])
|
|
||||||
{
|
|
||||||
u_int32_t a, b, c, d, e, f, g, h, s0, s1;
|
|
||||||
u_int32_t T1, W256[16];
|
|
||||||
int j;
|
|
||||||
|
|
||||||
/* Initialize registers with the prev. intermediate value */
|
|
||||||
a = state[0];
|
|
||||||
b = state[1];
|
|
||||||
c = state[2];
|
|
||||||
d = state[3];
|
|
||||||
e = state[4];
|
|
||||||
f = state[5];
|
|
||||||
g = state[6];
|
|
||||||
h = state[7];
|
|
||||||
|
|
||||||
j = 0;
|
|
||||||
do {
|
|
||||||
/* Rounds 0 to 15 (unrolled): */
|
|
||||||
ROUND256_0_TO_15(a,b,c,d,e,f,g,h);
|
|
||||||
ROUND256_0_TO_15(h,a,b,c,d,e,f,g);
|
|
||||||
ROUND256_0_TO_15(g,h,a,b,c,d,e,f);
|
|
||||||
ROUND256_0_TO_15(f,g,h,a,b,c,d,e);
|
|
||||||
ROUND256_0_TO_15(e,f,g,h,a,b,c,d);
|
|
||||||
ROUND256_0_TO_15(d,e,f,g,h,a,b,c);
|
|
||||||
ROUND256_0_TO_15(c,d,e,f,g,h,a,b);
|
|
||||||
ROUND256_0_TO_15(b,c,d,e,f,g,h,a);
|
|
||||||
} while (j < 16);
|
|
||||||
|
|
||||||
/* Now for the remaining rounds up to 63: */
|
|
||||||
do {
|
|
||||||
ROUND256(a,b,c,d,e,f,g,h);
|
|
||||||
ROUND256(h,a,b,c,d,e,f,g);
|
|
||||||
ROUND256(g,h,a,b,c,d,e,f);
|
|
||||||
ROUND256(f,g,h,a,b,c,d,e);
|
|
||||||
ROUND256(e,f,g,h,a,b,c,d);
|
|
||||||
ROUND256(d,e,f,g,h,a,b,c);
|
|
||||||
ROUND256(c,d,e,f,g,h,a,b);
|
|
||||||
ROUND256(b,c,d,e,f,g,h,a);
|
|
||||||
} while (j < 64);
|
|
||||||
|
|
||||||
/* Compute the current intermediate hash value */
|
|
||||||
state[0] += a;
|
|
||||||
state[1] += b;
|
|
||||||
state[2] += c;
|
|
||||||
state[3] += d;
|
|
||||||
state[4] += e;
|
|
||||||
state[5] += f;
|
|
||||||
state[6] += g;
|
|
||||||
state[7] += h;
|
|
||||||
|
|
||||||
/* Clean up */
|
|
||||||
a = b = c = d = e = f = g = h = T1 = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else /* SHA2_UNROLL_TRANSFORM */
|
|
||||||
|
|
||||||
void
|
|
||||||
SHA256Transform(u_int32_t state[8], const u_int8_t data[SHA256_BLOCK_LENGTH])
|
|
||||||
{
|
|
||||||
u_int32_t a, b, c, d, e, f, g, h, s0, s1;
|
|
||||||
u_int32_t T1, T2, W256[16];
|
|
||||||
int j;
|
|
||||||
|
|
||||||
/* Initialize registers with the prev. intermediate value */
|
|
||||||
a = state[0];
|
|
||||||
b = state[1];
|
|
||||||
c = state[2];
|
|
||||||
d = state[3];
|
|
||||||
e = state[4];
|
|
||||||
f = state[5];
|
|
||||||
g = state[6];
|
|
||||||
h = state[7];
|
|
||||||
|
|
||||||
j = 0;
|
|
||||||
do {
|
|
||||||
BE_8_TO_32(W256[j], data);
|
|
||||||
data += 4;
|
|
||||||
/* Apply the SHA-256 compression function to update a..h */
|
|
||||||
T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + W256[j];
|
|
||||||
T2 = Sigma0_256(a) + Maj(a, b, c);
|
|
||||||
h = g;
|
|
||||||
g = f;
|
|
||||||
f = e;
|
|
||||||
e = d + T1;
|
|
||||||
d = c;
|
|
||||||
c = b;
|
|
||||||
b = a;
|
|
||||||
a = T1 + T2;
|
|
||||||
|
|
||||||
j++;
|
|
||||||
} while (j < 16);
|
|
||||||
|
|
||||||
do {
|
|
||||||
/* Part of the message block expansion: */
|
|
||||||
s0 = W256[(j+1)&0x0f];
|
|
||||||
s0 = sigma0_256(s0);
|
|
||||||
s1 = W256[(j+14)&0x0f];
|
|
||||||
s1 = sigma1_256(s1);
|
|
||||||
|
|
||||||
/* Apply the SHA-256 compression function to update a..h */
|
|
||||||
T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] +
|
|
||||||
(W256[j&0x0f] += s1 + W256[(j+9)&0x0f] + s0);
|
|
||||||
T2 = Sigma0_256(a) + Maj(a, b, c);
|
|
||||||
h = g;
|
|
||||||
g = f;
|
|
||||||
f = e;
|
|
||||||
e = d + T1;
|
|
||||||
d = c;
|
|
||||||
c = b;
|
|
||||||
b = a;
|
|
||||||
a = T1 + T2;
|
|
||||||
|
|
||||||
j++;
|
|
||||||
} while (j < 64);
|
|
||||||
|
|
||||||
/* Compute the current intermediate hash value */
|
|
||||||
state[0] += a;
|
|
||||||
state[1] += b;
|
|
||||||
state[2] += c;
|
|
||||||
state[3] += d;
|
|
||||||
state[4] += e;
|
|
||||||
state[5] += f;
|
|
||||||
state[6] += g;
|
|
||||||
state[7] += h;
|
|
||||||
|
|
||||||
/* Clean up */
|
|
||||||
a = b = c = d = e = f = g = h = T1 = T2 = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* SHA2_UNROLL_TRANSFORM */
|
|
||||||
|
|
||||||
void
|
|
||||||
SHA256Update(SHA2_CTX *context, const u_int8_t *data, size_t len)
|
|
||||||
{
|
|
||||||
size_t freespace, usedspace;
|
|
||||||
|
|
||||||
/* Calling with no data is valid (we do nothing) */
|
|
||||||
if (len == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
usedspace = (context->bitcount[0] >> 3) % SHA256_BLOCK_LENGTH;
|
|
||||||
if (usedspace > 0) {
|
|
||||||
/* Calculate how much free space is available in the buffer */
|
|
||||||
freespace = SHA256_BLOCK_LENGTH - usedspace;
|
|
||||||
|
|
||||||
if (len >= freespace) {
|
|
||||||
/* Fill the buffer completely and process it */
|
|
||||||
memcpy(&context->buffer[usedspace], data, freespace);
|
|
||||||
context->bitcount[0] += freespace << 3;
|
|
||||||
len -= freespace;
|
|
||||||
data += freespace;
|
|
||||||
SHA256Transform(context->state.st32, context->buffer);
|
|
||||||
} else {
|
|
||||||
/* The buffer is not yet full */
|
|
||||||
memcpy(&context->buffer[usedspace], data, len);
|
|
||||||
context->bitcount[0] += len << 3;
|
|
||||||
/* Clean up: */
|
|
||||||
usedspace = freespace = 0;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
while (len >= SHA256_BLOCK_LENGTH) {
|
|
||||||
/* Process as many complete blocks as we can */
|
|
||||||
SHA256Transform(context->state.st32, data);
|
|
||||||
context->bitcount[0] += SHA256_BLOCK_LENGTH << 3;
|
|
||||||
len -= SHA256_BLOCK_LENGTH;
|
|
||||||
data += SHA256_BLOCK_LENGTH;
|
|
||||||
}
|
|
||||||
if (len > 0) {
|
|
||||||
/* There's left-overs, so save 'em */
|
|
||||||
memcpy(context->buffer, data, len);
|
|
||||||
context->bitcount[0] += len << 3;
|
|
||||||
}
|
|
||||||
/* Clean up: */
|
|
||||||
usedspace = freespace = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
SHA256Pad(SHA2_CTX *context)
|
|
||||||
{
|
|
||||||
unsigned int usedspace;
|
|
||||||
|
|
||||||
usedspace = (context->bitcount[0] >> 3) % SHA256_BLOCK_LENGTH;
|
|
||||||
if (usedspace > 0) {
|
|
||||||
/* Begin padding with a 1 bit: */
|
|
||||||
context->buffer[usedspace++] = 0x80;
|
|
||||||
|
|
||||||
if (usedspace <= SHA256_SHORT_BLOCK_LENGTH) {
|
|
||||||
/* Set-up for the last transform: */
|
|
||||||
memset(&context->buffer[usedspace], 0,
|
|
||||||
SHA256_SHORT_BLOCK_LENGTH - usedspace);
|
|
||||||
} else {
|
|
||||||
if (usedspace < SHA256_BLOCK_LENGTH) {
|
|
||||||
memset(&context->buffer[usedspace], 0,
|
|
||||||
SHA256_BLOCK_LENGTH - usedspace);
|
|
||||||
}
|
|
||||||
/* Do second-to-last transform: */
|
|
||||||
SHA256Transform(context->state.st32, context->buffer);
|
|
||||||
|
|
||||||
/* Prepare for last transform: */
|
|
||||||
memset(context->buffer, 0, SHA256_SHORT_BLOCK_LENGTH);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
/* Set-up for the last transform: */
|
|
||||||
memset(context->buffer, 0, SHA256_SHORT_BLOCK_LENGTH);
|
|
||||||
|
|
||||||
/* Begin padding with a 1 bit: */
|
|
||||||
*context->buffer = 0x80;
|
|
||||||
}
|
|
||||||
/* Store the length of input data (in bits) in big endian format: */
|
|
||||||
BE_64_TO_8(&context->buffer[SHA256_SHORT_BLOCK_LENGTH],
|
|
||||||
context->bitcount[0]);
|
|
||||||
|
|
||||||
/* Final transform: */
|
|
||||||
SHA256Transform(context->state.st32, context->buffer);
|
|
||||||
|
|
||||||
/* Clean up: */
|
|
||||||
usedspace = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
SHA256Final(u_int8_t digest[SHA256_DIGEST_LENGTH], SHA2_CTX *context)
|
|
||||||
{
|
|
||||||
SHA256Pad(context);
|
|
||||||
|
|
||||||
#if BYTE_ORDER == LITTLE_ENDIAN
|
|
||||||
int i;
|
|
||||||
|
|
||||||
/* Convert TO host byte order */
|
|
||||||
for (i = 0; i < 8; i++)
|
|
||||||
BE_32_TO_8(digest + i * 4, context->state.st32[i]);
|
|
||||||
#else
|
|
||||||
memcpy(digest, context->state.st32, SHA256_DIGEST_LENGTH);
|
|
||||||
#endif
|
|
||||||
memset(context, 0, sizeof(*context));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*** SHA-512: *********************************************************/
|
|
||||||
void
|
|
||||||
SHA512Init(SHA2_CTX *context)
|
|
||||||
{
|
|
||||||
memcpy(context->state.st64, sha512_initial_hash_value,
|
|
||||||
sizeof(sha512_initial_hash_value));
|
|
||||||
memset(context->buffer, 0, sizeof(context->buffer));
|
|
||||||
context->bitcount[0] = context->bitcount[1] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef SHA2_UNROLL_TRANSFORM
|
|
||||||
|
|
||||||
/* Unrolled SHA-512 round macros: */
|
|
||||||
|
|
||||||
#define ROUND512_0_TO_15(a,b,c,d,e,f,g,h) do { \
|
|
||||||
BE_8_TO_64(W512[j], data); \
|
|
||||||
data += 8; \
|
|
||||||
T1 = (h) + Sigma1_512((e)) + Ch((e), (f), (g)) + K512[j] + W512[j]; \
|
|
||||||
(d) += T1; \
|
|
||||||
(h) = T1 + Sigma0_512((a)) + Maj((a), (b), (c)); \
|
|
||||||
j++; \
|
|
||||||
} while(0)
|
|
||||||
|
|
||||||
|
|
||||||
#define ROUND512(a,b,c,d,e,f,g,h) do { \
|
|
||||||
s0 = W512[(j+1)&0x0f]; \
|
|
||||||
s0 = sigma0_512(s0); \
|
|
||||||
s1 = W512[(j+14)&0x0f]; \
|
|
||||||
s1 = sigma1_512(s1); \
|
|
||||||
T1 = (h) + Sigma1_512((e)) + Ch((e), (f), (g)) + K512[j] + \
|
|
||||||
(W512[j&0x0f] += s1 + W512[(j+9)&0x0f] + s0); \
|
|
||||||
(d) += T1; \
|
|
||||||
(h) = T1 + Sigma0_512((a)) + Maj((a), (b), (c)); \
|
|
||||||
j++; \
|
|
||||||
} while(0)
|
|
||||||
|
|
||||||
void
|
|
||||||
SHA512Transform(u_int64_t state[8], const u_int8_t data[SHA512_BLOCK_LENGTH])
|
|
||||||
{
|
|
||||||
u_int64_t a, b, c, d, e, f, g, h, s0, s1;
|
|
||||||
u_int64_t T1, W512[16];
|
|
||||||
int j;
|
|
||||||
|
|
||||||
/* Initialize registers with the prev. intermediate value */
|
|
||||||
a = state[0];
|
|
||||||
b = state[1];
|
|
||||||
c = state[2];
|
|
||||||
d = state[3];
|
|
||||||
e = state[4];
|
|
||||||
f = state[5];
|
|
||||||
g = state[6];
|
|
||||||
h = state[7];
|
|
||||||
|
|
||||||
j = 0;
|
|
||||||
do {
|
|
||||||
/* Rounds 0 to 15 (unrolled): */
|
|
||||||
ROUND512_0_TO_15(a,b,c,d,e,f,g,h);
|
|
||||||
ROUND512_0_TO_15(h,a,b,c,d,e,f,g);
|
|
||||||
ROUND512_0_TO_15(g,h,a,b,c,d,e,f);
|
|
||||||
ROUND512_0_TO_15(f,g,h,a,b,c,d,e);
|
|
||||||
ROUND512_0_TO_15(e,f,g,h,a,b,c,d);
|
|
||||||
ROUND512_0_TO_15(d,e,f,g,h,a,b,c);
|
|
||||||
ROUND512_0_TO_15(c,d,e,f,g,h,a,b);
|
|
||||||
ROUND512_0_TO_15(b,c,d,e,f,g,h,a);
|
|
||||||
} while (j < 16);
|
|
||||||
|
|
||||||
/* Now for the remaining rounds up to 79: */
|
|
||||||
do {
|
|
||||||
ROUND512(a,b,c,d,e,f,g,h);
|
|
||||||
ROUND512(h,a,b,c,d,e,f,g);
|
|
||||||
ROUND512(g,h,a,b,c,d,e,f);
|
|
||||||
ROUND512(f,g,h,a,b,c,d,e);
|
|
||||||
ROUND512(e,f,g,h,a,b,c,d);
|
|
||||||
ROUND512(d,e,f,g,h,a,b,c);
|
|
||||||
ROUND512(c,d,e,f,g,h,a,b);
|
|
||||||
ROUND512(b,c,d,e,f,g,h,a);
|
|
||||||
} while (j < 80);
|
|
||||||
|
|
||||||
/* Compute the current intermediate hash value */
|
|
||||||
state[0] += a;
|
|
||||||
state[1] += b;
|
|
||||||
state[2] += c;
|
|
||||||
state[3] += d;
|
|
||||||
state[4] += e;
|
|
||||||
state[5] += f;
|
|
||||||
state[6] += g;
|
|
||||||
state[7] += h;
|
|
||||||
|
|
||||||
/* Clean up */
|
|
||||||
a = b = c = d = e = f = g = h = T1 = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else /* SHA2_UNROLL_TRANSFORM */
|
|
||||||
|
|
||||||
void
|
|
||||||
SHA512Transform(u_int64_t state[8], const u_int8_t data[SHA512_BLOCK_LENGTH])
|
|
||||||
{
|
|
||||||
u_int64_t a, b, c, d, e, f, g, h, s0, s1;
|
|
||||||
u_int64_t T1, T2, W512[16];
|
|
||||||
int j;
|
|
||||||
|
|
||||||
/* Initialize registers with the prev. intermediate value */
|
|
||||||
a = state[0];
|
|
||||||
b = state[1];
|
|
||||||
c = state[2];
|
|
||||||
d = state[3];
|
|
||||||
e = state[4];
|
|
||||||
f = state[5];
|
|
||||||
g = state[6];
|
|
||||||
h = state[7];
|
|
||||||
|
|
||||||
j = 0;
|
|
||||||
do {
|
|
||||||
BE_8_TO_64(W512[j], data);
|
|
||||||
data += 8;
|
|
||||||
/* Apply the SHA-512 compression function to update a..h */
|
|
||||||
T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] + W512[j];
|
|
||||||
T2 = Sigma0_512(a) + Maj(a, b, c);
|
|
||||||
h = g;
|
|
||||||
g = f;
|
|
||||||
f = e;
|
|
||||||
e = d + T1;
|
|
||||||
d = c;
|
|
||||||
c = b;
|
|
||||||
b = a;
|
|
||||||
a = T1 + T2;
|
|
||||||
|
|
||||||
j++;
|
|
||||||
} while (j < 16);
|
|
||||||
|
|
||||||
do {
|
|
||||||
/* Part of the message block expansion: */
|
|
||||||
s0 = W512[(j+1)&0x0f];
|
|
||||||
s0 = sigma0_512(s0);
|
|
||||||
s1 = W512[(j+14)&0x0f];
|
|
||||||
s1 = sigma1_512(s1);
|
|
||||||
|
|
||||||
/* Apply the SHA-512 compression function to update a..h */
|
|
||||||
T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] +
|
|
||||||
(W512[j&0x0f] += s1 + W512[(j+9)&0x0f] + s0);
|
|
||||||
T2 = Sigma0_512(a) + Maj(a, b, c);
|
|
||||||
h = g;
|
|
||||||
g = f;
|
|
||||||
f = e;
|
|
||||||
e = d + T1;
|
|
||||||
d = c;
|
|
||||||
c = b;
|
|
||||||
b = a;
|
|
||||||
a = T1 + T2;
|
|
||||||
|
|
||||||
j++;
|
|
||||||
} while (j < 80);
|
|
||||||
|
|
||||||
/* Compute the current intermediate hash value */
|
|
||||||
state[0] += a;
|
|
||||||
state[1] += b;
|
|
||||||
state[2] += c;
|
|
||||||
state[3] += d;
|
|
||||||
state[4] += e;
|
|
||||||
state[5] += f;
|
|
||||||
state[6] += g;
|
|
||||||
state[7] += h;
|
|
||||||
|
|
||||||
/* Clean up */
|
|
||||||
a = b = c = d = e = f = g = h = T1 = T2 = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* SHA2_UNROLL_TRANSFORM */
|
|
||||||
|
|
||||||
void
|
|
||||||
SHA512Update(SHA2_CTX *context, const u_int8_t *data, size_t len)
|
|
||||||
{
|
|
||||||
size_t freespace, usedspace;
|
|
||||||
|
|
||||||
/* Calling with no data is valid (we do nothing) */
|
|
||||||
if (len == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
usedspace = (context->bitcount[0] >> 3) % SHA512_BLOCK_LENGTH;
|
|
||||||
if (usedspace > 0) {
|
|
||||||
/* Calculate how much free space is available in the buffer */
|
|
||||||
freespace = SHA512_BLOCK_LENGTH - usedspace;
|
|
||||||
|
|
||||||
if (len >= freespace) {
|
|
||||||
/* Fill the buffer completely and process it */
|
|
||||||
memcpy(&context->buffer[usedspace], data, freespace);
|
|
||||||
ADDINC128(context->bitcount, freespace << 3);
|
|
||||||
len -= freespace;
|
|
||||||
data += freespace;
|
|
||||||
SHA512Transform(context->state.st64, context->buffer);
|
|
||||||
} else {
|
|
||||||
/* The buffer is not yet full */
|
|
||||||
memcpy(&context->buffer[usedspace], data, len);
|
|
||||||
ADDINC128(context->bitcount, len << 3);
|
|
||||||
/* Clean up: */
|
|
||||||
usedspace = freespace = 0;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
while (len >= SHA512_BLOCK_LENGTH) {
|
|
||||||
/* Process as many complete blocks as we can */
|
|
||||||
SHA512Transform(context->state.st64, data);
|
|
||||||
ADDINC128(context->bitcount, SHA512_BLOCK_LENGTH << 3);
|
|
||||||
len -= SHA512_BLOCK_LENGTH;
|
|
||||||
data += SHA512_BLOCK_LENGTH;
|
|
||||||
}
|
|
||||||
if (len > 0) {
|
|
||||||
/* There's left-overs, so save 'em */
|
|
||||||
memcpy(context->buffer, data, len);
|
|
||||||
ADDINC128(context->bitcount, len << 3);
|
|
||||||
}
|
|
||||||
/* Clean up: */
|
|
||||||
usedspace = freespace = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
SHA512Pad(SHA2_CTX *context)
|
|
||||||
{
|
|
||||||
unsigned int usedspace;
|
|
||||||
|
|
||||||
usedspace = (context->bitcount[0] >> 3) % SHA512_BLOCK_LENGTH;
|
|
||||||
if (usedspace > 0) {
|
|
||||||
/* Begin padding with a 1 bit: */
|
|
||||||
context->buffer[usedspace++] = 0x80;
|
|
||||||
|
|
||||||
if (usedspace <= SHA512_SHORT_BLOCK_LENGTH) {
|
|
||||||
/* Set-up for the last transform: */
|
|
||||||
memset(&context->buffer[usedspace], 0, SHA512_SHORT_BLOCK_LENGTH - usedspace);
|
|
||||||
} else {
|
|
||||||
if (usedspace < SHA512_BLOCK_LENGTH) {
|
|
||||||
memset(&context->buffer[usedspace], 0, SHA512_BLOCK_LENGTH - usedspace);
|
|
||||||
}
|
|
||||||
/* Do second-to-last transform: */
|
|
||||||
SHA512Transform(context->state.st64, context->buffer);
|
|
||||||
|
|
||||||
/* And set-up for the last transform: */
|
|
||||||
memset(context->buffer, 0, SHA512_BLOCK_LENGTH - 2);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
/* Prepare for final transform: */
|
|
||||||
memset(context->buffer, 0, SHA512_SHORT_BLOCK_LENGTH);
|
|
||||||
|
|
||||||
/* Begin padding with a 1 bit: */
|
|
||||||
*context->buffer = 0x80;
|
|
||||||
}
|
|
||||||
/* Store the length of input data (in bits) in big endian format: */
|
|
||||||
BE_64_TO_8(&context->buffer[SHA512_SHORT_BLOCK_LENGTH],
|
|
||||||
context->bitcount[1]);
|
|
||||||
BE_64_TO_8(&context->buffer[SHA512_SHORT_BLOCK_LENGTH + 8],
|
|
||||||
context->bitcount[0]);
|
|
||||||
|
|
||||||
/* Final transform: */
|
|
||||||
SHA512Transform(context->state.st64, context->buffer);
|
|
||||||
|
|
||||||
/* Clean up: */
|
|
||||||
usedspace = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
SHA512Final(u_int8_t digest[SHA512_DIGEST_LENGTH], SHA2_CTX *context)
|
|
||||||
{
|
|
||||||
SHA512Pad(context);
|
|
||||||
|
|
||||||
#if BYTE_ORDER == LITTLE_ENDIAN
|
|
||||||
int i;
|
|
||||||
|
|
||||||
/* Convert TO host byte order */
|
|
||||||
for (i = 0; i < 8; i++)
|
|
||||||
BE_64_TO_8(digest + i * 8, context->state.st64[i]);
|
|
||||||
#else
|
|
||||||
memcpy(digest, context->state.st64, SHA512_DIGEST_LENGTH);
|
|
||||||
#endif
|
|
||||||
memset(context, 0, sizeof(*context));
|
|
||||||
}
|
|
||||||
|
|
||||||
#if !defined(SHA2_SMALL)
|
|
||||||
|
|
||||||
/*** SHA-384: *********************************************************/
|
|
||||||
void
|
|
||||||
SHA384Init(SHA2_CTX *context)
|
|
||||||
{
|
|
||||||
memcpy(context->state.st64, sha384_initial_hash_value,
|
|
||||||
sizeof(sha384_initial_hash_value));
|
|
||||||
memset(context->buffer, 0, sizeof(context->buffer));
|
|
||||||
context->bitcount[0] = context->bitcount[1] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
__weak_alias(SHA384Transform, SHA512Transform);
|
|
||||||
__weak_alias(SHA384Update, SHA512Update);
|
|
||||||
__weak_alias(SHA384Pad, SHA512Pad);
|
|
||||||
|
|
||||||
void
|
|
||||||
SHA384Final(u_int8_t digest[SHA384_DIGEST_LENGTH], SHA2_CTX *context)
|
|
||||||
{
|
|
||||||
SHA384Pad(context);
|
|
||||||
|
|
||||||
#if BYTE_ORDER == LITTLE_ENDIAN
|
|
||||||
int i;
|
|
||||||
|
|
||||||
/* Convert TO host byte order */
|
|
||||||
for (i = 0; i < 6; i++)
|
|
||||||
BE_64_TO_8(digest + i * 8, context->state.st64[i]);
|
|
||||||
#else
|
|
||||||
memcpy(digest, context->state.st64, SHA384_DIGEST_LENGTH);
|
|
||||||
#endif
|
|
||||||
/* Zero out state data */
|
|
||||||
memset(context, 0, sizeof(*context));
|
|
||||||
}
|
|
||||||
#endif /* !defined(SHA2_SMALL) */
|
|
|
@ -1,164 +0,0 @@
|
||||||
.\" $OpenBSD: src/usr.bin/signify/signify.1,v 1.26 2014/03/16 22:49:56 tedu Exp $
|
|
||||||
.\"
|
|
||||||
.\"Copyright (c) 2013 Marc Espie <espie@openbsd.org>
|
|
||||||
.\"Copyright (c) 2013 Ted Unangst <tedu@openbsd.org>
|
|
||||||
.\"
|
|
||||||
.\"Permission to use, copy, modify, and distribute this software for any
|
|
||||||
.\"purpose with or without fee is hereby granted, provided that the above
|
|
||||||
.\"copyright notice and this permission notice appear in all copies.
|
|
||||||
.\"
|
|
||||||
.\"THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
.\"WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
.\"MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
.\"ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
.\"WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
.\"ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
||||||
.\"OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
.Dd $Mdocdate: May 8 2014 $
|
|
||||||
.Dt SIGNIFY 1
|
|
||||||
.Os
|
|
||||||
.Sh NAME
|
|
||||||
.Nm signify
|
|
||||||
.Nd cryptographically sign and verify files
|
|
||||||
.Sh SYNOPSIS
|
|
||||||
.Nm signify
|
|
||||||
.Fl C
|
|
||||||
.Op Fl q
|
|
||||||
.Fl p Ar pubkey
|
|
||||||
.Fl x Ar sigfile
|
|
||||||
.Op Ar
|
|
||||||
.Nm signify
|
|
||||||
.Fl G
|
|
||||||
.Op Fl n
|
|
||||||
.Op Fl c Ar comment
|
|
||||||
.Fl p Ar pubkey
|
|
||||||
.Fl s Ar seckey
|
|
||||||
.Nm signify
|
|
||||||
.Fl I
|
|
||||||
.Op Fl p Ar pubkey
|
|
||||||
.Op Fl s Ar seckey
|
|
||||||
.Op Fl x Ar sigfile
|
|
||||||
.Nm signify
|
|
||||||
.Fl S
|
|
||||||
.Op Fl e
|
|
||||||
.Op Fl x Ar sigfile
|
|
||||||
.Fl s Ar seckey
|
|
||||||
.Fl m Ar message
|
|
||||||
.Nm signify
|
|
||||||
.Fl V
|
|
||||||
.Op Fl eq
|
|
||||||
.Op Fl x Ar sigfile
|
|
||||||
.Fl p Ar pubkey
|
|
||||||
.Fl m Ar message
|
|
||||||
.Sh DESCRIPTION
|
|
||||||
The
|
|
||||||
.Nm
|
|
||||||
utility creates and verifies cryptographic signatures.
|
|
||||||
A signature verifies the integrity of a
|
|
||||||
.Ar message .
|
|
||||||
The mode of operation is selected with the following options:
|
|
||||||
.Bl -tag -width Dsssigfile
|
|
||||||
.It Fl C
|
|
||||||
Verify a signed checksum list, and then verify the checksum for
|
|
||||||
each file.
|
|
||||||
If no files are specified, all of them are checked.
|
|
||||||
.Ar sigfile
|
|
||||||
should be the signed output of
|
|
||||||
.Xr sha256 1 .
|
|
||||||
.It Fl G
|
|
||||||
Generate a new key pair.
|
|
||||||
.It Fl I
|
|
||||||
Inspect the specified keys or signature and print their fingerprint.
|
|
||||||
.It Fl S
|
|
||||||
Sign the specified message file and create a signature.
|
|
||||||
.It Fl V
|
|
||||||
Verify the message and signature match.
|
|
||||||
.El
|
|
||||||
.Pp
|
|
||||||
The other options are as follows:
|
|
||||||
.Bl -tag -width Dsssignature
|
|
||||||
.It Fl c Ar comment
|
|
||||||
Specify the comment to be added during key generation.
|
|
||||||
.It Fl e
|
|
||||||
When signing, embed the message after the signature.
|
|
||||||
When verifying, extract the message from the signature.
|
|
||||||
(This requires that the signature was created using
|
|
||||||
.Fl e
|
|
||||||
and creates a new message file as output.)
|
|
||||||
.It Fl m Ar message
|
|
||||||
When signing, the file containing the message to sign.
|
|
||||||
When verifying, the file containing the message to verify.
|
|
||||||
When verifying with
|
|
||||||
.Fl e ,
|
|
||||||
the file to create.
|
|
||||||
.It Fl n
|
|
||||||
Do not ask for a passphrase during key generation.
|
|
||||||
Otherwise,
|
|
||||||
.Nm
|
|
||||||
will prompt the user for a passphrase to protect the secret key.
|
|
||||||
.It Fl p Ar pubkey
|
|
||||||
Public key produced by
|
|
||||||
.Fl G ,
|
|
||||||
and used by
|
|
||||||
.Fl V
|
|
||||||
to check a signature.
|
|
||||||
.It Fl q
|
|
||||||
Quiet mode.
|
|
||||||
Suppress informational output.
|
|
||||||
.It Fl s Ar seckey
|
|
||||||
Secret (private) key produced by
|
|
||||||
.Fl G ,
|
|
||||||
and used by
|
|
||||||
.Fl S
|
|
||||||
to sign a message.
|
|
||||||
.It Fl x Ar sigfile
|
|
||||||
The signature file to create or verify.
|
|
||||||
The default is
|
|
||||||
.Ar message Ns .sig .
|
|
||||||
.El
|
|
||||||
.Pp
|
|
||||||
The key and signature files created by
|
|
||||||
.Nm
|
|
||||||
have the same format.
|
|
||||||
The first line of the file is a free form text comment that may be edited,
|
|
||||||
so long as it does not exceed a single line.
|
|
||||||
.\" Signature comments will be generated based on the name of the secret
|
|
||||||
.\" key used for signing.
|
|
||||||
.\" This comment can then be used as a hint for the name of the public key
|
|
||||||
.\" when verifying.
|
|
||||||
The second line of the file is the actual key or signature base64 encoded.
|
|
||||||
.Sh EXIT STATUS
|
|
||||||
.Ex -std signify
|
|
||||||
It may fail because of one of the following reasons:
|
|
||||||
.Pp
|
|
||||||
.Bl -bullet -compact
|
|
||||||
.It
|
|
||||||
Some necessary files do not exist.
|
|
||||||
.It
|
|
||||||
Entered passphrase is incorrect.
|
|
||||||
.It
|
|
||||||
The message file was corrupted and its signature does not match.
|
|
||||||
.It
|
|
||||||
The message file is too large.
|
|
||||||
.El
|
|
||||||
.Sh EXAMPLES
|
|
||||||
Create a new key pair:
|
|
||||||
.Dl $ signify -G -p newkey.pub -s newkey.sec
|
|
||||||
.Pp
|
|
||||||
Sign a file, specifying a signature name:
|
|
||||||
.Dl $ signify -S -s key.sec -m message.txt -x msg.sig
|
|
||||||
.Pp
|
|
||||||
Verify a signature, using the default signature name:
|
|
||||||
.Dl $ signify -V -p key.pub -m generalsorders.txt
|
|
||||||
.Pp
|
|
||||||
Verify a SHA256 digest list (created with sha256sum --tag)
|
|
||||||
.Dl $ signify -C -p key.pub -x SHA256SUMS.sig
|
|
||||||
.Ed
|
|
||||||
.Sh SEE ALSO
|
|
||||||
.Xr sha256sum 1
|
|
||||||
.Sh HISTORY
|
|
||||||
The
|
|
||||||
.Nm
|
|
||||||
command first appeared in
|
|
||||||
.Ox 5.5 .
|
|
||||||
This is a portable version for use on Linux and other unixes.
|
|
|
@ -1,806 +0,0 @@
|
||||||
/* $OpenBSD: src/usr.bin/signify/signify.c,v 1.91 2014/07/13 18:59:40 tedu Exp $ */
|
|
||||||
/*
|
|
||||||
* Copyright (c) 2013 Ted Unangst <tedu@openbsd.org>
|
|
||||||
*
|
|
||||||
* Permission to use, copy, modify, and distribute this software for any
|
|
||||||
* purpose with or without fee is hereby granted, provided that the above
|
|
||||||
* copyright notice and this permission notice appear in all copies.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
||||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
#include <sys/stat.h>
|
|
||||||
|
|
||||||
#include <netinet/in.h>
|
|
||||||
#include <resolv.h>
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <err.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <readpassphrase.h>
|
|
||||||
#include <util.h>
|
|
||||||
#include <sha2.h>
|
|
||||||
|
|
||||||
#include "crypto_api.h"
|
|
||||||
#ifndef VERIFY_ONLY
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <ohash.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define SIGBYTES crypto_sign_ed25519_BYTES
|
|
||||||
#define SECRETBYTES crypto_sign_ed25519_SECRETKEYBYTES
|
|
||||||
#define PUBLICBYTES crypto_sign_ed25519_PUBLICKEYBYTES
|
|
||||||
|
|
||||||
#define PKALG "Ed"
|
|
||||||
#define KDFALG "BK"
|
|
||||||
#define FPLEN 8
|
|
||||||
|
|
||||||
#define COMMENTHDR "untrusted comment: "
|
|
||||||
#define COMMENTHDRLEN 19
|
|
||||||
#define COMMENTMAXLEN 1024
|
|
||||||
#define VERIFYWITH "verify with "
|
|
||||||
|
|
||||||
struct enckey {
|
|
||||||
uint8_t pkalg[2];
|
|
||||||
uint8_t kdfalg[2];
|
|
||||||
uint32_t kdfrounds;
|
|
||||||
uint8_t salt[16];
|
|
||||||
uint8_t checksum[8];
|
|
||||||
uint8_t fingerprint[FPLEN];
|
|
||||||
uint8_t seckey[SECRETBYTES];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct pubkey {
|
|
||||||
uint8_t pkalg[2];
|
|
||||||
uint8_t fingerprint[FPLEN];
|
|
||||||
uint8_t pubkey[PUBLICBYTES];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct sig {
|
|
||||||
uint8_t pkalg[2];
|
|
||||||
uint8_t fingerprint[FPLEN];
|
|
||||||
uint8_t sig[SIGBYTES];
|
|
||||||
};
|
|
||||||
|
|
||||||
extern char *__progname;
|
|
||||||
|
|
||||||
static void
|
|
||||||
usage(const char *error)
|
|
||||||
{
|
|
||||||
if (error)
|
|
||||||
fprintf(stderr, "%s\n", error);
|
|
||||||
fprintf(stderr, "usage:"
|
|
||||||
#ifndef VERIFYONLY
|
|
||||||
"\t%1$s -C [-q] -p pubkey -x sigfile [file ...]\n"
|
|
||||||
"\t%1$s -G [-n] [-c comment] -p pubkey -s seckey\n"
|
|
||||||
"\t%1$s -I [-p pubkey] [-s seckey] [-x sigfile]\n"
|
|
||||||
"\t%1$s -S [-e] [-x sigfile] -s seckey -m message\n"
|
|
||||||
#endif
|
|
||||||
"\t%1$s -V [-eq] [-x sigfile] -p pubkey -m message\n",
|
|
||||||
__progname);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
xopen(const char *fname, int oflags, mode_t mode)
|
|
||||||
{
|
|
||||||
struct stat sb;
|
|
||||||
int fd;
|
|
||||||
|
|
||||||
if (strcmp(fname, "-") == 0) {
|
|
||||||
if ((oflags & O_WRONLY))
|
|
||||||
fd = dup(STDOUT_FILENO);
|
|
||||||
else
|
|
||||||
fd = dup(STDIN_FILENO);
|
|
||||||
if (fd == -1)
|
|
||||||
err(1, "dup failed");
|
|
||||||
} else {
|
|
||||||
fd = open(fname, oflags, mode);
|
|
||||||
if (fd == -1)
|
|
||||||
err(1, "can't open %s for %s", fname,
|
|
||||||
(oflags & O_WRONLY) ? "writing" : "reading");
|
|
||||||
}
|
|
||||||
if (fstat(fd, &sb) == -1 || S_ISDIR(sb.st_mode))
|
|
||||||
errx(1, "not a valid file: %s", fname);
|
|
||||||
return fd;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void *
|
|
||||||
xmalloc(size_t len)
|
|
||||||
{
|
|
||||||
void *p;
|
|
||||||
|
|
||||||
if (!(p = malloc(len)))
|
|
||||||
err(1, "malloc %zu", len);
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
|
|
||||||
static size_t
|
|
||||||
parseb64file(const char *filename, char *b64, void *buf, size_t buflen,
|
|
||||||
char *comment)
|
|
||||||
{
|
|
||||||
char *commentend, *b64end;
|
|
||||||
|
|
||||||
commentend = strchr(b64, '\n');
|
|
||||||
if (!commentend || commentend - b64 <= COMMENTHDRLEN ||
|
|
||||||
memcmp(b64, COMMENTHDR, COMMENTHDRLEN) != 0)
|
|
||||||
errx(1, "invalid comment in %s; must start with '%s'",
|
|
||||||
filename, COMMENTHDR);
|
|
||||||
*commentend = '\0';
|
|
||||||
if (comment) {
|
|
||||||
if (strlcpy(comment, b64 + COMMENTHDRLEN,
|
|
||||||
COMMENTMAXLEN) >= COMMENTMAXLEN)
|
|
||||||
errx(1, "comment too long");
|
|
||||||
}
|
|
||||||
if (!(b64end = strchr(commentend + 1, '\n')))
|
|
||||||
errx(1, "missing new line after base64 in %s", filename);
|
|
||||||
*b64end = '\0';
|
|
||||||
if (b64_pton(commentend + 1, buf, buflen) != buflen)
|
|
||||||
errx(1, "invalid base64 encoding in %s", filename);
|
|
||||||
if (memcmp(buf, PKALG, 2) != 0)
|
|
||||||
errx(1, "unsupported file %s", filename);
|
|
||||||
return b64end - b64 + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
readb64file(const char *filename, void *buf, size_t buflen, char *comment)
|
|
||||||
{
|
|
||||||
char b64[2048];
|
|
||||||
int rv, fd;
|
|
||||||
|
|
||||||
fd = xopen(filename, O_RDONLY | O_NOFOLLOW, 0);
|
|
||||||
if ((rv = read(fd, b64, sizeof(b64) - 1)) == -1)
|
|
||||||
err(1, "read from %s", filename);
|
|
||||||
b64[rv] = '\0';
|
|
||||||
parseb64file(filename, b64, buf, buflen, comment);
|
|
||||||
explicit_bzero(b64, sizeof(b64));
|
|
||||||
close(fd);
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint8_t *
|
|
||||||
readmsg(const char *filename, unsigned long long *msglenp)
|
|
||||||
{
|
|
||||||
unsigned long long msglen = 0;
|
|
||||||
uint8_t *msg = NULL;
|
|
||||||
struct stat sb;
|
|
||||||
ssize_t x, space;
|
|
||||||
int fd;
|
|
||||||
const unsigned long long maxmsgsize = 1UL << 30;
|
|
||||||
|
|
||||||
fd = xopen(filename, O_RDONLY | O_NOFOLLOW, 0);
|
|
||||||
if (fstat(fd, &sb) == 0 && S_ISREG(sb.st_mode)) {
|
|
||||||
if (sb.st_size > maxmsgsize)
|
|
||||||
errx(1, "msg too large in %s", filename);
|
|
||||||
space = sb.st_size + 1;
|
|
||||||
} else {
|
|
||||||
space = 64 * 1024;
|
|
||||||
}
|
|
||||||
|
|
||||||
msg = xmalloc(space + 1);
|
|
||||||
while (1) {
|
|
||||||
if (space == 0) {
|
|
||||||
if (msglen * 2 > maxmsgsize)
|
|
||||||
errx(1, "msg too large in %s", filename);
|
|
||||||
space = msglen;
|
|
||||||
if (!(msg = realloc(msg, msglen + space + 1)))
|
|
||||||
errx(1, "realloc");
|
|
||||||
}
|
|
||||||
if ((x = read(fd, msg + msglen, space)) == -1)
|
|
||||||
err(1, "read from %s", filename);
|
|
||||||
if (x == 0)
|
|
||||||
break;
|
|
||||||
space -= x;
|
|
||||||
msglen += x;
|
|
||||||
}
|
|
||||||
|
|
||||||
msg[msglen] = '\0';
|
|
||||||
close(fd);
|
|
||||||
|
|
||||||
*msglenp = msglen;
|
|
||||||
return msg;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
writeall(int fd, const void *buf, size_t buflen, const char *filename)
|
|
||||||
{
|
|
||||||
ssize_t x;
|
|
||||||
|
|
||||||
while (buflen != 0) {
|
|
||||||
if ((x = write(fd, buf, buflen)) == -1)
|
|
||||||
err(1, "write to %s", filename);
|
|
||||||
buflen -= x;
|
|
||||||
buf = (char *)buf + x;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef VERIFYONLY
|
|
||||||
static void
|
|
||||||
writeb64file(const char *filename, const char *comment, const void *buf,
|
|
||||||
size_t buflen, const void *msg, size_t msglen, int oflags, mode_t mode)
|
|
||||||
{
|
|
||||||
char header[1024];
|
|
||||||
char b64[1024];
|
|
||||||
int fd, rv, nr;
|
|
||||||
|
|
||||||
fd = xopen(filename, O_CREAT|oflags|O_NOFOLLOW|O_WRONLY, mode);
|
|
||||||
if ((nr = snprintf(header, sizeof(header), "%s%s\n",
|
|
||||||
COMMENTHDR, comment)) == -1 || nr >= sizeof(header))
|
|
||||||
errx(1, "comment too long");
|
|
||||||
writeall(fd, header, strlen(header), filename);
|
|
||||||
if ((rv = b64_ntop(buf, buflen, b64, sizeof(b64)-1)) == -1)
|
|
||||||
errx(1, "base64 encode failed");
|
|
||||||
b64[rv++] = '\n';
|
|
||||||
writeall(fd, b64, rv, filename);
|
|
||||||
explicit_bzero(b64, sizeof(b64));
|
|
||||||
if (msg)
|
|
||||||
writeall(fd, msg, msglen, filename);
|
|
||||||
close(fd);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
kdf(uint8_t *salt, size_t saltlen, int rounds, int allowstdin, int confirm,
|
|
||||||
uint8_t *key, size_t keylen)
|
|
||||||
{
|
|
||||||
char pass[1024];
|
|
||||||
int rppflags = RPP_ECHO_OFF;
|
|
||||||
|
|
||||||
if (rounds == 0) {
|
|
||||||
memset(key, 0, keylen);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (allowstdin && !isatty(STDIN_FILENO))
|
|
||||||
rppflags |= RPP_STDIN;
|
|
||||||
if (!readpassphrase("passphrase: ", pass, sizeof(pass), rppflags))
|
|
||||||
errx(1, "unable to read passphrase");
|
|
||||||
if (strlen(pass) == 0)
|
|
||||||
errx(1, "please provide a password");
|
|
||||||
if (confirm && !(rppflags & RPP_STDIN)) {
|
|
||||||
char pass2[1024];
|
|
||||||
if (!readpassphrase("confirm passphrase: ", pass2,
|
|
||||||
sizeof(pass2), rppflags))
|
|
||||||
errx(1, "unable to read passphrase");
|
|
||||||
if (strcmp(pass, pass2) != 0)
|
|
||||||
errx(1, "passwords don't match");
|
|
||||||
explicit_bzero(pass2, sizeof(pass2));
|
|
||||||
}
|
|
||||||
if (bcrypt_pbkdf(pass, strlen(pass), salt, saltlen, key,
|
|
||||||
keylen, rounds) == -1)
|
|
||||||
errx(1, "bcrypt pbkdf");
|
|
||||||
explicit_bzero(pass, sizeof(pass));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
signmsg(uint8_t *seckey, uint8_t *msg, unsigned long long msglen,
|
|
||||||
uint8_t *sig)
|
|
||||||
{
|
|
||||||
unsigned long long siglen;
|
|
||||||
uint8_t *sigbuf;
|
|
||||||
|
|
||||||
sigbuf = xmalloc(msglen + SIGBYTES);
|
|
||||||
crypto_sign_ed25519(sigbuf, &siglen, msg, msglen, seckey);
|
|
||||||
memcpy(sig, sigbuf, SIGBYTES);
|
|
||||||
free(sigbuf);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
generate(const char *pubkeyfile, const char *seckeyfile, int rounds,
|
|
||||||
const char *comment)
|
|
||||||
{
|
|
||||||
uint8_t digest[SHA512_DIGEST_LENGTH];
|
|
||||||
struct pubkey pubkey;
|
|
||||||
struct enckey enckey;
|
|
||||||
uint8_t xorkey[sizeof(enckey.seckey)];
|
|
||||||
uint8_t fingerprint[FPLEN];
|
|
||||||
char commentbuf[COMMENTMAXLEN];
|
|
||||||
SHA2_CTX ctx;
|
|
||||||
int i, nr;
|
|
||||||
|
|
||||||
crypto_sign_ed25519_keypair(pubkey.pubkey, enckey.seckey);
|
|
||||||
arc4random_buf(fingerprint, sizeof(fingerprint));
|
|
||||||
|
|
||||||
SHA512Init(&ctx);
|
|
||||||
SHA512Update(&ctx, enckey.seckey, sizeof(enckey.seckey));
|
|
||||||
SHA512Final(digest, &ctx);
|
|
||||||
|
|
||||||
memcpy(enckey.pkalg, PKALG, 2);
|
|
||||||
memcpy(enckey.kdfalg, KDFALG, 2);
|
|
||||||
enckey.kdfrounds = htonl(rounds);
|
|
||||||
memcpy(enckey.fingerprint, fingerprint, FPLEN);
|
|
||||||
arc4random_buf(enckey.salt, sizeof(enckey.salt));
|
|
||||||
kdf(enckey.salt, sizeof(enckey.salt), rounds, 1, 1, xorkey, sizeof(xorkey));
|
|
||||||
memcpy(enckey.checksum, digest, sizeof(enckey.checksum));
|
|
||||||
for (i = 0; i < sizeof(enckey.seckey); i++)
|
|
||||||
enckey.seckey[i] ^= xorkey[i];
|
|
||||||
explicit_bzero(digest, sizeof(digest));
|
|
||||||
explicit_bzero(xorkey, sizeof(xorkey));
|
|
||||||
|
|
||||||
if ((nr = snprintf(commentbuf, sizeof(commentbuf), "%s secret key",
|
|
||||||
comment)) == -1 || nr >= sizeof(commentbuf))
|
|
||||||
errx(1, "comment too long");
|
|
||||||
writeb64file(seckeyfile, commentbuf, &enckey,
|
|
||||||
sizeof(enckey), NULL, 0, O_EXCL, 0600);
|
|
||||||
explicit_bzero(&enckey, sizeof(enckey));
|
|
||||||
|
|
||||||
memcpy(pubkey.pkalg, PKALG, 2);
|
|
||||||
memcpy(pubkey.fingerprint, fingerprint, FPLEN);
|
|
||||||
if ((nr = snprintf(commentbuf, sizeof(commentbuf), "%s public key",
|
|
||||||
comment)) == -1 || nr >= sizeof(commentbuf))
|
|
||||||
errx(1, "comment too long");
|
|
||||||
writeb64file(pubkeyfile, commentbuf, &pubkey,
|
|
||||||
sizeof(pubkey), NULL, 0, O_EXCL, 0666);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
sign(const char *seckeyfile, const char *msgfile, const char *sigfile,
|
|
||||||
int embedded)
|
|
||||||
{
|
|
||||||
struct sig sig;
|
|
||||||
uint8_t digest[SHA512_DIGEST_LENGTH];
|
|
||||||
struct enckey enckey;
|
|
||||||
uint8_t xorkey[sizeof(enckey.seckey)];
|
|
||||||
uint8_t *msg;
|
|
||||||
char comment[COMMENTMAXLEN], sigcomment[COMMENTMAXLEN];
|
|
||||||
char *secname;
|
|
||||||
unsigned long long msglen;
|
|
||||||
int i, rounds, nr;
|
|
||||||
SHA2_CTX ctx;
|
|
||||||
|
|
||||||
readb64file(seckeyfile, &enckey, sizeof(enckey), comment);
|
|
||||||
|
|
||||||
if (memcmp(enckey.kdfalg, KDFALG, 2) != 0)
|
|
||||||
errx(1, "unsupported KDF");
|
|
||||||
rounds = ntohl(enckey.kdfrounds);
|
|
||||||
kdf(enckey.salt, sizeof(enckey.salt), rounds, strcmp(msgfile, "-") != 0,
|
|
||||||
0, xorkey, sizeof(xorkey));
|
|
||||||
for (i = 0; i < sizeof(enckey.seckey); i++)
|
|
||||||
enckey.seckey[i] ^= xorkey[i];
|
|
||||||
explicit_bzero(xorkey, sizeof(xorkey));
|
|
||||||
SHA512Init(&ctx);
|
|
||||||
SHA512Update(&ctx, enckey.seckey, sizeof(enckey.seckey));
|
|
||||||
SHA512Final(digest, &ctx);
|
|
||||||
if (memcmp(enckey.checksum, digest, sizeof(enckey.checksum)) != 0)
|
|
||||||
errx(1, "incorrect passphrase");
|
|
||||||
explicit_bzero(digest, sizeof(digest));
|
|
||||||
|
|
||||||
msg = readmsg(msgfile, &msglen);
|
|
||||||
|
|
||||||
signmsg(enckey.seckey, msg, msglen, sig.sig);
|
|
||||||
memcpy(sig.fingerprint, enckey.fingerprint, FPLEN);
|
|
||||||
explicit_bzero(&enckey, sizeof(enckey));
|
|
||||||
|
|
||||||
memcpy(sig.pkalg, PKALG, 2);
|
|
||||||
secname = strstr(seckeyfile, ".sec");
|
|
||||||
if (secname && strlen(secname) == 4) {
|
|
||||||
if ((nr = snprintf(sigcomment, sizeof(sigcomment), VERIFYWITH "%.*s.pub",
|
|
||||||
(int)strlen(seckeyfile) - 4, seckeyfile)) == -1 || nr >= sizeof(sigcomment))
|
|
||||||
errx(1, "comment too long");
|
|
||||||
} else {
|
|
||||||
if ((nr = snprintf(sigcomment, sizeof(sigcomment), "signature from %s",
|
|
||||||
comment)) == -1 || nr >= sizeof(sigcomment))
|
|
||||||
errx(1, "comment too long");
|
|
||||||
}
|
|
||||||
if (embedded)
|
|
||||||
writeb64file(sigfile, sigcomment, &sig, sizeof(sig), msg,
|
|
||||||
msglen, O_TRUNC, 0666);
|
|
||||||
else
|
|
||||||
writeb64file(sigfile, sigcomment, &sig, sizeof(sig), NULL,
|
|
||||||
0, O_TRUNC, 0666);
|
|
||||||
|
|
||||||
free(msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
inspect(const char *seckeyfile, const char *pubkeyfile, const char *sigfile)
|
|
||||||
{
|
|
||||||
struct sig sig;
|
|
||||||
struct enckey enckey;
|
|
||||||
struct pubkey pubkey;
|
|
||||||
char fp[(FPLEN + 2) / 3 * 4 + 1];
|
|
||||||
|
|
||||||
if (seckeyfile) {
|
|
||||||
readb64file(seckeyfile, &enckey, sizeof(enckey), NULL);
|
|
||||||
b64_ntop(enckey.fingerprint, FPLEN, fp, sizeof(fp));
|
|
||||||
printf("sec fp: %s\n", fp);
|
|
||||||
}
|
|
||||||
if (pubkeyfile) {
|
|
||||||
readb64file(pubkeyfile, &pubkey, sizeof(pubkey), NULL);
|
|
||||||
b64_ntop(pubkey.fingerprint, FPLEN, fp, sizeof(fp));
|
|
||||||
printf("pub fp: %s\n", fp);
|
|
||||||
}
|
|
||||||
if (sigfile) {
|
|
||||||
readb64file(sigfile, &sig, sizeof(sig), NULL);
|
|
||||||
b64_ntop(sig.fingerprint, FPLEN, fp, sizeof(fp));
|
|
||||||
printf("sig fp: %s\n", fp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void
|
|
||||||
verifymsg(struct pubkey *pubkey, uint8_t *msg, unsigned long long msglen,
|
|
||||||
struct sig *sig, int quiet)
|
|
||||||
{
|
|
||||||
uint8_t *sigbuf, *dummybuf;
|
|
||||||
unsigned long long siglen, dummylen;
|
|
||||||
|
|
||||||
if (memcmp(pubkey->fingerprint, sig->fingerprint, FPLEN) != 0)
|
|
||||||
errx(1, "verification failed: checked against wrong key");
|
|
||||||
|
|
||||||
siglen = SIGBYTES + msglen;
|
|
||||||
sigbuf = xmalloc(siglen);
|
|
||||||
dummybuf = xmalloc(siglen);
|
|
||||||
memcpy(sigbuf, sig->sig, SIGBYTES);
|
|
||||||
memcpy(sigbuf + SIGBYTES, msg, msglen);
|
|
||||||
if (crypto_sign_ed25519_open(dummybuf, &dummylen, sigbuf, siglen,
|
|
||||||
pubkey->pubkey) == -1)
|
|
||||||
errx(1, "signature verification failed");
|
|
||||||
if (!quiet)
|
|
||||||
printf("Signature Verified\n");
|
|
||||||
free(sigbuf);
|
|
||||||
free(dummybuf);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
readpubkey(const char *pubkeyfile, struct pubkey *pubkey,
|
|
||||||
const char *sigcomment)
|
|
||||||
{
|
|
||||||
const char *safepath = "/etc/signify/";
|
|
||||||
|
|
||||||
if (!pubkeyfile) {
|
|
||||||
pubkeyfile = strstr(sigcomment, VERIFYWITH);
|
|
||||||
if (pubkeyfile) {
|
|
||||||
pubkeyfile += strlen(VERIFYWITH);
|
|
||||||
if (strncmp(pubkeyfile, safepath, strlen(safepath)) != 0 ||
|
|
||||||
strstr(pubkeyfile, "/../") != NULL)
|
|
||||||
errx(1, "untrusted path %s", pubkeyfile);
|
|
||||||
} else
|
|
||||||
usage("must specify pubkey");
|
|
||||||
}
|
|
||||||
readb64file(pubkeyfile, pubkey, sizeof(*pubkey), NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
verifysimple(const char *pubkeyfile, const char *msgfile, const char *sigfile,
|
|
||||||
int quiet)
|
|
||||||
{
|
|
||||||
char sigcomment[COMMENTMAXLEN];
|
|
||||||
struct sig sig;
|
|
||||||
struct pubkey pubkey;
|
|
||||||
unsigned long long msglen;
|
|
||||||
uint8_t *msg;
|
|
||||||
|
|
||||||
msg = readmsg(msgfile, &msglen);
|
|
||||||
|
|
||||||
readb64file(sigfile, &sig, sizeof(sig), sigcomment);
|
|
||||||
readpubkey(pubkeyfile, &pubkey, sigcomment);
|
|
||||||
|
|
||||||
verifymsg(&pubkey, msg, msglen, &sig, quiet);
|
|
||||||
|
|
||||||
free(msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint8_t *
|
|
||||||
verifyembedded(const char *pubkeyfile, const char *sigfile,
|
|
||||||
int quiet, unsigned long long *msglenp)
|
|
||||||
{
|
|
||||||
char sigcomment[COMMENTMAXLEN];
|
|
||||||
struct sig sig;
|
|
||||||
struct pubkey pubkey;
|
|
||||||
unsigned long long msglen, siglen;
|
|
||||||
uint8_t *msg;
|
|
||||||
|
|
||||||
msg = readmsg(sigfile, &msglen);
|
|
||||||
|
|
||||||
siglen = parseb64file(sigfile, msg, &sig, sizeof(sig), sigcomment);
|
|
||||||
readpubkey(pubkeyfile, &pubkey, sigcomment);
|
|
||||||
|
|
||||||
msglen -= siglen;
|
|
||||||
memmove(msg, msg + siglen, msglen);
|
|
||||||
msg[msglen] = 0;
|
|
||||||
|
|
||||||
verifymsg(&pubkey, msg, msglen, &sig, quiet);
|
|
||||||
|
|
||||||
*msglenp = msglen;
|
|
||||||
return msg;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
verify(const char *pubkeyfile, const char *msgfile, const char *sigfile,
|
|
||||||
int embedded, int quiet)
|
|
||||||
{
|
|
||||||
unsigned long long msglen;
|
|
||||||
uint8_t *msg;
|
|
||||||
int fd;
|
|
||||||
|
|
||||||
if (embedded) {
|
|
||||||
msg = verifyembedded(pubkeyfile, sigfile, quiet, &msglen);
|
|
||||||
fd = xopen(msgfile, O_CREAT|O_TRUNC|O_NOFOLLOW|O_WRONLY, 0666);
|
|
||||||
writeall(fd, msg, msglen, msgfile);
|
|
||||||
free(msg);
|
|
||||||
close(fd);
|
|
||||||
} else {
|
|
||||||
verifysimple(pubkeyfile, msgfile, sigfile, quiet);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef VERIFYONLY
|
|
||||||
#define HASHBUFSIZE 224
|
|
||||||
struct checksum {
|
|
||||||
char file[1024];
|
|
||||||
char hash[HASHBUFSIZE];
|
|
||||||
char algo[32];
|
|
||||||
};
|
|
||||||
|
|
||||||
static void *
|
|
||||||
ecalloc(size_t s1, size_t s2, void *data)
|
|
||||||
{
|
|
||||||
void *p;
|
|
||||||
|
|
||||||
if (!(p = calloc(s1, s2)))
|
|
||||||
err(1, "calloc");
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
efree(void *p, void *data)
|
|
||||||
{
|
|
||||||
free(p);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
recodehash(char *hash, size_t len)
|
|
||||||
{
|
|
||||||
uint8_t data[HASHBUFSIZE / 2];
|
|
||||||
int i, rv;
|
|
||||||
|
|
||||||
if (strlen(hash) == len)
|
|
||||||
return;
|
|
||||||
if ((rv = b64_pton(hash, data, sizeof(data))) == -1)
|
|
||||||
errx(1, "invalid base64 encoding");
|
|
||||||
for (i = 0; i < rv; i++)
|
|
||||||
snprintf(hash + i * 2, HASHBUFSIZE - i * 2, "%2.2x", data[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
verifychecksum(struct checksum *c, int quiet)
|
|
||||||
{
|
|
||||||
char buf[HASHBUFSIZE];
|
|
||||||
|
|
||||||
if (strcmp(c->algo, "SHA256") == 0) {
|
|
||||||
recodehash(c->hash, SHA256_DIGEST_STRING_LENGTH-1);
|
|
||||||
if (!SHA256File(c->file, buf))
|
|
||||||
return 0;
|
|
||||||
} else if (strcmp(c->algo, "SHA512") == 0) {
|
|
||||||
recodehash(c->hash, SHA512_DIGEST_STRING_LENGTH-1);
|
|
||||||
if (!SHA512File(c->file, buf))
|
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
errx(1, "can't handle algorithm %s", c->algo);
|
|
||||||
}
|
|
||||||
if (strcmp(c->hash, buf) != 0) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (!quiet)
|
|
||||||
printf("%s: OK\n", c->file);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
verifychecksums(char *msg, int argc, char **argv, int quiet)
|
|
||||||
{
|
|
||||||
struct ohash_info info = { 0, NULL, ecalloc, efree, NULL };
|
|
||||||
struct ohash myh;
|
|
||||||
struct checksum c;
|
|
||||||
char *e, *line, *endline;
|
|
||||||
int hasfailed = 0;
|
|
||||||
int i, rv;
|
|
||||||
unsigned int slot;
|
|
||||||
|
|
||||||
ohash_init(&myh, 6, &info);
|
|
||||||
if (argc) {
|
|
||||||
for (i = 0; i < argc; i++) {
|
|
||||||
slot = ohash_qlookup(&myh, argv[i]);
|
|
||||||
e = ohash_find(&myh, slot);
|
|
||||||
if (e == NULL)
|
|
||||||
ohash_insert(&myh, slot, argv[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
line = msg;
|
|
||||||
while (line && *line) {
|
|
||||||
if ((endline = strchr(line, '\n')))
|
|
||||||
*endline++ = '\0';
|
|
||||||
rv = sscanf(line, "%31s (%1023s = %223s",
|
|
||||||
c.algo, c.file, c.hash);
|
|
||||||
if (rv != 3 || c.file[0] == 0 || c.file[strlen(c.file)-1] != ')')
|
|
||||||
errx(1, "unable to parse checksum line %s", line);
|
|
||||||
c.file[strlen(c.file) - 1] = '\0';
|
|
||||||
line = endline;
|
|
||||||
if (argc) {
|
|
||||||
slot = ohash_qlookup(&myh, c.file);
|
|
||||||
e = ohash_find(&myh, slot);
|
|
||||||
if (e != NULL) {
|
|
||||||
if (verifychecksum(&c, quiet) != 0)
|
|
||||||
ohash_remove(&myh, slot);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (verifychecksum(&c, quiet) == 0) {
|
|
||||||
slot = ohash_qlookup(&myh, c.file);
|
|
||||||
e = ohash_find(&myh, slot);
|
|
||||||
if (e == NULL) {
|
|
||||||
if (!(e = strdup(c.file)))
|
|
||||||
err(1, "strdup");
|
|
||||||
ohash_insert(&myh, slot, e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (e = ohash_first(&myh, &slot); e != NULL; e = ohash_next(&myh, &slot)) {
|
|
||||||
fprintf(stderr, "%s: FAIL\n", e);
|
|
||||||
hasfailed = 1;
|
|
||||||
if (argc == 0)
|
|
||||||
free(e);
|
|
||||||
}
|
|
||||||
ohash_delete(&myh);
|
|
||||||
if (hasfailed)
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
check(const char *pubkeyfile, const char *sigfile, int quiet, int argc,
|
|
||||||
char **argv)
|
|
||||||
{
|
|
||||||
unsigned long long msglen;
|
|
||||||
uint8_t *msg;
|
|
||||||
|
|
||||||
msg = verifyembedded(pubkeyfile, sigfile, quiet, &msglen);
|
|
||||||
verifychecksums((char *)msg, argc, argv, quiet);
|
|
||||||
|
|
||||||
free(msg);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int
|
|
||||||
main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
const char *pubkeyfile = NULL, *seckeyfile = NULL, *msgfile = NULL,
|
|
||||||
*sigfile = NULL;
|
|
||||||
char sigfilebuf[1024];
|
|
||||||
const char *comment = "signify";
|
|
||||||
int ch, rounds;
|
|
||||||
int embedded = 0;
|
|
||||||
int quiet = 0;
|
|
||||||
enum {
|
|
||||||
NONE,
|
|
||||||
CHECK,
|
|
||||||
GENERATE,
|
|
||||||
INSPECT,
|
|
||||||
SIGN,
|
|
||||||
VERIFY
|
|
||||||
} verb = NONE;
|
|
||||||
|
|
||||||
|
|
||||||
rounds = 42;
|
|
||||||
|
|
||||||
while ((ch = getopt(argc, argv, "CGISVc:em:np:qs:x:")) != -1) {
|
|
||||||
switch (ch) {
|
|
||||||
#ifndef VERIFYONLY
|
|
||||||
case 'C':
|
|
||||||
if (verb)
|
|
||||||
usage(NULL);
|
|
||||||
verb = CHECK;
|
|
||||||
break;
|
|
||||||
case 'G':
|
|
||||||
if (verb)
|
|
||||||
usage(NULL);
|
|
||||||
verb = GENERATE;
|
|
||||||
break;
|
|
||||||
case 'I':
|
|
||||||
if (verb)
|
|
||||||
usage(NULL);
|
|
||||||
verb = INSPECT;
|
|
||||||
break;
|
|
||||||
case 'S':
|
|
||||||
if (verb)
|
|
||||||
usage(NULL);
|
|
||||||
verb = SIGN;
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
case 'V':
|
|
||||||
if (verb)
|
|
||||||
usage(NULL);
|
|
||||||
verb = VERIFY;
|
|
||||||
break;
|
|
||||||
case 'c':
|
|
||||||
comment = optarg;
|
|
||||||
break;
|
|
||||||
case 'e':
|
|
||||||
embedded = 1;
|
|
||||||
break;
|
|
||||||
case 'm':
|
|
||||||
msgfile = optarg;
|
|
||||||
break;
|
|
||||||
case 'n':
|
|
||||||
rounds = 0;
|
|
||||||
break;
|
|
||||||
case 'p':
|
|
||||||
pubkeyfile = optarg;
|
|
||||||
break;
|
|
||||||
case 'q':
|
|
||||||
quiet = 1;
|
|
||||||
break;
|
|
||||||
case 's':
|
|
||||||
seckeyfile = optarg;
|
|
||||||
break;
|
|
||||||
case 'x':
|
|
||||||
sigfile = optarg;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
usage(NULL);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
argc -= optind;
|
|
||||||
argv += optind;
|
|
||||||
|
|
||||||
#ifndef VERIFYONLY
|
|
||||||
if (verb == CHECK) {
|
|
||||||
if (!sigfile)
|
|
||||||
usage("must specify sigfile");
|
|
||||||
check(pubkeyfile, sigfile, quiet, argc, argv);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (argc != 0)
|
|
||||||
usage(NULL);
|
|
||||||
|
|
||||||
if (!sigfile && msgfile) {
|
|
||||||
int nr;
|
|
||||||
if (strcmp(msgfile, "-") == 0)
|
|
||||||
usage("must specify sigfile with - message");
|
|
||||||
if ((nr = snprintf(sigfilebuf, sizeof(sigfilebuf), "%s.sig",
|
|
||||||
msgfile)) == -1 || nr >= sizeof(sigfilebuf))
|
|
||||||
errx(1, "path too long");
|
|
||||||
sigfile = sigfilebuf;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (verb) {
|
|
||||||
#ifndef VERIFYONLY
|
|
||||||
case GENERATE:
|
|
||||||
if (!pubkeyfile || !seckeyfile)
|
|
||||||
usage("must specify pubkey and seckey");
|
|
||||||
generate(pubkeyfile, seckeyfile, rounds, comment);
|
|
||||||
break;
|
|
||||||
case INSPECT:
|
|
||||||
inspect(seckeyfile, pubkeyfile, sigfile);
|
|
||||||
break;
|
|
||||||
case SIGN:
|
|
||||||
if (!msgfile || !seckeyfile)
|
|
||||||
usage("must specify message and seckey");
|
|
||||||
sign(seckeyfile, msgfile, sigfile, embedded);
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
case VERIFY:
|
|
||||||
if (!msgfile)
|
|
||||||
usage("must specify message");
|
|
||||||
verify(pubkeyfile, msgfile, sigfile, embedded, quiet);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
usage(NULL);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,265 +0,0 @@
|
||||||
/* $OpenBSD: smult_curve25519_ref.c,v 1.2 2013/11/02 22:02:14 markus Exp $ */
|
|
||||||
/*
|
|
||||||
version 20081011
|
|
||||||
Matthew Dempsky
|
|
||||||
Public domain.
|
|
||||||
Derived from public domain code by D. J. Bernstein.
|
|
||||||
*/
|
|
||||||
|
|
||||||
int crypto_scalarmult_curve25519(unsigned char *, const unsigned char *, const unsigned char *);
|
|
||||||
|
|
||||||
static void add(unsigned int out[32],const unsigned int a[32],const unsigned int b[32])
|
|
||||||
{
|
|
||||||
unsigned int j;
|
|
||||||
unsigned int u;
|
|
||||||
u = 0;
|
|
||||||
for (j = 0;j < 31;++j) { u += a[j] + b[j]; out[j] = u & 255; u >>= 8; }
|
|
||||||
u += a[31] + b[31]; out[31] = u;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void sub(unsigned int out[32],const unsigned int a[32],const unsigned int b[32])
|
|
||||||
{
|
|
||||||
unsigned int j;
|
|
||||||
unsigned int u;
|
|
||||||
u = 218;
|
|
||||||
for (j = 0;j < 31;++j) {
|
|
||||||
u += a[j] + 65280 - b[j];
|
|
||||||
out[j] = u & 255;
|
|
||||||
u >>= 8;
|
|
||||||
}
|
|
||||||
u += a[31] - b[31];
|
|
||||||
out[31] = u;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void squeeze(unsigned int a[32])
|
|
||||||
{
|
|
||||||
unsigned int j;
|
|
||||||
unsigned int u;
|
|
||||||
u = 0;
|
|
||||||
for (j = 0;j < 31;++j) { u += a[j]; a[j] = u & 255; u >>= 8; }
|
|
||||||
u += a[31]; a[31] = u & 127;
|
|
||||||
u = 19 * (u >> 7);
|
|
||||||
for (j = 0;j < 31;++j) { u += a[j]; a[j] = u & 255; u >>= 8; }
|
|
||||||
u += a[31]; a[31] = u;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const unsigned int minusp[32] = {
|
|
||||||
19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128
|
|
||||||
} ;
|
|
||||||
|
|
||||||
static void freeze(unsigned int a[32])
|
|
||||||
{
|
|
||||||
unsigned int aorig[32];
|
|
||||||
unsigned int j;
|
|
||||||
unsigned int negative;
|
|
||||||
|
|
||||||
for (j = 0;j < 32;++j) aorig[j] = a[j];
|
|
||||||
add(a,a,minusp);
|
|
||||||
negative = -((a[31] >> 7) & 1);
|
|
||||||
for (j = 0;j < 32;++j) a[j] ^= negative & (aorig[j] ^ a[j]);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void mult(unsigned int out[32],const unsigned int a[32],const unsigned int b[32])
|
|
||||||
{
|
|
||||||
unsigned int i;
|
|
||||||
unsigned int j;
|
|
||||||
unsigned int u;
|
|
||||||
|
|
||||||
for (i = 0;i < 32;++i) {
|
|
||||||
u = 0;
|
|
||||||
for (j = 0;j <= i;++j) u += a[j] * b[i - j];
|
|
||||||
for (j = i + 1;j < 32;++j) u += 38 * a[j] * b[i + 32 - j];
|
|
||||||
out[i] = u;
|
|
||||||
}
|
|
||||||
squeeze(out);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void mult121665(unsigned int out[32],const unsigned int a[32])
|
|
||||||
{
|
|
||||||
unsigned int j;
|
|
||||||
unsigned int u;
|
|
||||||
|
|
||||||
u = 0;
|
|
||||||
for (j = 0;j < 31;++j) { u += 121665 * a[j]; out[j] = u & 255; u >>= 8; }
|
|
||||||
u += 121665 * a[31]; out[31] = u & 127;
|
|
||||||
u = 19 * (u >> 7);
|
|
||||||
for (j = 0;j < 31;++j) { u += out[j]; out[j] = u & 255; u >>= 8; }
|
|
||||||
u += out[j]; out[j] = u;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void square(unsigned int out[32],const unsigned int a[32])
|
|
||||||
{
|
|
||||||
unsigned int i;
|
|
||||||
unsigned int j;
|
|
||||||
unsigned int u;
|
|
||||||
|
|
||||||
for (i = 0;i < 32;++i) {
|
|
||||||
u = 0;
|
|
||||||
for (j = 0;j < i - j;++j) u += a[j] * a[i - j];
|
|
||||||
for (j = i + 1;j < i + 32 - j;++j) u += 38 * a[j] * a[i + 32 - j];
|
|
||||||
u *= 2;
|
|
||||||
if ((i & 1) == 0) {
|
|
||||||
u += a[i / 2] * a[i / 2];
|
|
||||||
u += 38 * a[i / 2 + 16] * a[i / 2 + 16];
|
|
||||||
}
|
|
||||||
out[i] = u;
|
|
||||||
}
|
|
||||||
squeeze(out);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void select(unsigned int p[64],unsigned int q[64],const unsigned int r[64],const unsigned int s[64],unsigned int b)
|
|
||||||
{
|
|
||||||
unsigned int j;
|
|
||||||
unsigned int t;
|
|
||||||
unsigned int bminus1;
|
|
||||||
|
|
||||||
bminus1 = b - 1;
|
|
||||||
for (j = 0;j < 64;++j) {
|
|
||||||
t = bminus1 & (r[j] ^ s[j]);
|
|
||||||
p[j] = s[j] ^ t;
|
|
||||||
q[j] = r[j] ^ t;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void mainloop(unsigned int work[64],const unsigned char e[32])
|
|
||||||
{
|
|
||||||
unsigned int xzm1[64];
|
|
||||||
unsigned int xzm[64];
|
|
||||||
unsigned int xzmb[64];
|
|
||||||
unsigned int xzm1b[64];
|
|
||||||
unsigned int xznb[64];
|
|
||||||
unsigned int xzn1b[64];
|
|
||||||
unsigned int a0[64];
|
|
||||||
unsigned int a1[64];
|
|
||||||
unsigned int b0[64];
|
|
||||||
unsigned int b1[64];
|
|
||||||
unsigned int c1[64];
|
|
||||||
unsigned int r[32];
|
|
||||||
unsigned int s[32];
|
|
||||||
unsigned int t[32];
|
|
||||||
unsigned int u[32];
|
|
||||||
unsigned int j;
|
|
||||||
unsigned int b;
|
|
||||||
int pos;
|
|
||||||
|
|
||||||
for (j = 0;j < 32;++j) xzm1[j] = work[j];
|
|
||||||
xzm1[32] = 1;
|
|
||||||
for (j = 33;j < 64;++j) xzm1[j] = 0;
|
|
||||||
|
|
||||||
xzm[0] = 1;
|
|
||||||
for (j = 1;j < 64;++j) xzm[j] = 0;
|
|
||||||
|
|
||||||
for (pos = 254;pos >= 0;--pos) {
|
|
||||||
b = e[pos / 8] >> (pos & 7);
|
|
||||||
b &= 1;
|
|
||||||
select(xzmb,xzm1b,xzm,xzm1,b);
|
|
||||||
add(a0,xzmb,xzmb + 32);
|
|
||||||
sub(a0 + 32,xzmb,xzmb + 32);
|
|
||||||
add(a1,xzm1b,xzm1b + 32);
|
|
||||||
sub(a1 + 32,xzm1b,xzm1b + 32);
|
|
||||||
square(b0,a0);
|
|
||||||
square(b0 + 32,a0 + 32);
|
|
||||||
mult(b1,a1,a0 + 32);
|
|
||||||
mult(b1 + 32,a1 + 32,a0);
|
|
||||||
add(c1,b1,b1 + 32);
|
|
||||||
sub(c1 + 32,b1,b1 + 32);
|
|
||||||
square(r,c1 + 32);
|
|
||||||
sub(s,b0,b0 + 32);
|
|
||||||
mult121665(t,s);
|
|
||||||
add(u,t,b0);
|
|
||||||
mult(xznb,b0,b0 + 32);
|
|
||||||
mult(xznb + 32,s,u);
|
|
||||||
square(xzn1b,c1);
|
|
||||||
mult(xzn1b + 32,r,work);
|
|
||||||
select(xzm,xzm1,xznb,xzn1b,b);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (j = 0;j < 64;++j) work[j] = xzm[j];
|
|
||||||
}
|
|
||||||
|
|
||||||
static void recip(unsigned int out[32],const unsigned int z[32])
|
|
||||||
{
|
|
||||||
unsigned int z2[32];
|
|
||||||
unsigned int z9[32];
|
|
||||||
unsigned int z11[32];
|
|
||||||
unsigned int z2_5_0[32];
|
|
||||||
unsigned int z2_10_0[32];
|
|
||||||
unsigned int z2_20_0[32];
|
|
||||||
unsigned int z2_50_0[32];
|
|
||||||
unsigned int z2_100_0[32];
|
|
||||||
unsigned int t0[32];
|
|
||||||
unsigned int t1[32];
|
|
||||||
int i;
|
|
||||||
|
|
||||||
/* 2 */ square(z2,z);
|
|
||||||
/* 4 */ square(t1,z2);
|
|
||||||
/* 8 */ square(t0,t1);
|
|
||||||
/* 9 */ mult(z9,t0,z);
|
|
||||||
/* 11 */ mult(z11,z9,z2);
|
|
||||||
/* 22 */ square(t0,z11);
|
|
||||||
/* 2^5 - 2^0 = 31 */ mult(z2_5_0,t0,z9);
|
|
||||||
|
|
||||||
/* 2^6 - 2^1 */ square(t0,z2_5_0);
|
|
||||||
/* 2^7 - 2^2 */ square(t1,t0);
|
|
||||||
/* 2^8 - 2^3 */ square(t0,t1);
|
|
||||||
/* 2^9 - 2^4 */ square(t1,t0);
|
|
||||||
/* 2^10 - 2^5 */ square(t0,t1);
|
|
||||||
/* 2^10 - 2^0 */ mult(z2_10_0,t0,z2_5_0);
|
|
||||||
|
|
||||||
/* 2^11 - 2^1 */ square(t0,z2_10_0);
|
|
||||||
/* 2^12 - 2^2 */ square(t1,t0);
|
|
||||||
/* 2^20 - 2^10 */ for (i = 2;i < 10;i += 2) { square(t0,t1); square(t1,t0); }
|
|
||||||
/* 2^20 - 2^0 */ mult(z2_20_0,t1,z2_10_0);
|
|
||||||
|
|
||||||
/* 2^21 - 2^1 */ square(t0,z2_20_0);
|
|
||||||
/* 2^22 - 2^2 */ square(t1,t0);
|
|
||||||
/* 2^40 - 2^20 */ for (i = 2;i < 20;i += 2) { square(t0,t1); square(t1,t0); }
|
|
||||||
/* 2^40 - 2^0 */ mult(t0,t1,z2_20_0);
|
|
||||||
|
|
||||||
/* 2^41 - 2^1 */ square(t1,t0);
|
|
||||||
/* 2^42 - 2^2 */ square(t0,t1);
|
|
||||||
/* 2^50 - 2^10 */ for (i = 2;i < 10;i += 2) { square(t1,t0); square(t0,t1); }
|
|
||||||
/* 2^50 - 2^0 */ mult(z2_50_0,t0,z2_10_0);
|
|
||||||
|
|
||||||
/* 2^51 - 2^1 */ square(t0,z2_50_0);
|
|
||||||
/* 2^52 - 2^2 */ square(t1,t0);
|
|
||||||
/* 2^100 - 2^50 */ for (i = 2;i < 50;i += 2) { square(t0,t1); square(t1,t0); }
|
|
||||||
/* 2^100 - 2^0 */ mult(z2_100_0,t1,z2_50_0);
|
|
||||||
|
|
||||||
/* 2^101 - 2^1 */ square(t1,z2_100_0);
|
|
||||||
/* 2^102 - 2^2 */ square(t0,t1);
|
|
||||||
/* 2^200 - 2^100 */ for (i = 2;i < 100;i += 2) { square(t1,t0); square(t0,t1); }
|
|
||||||
/* 2^200 - 2^0 */ mult(t1,t0,z2_100_0);
|
|
||||||
|
|
||||||
/* 2^201 - 2^1 */ square(t0,t1);
|
|
||||||
/* 2^202 - 2^2 */ square(t1,t0);
|
|
||||||
/* 2^250 - 2^50 */ for (i = 2;i < 50;i += 2) { square(t0,t1); square(t1,t0); }
|
|
||||||
/* 2^250 - 2^0 */ mult(t0,t1,z2_50_0);
|
|
||||||
|
|
||||||
/* 2^251 - 2^1 */ square(t1,t0);
|
|
||||||
/* 2^252 - 2^2 */ square(t0,t1);
|
|
||||||
/* 2^253 - 2^3 */ square(t1,t0);
|
|
||||||
/* 2^254 - 2^4 */ square(t0,t1);
|
|
||||||
/* 2^255 - 2^5 */ square(t1,t0);
|
|
||||||
/* 2^255 - 21 */ mult(out,t1,z11);
|
|
||||||
}
|
|
||||||
|
|
||||||
int crypto_scalarmult_curve25519(unsigned char *q,
|
|
||||||
const unsigned char *n,
|
|
||||||
const unsigned char *p)
|
|
||||||
{
|
|
||||||
unsigned int work[96];
|
|
||||||
unsigned char e[32];
|
|
||||||
unsigned int i;
|
|
||||||
for (i = 0;i < 32;++i) e[i] = n[i];
|
|
||||||
e[0] &= 248;
|
|
||||||
e[31] &= 127;
|
|
||||||
e[31] |= 64;
|
|
||||||
for (i = 0;i < 32;++i) work[i] = p[i];
|
|
||||||
mainloop(work,e);
|
|
||||||
recip(work + 32,work + 32);
|
|
||||||
mult(work + 64,work,work + 32);
|
|
||||||
freeze(work + 64);
|
|
||||||
for (i = 0;i < 32;++i) q[i] = work[64 + i];
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,51 +0,0 @@
|
||||||
/* $OpenBSD: src/lib/libc/string/strlcpy.c,v 1.11 2006/05/05 15:27:38 millert Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
|
|
||||||
*
|
|
||||||
* Permission to use, copy, modify, and distribute this software for any
|
|
||||||
* purpose with or without fee is hereby granted, provided that the above
|
|
||||||
* copyright notice and this permission notice appear in all copies.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
||||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copy src to string dst of size siz. At most siz-1 characters
|
|
||||||
* will be copied. Always NUL terminates (unless siz == 0).
|
|
||||||
* Returns strlen(src); if retval >= siz, truncation occurred.
|
|
||||||
*/
|
|
||||||
size_t
|
|
||||||
strlcpy(char *dst, const char *src, size_t siz)
|
|
||||||
{
|
|
||||||
char *d = dst;
|
|
||||||
const char *s = src;
|
|
||||||
size_t n = siz;
|
|
||||||
|
|
||||||
/* Copy as many bytes as will fit */
|
|
||||||
if (n != 0) {
|
|
||||||
while (--n != 0) {
|
|
||||||
if ((*d++ = *s++) == '\0')
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Not enough room in dst, add NUL and traverse rest of src */
|
|
||||||
if (n == 0) {
|
|
||||||
if (siz != 0)
|
|
||||||
*d = '\0'; /* NUL-terminate dst */
|
|
||||||
while (*s++)
|
|
||||||
;
|
|
||||||
}
|
|
||||||
|
|
||||||
return(s - src - 1); /* count does not include NUL */
|
|
||||||
}
|
|
|
@ -1,29 +0,0 @@
|
||||||
/* $OpenBSD: timingsafe_bcmp.c,v 1.1 2010/09/24 13:33:00 matthew Exp $ */
|
|
||||||
/*
|
|
||||||
* Copyright (c) 2010 Damien Miller. All rights reserved.
|
|
||||||
*
|
|
||||||
* Permission to use, copy, modify, and distribute this software for any
|
|
||||||
* purpose with or without fee is hereby granted, provided that the above
|
|
||||||
* copyright notice and this permission notice appear in all copies.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
||||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
int
|
|
||||||
timingsafe_bcmp(const void *b1, const void *b2, size_t n)
|
|
||||||
{
|
|
||||||
const unsigned char *p1 = b1, *p2 = b2;
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
for (; n > 0; n--)
|
|
||||||
ret |= *p1++ ^ *p2++;
|
|
||||||
return (ret != 0);
|
|
||||||
}
|
|
|
@ -1,5 +0,0 @@
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
int bcrypt_pbkdf(const char *pass, size_t pass_len, const uint8_t *salt,
|
|
||||||
size_t salt_len, uint8_t *key, size_t key_len, unsigned int rounds);
|
|
||||||
void explicit_bzero(void *b, size_t len);
|
|
|
@ -1,32 +0,0 @@
|
||||||
/*
|
|
||||||
* Mini Object Storage, (C) 2014 Minio, Inc.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// +build amd64
|
|
||||||
|
|
||||||
package signify
|
|
||||||
|
|
||||||
// #cgo LDFLAGS: libsignify/libsignify_static.a
|
|
||||||
// #include <stdlib.h>
|
|
||||||
// #include <stdlib.h>
|
|
||||||
//
|
|
||||||
import "C"
|
|
||||||
import (
|
|
||||||
// "errors"
|
|
||||||
// "unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Sign struct {
|
|
||||||
}
|
|
|
@ -29,10 +29,10 @@ import (
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/minio-io/minio/pkg/erasure"
|
"github.com/minio-io/minio/pkg/fileutils/split"
|
||||||
"github.com/minio-io/minio/pkg/split"
|
|
||||||
"github.com/minio-io/minio/pkg/storage"
|
"github.com/minio-io/minio/pkg/storage"
|
||||||
"github.com/minio-io/minio/pkg/storage/appendstorage"
|
"github.com/minio-io/minio/pkg/storage/appendstorage"
|
||||||
|
"github.com/minio-io/minio/pkg/storage/erasure"
|
||||||
"github.com/spaolacci/murmur3"
|
"github.com/spaolacci/murmur3"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue