// 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.

// +build ignore,OMIT

// This code differs from the slides in that it handles errors.

package main

import (
	"compress/gzip"
	"crypto/aes"
	"crypto/cipher"
	"io"
	"log"
	"os"
)

func EncryptAndGzip(dstfile, srcfile string, key, iv []byte) 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) 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)
	}
}
