MAINTAINING THE GO CRYPTO LIBRARIES Filippo Valsorda Google - - PowerPoint PPT Presentation

maintaining the go crypto libraries
SMART_READER_LITE
LIVE PREVIEW

MAINTAINING THE GO CRYPTO LIBRARIES Filippo Valsorda Google - - PowerPoint PPT Presentation

QCon NYC 25 JUNE 2019 MAINTAINING THE GO CRYPTO LIBRARIES Filippo Valsorda Google @FiloSottile WHO AM I { Go security coordinator Go crypto/ packages owner and maintainer 00. INTRO SECTION 1 Cryptography is H ard


slide-1
SLIDE 1

MAINTAINING THE
 GO CRYPTO LIBRARIES

QCon NYC — 25 JUNE 2019

Filippo Valsorda Google @FiloSottile

slide-2
SLIDE 2

{

WHO AM I

Go security coordinator Go crypto/… packages

  • wner and maintainer
  • 00. INTRO
slide-3
SLIDE 3

Cryptography is Hard

SECTION 1

slide-4
SLIDE 4

Cryptography engineering is an exercise in managing complexity

  • 01. CRYPTO IS HARD
slide-5
SLIDE 5

In cryptography engineering a single mistake makes your entire system useless.

slide-6
SLIDE 6

In cryptography engineering a single mistake makes your entire system useless. … and tests won’t save you.

slide-7
SLIDE 7

API surface Complexity that affects users Complexity that affects contributors

slide-8
SLIDE 8

If users roll their own, what is available is not easy enough

  • 01. CRYPTO IS HARD
slide-9
SLIDE 9

For cryptography to be solid, it needs to be understandable

  • 01. CRYPTO IS HARD
slide-10
SLIDE 10

The Go cryptography libraries

SECTION 2

slide-11
SLIDE 11

THE GO CRYPTOGRAPHY LIBRARIES

  • 02. THE GO CRYPTOGRAPHY LIBRARIES

crypto/tls crypto/x509 crypto/ed25519 crypto/ecdsa crypto/sha256 crypto/sha512 crypto/cipher crypto/aes crypto/rsa crypto/elliptic crypto/rand crypto/subtle crypto/hmac crypto/des crypto/md5 crypto/dsa crypto/rc4 crypto/sha1

Packages in the Go standard library

slide-12
SLIDE 12

THE GO CRYPTOGRAPHY LIBRARIES

  • 02. THE GO CRYPTOGRAPHY LIBRARIES

x/crypto/acme x/crypto/argon2 x/crypto/bcrypt x/crypto/blake2[bs] x/crypto/chacha20poly1305 x/crypto/cryptobyte x/crypto/curve25519 x/crypto/hkdf x/crypto/nacl x/crypto/pbkdf2 x/crypto/scrypt x/crypto/sha3 x/crypto/ssh

Packages in golang.org/x/ crypto … and more

slide-13
SLIDE 13

Go is good for cryptography

  • Memory safety
  • Performance
  • Reproducible builds
  • Static analysis
  • 02. THE GO CRYPTOGRAPHY LIBRARIES
slide-14
SLIDE 14

Go is good for cryptography

  • Memory safety
  • Performance
  • Reproducible builds
  • Static analysis
  • Clarity and explicit control flow
  • Easy documentation
  • go fmt
  • 02. THE GO CRYPTOGRAPHY LIBRARIES
slide-15
SLIDE 15

{

Success

Go has a solid, modern, production-ready crypto library.

  • 02. THE GO CRYPTOGRAPHY LIBRARIES
slide-16
SLIDE 16

{

Goal

Enabling a secure ecosystem

  • 02. THE GO CRYPTOGRAPHY LIBRARIES
slide-17
SLIDE 17

The Go Crypto Principles

Secure, safe, practical, modern

https:/ /golang.org/design/cryptography-principles

slide-18
SLIDE 18

Secure

The obvious one

slide-19
SLIDE 19

Safe

The overlooked one

slide-20
SLIDE 20

Practical

The dangerous one

slide-21
SLIDE 21

Modern

The aspirational one

slide-22
SLIDE 22

How the Go cryptography libraries are different

SECTION 3

slide-23
SLIDE 23

Not a priority

Maximum performance Universal support Uncommon use cases

  • 03. HOW THE GO CRYPTOGRAPHY LIBRARIES ARE DIFFERENT

Readability Safe defaults Good guidance, docs and examples

A priority

slide-24
SLIDE 24

CIPHERSUITES SUPPORTED BY OPENSSL

TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 TLS_ECDHE_ECDSA_WITH_AES_256_CCM TLS_DHE_RSA_WITH_AES_256_CCM_8 TLS_DHE_RSA_WITH_AES_256_CCM TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384 TLS_DHE_DSS_WITH_ARIA_256_GCM_SHA384 TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 TLS_ECDHE_ECDSA_WITH_AES_128_CCM TLS_DHE_RSA_WITH_AES_128_CCM_8 TLS_DHE_RSA_WITH_AES_128_CCM TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256 TLS_DHE_DSS_WITH_ARIA_128_GCM_SHA256 TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA TLS_DHE_RSA_WITH_AES_256_CBC_SHA TLS_DHE_DSS_WITH_AES_256_CBC_SHA TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA TLS_DHE_RSA_WITH_AES_128_CBC_SHA TLS_DHE_DSS_WITH_AES_128_CBC_SHA TLS_DHE_RSA_WITH_SEED_CBC_SHA TLS_DHE_DSS_WITH_SEED_CBC_SHA TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA TLS_RSA_WITH_AES_256_GCM_SHA384 TLS_RSA_WITH_AES_256_CCM_8 TLS_RSA_WITH_AES_256_CCM TLS_RSA_WITH_ARIA_256_GCM_SHA384 TLS_RSA_WITH_AES_128_GCM_SHA256 TLS_RSA_WITH_AES_128_CCM_8 TLS_RSA_WITH_AES_128_CCM TLS_RSA_WITH_ARIA_128_GCM_SHA256 TLS_RSA_WITH_AES_256_CBC_SHA256 TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 TLS_RSA_WITH_AES_128_CBC_SHA256 TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 TLS_RSA_WITH_AES_256_CBC_SHA TLS_RSA_WITH_CAMELLIA_256_CBC_SHA TLS_RSA_WITH_AES_128_CBC_SHA TLS_RSA_WITH_SEED_CBC_SHA TLS_RSA_WITH_CAMELLIA_128_CBC_SHA TLS_RSA_WITH_IDEA_CBC_SHA
  • 03. HOW THE GO CRYPTOGRAPHY LIBRARIES ARE DIFFERENT
  • penssl ciphers -stdname -s ALL
slide-25
SLIDE 25

CIPHERSUITES SUPPORTED BY CRYPTO/TLS

TLS_RSA_WITH_RC4_128_SHA TLS_RSA_WITH_3DES_EDE_CBC_SHA TLS_RSA_WITH_AES_128_CBC_SHA TLS_RSA_WITH_AES_256_CBC_SHA TLS_RSA_WITH_AES_128_CBC_SHA256 TLS_RSA_WITH_AES_128_GCM_SHA256 TLS_RSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_RC4_128_SHA TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA TLS_ECDHE_RSA_WITH_RC4_128_SHA TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305 TLS_AES_128_GCM_SHA256 TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256

  • 03. HOW THE GO CRYPTOGRAPHY LIBRARIES ARE DIFFERENT
slide-26
SLIDE 26

CIPHERSUITES SUPPORTED BY CRYPTO/TLS

TLS_RSA_WITH_RC4_128_SHA TLS_RSA_WITH_3DES_EDE_CBC_SHA TLS_RSA_WITH_AES_128_CBC_SHA TLS_RSA_WITH_AES_256_CBC_SHA TLS_RSA_WITH_AES_128_CBC_SHA256 TLS_RSA_WITH_AES_128_GCM_SHA256 TLS_RSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_RC4_128_SHA TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA TLS_ECDHE_RSA_WITH_RC4_128_SHA TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305 
 TLS_AES_128_GCM_SHA256 TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256

  • 03. HOW THE GO CRYPTOGRAPHY LIBRARIES ARE DIFFERENT
slide-27
SLIDE 27

Most of the value of the Go cryptography libraries is in what they don’t ship. No knobs. Curated selection of features.

slide-28
SLIDE 28

Maintaining a cryptography library is an exercise in resisting complexity.

slide-29
SLIDE 29

How the Go cryptography libraries stay different

SECTION 4

slide-30
SLIDE 30

The maintainer asymmetry: reviewing cryptographic code can take
 10 times the time it takes to write it.

slide-31
SLIDE 31
slide-32
SLIDE 32

“Secure” is relative to maintainer resources.

slide-33
SLIDE 33
  • Minimize assembly
  • Explain why it’s needed
  • Comment it well
  • Test units individually
slide-34
SLIDE 34
  • Minimize assembly
  • Explain why it’s needed
  • Comment it well
  • Test units individually
  • Use code generation
  • Write small testable units
  • Write a reference Go implementation
  • Document why the Go is slow
  • Use test tooling and fuzzing
slide-35
SLIDE 35

Policies need to be relative to maintainer resources, too!

slide-36
SLIDE 36
slide-37
SLIDE 37

Tools to even the ground

  • Fuzzing (oss-fuzz)
  • Mutation testing (soon!)
  • Reusable tests (golang.org/x/crypto/cryptotest)
  • 02. THE GO CRYPTOGRAPHY LIBRARIES
slide-38
SLIDE 38

Everyone wants their proposal accepted…

slide-39
SLIDE 39

Everyone wants their proposal accepted… … and everyone else’s rejected.

slide-40
SLIDE 40

Go is good for cryptography

  • blowfish
  • bn256
  • cast5
  • md4
  • ripemd160
  • tea
  • twofish
  • 02. THE GO CRYPTOGRAPHY LIBRARIES
slide-41
SLIDE 41
slide-42
SLIDE 42
slide-43
SLIDE 43
slide-44
SLIDE 44

Conclusion

SECTION 5

slide-45
SLIDE 45

Every project has a complexity budget. Whether you acknowledge it or not. You should actively manage it.

slide-46
SLIDE 46

Thank you!

Filippo Valsorda Google @FiloSottile