summaryrefslogtreecommitdiff
path: root/doc/talks/io2010/decrypt.go
diff options
context:
space:
mode:
authorOndřej Surý <ondrej@sury.org>2011-09-13 13:13:40 +0200
committerOndřej Surý <ondrej@sury.org>2011-09-13 13:13:40 +0200
commit5ff4c17907d5b19510a62e08fd8d3b11e62b431d (patch)
treec0650497e988f47be9c6f2324fa692a52dea82e1 /doc/talks/io2010/decrypt.go
parent80f18fc933cf3f3e829c5455a1023d69f7b86e52 (diff)
downloadgolang-upstream/60.tar.gz
Imported Upstream version 60upstream/60
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)
+ }
+}