diff options
Diffstat (limited to 'doc/talks/io2010/decrypt.go')
-rw-r--r-- | doc/talks/io2010/decrypt.go | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/doc/talks/io2010/decrypt.go b/doc/talks/io2010/decrypt.go new file mode 100644 index 000000000..0a6c006e2 --- /dev/null +++ b/doc/talks/io2010/decrypt.go @@ -0,0 +1,85 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This code differs from the slides in that it handles errors. + +package main + +import ( + "crypto/aes" + "crypto/cipher" + "compress/gzip" + "io" + "log" + "os" +) + +func EncryptAndGzip(dstfile, srcfile string, key, iv []byte) os.Error { + r, err := os.Open(srcfile) + if err != nil { + return err + } + var w io.Writer + w, err = os.Create(dstfile) + if err != nil { + return err + } + c, err := aes.NewCipher(key) + if err != nil { + return err + } + w = cipher.StreamWriter{S: cipher.NewOFB(c, iv), W: w} + w2, err := gzip.NewWriter(w) + if err != nil { + return err + } + defer w2.Close() + _, err = io.Copy(w2, r) + return err +} + +func DecryptAndGunzip(dstfile, srcfile string, key, iv []byte) os.Error { + f, err := os.Open(srcfile) + if err != nil { + return err + } + defer f.Close() + c, err := aes.NewCipher(key) + if err != nil { + return err + } + r := cipher.StreamReader{S: cipher.NewOFB(c, iv), R: f} + r2, err := gzip.NewReader(r) + if err != nil { + return err + } + w, err := os.Create(dstfile) + if err != nil { + return err + } + defer w.Close() + _, err = io.Copy(w, r2) + return err +} + +func main() { + err := EncryptAndGzip( + "/tmp/passwd.gz", + "/etc/passwd", + make([]byte, 16), + make([]byte, 16), + ) + if err != nil { + log.Fatal(err) + } + err = DecryptAndGunzip( + "/dev/stdout", + "/tmp/passwd.gz", + make([]byte, 16), + make([]byte, 16), + ) + if err != nil { + log.Fatal(err) + } +} |