@@ -2,6 +2,7 @@ package actions
22
33import (
44 "context"
5+ "crypto/elliptic"
56 "reflect"
67 "testing"
78
@@ -11,6 +12,8 @@ import (
1112 "github.com/securesign/operator/internal/labels"
1213 testAction "github.com/securesign/operator/internal/testing/action"
1314 utils2 "github.com/securesign/operator/internal/utils"
15+ cryptoutil "github.com/securesign/operator/internal/utils/crypto"
16+ fipsTest "github.com/securesign/operator/internal/utils/crypto/test"
1417 "github.com/securesign/operator/internal/utils/kubernetes"
1518 "k8s.io/apimachinery/pkg/watch"
1619 "sigs.k8s.io/controller-runtime/pkg/client"
@@ -565,3 +568,185 @@ func TestKeys_Handle(t *testing.T) {
565568 })
566569 }
567570}
571+
572+ func TestKeys_Handle_FIPS (t * testing.T ) {
573+ cryptoutil .FIPSEnabled = true
574+ t .Cleanup (func () {
575+ cryptoutil .FIPSEnabled = false
576+ })
577+
578+ type env struct {
579+ spec v1alpha1.CTlogSpec
580+ objects []client.Object
581+ status v1alpha1.CTlogStatus
582+ }
583+
584+ type want struct {
585+ expectError bool
586+ result * action.Result
587+ }
588+
589+ tests := []struct {
590+ name string
591+ env env
592+ want want
593+ }{
594+ {
595+ name : "valid private key (EC P256)" ,
596+ env : env {
597+ spec : v1alpha1.CTlogSpec {
598+ PrivateKeyRef : & v1alpha1.SecretKeySelector {
599+ LocalObjectReference : v1alpha1.LocalObjectReference {
600+ Name : "privateKey" ,
601+ },
602+ Key : "private" ,
603+ },
604+ },
605+ status : v1alpha1.CTlogStatus {},
606+ objects : []client.Object {
607+ & v1.Secret {
608+ ObjectMeta : metav1.ObjectMeta {
609+ Name : "privateKey" ,
610+ Namespace : "default" ,
611+ },
612+ Data : map [string ][]byte {
613+ "private" : fipsTest .GenerateECPrivateKeyPEM (t , elliptic .P256 ()),
614+ },
615+ },
616+ },
617+ },
618+ want : want {
619+ expectError : false ,
620+ result : testAction .StatusUpdate (),
621+ },
622+ },
623+ {
624+ name : "valid public key" ,
625+ env : env {
626+ spec : v1alpha1.CTlogSpec {
627+ PublicKeyRef : & v1alpha1.SecretKeySelector {
628+ LocalObjectReference : v1alpha1.LocalObjectReference {
629+ Name : "pubKey" ,
630+ },
631+ Key : "public" ,
632+ },
633+ },
634+ status : v1alpha1.CTlogStatus {},
635+ objects : []client.Object {
636+ & v1.Secret {
637+ ObjectMeta : metav1.ObjectMeta {
638+ Name : "pubKey" ,
639+ Namespace : "default" ,
640+ }, Data : map [string ][]byte {
641+ "public" : fipsTest .GenerateECPublicKeyPEM (t , elliptic .P256 ()),
642+ },
643+ },
644+ },
645+ },
646+ want : want {
647+ expectError : false ,
648+ result : testAction .StatusUpdate (),
649+ },
650+ },
651+ {
652+ name : "invalid private key (EC P224)" ,
653+ env : env {
654+ spec : v1alpha1.CTlogSpec {
655+ PrivateKeyRef : & v1alpha1.SecretKeySelector {
656+ LocalObjectReference : v1alpha1.LocalObjectReference {
657+ Name : "bad" ,
658+ },
659+ Key : "private" ,
660+ },
661+ },
662+ status : v1alpha1.CTlogStatus {},
663+ objects : []client.Object {
664+ & v1.Secret {
665+ ObjectMeta : metav1.ObjectMeta {
666+ Name : "bad" ,
667+ Namespace : "default" ,
668+ },
669+ Data : map [string ][]byte {
670+ "private" : fipsTest .GenerateECPrivateKeyPEM (t , elliptic .P224 ()),
671+ },
672+ },
673+ },
674+ },
675+ want : want {
676+ expectError : false ,
677+ result : testAction .Requeue (),
678+ },
679+ },
680+ {
681+ name : "invalid public key" ,
682+ env : env {
683+ spec : v1alpha1.CTlogSpec {
684+ PrivateKeyRef : & v1alpha1.SecretKeySelector {
685+ LocalObjectReference : v1alpha1.LocalObjectReference {
686+ Name : "privateKey" ,
687+ }, Key : "private" ,
688+ },
689+ PublicKeyRef : & v1alpha1.SecretKeySelector {
690+ LocalObjectReference : v1alpha1.LocalObjectReference {
691+ Name : "badPubKey" ,
692+ },
693+ Key : "public" ,
694+ },
695+ },
696+ status : v1alpha1.CTlogStatus {},
697+ objects : []client.Object {
698+ & v1.Secret {
699+ ObjectMeta : metav1.ObjectMeta {
700+ Name : "badPubKey" ,
701+ Namespace : "default" ,
702+ },
703+ Data : map [string ][]byte {
704+ "public" : fipsTest .GenerateECPublicKeyPEM (t , elliptic .P224 ()),
705+ },
706+ },
707+ & v1.Secret {
708+ ObjectMeta : metav1.ObjectMeta {
709+ Name : "privateKey" ,
710+ Namespace : "default" ,
711+ },
712+ Data : map [string ][]byte {"private" : fipsTest .GenerateECPrivateKeyPEM (t , elliptic .P256 ())},
713+ },
714+ },
715+ },
716+ want : want {
717+ expectError : false ,
718+ result : testAction .Requeue (),
719+ },
720+ },
721+ }
722+ for _ , tt := range tests {
723+ t .Run (tt .name , func (t * testing.T ) {
724+ ctx := context .TODO ()
725+ instance := & v1alpha1.CTlog {
726+ ObjectMeta : metav1.ObjectMeta {Name : "instance" , Namespace : "default" },
727+ Spec : tt .env .spec ,
728+ Status : tt .env .status ,
729+ }
730+ meta .SetStatusCondition (& instance .Status .Conditions , metav1.Condition {Type : constants .Ready , Reason : constants .Creating })
731+
732+ c := testAction .FakeClientBuilder ().
733+ WithObjects (instance ).
734+ WithStatusSubresource (instance ).
735+ WithObjects (tt .env .objects ... ).
736+ Build ()
737+ a := testAction .PrepareAction (c , NewHandleKeysAction ())
738+ res := a .Handle (ctx , instance )
739+
740+ if tt .want .expectError {
741+ if ! action .IsError (res ) {
742+ t .Fatalf ("expected error result, got: %#v" , res )
743+ }
744+ return
745+ }
746+
747+ if ! reflect .DeepEqual (res , tt .want .result ) {
748+ t .Errorf ("Handle() = %v, want %v" , res , tt .want .result )
749+ }
750+ })
751+ }
752+ }
0 commit comments