Merge "core: minor tweaks to description and api."
diff --git a/ibe/.api b/ibe/.api
index 7bbaf0c..d2dd141 100644
--- a/ibe/.api
+++ b/ibe/.api
@@ -1,14 +1,14 @@
+pkg ibe, const CiphertextSize ideal-int
+pkg ibe, const PlaintextSize ideal-int
 pkg ibe, func MarshalParams(Params) ([]byte, error)
 pkg ibe, func MarshalPrivateKey(PrivateKey) ([]byte, error)
 pkg ibe, func SetupBB1() (Master, error)
 pkg ibe, func UnmarshalParams([]byte) (Params, error)
 pkg ibe, func UnmarshalPrivateKey(Params, []byte) (PrivateKey, error)
-pkg ibe, type Ciphertext [160]byte
 pkg ibe, type Master interface { Extract, Params }
 pkg ibe, type Master interface, Extract(string) (PrivateKey, error)
 pkg ibe, type Master interface, Params() Params
 pkg ibe, type Params interface { Encrypt }
-pkg ibe, type Params interface, Encrypt(string, *Plaintext, *Ciphertext) error
-pkg ibe, type Plaintext [32]byte
+pkg ibe, type Params interface, Encrypt(string, []byte, []byte) error
 pkg ibe, type PrivateKey interface { Decrypt }
-pkg ibe, type PrivateKey interface, Decrypt(*Ciphertext, *Plaintext) error
+pkg ibe, type PrivateKey interface, Decrypt([]byte, []byte) error
diff --git a/ibe/bb1.go b/ibe/bb1.go
index 71e6937..2f1351a 100644
--- a/ibe/bb1.go
+++ b/ibe/bb1.go
@@ -110,7 +110,10 @@
 	v                 *bn256.GT
 }
 
