// Copyright 2017 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. // Like crypto/rsa/boring_test.go but outside the crypto/ tree. // Tests what happens if a package outside the crypto/ tree // "adopts" a struct definition. This happens in golang.org/x/crypto/ssh. package boring import ( "crypto/rand" "crypto/rsa" "encoding/asn1" "reflect" "testing" ) type publicKey rsa.PublicKey func TestBoringASN1Marshal(t *testing.T) { k, err := rsa.GenerateKey(rand.Reader, 128) if err != nil { t.Fatal(err) } pk := (*publicKey)(&k.PublicKey) // This used to fail, because of the unexported 'boring' field. // Now the compiler hides it [sic]. _, err = asn1.Marshal(*pk) if err != nil { t.Fatal(err) } } func TestBoringDeepEqual(t *testing.T) { k0, err := rsa.GenerateKey(rand.Reader, 128) if err != nil { t.Fatal(err) } k := (*publicKey)(&k0.PublicKey) k2 := *k rsa.EncryptPKCS1v15(rand.Reader, (*rsa.PublicKey)(&k2), []byte("hello")) // initialize hidden boring field if !reflect.DeepEqual(k, &k2) { // compiler should be hiding the boring field from reflection t.Fatalf("DeepEqual compared boring fields") } }