ateccx08: inttial implementation for ATECCx08

This working implementation for the ATECCx08 family of cryptgraphic processors
has random number generation and other needed supporting functions.

It also includes a sample of how to connect it to the Go crypto/rand package.

More cryptographic functions await a future interation.

Signed-off-by: deadprogram <ron@hybridgroup.com>
This commit is contained in:
deadprogram
2023-01-18 19:29:52 +01:00
parent f2637a87d2
commit 68d4991da1
7 changed files with 485 additions and 1 deletions
+53
View File
@@ -0,0 +1,53 @@
package main
import (
"machine"
"encoding/hex"
"time"
"tinygo.org/x/drivers/ateccx08"
)
func main() {
time.Sleep(5 * time.Second)
println("Looking for ATECCx08...")
machine.I2C0.Configure(machine.I2CConfig{})
atecc := ateccx08.New(machine.I2C0)
atecc.Configure()
if !atecc.Connected() {
for {
println("could not connect to ATECCx08")
time.Sleep(time.Second)
}
}
version, _ := atecc.Version()
println(version.String(), "started")
if !atecc.IsLocked() {
for i := 10; i > 0; i-- {
println(version.String(), "is not locked. Locking in", i, "seconds...")
time.Sleep(time.Second)
}
// locks the Configuration zone... PERMANENTLY!
atecc.Lock(0)
}
println(version.String(), "locked.")
for {
data, err := atecc.Random()
if err != nil {
println(err)
}
println(hex.EncodeToString(data[:]))
time.Sleep(500 * time.Millisecond)
}
}
+49
View File
@@ -0,0 +1,49 @@
package main
import (
"machine"
"crypto/rand"
"encoding/hex"
"time"
"tinygo.org/x/drivers/ateccx08"
)
var atecc *ateccx08.Device
func main() {
time.Sleep(5 * time.Second)
println("Looking for ATECCx08...")
machine.I2C0.Configure(machine.I2CConfig{})
atecc = ateccx08.New(machine.I2C0)
atecc.Configure()
if !atecc.Connected() {
for {
println("could not connect to ATECCx08")
time.Sleep(time.Second)
}
}
version, _ := atecc.Version()
println(version.String(), "started")
if !atecc.IsLocked() {
for {
println(version.String(), "is not locked. Random numbers will not actually be random.")
time.Sleep(time.Second)
}
}
var result [13]byte
for {
rand.Read(result[:])
encodedString := hex.EncodeToString(result[:])
println(encodedString)
time.Sleep(500 * time.Millisecond)
}
}
+52
View File
@@ -0,0 +1,52 @@
// connects the Go crypto/rand package to the random number generation
// on the ATECCx08 cryptographic processor.
package main
import (
"crypto/rand"
"errors"
)
var (
errNoATECC = errors.New("no ATECCx08")
)
func init() {
rand.Reader = &reader{}
}
type reader struct{}
func (r *reader) Read(b []byte) (n int, err error) {
if len(b) == 0 {
return
}
if atecc == nil {
return 0, errNoATECC
}
if !atecc.IsLocked() {
panic("ATECCx08 is not locked and cannot produce random numbers!")
}
rnds, err := atecc.Random()
if err != nil {
return 0, err
}
for i := 0; i < len(b); i += 32 {
if i+32 > len(b) {
copy(b[i:], rnds[:(len(b)-i)])
break
}
copy(b[i:], rnds[:])
rnds, err = atecc.Random()
if err != nil {
return 0, err
}
}
return len(b), nil
}