Skip to content
This repository was archived by the owner on Apr 25, 2025. It is now read-only.

Commit 115b0db

Browse files
[FAB-3128] Added re-enroll
Signed-off-by: biljana lukovic <biljana.lukovic@securekey.com> Change-Id: I55862204ef71f69bc88c79fe2259f7cb8365699a Signed-off-by: biljana lukovic <biljana.lukovic@securekey.com>
1 parent 7a66106 commit 115b0db

File tree

2 files changed

+62
-2
lines changed

2 files changed

+62
-2
lines changed

fabric-ca-client/fabricca.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ var logger = logging.MustGetLogger("fabric_sdk_go")
3838
// Services ...
3939
type Services interface {
4040
Enroll(enrollmentID string, enrollmentSecret string) ([]byte, []byte, error)
41+
//reenroll to renew user's enrollment certificate
42+
Reenroll(user fabricclient.User) ([]byte, []byte, error)
4143
Register(registrar fabricclient.User, request *RegistrationRequest) (string, error)
4244
Revoke(registrar fabricclient.User, request *RevocationRequest) error
4345
}
@@ -153,6 +155,40 @@ func (fabricCAServices *services) Enroll(enrollmentID string, enrollmentSecret s
153155
return enrollmentResponse.Identity.GetECert().Key(), enrollmentResponse.Identity.GetECert().Cert(), nil
154156
}
155157

158+
/**
159+
* ReEnroll an enrolled user in order to receive a signed X509 certificate
160+
* @param {user} fabricclient.User to be reenrolled
161+
* @returns {[]byte} X509 certificate
162+
* @returns {[]byte} private key
163+
*/
164+
func (fabricCAServices *services) Reenroll(user fabricclient.User) ([]byte, []byte, error) {
165+
if user == nil {
166+
return nil, nil, fmt.Errorf("User does not exist")
167+
}
168+
if user.GetName() == "" {
169+
logger.Infof("Invalid re-enroll request, missing argument user")
170+
return nil, nil, fmt.Errorf("User is empty")
171+
}
172+
req := &api.ReenrollmentRequest{}
173+
// Create signing identity
174+
identity, err := fabricCAServices.createSigningIdentity(user)
175+
if err != nil {
176+
logger.Infof("Invalid re-enroll request, %s is not a valid user %s\n", user.GetName(), err)
177+
return nil, nil, fmt.Errorf("Reenroll has failed; Cannot create user identity: %s", err)
178+
}
179+
180+
if identity.GetECert() == nil {
181+
logger.Infof("Invalid re-enroll request for user '%s'. Enrollment cert does not exist %s\n", user.GetName(), err)
182+
return nil, nil, fmt.Errorf("Reenroll has failed; enrollment cert does not exist: %s", err)
183+
}
184+
185+
reenrollmentResponse, err := identity.Reenroll(req)
186+
if err != nil {
187+
return nil, nil, fmt.Errorf("ReEnroll failed: %s", err)
188+
}
189+
return reenrollmentResponse.Identity.GetECert().Key(), reenrollmentResponse.Identity.GetECert().Cert(), nil
190+
}
191+
156192
// Register a User with the Fabric CA
157193
// @param {User} registrar The User that is initiating the registration
158194
// @param {RegistrationRequest} request Registration Request

test/integration/fabric_ca_test.go

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ limitations under the License.
2020
package integration
2121

2222
import (
23+
"bytes"
2324
"crypto/x509"
2425
"encoding/pem"
2526
"fmt"
@@ -140,11 +141,34 @@ func TestRegisterEnrollRevoke(t *testing.T) {
140141
}
141142
fmt.Printf("Registered User: %s, Secret: %s\n", userName, enrolmentSecret)
142143
// Enrol the previously registered user
143-
_, _, err = caClient.Enroll(userName, enrolmentSecret)
144-
144+
ekey, ecert, err := caClient.Enroll(userName, enrolmentSecret)
145145
if err != nil {
146146
t.Fatalf("Error enroling user: %s", err.Error())
147147
}
148+
//re-enroll
149+
fmt.Printf("** Attempt to re-enrolled user: '%s'\n", userName)
150+
keyPem, _ := pem.Decode(ekey)
151+
if err != nil {
152+
t.Fatalf("pem Decode return error: %v", err)
153+
}
154+
//convert key to bccsp
155+
k, err := client.GetCryptoSuite().KeyImport(keyPem.Bytes, &bccsp.ECDSAPrivateKeyImportOpts{Temporary: false})
156+
if err != nil {
157+
t.Fatalf("KeyImport return error: %v", err)
158+
}
159+
//create new user object and set certificate and private key of the previously enrolled user
160+
enrolleduser := fabricClient.NewUser(userName)
161+
enrolleduser.SetEnrollmentCertificate(ecert)
162+
enrolleduser.SetPrivateKey(k)
163+
//reenroll
164+
_, reenrollCert, err := caClient.Reenroll(enrolleduser)
165+
if err != nil {
166+
t.Fatalf("Error Reenroling user: %s", err.Error())
167+
}
168+
fmt.Printf("** User '%s' was re-enrolled \n", userName)
169+
if bytes.Equal(ecert, reenrollCert) {
170+
t.Fatalf("Error Reenroling user. Enrollmet and Reenrollment certificates are the same.")
171+
}
148172

149173
revokeRequest := fabricCAClient.RevocationRequest{Name: userName}
150174
err = caClient.Revoke(adminUser, &revokeRequest)

0 commit comments

Comments
 (0)