// 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)
	}
}
