{
     glb_ctx *cc = (glb_ctx*) ctx;
     creds *crd = (creds*) cred;
+    int count = 0;
 
     if (!ctx)
         return EINVAL;
     if (!cert_stack)
         return set_error(cc, EINVAL, posix_error, "Invalid stack value");
 
-    /*TODO is there ossl API for duplicate STACK_OF ?*/
-    return ENOSYS;
+    count = sk_X509_num(cert_stack);
+    if (!count)
+        return 0; //TODO is empty cert_stack error?
+    
+    if (crd->c_cert_chain) {
+        sk_X509_pop_free(crd->c_cert_chain, X509_free);
+        crd->c_cert_chain = NULL;
+    }
+    crd->c_cert_chain = sk_X509_dup(cert_stack);
+    if (crd->c_cert_chain)
+        return set_error(cc, ENOMEM, posix_error, "Cannot copy"
+                " certificate chain" ); //TODO check ret val
+    return 0;
 }
 
 canl_err_code CANL_CALLCONV