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.

angular.module('myApp')
.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];
      ...
    }
  }
}