Accessing the form and controller within the linking function of a directive is achieved by passing an array to the require property. This results in an array of controllers as the fourth argument in the link function.

.directive('passwordValidation', passwordValidation)
function passwordValidation(){
  return {
    replace: true,
    require: ['ngModel','^form'], // also 'form^' ?
    scope: {
      userName: '@'
    link: function(scope, elem, attr, controllers) {
      var ngModelCtrl = controllers[0],formCtrl = controllers[1];