-func (e *bb1params) Encrypt(id string, m *Plaintext, C *Ciphertext) error {
+func (e *bb1params) Encrypt(id string, m, C []byte) error {
+	if err := checkSizes(m, C); err != nil {
+		return err
+	}
 	s, err := random()
 	if err != nil {
 		return err
@@ -149,7 +152,10 @@
 	d0, d1 bn256.G2
 }
 
-func (k *bb1PrivateKey) Decrypt(C *Ciphertext, m *Plaintext) error {
+func (k *bb1PrivateKey) Decrypt(C, m []byte) error {
+	if err := checkSizes(m, C); err != nil {
+		return err
+	}
 	var (
 		A     = C[0:len(m)]
 		B, C1 bn256.G1
@@ -206,3 +212,10 @@
 	copy(dst, src)
 	return nil
 }
+
+func checkSizes(m, C []byte) error {
+	if msize, Csize := len(m), len(C); msize != PlaintextSize || Csize != CiphertextSize {
+		return fmt.Errorf("provided plaintext and ciphertext are of sizes (%d, %d), want (%d, %d)", msize, Csize, PlaintextSize, CiphertextSize)
+	}
+	return nil
+}
diff --git a/ibe/bb1_test.go b/ibe/bb1_test.go
index 8a8f4e8..b6218c0 100644
--- a/ibe/bb1_test.go
+++ b/ibe/bb1_test.go
@@ -37,35 +37,34 @@
 	}
 
 	// Encrypt
-	var (
-		m     Plaintext
-		C, C2 Ciphertext
-	)
-	if n := copy(m[:], []byte("AThirtyTwoBytePieceOfTextThisIs!")); n != len(m) {
-		t.Fatalf("Test string must be %d bytes, not %d", len(m), n)
+	m := []byte("AThirtyTwoBytePieceOfTextThisIs!")
+	C := make([]byte, CiphertextSize)
+	C2 := make([]byte, CiphertextSize)
+	if msize := len(m); msize != PlaintextSize {
+		t.Fatalf("Test string must be %d bytes, not %d", PlaintextSize, msize)
 	}
-	if err := master.Params().Encrypt(alice, &m, &C); err != nil {
+	if err := master.Params().Encrypt(alice, m, C); err != nil {
 		t.Fatal(err)
 	}
-	if err := master.Params().Encrypt(alice, &m, &C2); err != nil {
+	if err := master.Params().Encrypt(alice, m, C2); err != nil {
 		t.Fatal(err)
 	}
-	if bytes.Equal(C[:], C2[:]) {
+	if bytes.Equal(C, C2) {
 		t.Errorf("Repeated encryptions of the identical plaintext should not produce identical ciphertext")
 	}
 
 	// Decrypt
-	decrypt := func(sk PrivateKey) (*Plaintext, error) {
-		var ret Plaintext
-		if err := sk.Decrypt(&C, &ret); err != nil {
+	decrypt := func(sk PrivateKey) ([]byte, error) {
+		ret := make([]byte, PlaintextSize)
+		if err := sk.Decrypt(C, ret); err != nil {
 			return nil, err
 		}
-		return &ret, nil
+		return ret, nil
 	}
-	if decrypted, err := decrypt(aliceSK); err != nil || !bytes.Equal(decrypted[:], m[:]) {
+	if decrypted, err := decrypt(aliceSK); err != nil || !bytes.Equal(decrypted, m) {
 		t.Errorf("Got (%v, %v), want (%v, nil)", decrypted, err, m[:])
 	}
-	if decrypted, err := decrypt(aliceSK2); err != nil || !bytes.Equal(decrypted[:], m[:]) {
+	if decrypted, err := decrypt(aliceSK2); err != nil || !bytes.Equal(decrypted, m) {
 		t.Errorf("Got (%v, %v), want (%v, nil)", decrypted, err, m[:])
 	}
 	if decrypted, _ := decrypt(bobSK); bytes.Equal(decrypted[:], m[:]) {
@@ -74,10 +73,11 @@
 }
 
 var (
-	bb1        Master
-	bb1SK      PrivateKey
-	benchmarkm Plaintext
-	bb1C       Ciphertext
+	bb1   Master
+	bb1SK PrivateKey
+
+	benchmarkm = make([]byte, PlaintextSize)
+	bb1C       = make([]byte, CiphertextSize)
 )
 
 func TestBB1Marshaling(t *testing.T) {
@@ -90,30 +90,31 @@
 	if err != nil {
 		t.Fatal(err)
 	}
-	var m Plaintext
-	if n := copy(m[:], []byte("01234567899876543210123456789012")); n != len(m) {
-		t.Fatalf("%v vs. %v", n, len(m))
-	}
-	var C1, C2 Ciphertext
-	var m1, m2 Plaintext
+	m := []byte("01234567899876543210123456789012")
+	var (
+		C1 = make([]byte, CiphertextSize)
+		C2 = make([]byte, CiphertextSize)
+		m1 = make([]byte, PlaintextSize)
+		m2 = make([]byte, PlaintextSize)
+	)
 	// Encrypt with the original params, decrypt with the unmarshaled key.
-	if err := bb1P.Encrypt("alice", &m, &C1); err != nil {
+	if err := bb1P.Encrypt("alice", m, C1); err != nil {
 		t.Error(err)
 	} else if sk, err := UnmarshalPrivateKey(bb1P, skbytes); err != nil {
 		t.Error(err)
-	} else if err := sk.Decrypt(&C1, &m2); err != nil {
+	} else if err := sk.Decrypt(C1, m2); err != nil {
 		t.Error(err)
-	} else if !bytes.Equal(m[:], m2[:]) {
+	} else if !bytes.Equal(m, m2) {
 		t.Errorf("Got %q, want %q", m, m2)
 	}
 	// Encrypt with the unmarshaled params, decrypt with the original key.
 	if p, err := UnmarshalParams(pbytes); err != nil {
 		t.Error(err)
-	} else if err := p.Encrypt("alice", &m, &C2); err != nil {
+	} else if err := p.Encrypt("alice", m, C2); err != nil {
 		t.Error(err)
-	} else if err := bb1SK.Decrypt(&C2, &m1); err != nil {
+	} else if err := bb1SK.Decrypt(C2, m1); err != nil {
 		t.Error(err)
-	} else if !bytes.Equal(m[:], m1[:]) {
+	} else if !bytes.Equal(m, m1) {
 		t.Errorf("Got %q, want %q", m, m1)
 	}
 
@@ -157,7 +158,7 @@
 	if _, err := rand.Read(benchmarkm[:]); err != nil {
 		panic(err)
 	}
-	if err := bb1.Params().Encrypt("alice", &benchmarkm, &bb1C); err != nil {
+	if err := bb1.Params().Encrypt("alice", benchmarkm, bb1C); err != nil {
 		panic(err)
 	}
 }
@@ -172,18 +173,18 @@
 
 func BenchmarkEncryptBB(b *testing.B) {
 	p := bb1.Params()
-	var C Ciphertext
+	C := make([]byte, CiphertextSize)
 	for i := 0; i < b.N; i++ {
-		if err := p.Encrypt("alice", &benchmarkm, &C); err != nil {
+		if err := p.Encrypt("alice", benchmarkm, C); err != nil {
 			b.Fatal(err)
 		}
 	}
 }
 
 func BenchmarkDecryptBB(b *testing.B) {
-	var m Plaintext
+	m := make([]byte, PlaintextSize)
 	for i := 0; i < b.N; i++ {
-		if err := bb1SK.Decrypt(&bb1C, &m); err != nil {
+		if err := bb1SK.Decrypt(bb1C, m); err != nil {
 			b.Fatal(err)
 		}
 	}
diff --git a/ibe/ibe.go b/ibe/ibe.go
index 6045cb1..0d7c60e 100644
--- a/ibe/ibe.go
+++ b/ibe/ibe.go
@@ -32,14 +32,10 @@
 // systems (at the time of this writing, only for the Boneh-Boyen scheme).
 package ibe
 
-// Plaintext represents a plaintext message that can be encrypted.
-//
-// Typical use would be for plaintext to be a key used to encrypt arbitrary
-// messages.
-type Plaintext [32]byte
-
-// Ciphertext represents an encrypted plaintext.
-type Ciphertext [160]byte
+const (
+	PlaintextSize  = 32
+	CiphertextSize = 160
+)
 
 // Master is the interface used to extract private keys for arbitrary identities.
 type Master interface {
@@ -51,10 +47,17 @@
 // messages for a particular identity.
 type Params interface {
 	// Encrypt encrypts m into C for the identity id.
-	Encrypt(id string, m *Plaintext, C *Ciphertext) error
+	//
+	// The slices m and C must of PlaintextSize and CiphertextSize respectively,
+	// and must not overlap.
+	Encrypt(id string, m, C []byte) error
 }
 
 // PrivateKey is the interface used to decrypt encrypted messages.
 type PrivateKey interface {
-	Decrypt(C *Ciphertext, m *Plaintext) error
+	// Decrypt decrypts ciphertext C into m.
+	//
+	// The slices m and C must of PlaintextSize and CiphertextSize respectively,
+	// and must not overlap.
+	Decrypt(C, m []byte) error
 }