summaryrefslogtreecommitdiff
path: root/doc/talks/io2010/decrypt.go
diff options
context:
space:
mode:
Diffstat (limited to 'doc/talks/io2010/decrypt.go')
-rw-r--r--doc/talks/io2010/decrypt.go85
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)
+ }
+}